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
#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);
}