Autor Tema: Interrupción RDA (UART) con PIC en simulación  (Leído 2294 veces)

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

Desconectado sysseon

  • PIC10
  • *
  • Mensajes: 20
Interrupción RDA (UART) con PIC en simulación
« en: 03 de Junio de 2016, 11:04:48 »
Buenas!

Bueno, no sé muy bien dónde encasillar este post, pero creo que aquí va bien. Estoy intentando implementar una cola de recepción para el UART de un PIC en CCS. Para ello estoy utilizando un código de ejemplo que incluye el compilador:

Código: [Seleccionar]
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;


#int_rda
void serial_isr() {
   int t;

   buffer[next_in]=getc();
   t=next_in;
   next_in=(next_in+1) % BUFFER_SIZE;
   if(next_in==next_out)
     next_in=t;           // Buffer full !!
}

#define bkbhit (next_in!=next_out)

BYTE bgetc() {
   BYTE c;

   while(!bkbhit) ;
   c=buffer[next_out];
   next_out=(next_out+1) % BUFFER_SIZE;
   return(c);
}

void main() {

   enable_interrupts(int_rda);
   #if defined(__PCD__)
   enable_interrupts(intr_global);
   #else
   enable_interrupts(global);
   #endif

   printf("\r\n\Running...\r\n");

               // The program will delay for 10 seconds and then display
               // any data that came in during the 10 second delay

   do {
      delay_ms(10000);
      printf("\r\nBuffered data => ");
      while(bkbhit)
        putc( bgetc() );
   } while (TRUE);
}

El programa es sencillo, pero lo que me importa realmente es el tema de la interrupción INT_RDA de recepción. Simulando con ISIS, la transmisión del PIC funciona, pero no consigo que reciba nada porque nunca llega a dispararse la interrupción. He probado con el PIC16F877, el PIC12F1840 (que es el que me interesaría), el PIC18F452... y nada, no consigo que salte la interrupción. Sé que Proteus tendrá muchos bugs a la hora de simular, pero ahora mismo no puedo dar el salto a hardware real, así que me gustaría hacerlo funcionar en simulación. Es posible que el código esté mal (aunque no lo he modificado) y la interrupción no saltara ni en un dispositivo real, pero, como digo, solo puedo simular.

Adjunto el esquemático que uso en ISIS con un PIC16F877. ¿Alguien ha tenido problemas con esta interrupción en ISIS o ve algún posible fallo en el código o diseño?

Muchas gracias y un saludo!
« Última modificación: 03 de Junio de 2016, 11:07:51 por sysseon »


 

anything