Comunicacion entre dos pic16f877A - ccs - uart

#1
Hola, tengo un problema en el código para la comunicacion entre dos PIC del tipo 16f877a ambos. La idea es apretar una tecla del teclado matricial en cualquiera de los dos pic y que aparezca en ambos lcd (de los dos pic) el valor de la tecla presionada.
El problema es que al compiladar el codigo me arroja cinco advertencias del tipo:

Warning: Interrupts disabled during call to prevent re-entrancy

El codigo es el siguiente:

PHP:
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=4000000)
#include <KBD1.c>
#include <flex_lcd1.c>
#use RS232 (baud=9600, xmit=pin_c6, rcv=pin_c7)

   int valor;                 //Dato a transmitir
   char tecla;                //Dato ASCII tecla pulsada  


#int_RDA                               //Interrupción por recepción de datos

void RDA_isr(){

   valor=getc();                 
   printf(lcd_putc, "\fRecibido %d ", valor);   
   delay_ms(500);
   }


void main () {
    
   port_b_pullups(TRUE);
   lcd_init();                   
   enable_interrupts(INT_RDA);  
   enable_interrupts(GLOBAL);
   
   while(1){
         tecla=kbd_getc();     
         valor=tecla-48;         
         if(tecla!=0){           
            putc(valor);         
            printf(lcd_putc, "\fEnviado %d", valor);   
            delay_ms(500);
         }
   }
}
Muchas gracias.
 
#2
Hola, el problema se da, porque utilizas retardos dentro de las subrutinas de las interrupciones. Deshazte de los mismos, porque lo único que causan son líos.
 
Última edición:
#4
Los errores son por el uso del delay y el printf dentro de la interrupción, lo mejor seria que dentro de la interrupción activaras una bandera para refrescar el lcd.
Seria asi
Código:
int flag=0;
#int_RDA                               //Interrupción por recepción de datos 

void RDA_isr(){ 

   valor=getc();                  
   flag=1; 
   } 

 while(true){ 
   if (flag==1){
   printf(lcd_putc, "\fRecibido %d ", valor);    
   delay_ms(500);
   flag=0;}
 
#7
El mensaje de advertencia dice que "las interrupciones se desactivan durante la llamada (a getc) para impedir reentradas".

Mi consejo es que no utilices llamadas de nivel 2 o 3 (fgetc) dentro de interrupciones. Las llamadas de nivel 0 o 1 (getc) sí puedes usarlas, con la condición de que regresen inmediatamente en el caso de que no exista ningún carácter disponible.

Si el getc (o getchar) lo estás sacando de la librería stdio.h, debes saber que se quedará esperando a que alguien pulse una tecla.

Te recomiendo que hagas lo que te han dicho antes: usar las interrupciones para cuando se pulse la tecla en el teclado, dejando su valor en una variable global, leyendo directamente de los puertos de E/S.
 

Arriba