Hola,
Quisiera saber :?: si alguien a implementado un emulador de USARt en un PIC16F877A, necesito comunicarme por dos puerto serie usando este pic.
Espero haberte entendido bien, con "emulador de USART" te refieres a tener un código que haga las veces del módulo USART que tiene el pic, correcto? Ya que estás usando dos puertos seriales, supongo que ya estás usando el hardware USART del micro
/////////////////////////////////////////////////////////////////////////
//// EX_ENCRY.C ////
/////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define BUFFER_SIZE 32
///////////////////////////////////////////////////////////////// PORT 1
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
byte buffer1[BUFFER_SIZE];
byte next_in1 = 0;
byte next_out1 = 0;
#int_rda
void serial_isr1() {
int t;
buffer1[next_in1]=getc();
t=next_in1;
next_in1=(next_in1+1) % BUFFER_SIZE;
if(next_in1==next_out1)
next_in1=t; // Buffer full !!
}
#define bkbhit1 (next_in1!=next_out1)
byte bgetc1() {
byte c;
while(!bkbhit1) ;
c=buffer1[next_out1];
next_out1=(next_out1+1) % BUFFER_SIZE;
return(c);
}
void putc1(char c) {
putc(c);
}
///////////////////////////////////////////////////////////////// PORT 2
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B0)
byte buffer2[BUFFER_SIZE];
byte next_in2 = 0;
byte next_out2 = 0;
#int_ext
void serial_isr2() {
int t;
buffer2[next_in2]=getc();
t=next_in2;
next_in2=(next_in2+1) % BUFFER_SIZE;
if(next_in2==next_out2)
next_in2=t; // Buffer full !!
}
#define bkbhit2 (next_in2!=next_out2)
byte bgetc2() {
byte c;
while(!bkbhit2) ;
c=buffer2[next_out2];
next_out2=(next_out2+1) % BUFFER_SIZE;
return(c);
}
void putc2(char c) {
putc(c);
}
///////////////////////////////////////////////////////////////////////////////////////
void main() {
char c;
enable_interrupts(global);
enable_interrupts(int_rda);
enable_interrupts(int_ext);
printf(putc2,"\r\n\Corriendo...\r\n");
do {
if(bkbhit1) {
c = bgetc1();
putc2(c);
}
if(bkbhit2) {
c = bgetc2();
putc1(c);
}
} while (TRUE);
}
ext_int_edge(H_TO_L);No hay error, es solo el primer bit el que se debe tener en cuenta, es decir el bit de start.
Código:
ext_int_edge(H_TO_L);
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM=USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)
main(){
while (1) {
if (keybsp(USART_FISICO))
fputc(fgetc(USART_FISICO),USART_VIRTUAL);
if (keybsp(USART_VIRTUAL))
fputc(fgetc(USART_VIRTUAL),USART_FISICO);
}
}
void main (void)
{
...
ext_int_edge(H_TO_L);
...
}