Conexion RS232 bidireccional

#1
Hola necesito hacer una comunicacion semi duplex es decir que le mando algo a un segundo pic desde un pic y que este segundo me conteste, pero no logro hacerlo, desde ya muchas gracias a quien pueda ayudarme o hacerme notar mi error.

Los programas estan hechos en ccs.

Transmisor

Código:
#include <16f628a.h>
#fuses XT,NOWDT,NOMCLR      
#use delay(clock=4mhz)       
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1)    

#define LED_0 PIN_B4
#define LED_1 PIN_B5
int valor;

#int_rda
void rda_isr(){
valor=getc();
}

void main(){

enable_interrupts(int_rda);
enable_interrupts(global);

while(true){

output_low(LED_0);

if (input(PIN_A0)==0){
         output_high(LED_0);
         printf("a"); //ENVIAR CARACTER a
         delay_ms(200);}

if (valor=="b"){
            output_high(LED_1);
            delay_ms(300);
            output_low(LED_1);
           }
}
}
receptor

Código:
#include <16f628a.h>
#fuses XT,NOWDT,NOMCLR      
#use delay(clock=4mhz)       
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1)    

#define LED_0 PIN_B4
int valor;

#int_rda
void rda_isr(){
valor=getc();
}

void main(){

enable_interrupts(int_rda);
enable_interrupts(global);

while(true){

output_low(LED_0);

if (valor=="a"){

            output_high(LED_0);
            delay_ms(300);
            output_low(LED_0);
            printf("b");}
}
}
De vuelta Gracias.
 
#2
Hola, para transmitir un data debes usar putc o printf.
Para recibir debes hacerlo por interrupcion, te paso una rutina.

#int_RDA
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
valor=getc(); // lo descargo y ...
}
}
 
#3
Hola, para transmitir un data debes usar putc o printf.
Para recibir debes hacerlo por interrupcion, te paso una rutina.

#int_RDA
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
valor=getc(); // lo descargo y ...
}
}
ehhh!!! gracias Ricber por el dato, voy a probar a ver que tal.
Un saludo
 
#4
Hola Ricber, te pregunto:

rcvchar=0x00; // Inicializo caracter recibido esta es la variable donde recibo el caracter??
Si es asi:
valor=getc(); // lo descargo y ... valor es otra variable?

Subo los archivos fuente , los hex y la simulacion por si la queres ver.

Gracias.
 

Adjuntos

Última edición:
#7
Favalito

Una sugerencia, es mejor que uses los pines que corresponden al USART que el 628a trae, el compilador quizas este implementando las rutinas para el uso de hardware.

#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)

Saludos !!!
 
#8
Una sugerencia, es mejor que uses los pines que corresponden al USART que el 628a trae, el compilador quizas este implementando las rutinas para el uso de hardware.

#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)
Hola amigo Tratante, probe la comunicaion por usart hardware y nada, ocurre lo mismo, no me "responde" el segundo pic, o mas bien creo que en el primer pic no entra en interrupcion, la verdad no se porque sera...
De todas formas muchas gracias por la sugerencia, aunque no pense que la comunicacion bidireccional fuera tan complicada. Cualquier cosa mas arriba estan los archivos fuente y la simulacion por si queres probar.
Gracias de vuelta y saludos.
 
#11
Hice una simulacion con unas rutinas mas simples, por ahora solo trasmite un pic y el otro recibe, luego le ire agregando el resto.
Si te interasa lo hecho hasta ahot te lo paso.
A veces hay que hacer los programas paso a paso.
 
Arriba