TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablolode en 28 de Abril de 2010, 15:08:37
-
Hola compañeros, estoy tratando de comunicar 2 pics enviando datos, cada uno debe poder enviar y recivir.
Usando un codigo del amigo redpic ''RS232 Buffered'' con 2 18f6520 que tienen 2 usart por hard, he hecho cada rutina por duplicado las dos funcionan bien(individualmente), pero al agregarle la 2da usart (#INT_RDA2) ESTA NO envia nada. lo estoy simulando con proteus 7.6. creo que me esta faltando asociar cada usart con su respectivo canal de comunicacion este es el encabezado:
#USE delay(clock=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7,stream=rs232)
#USE RS232(BAUD=9600, XMIT=PIN_G1, RCV=PIN_G2,stream=rs485)
#use standard_io(b)
#use standard_io(a)
#use standard_io(c)
#use standard_io(d)
#use standard_io(e)
#use standard_io(f)
#use standard_io(g)
******* interrupciones*******
#INT_RDA // interrupcion datos disponibles
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=fgetc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
echos(rcvchar); // hago eco (si procede).
}
}
#INT_RDA2
void serial_isr_2() { // Interrupción recepción serie USART 2
rcvchar_2=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar_2=fgetc(); // lo descargo y ...
addcbuff_2(rcvchar_2); // lo añado al buffer y ...
echos_2(rcvchar_2); // hago eco (si procede).
**********MAIN***********
enable_interrupts(INT_RDA); // Habilita Interrupción RDA
enable_interrupts(INT_RDA2);
enable_interrupts(global); // Habilita interrupciones
do {
if(flagcommand)
{ procesa_comando(); // Si hay comando pendiente
} // de procesar ... lo procesa.
if(flagcommand_2)
{procesa_comando_2();
}
} while (TRUE);
}
}
}
dejo el codigo completo con proteus. Saludos
-
bueno, he solucionado el tema agregando el canal usart ,en la interrupcion,por el cual recibe el dato.
ya podemos recivir por un canal , enviarlo al otro y viceversa...
#INT_RDA HIGH//
void serial_isr_1() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo caracter recibido
if(kbhit(rs232)){ // Si hay algo pendiente de recibir ...
rcvchar=getc(rs232); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
echos(rcvchar); // hago eco (si procede).
//fprintf(rs232,"[rda_1_]\r\n\r\n");
}
}
//*/
#INT_RDA2 //RS485 receive data available
void serial_isr_2() { // Interrupción recepción serie USART
rcvchar_2=0x00; // Inicializo caracter recibido
if(kbhit(rs485)){ // Si hay algo pendiente de recibir ...
rcvchar_2=getc(rs485); // lo descargo y ...
addcbuff_2(rcvchar_2); // lo añado al buffer y ...
echos_2(rcvchar_2); // hago eco (si procede).
// fprintf(rs485,"[rda_2_]\r\n\r\n");
}
}
y en funcion echos...
void echos(char c){ // Echo selectivo ----------------------
switch(c){
case 0x0D: printf(" [Ent] "); // Si he pulsado la tecla [Intro]
break;
default: fputc(rcvchar,rs232); // Echo de cualquier otro caracter
}
}
void echos_2(char c){ // Echo selectivo ----------------------
switch(c){
case 0x0D: printf(" [Ent] "); // Si he pulsado la tecla [Intro]
break;
default: fputc(rcvchar_2,rs485); // Echo de cualquier otro caracter
}
}
-
Hola, te molestaria adjuntar la simulacion en proteus ya que quiero hacer algo parecido?
Muchisimas gracias!
-
ya lo adjuntade, solo cambie las lineas en interrupcion INT_RDA , INT_RDA2 y funcion ECHOS si no te funca avisame.