miércoles, 24 de junio de 2015

Librería para LCD Nokia 1208b en CCS



Hace poco, me di cuenta que un familiar se estaba deshaciendo de un par de celulares que consideraba obsoletos por ser un modelo muy viejo y básico, aunque funcionaban perfectamente. Así que vi mi oportunidad de rescatarlos del bote de basura para tratar de reutilizar algunas de sus partes. Lo primero que revise del par de teléfonos idénticos, fue la marca y modelo, los cuales resultaron ser Nokia modelo 1208b.

 




Desde hace mucho tiempo sabía que se podían utilizar las pantallas de ciertos celulares, siempre y cuando se tenga la hoja de datos del controlador que incorporan, convenientemente en la red se encuentra mucha información sobre el manejo del LCD de algunos modelos de celulares Nokia, específicamente del modelo 6100. Desafortunadamente del modelo 1208b no hay mucho que encontrar. La poca información que encontré  es que el controlador de dicho LCD es el chip LDS184 de acuerdo a una lista que indica las características de las pantallas de varios celulares, esta lista me parece muy buena pese que algo de texto se encuentra en Ruso, se las comparto al final de esta entrada.



Para mi mala suerte tampoco pude encontrar la hoja de datos del chip en cuestión, pero investigando más encontré este vídeo www.youtube.com/watch?v=y3UOGYaFeBk, donde confirme que el chip LDS184 es compatible con el chip PCF8833, del cual hay mucha información en la red.
Ya teniendo la suficiente información para manejar el LCD, el siguiente paso fue identificar la función de cada pin del conector SMD de la pantalla, para esto utilicé un analizador lógico. El resultado fue el siguiente.



Después realice el circuito para poder utilizarlo a partir de una fuente de 5V y con niveles de control TTL. Como el controlador del LCD puede trabajar con una tensión máxima de 3.3V es necesario colocar un regulador para esta tensión, como no tenía un regulador para tal tensión, utilicé dos reguladores variables LM317LZ, uno para el controlador y el otro para alimentar el LED de la iluminación, en el que la tensión puede estar entre 6 a 7 Volts.



Y así fue como quedo el modulo LCD-Nokia1208, una de las cosas más difíciles fue el soldar los conductores al conector SMD, debido al pequeño tamaño y a la poca separación; siendo muy cuidadoso conseguí soldar los alambres. Como se darán cuenta en las imágenes el conector al cual soldé los alambres fue al que se utiliza como una extensión entra la pantalla y la placa de circuitos.





Ahora sí, llego la hora se probar el modulo. Tomando de referencia la librería escrita en el compilador mikroC PRO para la pantalla del celular Nokia 6610 de esta página microcontrolandos.blogspot.mx/2013/06/pic-nokia-6610.html, que por cierto tiene librerías muy interesantes, la modifique y adapte para el compilador PCW de CCS. Pensaran porque no trabajar directamente en el primer compilador, la razón es porque la mayoría de mis proyectos los tengo en CCS, por lo tanto me favorece que la librería se encuentre en este lenguaje. Aclaro que esta librería esta configurara para trabajar con el LCD del Nokia 1208b con 8 bits por color, pero puede configurarse fácilmente para otro modelo compatible con el chip PCF8833, la modificaciones radican en la forma en que se escribe en la memoria RAM usando el comando MADCTL.
El primer ejemplo que presento utiliza todas las funciones de la librería como demostración. Además se imprime una imagen con el icono del compilados PCW, generada con el programa Nokia Image Converter también desarrollado por el autor de la pagina anterior, igualmente  lo modificamos ligeramente para que admita imágenes de menor tamaño a  132x132 píxeles pero mayores a 29x29 píxeles.
void main()
{

 char msg1[]="Font6x8";
 char msg2[]="Font8x8";
 char msg3[]="Font8x16";

   setup_adc_ports(AN0_TO_AN2|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_16,249,1);
   setup_timer_3(T3_INTERNAL|T3_DIV_BY_1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   set_pwm1_duty(pwm1);
   set_pwm2_duty(pwm2);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   disable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER3);
   enable_interrupts(INT_EXT);
   disable_interrupts(GLOBAL);

 // TODO: USER CODE!! 

  PCF8833_Init();  

  While(1){
   PCF8833_Fill(BLANCO,0,0,97,69);//98 pixeles horizontales y 70 verticales
   PCF8833_Line(0,0,97,69,AZUL);
   PCF8833_Set_Pixel(5,10,AZUL);
   PCF8833_Write_Char('C',  5, 15, FONT6x8,NEGRO,ROJO);
   PCF8833_Write_Text(msg1, 5, 24, FONT6x8, ROJO, GRIS);
   PCF8833_Write_Text(msg2, 5, 37, FONT8x8, CAFE, AMARILLO);
   PCF8833_Write_Text(msg3, 5, 50, FONT8x16, BLANCO, NARANJA);
   PCF8833_Circle(90,10,5, AZUL);
   PCF8833_Rect(80,20,90,25, VERDE);
   PCF8833_Rect_Fill(80,30,90,35,VERDE,AZUL );
   PCF8833_Circle_Fill(85,50,10,45 , ROJO, AZUL);
   delay_ms(1500);
   PCF8833_Image();
   delay_ms(6000);
  }

}//FIN MAIN


 




El segundo ejemplo se trata de un pequeño osciloscopio, en este caso muestra una señal de un rectificador de media onda con una frecuencia cercana a los 5 kHz.


void main()
{

 int8 i;
 int8  Y[100];
 float Vprom=0;
 char msg1[]="Vprom=";
 char Volts[5];

   setup_adc_ports(AN0_TO_AN2|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_16,249,1);
   setup_timer_3(T3_INTERNAL|T3_DIV_BY_1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   set_pwm1_duty(pwm1);
   set_pwm2_duty(pwm2);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   disable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER3);
   enable_interrupts(INT_EXT);
   disable_interrupts(GLOBAL);

 // TODO: USER CODE!!

  PCF8833_Init();  

  While(1){ 

  PCF8833_Fill(BLANCO,0,0,97,69);//98 pixeles horizontales y 70 verticales
  PCF8833_Line(1,3,1,52,NEGRO); //Linea del eje Y
  PCF8833_Line(1,53,97,53,NEGRO);  //Linea del eje X
  PCF8833_Write_Char('X',90,55, FONT6x8,AZUL,BLANCO);
  PCF8833_Write_Char('Y',3,3, FONT6x8,AZUL,BLANCO); 

  for(i=0;i<96 ;i++){ //Captura de muestras
  set_adc_channel(0);
  delay_us(1);
  Y[i]=READ_ADC();  } 

  for(i=0;i<96 ;i++){ //Mostrar las capturas
  PCF8833_Set_Pixel(i+2,(53-(int8)(Y[i]*0.196)),ROJO);
  Vprom=Vprom+Y[i];  } 

  Vprom=(Vprom/96)*5/255;
  sprintf(Volts,"%f",Vprom);
  PCF8833_Write_Text(msg1, 1, 60, FONT8x8, CAFE , GRIS);
  PCF8833_Write_Text(Volts, 49, 60, FONT8x8, VERDE, GRIS);
  delay_ms(2000);

  }
}//FIN MAIN




Para concluir, les digo que con un poco de trabajo podemos armar un módulo LCD gráfico sin tener que gastar mucho dinero, pues como les reitero estos los obtuve gratis, pero si no tienen un conocido que les pueda donar su celular, pueden recurrir a un tianguis donde los precios de celulares “antiguos” son bastante cómodos, ya he visitado estos lugares y he encontrado celulares en venta por menos de 2 dólares. De esta forma podremos utilizar estas pantallas para cualquier proyecto que lo requiera, en mi caso estoy considerando emplearlo para una fuente de poder digital con función de cargador de baterías universal, que me encuentro desarrollando y que por supuesto la compartiré por este medio.

Sin más que decir les comparto la biblioteca, los ejemplos, el programa Nokia Image Converter, la hoja de datos del PCF8833 y la lista de los controladores de las pantallas de celulares, que gracias a ella mi próxima víctima será el Alcatel OT557 muuaajaja, hasta pronto...