TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elfrancho en 29 de Mayo de 2011, 23:24:25
-
Hola amigos, estoy de los pelos con una comunicacion rs232 entre dos pics 16F628A.
En la placa tengo estos dos micros, el tx del master con el rx del esclavo y viceversa.
Envío datos del master al esclavo y este ni siquiera entra en la interrupcion RDA,puse para q encienda un led cuando recibe cualquier dato y no lo hace... Mas abajo pego el codigo....
Lo raro es que por software (FORCE_SW) funciona perfecto..
MASTER:
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,XMIT=PIN_B0,BITS=8,FORCE_SW)
#use fast_io(A)
#use fast_io(B)
void main()
{
setup_oscillator(OSC_4MHZ);
setup_comparator(NC_NC_NC_NC);
set_tris_b (11111110);
set_tris_a (11111001);
while(1){
printf ( "1A" );
delay_ms ( 30 );
printf ( "1B" );
delay_ms ( 30 );
}
}
SLAVE:
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,RCV=PIN_B1,BITS=8)
#use fast_io(A)
#use fast_io(B)
#define ledb PIN_A1
#int_RDA
RDA_isr() {
output_toggle(ledb);
}
void main()
{
setup_oscillator(OSC_4MHZ);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_b (11111111);
set_tris_a (11111000);
while(1){
}
A alguien se le ocurre por que puede ser que no entre en interrupcion??
poniendo en el escalvo FORCE_SW, y poniendo getc() en el main, funciona perfecto.... ?¿?¿?¿?¿
SALUDOS!!!!
-
Hola.
Pon la función getc() dentro de la interrupción RDA para limpiar el flag, tal como esta, no lo hace y nunca va a salir de la rutina de interrupción.
Saludos
-
MLO, gracias por tu respuesta, pero ya he probado... y NUNCA entra en la interrupcion...
-
Seguramente el problema es que envías de a 2 bytes, entonces al realizar 2 toggles en tan poco tiempo no logres ver el cambio. Espera unos 150ms entre envios
Saludos!
-
Aparte de que te falta el getc() en la interrupción, el pin del USART que transmite por hardware es PIN_B2 y el que recibe es el PIN_B1
Prueba de poner los dos por hardware, y asignarle correctamente los pines en ambos pics
#use rs232(baud=9600,parity=N,RCV=PIN_B1,XMIT=PIN_B2,BITS=8)
Además trata de enviar un caracter y esperar más de 30mseg entre caracter y caracter, sino no vas a ver el parpadeo en el led.
-
Gracias por su ayuda, les comento las pruebas que hice.....
Aun sigue sin funcionar:
MODIFICACIONES:
Master:
while(1){
printf ( "1" );
delay_ms ( 50 );
}
Ahora envío un solo bit cada 50ms
Slave:
#int_RDA
RDA_isr() {
comando=getc();
output_high(ledr);
}
Y EL LED NUNCA PRENDE !!! (nunca entra en la interrupción)
Aclaración1: el pin del led responde correctamente ya que si coloco output_high(ledr); dentro del main, este prende correctamente.
Aclaración2: Ya probe con otro PIC y pasa lo mismo!!!
Y por soft funciona de maravilla... ¿?
-
Tendrías que revisar si CCS configura correctamente el módulo y la interrupción. Hay que revisar el ASM que genera, sino probar con otra versión de CCS :undecided:
Saludos!
-
Simulé tu código en CCS, si no le colocas el XMIT=PIN_B2, no hace caso, pero agregándolo si
probaste con esto:
#use rs232(baud=9600,parity=N,RCV=PIN_B1,XMIT=PIN_B2,BITS=8)
tanto en transmisor como en receptor?
-
pablomanieri:
Sos un groso !!! ahora funciona de mil maravillas !!!
Ahora si que mis dos pics hablan en el mismo idioma!!
AGENDAR: por mas que usemos unicamente RX pin, se debe configurar TX, de lo contrario no funca !!!!
-
AGENDAR: por mas que usemos unicamente RX pin, se debe configurar TX, de lo contrario no funca !!!!
O sea, CCS por más que no le pongas FORCE_SW considera que no quieres utilizar el módulo! :shock: Pero podría testear si se ha incluido #int_RDA :?
Saludos!
-
AGENDAR: por mas que usemos unicamente RX pin, se debe configurar TX, de lo contrario no funca !!!!
O sea, CCS por más que no le pongas FORCE_SW considera que no quieres utilizar el módulo! :shock: Pero podría testear si se ha incluido #int_RDA :?
Saludos!
Mmmm lo que me extraña es que me puse a seguir el asm antes de hacer la correccion que soluciono mi problema y aparentemente el CCS configura bien el tema de las interrupciones... Lo simule con el simu de mplab y pude observar lo siguiente:
Bytes
INTCON: 11000000 (GIE y PEIE enable)
PIE1: 00100000 (RCIE enable)
Creo que nada mas se necesita configurar ¿?
Saludos !!
-
Pero seguramente no habilita el módulo UART, porque sino funcionaría ..