Autor Tema: problema con lcd y comunicacion rs232  (Leído 3247 veces)

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

Desconectado GabrielD

  • PIC10
  • *
  • Mensajes: 34
problema con lcd y comunicacion rs232
« en: 25 de Marzo de 2014, 19:03:16 »
Hola, estoy teniendo problemas con el proyecto en el que estoy trabajando, primero les voy a describir brevemente el proyecto y luego si el problema que estoy teniendo.

El proyecto es que tengo que realizar un chat por RF utilizando dos pic 16f877a, dos teclados 3x4, dos display lcd 16x2 y dos NRF24l01, bueno lo de los pics no es fijo eso es simplemente porque esos son los que tengo en el momento. El teclado funciona como el teclado de los celulares antiguos donde la 'a', la 'b', la 'c' venian en la tecla del numero 2, en el 3 la d, la f, la g y asi sucesivamente uds recuerdan. El caso es que el mensaje que uno va escribiendo se muestra en la segunda fila del lcd y el mensaje que se recibe del otro usuario debe salir impreso en la fila numero 1 ( que es donde normalmente inicia el display lcd). El mensaje se envia con la tecla "#" .

El problema que estoy teniendo es que una vez el programa arranca y solo empiezo a escribir en uno solo el teclado funciona bien me muestra todo normal en el lcd y lo puedo enviar normal, pero en el microcontrolador que estoy reciviendo el teclado se bloquea por decirlo asi, es que como si me estuviera llenando el vector donde se guarda el mensaje con espacios vacios, porque una vez lo envio obviamente no me sale nada en el otro lcd pero si me bloquea ese teclado tambien, por lo tanto algo fue enviado, ademas que puse un led para saber si recibi mensaje o no.
Tambien si empiezo a escribir en ambos a la vez, puedo enviar y recibir normalmente por unos dos o tres mensajes pero despues pasa lo mismo, hay uno que se bloquea primero.

No se si estoy teniendo problema con la int_rda que me esta bloqueando el resto del codigo o que pueda ser, espero me puedan ayudar. Hasta ahora estoy usando la comunicacion rs232 por eso no entiendo mucho como funciona, la idea es hacer una comunicacion serial por medio del max232 al rf y viceversa.

aqui esta el codigo es algo extenso debido a que estan las funciones del teclado jeje

Por cierto estoy usando una frecuencia de 20MHz el codigo es en PIC C y estoy usando PROTEUS para simular

Código: [Seleccionar]
#include <16f877a.h>
#include <stdlib.h>
#fuses hs,nowdt, nolvp,noprotect
#use delay(clock=20000000)
#include <lcd.c>
//#define lcd_data_port getenv("sfr:portc")
//#include <D:\laboratorio 3a\lcd.c>
#define use_portb_kbd true
#include <kbd.c>
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,bits=8)

char k;
int x,i,j,h,l;
char prim[7]={'.',',',':',';',')','(','1'};
char seg[7]={'a','b','c','A','B','C','2'};
char ter[7]={'d','e','f','D','E','F','3'};
char cuar[7]={'g','h','i','G','H','I','4'};
char quin[7]={'j','k','l','J','K','L','5'};
char six[7]={'m','n','o','M','N','O','6'};
char sep[9]={'p','q','r','s','P','Q','R','S','7'};
char octv[7]={'t','u','v','T','U','V','8'};
char nov[9]={'w','x','y','z','W','X','Y','Z','9'};
char cero[2]={'0',' '};
char guardar[16]={};
char recibido[16]={};
int veces=0;
int t1,t2,t3,t4,t5,t6,t7,t8,t9,t0,t10,t11;
int tamano;
int tec;
//int dato;
void imprimir(char vector[],int tamano)
{


switch (veces)
{
  case 0:
   printf(lcd_putc,"%c",vector[0]);
   delay_ms(100);
   veces++;
   break;
  
   case 1:
   printf(lcd_putc,"\b%c",vector[1]);
   delay_ms(100);
   veces++;
   if(tamano==2)
     { veces=0;
      }
   break;
  
   case 2:
   printf(lcd_putc,"\b%c",vector[2]);
   delay_ms(100);
   veces++;
   break;
  
   case 3:
   printf(lcd_putc,"\b%c",vector[3]);
   delay_ms(100);
   veces++;
   break;
  
   case 4:
   printf(lcd_putc,"\b%c",vector[4]);
   delay_ms(100);
   veces++;
    if(tamano==4)
     { veces=0;
      }
   break;
  
   case 5:
   printf(lcd_putc,"\b%c",vector[5]);
   delay_ms(100);
   veces++;
   if(tamano==5)
     { veces=0;
      }
   break;
  
   case 6:
   printf(lcd_putc,"\b%c",vector[6]);
   delay_ms(100);
   veces++;
   if(tamano==6)
     { veces=0;
      }
   break;
  
   case 7:
   printf(lcd_putc,"\b%c",vector[7]);
   delay_ms(100);
   veces++;
   if(tamano==7)
     { veces=0;
      }
   break;
  
   case 8:
   printf(lcd_putc,"\b%c",vector[8]);
   delay_ms(100);
   veces=0;
   if(tamano==8)
     { veces=0;
      }
   break;
 }
}
void presione (int tec)
{
      t1=0;
      t2=0;
      t3=0;
      t4=0;
      t5=0;
      t6=0;
      t7=0;
      t8=0;
      t9=0;
      t0=0;
      t10=0;
      t11=0;
      
switch (tec)
 {
  case 0:
  t0=1;
  break;
  case 1:
  t1=1;
  break;
  case 2:
  t2=1;
  break;
  case 3:
  t3=1;
  break;
  case 4:
  t4=1;
  break;
  case 5:
  t5=1;
  break;
  case 6:
  t6=1;
  break;
  case 7:
  t7=1;
  break;
  case 8:
  t8=1;
  break;
  case 9:
  t9=1;
  break;
  case 10:
  t10=1;
  break;
  case 11:
  t11=1;
  break;
 }
}
void enviar (void)
{
  for (i=1;i<=16;i++)
  {
   lcd_gotoxy(i,2);
   guardar[i]=lcd_getc(i,2);
  }
    
  for(j=1;j<=16;j++)
  {
  
  putc(guardar[j]);
  }
  
  for (h=1;h<=16;h++)
  {
   lcd_gotoxy(h,2);
   printf(lcd_putc," ");
  }
  lcd_gotoxy(1,2);
}
#int_rda
void serial_isr()
{

  for(l=1;l<=16;l++)
  {
   recibido[l]=getc();
  }
   output_toggle(pin_a0);
  
   lcd_gotoxy(1,1);
   for(i=1;i<=16;i++)
 {
  printf(lcd_putc,"%c",recibido[i]);
 }
 
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);
lcd_init();
kbd_init();
port_b_pullups(true);
lcd_gotoxy(1,2);
do
 {
 /*lcd_gotoxy(1,1);
 for(i=1;i<=16;i++)
 {
  printf(lcd_putc,"%c",recibido[i]);
 }*/
 k=kbd_getc();
 x=k-48;
 if (k!=0){
 
 if (k=='*')
  {
    t10=1;
    if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t11==1))
    { veces=0;
      presione(10);
    }
    lcd_putc("\b \b");
    delay_ms (100);
  }
  if (x==0)
  {
    t0=1;
    if((t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t1==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(0);
    }
    imprimir(cero,2);
  }
 
 if (x==1)
  {
    t1=1;
    if((t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(1);
    }
    imprimir(prim,6);
  }
 if (x==2)
  {
    t2=1;
    if((t1==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(2);
    }
    imprimir(seg,6);
  }
 if (x==3)
  {
    t3=1;
    if((t1==1)||(t2==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(3);
    }
    imprimir(ter,6);
  }
 if (x==4)
  {
    t4=1;
    if((t1==1)||(t2==1)||(t3==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(4);
    }
    imprimir(cuar,6);
  }
 if (x==5)
  {
    t5=1;
    if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t6==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(5);
    }
    imprimir(quin,6);
  }
 if (x==6)
  {
    t6=1;
    if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t7==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(6);
    }
  
   imprimir(six,6);
  }
  
  if (x==7)
  {
   t7=1;
   if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t8==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(7);
    }
  
   imprimir(sep,8);
  }
  
  if (x==8)
  {
   t8=1;
   if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t9==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(8);
    }
  
   imprimir(octv,6);
  }
  
  if (x==9)
  {
  t9=1;
   if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t0==1)||(t10==1)||(t11==1))
    { veces=0;
      presione(9);
    }
  
   imprimir(nov,8);
  }
  if (k=='#')
  {
  t11=1;
   if((t1==1)||(t2==1)||(t3==1)||(t4==1)||(t5==1)||(t6==1)||(t7==1)||(t8==1)||(t0==1)||(t10==1)||(t9==1))
    { veces=0;
      presione(11);      
    }
   enviar();
   //recibir();
  }
  
 }
 } while (true);
}
« Última modificación: 25 de Marzo de 2014, 19:45:12 por GabrielD »

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: problema con lcd y comunicacion rs232
« Respuesta #1 en: 26 de Marzo de 2014, 14:04:36 »
Porque no agregas la directiva ERRORS a #users232 asi:

Código: [Seleccionar]
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,bits=8,errors)
Nunca se deja de aprender

Desconectado GabrielD

  • PIC10
  • *
  • Mensajes: 34
Re: problema con lcd y comunicacion rs232
« Respuesta #2 en: 26 de Marzo de 2014, 18:51:19 »
ok thegame gracias lo hare, y que hace ese errors??

Desconectado GabrielD

  • PIC10
  • *
  • Mensajes: 34
Re: problema con lcd y comunicacion rs232
« Respuesta #3 en: 29 de Marzo de 2014, 11:07:01 »
Bueno ya monte el circuito y comprobe que tanto fisico como en simulacion la interrupcion rda es la que me esta bloqueando el codigo

alguien tiene una sugerencia de como usar esta interrupcion adecuadamente o sabe que estoy haciendo mal

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: problema con lcd y comunicacion rs232
« Respuesta #4 en: 31 de Marzo de 2014, 19:32:00 »
y si pruebas a colocar un delay despues de cada captura????

has probado si te recibe digamos un solo byte????

saludos.
Nunca se deja de aprender

Desconectado GabrielD

  • PIC10
  • *
  • Mensajes: 34
Re: problema con lcd y comunicacion rs232
« Respuesta #5 en: 04 de Abril de 2014, 20:16:22 »
hola thegame,

si lo recibe y me recibe mas de un byte pero despues de unos dos o tres intentos se bloquea, igual en fisico no corre el programa, pero creo que es porq estaba utilizando el lcd desde la interrupcion, me toca quitar esa linea de codigo de ahi. Pero la verdad lo habia soltado porq estoy trabajando en algo mas, me toca probar con eso mas tarde jeje, gracias luego te comento como voy

Desconectado GabrielD

  • PIC10
  • *
  • Mensajes: 34
Re: problema con lcd y comunicacion rs232
« Respuesta #6 en: 08 de Abril de 2014, 11:32:40 »
Hola pues le comento que ya resolvi mi problema :)

al final si era lo que pensaba era por manejar el lcd desde la interrupcion, sin embargo decidi quitar toda la interrupcion y maneje la recepcion de datos por el kbhit() (sugerencia que lei en otro topic de este foro), este me permitio manejar la recepcion de datos y la impresion de una en el lcd, en cambio con la interrupcion solo hubiera podido atender la recepcion de datos y luego crear otra rutina para la impresion de datos.

Desconectado Tavo

  • PIC10
  • *
  • Mensajes: 22
Re: problema con lcd y comunicacion rs232
« Respuesta #7 en: 12 de Mayo de 2015, 13:37:05 »
Porque no agregas la directiva ERRORS a #users232 asi:

Código: [Seleccionar]
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,bits=8,errors)
Hola thegame.
Tengo un problema similar.
Tengo un circuito donde un MAESTRO 16F876A detecta cuando se activan algunos sensores y se lo informa a un ESCLAVO otro 16F876A por RS232 . Todo funciona correctamente un par de horas pero después el MAESTRO se "clava" y deja de transmitir. El ESCLAVO sigue funcionando correctamente.
Probé con diferentes velocidades pero pasa lo mismo.

Si al MAESTRO lo conecto a una PC no se me tilda, funciona perfecto.
Si al MAESTRO lo reemplazo por un Arduino, funciona perfecto.

Leí sobre la variable ERRORS pero no me queda claro qué información te da. Podrías explicarla un poquito ?
Alguna pista ?
Gracias.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: problema con lcd y comunicacion rs232
« Respuesta #8 en: 18 de Mayo de 2015, 14:54:56 »
Perdon por la tardanza, mira la función de ERRORS es para borrar o resetar las condiciones de error generadas en la comunicacion RS232, de manera que si una de ellas bloquea la comunicación, esto te ayuda a que se reinicie el modulo RS232 y continué normalmente, aunque......., me ha ocurrido que en ocaciones no funciona del todo bien, yo lo que realizo en adicional a colocar ERRORS es checar los bits bandera de los errores posibles que se pueden dar en la comunicacion RS232, asi corroboro y me doy cuenta exactamente que ocurrió o puedes checar también la variable RS232_ERRORS.

Saludos.

PD: Has revisado el erradata del pic que usas.....ya me paso con el 16F1933,36,38 que tienen un problema cuando se elije trabajar en modo 16bits y alta velocidad y casualmente ese es ek modo por default  :5] :5] :5], despues de un tiempo pufff adios comunicacion, como sugerencia checalo
Nunca se deja de aprender

Desconectado Tavo

  • PIC10
  • *
  • Mensajes: 22
Re: problema con lcd y comunicacion rs232
« Respuesta #9 en: 28 de Mayo de 2015, 11:56:27 »
Perdon por la tardanza, mira la función de ERRORS es para borrar o resetar las condiciones de error generadas en la comunicacion RS232, de manera que si una de ellas bloquea la comunicación, esto te ayuda a que se reinicie el modulo RS232 y continué normalmente, aunque......., me ha ocurrido que en ocaciones no funciona del todo bien, yo lo que realizo en adicional a colocar ERRORS es checar los bits bandera de los errores posibles que se pueden dar en la comunicacion RS232, asi corroboro y me doy cuenta exactamente que ocurrió o puedes checar también la variable RS232_ERRORS.

Saludos.

PD: Has revisado el erradata del pic que usas.....ya me paso con el 16F1933,36,38 que tienen un problema cuando se elije trabajar en modo 16bits y alta velocidad y casualmente ese es ek modo por default  :5] :5] :5], despues de un tiempo pufff adios comunicacion, como sugerencia checalo

Todavía no pude hacer nada de lo que me dijiste, pero lo que pude comprobar es que el Arduino le envía los mensajes al PIC hasta que el PIC deja de leerlos. Aclaro que el PIC sigue funcionando correctamente, sólo deja de leer los mensajes por RS232.
Si reseteo el PIC empieza a leer nuevamente los mensajes, inclusive los que quedaron en el buffer del Arduino.
Por lo que leí el Arduino Uno tiene un buffer de 64 bytes y el 16F876A tiene un buffer de 2 bytes. La transmisión de los datos no es constante y transmite un sólo un byte (no transmiete cadenas de datos), por eso no entiendo por qué deja de leerlos.
Pruebo y les cuento como me fue.
Gracias.


 

anything