Autor Tema: Driver Grafico LCD para uCOS  (Leído 1686 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Driver Grafico LCD para uCOS
« en: 16 de Octubre de 2011, 00:58:31 »
Debido a una materia del posgrado de Sistemas Embebidos del Instuto Universitario Aeronautico, que pedia realizar un pequeño proyecto donde se implemente un sistema embebido con el RTOS uCOS, me parecio una buena oportunidad de adaptar el driver grafico LCD para FREERTOS para que funcione en uC/OS-II.

Como la libreria estaba pensada para usar con un RTOS, fue relativamente sencillo adaptarla para que funcione con las funciones que implementa uC/OS para:
  • Creacion de tareas
  • Destruccion de tareas
  • Pasaje de argumentos a tareas
  • Semaforos, señalizacion y sincronizacion
  • Manejo de memoria y errores

Lo que mas me complico fue en si el port (o adaptacion del uCOS a un micro/compilador) para C18, por el modelo de memoria que este cuenta (modelo de bancos y punteros de memoria separados para objetos en ram y rom).
Utilice C18 por questiones de tiempo y disponibilidad, ya que los micros que tenia (AT91SAM7, LPC1104, DSPIC, PIC24) no tenia todo lo necesario para hacerlo funcionar (en algunos tenia el port para el micro pero no la IDE, o el debugguer, en otro no tenia el port, etc).

Adicionalmente en este proyectito dejo una demo actualizada para el port del C30 (linea DSPIC y PIC24) y (espero que no haya inconvenientes) todos los sources del uCOS desde el 2.50 al 2.90.

Solo a modo de ejemplo dejo la parte de la demo que muestra como se utiliza, es muy simple, se inicializa con una funcion que se le pasa el stack que requerira y la primera de 2 prioridades que utilizara.
Despues cada tarea se le pasa por parametros el objeto especifico (pixel, linea, rectangulo, circulo, bitmaps, etc).

Código: C
  1. void demoTask(void *pdata)
  2. {
  3.     INT16S size;
  4.     INT8U  cnt;
  5.     const INT8U **messagesPtr;
  6.  
  7.     //Initialize LCD Services (uses priorities 3, 4, 5)
  8.     vGlcdInit(&lcdTaskStk[0], sizeof(lcdTaskStk), 3);
  9.  
  10.     for(;;)
  11.     {
  12.         /*Init fillscreen object*/
  13.         fillScr.offset.x = fillScr.offset.y = 0; //Offset for the source in X and Y
  14.         fillScr.param.color = PX_COMB_PASTE;     //Coloring method
  15.         fillScr.size.x = fillScr.size.y = 1;     //One byte long in X and Y
  16.         fillScr.data = pclean;                   //Source of the data
  17.  
  18.         /*Call to the method "Clear all screen"*/
  19.         cGlcdFillScr( &fillScr );
  20.  
  21.         /*Draw 2 rectangles*/
  22.         rectangle.posIni.x = 0; rectangle.posFin.x = 127;
  23.         rectangle.posIni.y = 0;  rectangle.posFin.y = 63;
  24.         rectangle.param.color = PX_COMB_ON;
  25.         rectangle.param.getSet = SET;
  26.         rectangle.param.limited = 1; rectangle.param.optimized = 1;
  27.  
  28.         for (cnt = 0; cnt < 2; cnt++)
  29.         {
  30.             rectangle.posIni.x = cnt * 2; rectangle.posFin.x = 127 - cnt * 2;
  31.             rectangle.posIni.y = cnt * 2; rectangle.posFin.y = 63 - cnt * 2;
  32.             cGlcdRectangle(&rectangle);
  33.             OSTimeDly(2);
  34.         }
  35.  
  36.         //Draw a splitting line
  37.         line.param.color = PX_COMB_ON;
  38.         line.param.getSet = SET;
  39.         line.param.limited = 1;
  40.         line.param.optimized = 1;
  41.         line.posIni.x = 63;
  42.         line.posIni.y = 2;
  43.         line.posFin.x = 63;
  44.         line.posFin.y = 60;
  45.  
  46.         cGlcdLine(&line);
  47.  
  48.         /*Init text object*/
  49.         text1.window.pos.x = 3;
  50.         text1.window.pos.y = 3; //Position of the text window
  51.         text1.window.size.x = 58;
  52.         text1.window.size.y = 58; //Size of the text window
  53.         text1.string.pos.x = text1.string.pos.y = 0; // Initial position of text in the window
  54.         text1.string.param.color = PX_COMB_PASTE;
  55.         text1.string.param.optimized = 1;
  56.         text1.string.param.limited = 1;
  57.         text1.string.tabspace = xGlcdGetDefTAB(4); // Size of tab space
  58.         text1.font.size.x = 5; text1.font.size.y = 6; //Size of font
  59.         text1.font.data = font5_6;
  60.  
  61.         messagesPtr = messages;
  62.  
  63.         //Print a message 20 times
  64.         for (cnt = 0; cnt < 20; cnt++)
  65.         {
  66.             //Set Message
  67.             text1.string.data = (const INT8U *) *messagesPtr++;
  68.  
  69.             //Print Messages
  70.             cGlcdPrintf( &text1 );
  71.            
  72.             //Delay 500 ms
  73.             OSTimeDlyHMSM(0, 0, 2, 0);
  74.  
  75.             if (*messagesPtr == 0) { messagesPtr = messages; }
  76.         }
  77.        
  78.         bitmap.param.limited = 0; //Limit to screen size
  79.         bitmap.param.optimized = 1; //Optimized routine
  80.         bitmap.source.size.x = 16; bitmap.source.size.y = 16; //Size of the bitmap source
  81.         bitmap.size = bitmap.source.size; //Size of the desired bitmap
  82.         bitmap.source.offset.x = bitmap.source.offset.y = 0;
  83.         bitmap.param.color = PX_COMB_XOR; //Negate
  84.         bitmap.source.data = pball;  //Data of the bitmap
  85.  
  86.         for (cnt = 0; cnt < 200; cnt++ )
  87.         {
  88.             bitmap.pos.x = ((INT16U)sin(cnt     ) * 48)/64;
  89.             bitmap.pos.y = ((INT16U)sin(cnt + 32) * 48)/64;
  90.  
  91.             /*Call to the method "place bitmap"*/
  92.             cGlcdBitmapSet( &bitmap );
  93.  
  94.             OSTimeDly(5);
  95.  
  96.             /*Restore by negating*/
  97.             cGlcdBitmapSet( &bitmap );
  98.         }        
  99.     }
  100. }

Aca las funciones (solo dos son ejecutadas en el momento, la inicializacion y el pixel, que cuenta con semaforizacion), el resto llama a un arrancador generico de tareas.

Código: C
  1. void  vGlcdInit(void *stack, INT16U size, INT8U prios);
  2.  
  3. #define cGlcdPixel(pixel)           cGlcdPixelInt(pixel, TRUE /*use locks*/)          
  4. #define cGlcdFillScr(fillData)      cGlcdTaskStarter(vGlcdFillScr   /*Starts a FillScr task*/ ,       (void *)fillData, 0)
  5. #define cGlcdBitmapSet(bitmap)      cGlcdTaskStarter(vGlcdBitmapSet /*Starts a GlcdBitmapSet task*/,  (void *)bitmap, 0)
  6. #define cGlcdBitmapGet(bitmap)      cGlcdTaskStarter(vGlcdBitmapGet /*Starts a GlcdBitmapGet task*/,  (void *)bitmap, 0)
  7. #define cGlcdLine(line)             cGlcdTaskStarter(vGlcdLine      /*Starts a GlcdLine task*/,       (void *)line, 0)
  8. #define cGlcdFloodFill(floodFill)   cGlcdTaskStarter(vGlcdFloodFill /*Starts a GlcdFloodFill task*/,  (void *)floodFill, 0)
  9. #define cGlcdCircle(circle)         cGlcdTaskStarter(vGlcdCircle    /*Starts a GlcdCircle task*/,     (void *)circle, 0)
  10. #define cGlcdPrintf(text)           cGlcdTaskStarter(vGlcdPrintf    /*Starts a GlcdPrintf task*/,     (void *)text, 1)
  11. #define cGlcdRectangle(rectangle)   cGlcdTaskStarter(vGlcdRectangle /*Starts a GlcdRectangle task*/,  (void *)rectangle, 1)

Aqui subo un video pero es mucho mas limitado que el demo del link que pase al principio, debido a la poca memoria del PIC, y que todos los objetos constantes los vuelca en RAM (si, una porqueria) hay que usar el qualifier rom para que lo mande a rom pero los punteros de rom no tienen visibilidad de ram con lo que hay que duplicar metodos y no vale la pena ensuciar el driver.

Nota: no se rian del audio que tiene, era para sacarle el original que se escuchaban los autos pasar.

Como nota adicional, este port de MCC18 esta mejorado del original de Nathan Brown, este usa como tick del sistema el CCP que genera una interrupcion sin latencias por cuestiones de recarga del timer y tiene listo el uso del puerto serie a traves del RTOS con mutex y semaforizacion.

Link al codigo
« Última modificación: 16 de Octubre de 2011, 01:18:00 por Darukur »
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Driver Grafico LCD para uCOS
« Respuesta #1 en: 16 de Octubre de 2011, 09:32:12 »
Gracias Darukur¡¡¡ pense que era el uCgui... exelente laburo!!!
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Driver Grafico LCD para uCOS
« Respuesta #2 en: 16 de Octubre de 2011, 21:52:30 »
Gracias manutek! estoy mirando esa libreria a ver que tal. Esta lib que hice queda como anecdota ya, hay librerias graficas color muy potentes totalmente orientadas a micros y encima opensource.

Vi esta demo:

Tengamos en cuenta que es un ARM9 a 400Mhz... (aprox 400mips) la demo que hice en un PIC a 10Mhz (2.5Mips)
« Última modificación: 16 de Octubre de 2011, 21:59:19 por Darukur »
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/