Ahi va:
Las siguientes lineas le dicen al compilador segun cual version sea elegida, que compile el codigo para un PIC17F877 o para un PIC18F452.
Esta forma de programar se denomina Compilacion Condicional, y permite en un mismo codigo tener alternativas diferentes de PIC a utilizar.
Ademas del PIC en este caso se determina los Fusibles a usar (fuses) , la frecuecia de oscilacion del PIC (#use delay) y la velocidad y pines del puerto serial (#use rs232).
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
La siguiente seccion declara las variables a usar en el programa.
Define un buffer (cadena del tipo string) de 32 bytes en las dos primeras lineas y luego declara dos variables tipo Byte y en el mismo mometo las pone en cero.
#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
Esta seccion es la interrupcion del puerto serie, que ocurrira toda vez que u nuevo byte entre al puerto USART.
El codigo dentro de la funcion siguiente se ejecutara cada vez que ocurra la interrupcion.
Dentro del codigo se verifica no superar el tamaño del buffer, ya que eso produciria un desborde del micro y error fatal del programa.
#int_rda
void serial_isr() {
int t;
t=next_in;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t; // Buffer full !!
}
Lo siguiente declara que ambos bytes deben ser diferentes para que la bandera bkbhit se ponga e uno.
La funcion que sigue controla y pone dentro del buffer cada caracter nuevo que ingresa por el puerto serial.
#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);
}
El resto es el programa principal que habilita la interrupcion y cada 10 segundos imprime lo que entro por el puerto serial...
void main() {
enable_interrupts(global);
enable_interrupts(int_rda);
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)
} while (TRUE);
}