TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Byakuya en 23 de Febrero de 2016, 17:21:23
-
Hola amigos del foro, quería consultarles, quiero diseñar un controlador de lcd 16x2, la idea es usar dos micro controladores uno hará el trabajo de esclavo y el otro de maestro, eh pensado que podría implementarse usando protocolo serial y entonces tener el control de la lcd con un solo hilo (TX), o tal ves usando (spi) yo generalmente uso ccs compiler. ayuda comentarios io sugerencias son bien aceptadas.
-
Definitivamente la forma mas sencilla es usar un solo hilo con comunicacion serial. Yo te recomiendo eso, por que si necesitas colocar la LCD (dispositivo esclavo) a una distancia considerable, simplemente implementas el RS-485 y listo. Pero no se cual sera tu aplicacion final. Pero lo recalco, usa un solo hilo con comunicacion serial.
Elreypic.
-
Gracias por tu respuesta elreypic2, hablando de aplicaciones finales, la idea es poder controlar la lcd de forma serial, hasta el momento escribo sobre la lcd desde el micro master, a una velocidad 9600 bauds, por alli mi problema comienza con la identificación del retorno de carro, o nueva linea, etc, quisiera comandar la lcd desde otro micro cuando mis pines están agotados. y se me ocurre que hacerlo de manera serial es la mejor forma.
Hasta aora digo esto,, estecodigo controla la lcd de forma serial, me echan una mano a control total de la lcd???
#INCLUDE <18F24K50.h>
#FUSES INTRC_IO,PLLEN,PLL3X,NOCPUDIV,FCMEN,NOIESO,NOPUT,NOBROWNOUT,NOLPBOR,NOWDT
#FUSES NOMCLR,STVREN,NOLVP,NOXINST,NODEBUG
#FUSES NOPROTECT,NOCPB,NOCPD,NOWRTC,NOWRTB,NOWRTD,NOEBTRB //DE PROTECCION OR NOT
#USE DELAY(CLOCK = 48MHZ)
#USE RS232(UART1,BAUD = 9600, PARITY = N, XMIT = PIN_C6, RCV = PIN_C7 ,BITS = 8)
#DEFINE LCD_RS_PIN PIN_C0
#DEFINE LCD_RW_PIN PIN_C1
#DEFINE LCD_ENABLE_PIN PIN_C2
#DEFINE LCD_DATA4 PIN_A0
#DEFINE LCD_DATA5 PIN_A1
#DEFINE LCD_DATA6 PIN_A2
#DEFINE LCD_DATA7 PIN_A3
#INCLUDE <LCD.c>
VOID BORRAR(VOID);
UNSIGNED INT8 CHAR_CNT = 0, LINE = 1;
//=============================================//
// DESPLAZA AL DISPLAY (DDRAM NO SE MODIFICA) //
//=============================================//
VOID LCD_DESPLAZA_DISPLAY(INT1 D_I)
{
INT8 CODIGO = 0b00011000;
IF(D_I) // D_I = 1, EL CURSOR SE DESPLAZA A LA DERECHA
CODIGO = CODIGO + 0b00000100; // D_I = 0, EL CURSOR SE DESPLAZA A LA IZQUIERDA
LCD_SEND_BYTE(CODIGO,0);
}
//============================================//
// DESPLAZA AL CURSOR (DDRAM NO SE MODIFICA) //
//============================================//
VOID LCD_DESPLAZA_CURSOR(INT1 D_I)
{
INT8 CODIGO = 0b00010000;
IF(D_I) // D_I = 1, EL CURSOR SE DESPLAZA A LA DERECHA
CODIGO = CODIGO + 0b00000100; // D_I = 0, EL CURSOR SE DESPLAZA A LA IZQUIERDA
LCD_SEND_BYTE(CODIGO,0); // EL CURSOR SE DESPLAZA DE LA POSICION 40 DE LA LINEA 1 A LA POSICION 0 DE LA LINEA 2
}
VOID MAIN (VOID)
{
DELAY_MS(100);
UNSIGNED INT8 B_DATA=0;
LCD_INIT();
LCD_CURSOR_ON(0);
WHILE(TRUE)
{ // Recibir los caracteres via serial RS2-232
IF(KBHIT()) { // Si el buffer contiene datos...
B_DATA = GETCH(); // Guardar el dato en la variable b_data
CHAR_CNT++; // Se incrementa el contador de caracteres.
LCD_GOTOXY(CHAR_CNT, LINE); // Se posiciona el cursor en la pantalla según la línea.
PRINTF(LCD_PUTC,"%c",B_DATA); // Se escriben los caracteres.
// Si se recibe el ASCII 8, entonces borrar el último caracter escrito.
IF(B_DATA == 8) {
BORRAR();
}
IF(B_DATA == 13) { //SI SE RECIBE RETORNO DE CARRO
CHAR_CNT = 0;
}
// Por si se excede el conteo a mas de 16
IF(CHAR_CNT >= 17) {
CHAR_CNT = 0;
LCD_PUTC("\f");
}
// Pasar a la línea 1 con el comando !
IF(B_DATA == 33) {
CHAR_CNT++;
BORRAR();
LINE = 1;
LCD_GOTOXY(1,1);
LCD_PUTC(" ");
CHAR_CNT = 0;
}
// Pasar a la línea 2 con el comando "
IF(B_DATA == 34) {
CHAR_CNT++;
BORRAR();
LINE = 2;
LCD_GOTOXY(1,2);
LCD_PUTC(" ");
CHAR_CNT = 0;
}
}
}
}
VOID BORRAR(VOID)
{
// Rutina para borrar un caracter de la pantalla
CHAR_CNT--;
LCD_GOTOXY(CHAR_CNT,LINE);
LCD_PUTC(" ");
CHAR_CNT--;
IF(CHAR_CNT > 16) {
CHAR_CNT = 0;
}
}
-
Que tal Byakuya,
Me imagino que cuando envias el retorno de carro lo haces con "\n". Al hacer eso estas enviando dos bytes, el 13 y el 10 para formar el retorno de carro, y creo que alli el problema ya que en el controlador solo esperas el 13 pero nunca el 10, y el buffer del USART se te desborda.
Elreypic.