Autor Tema: RS232 PIC a PIC, no me funciona la interrupcion  (Leído 4586 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
RS232 PIC a PIC, no me funciona la interrupcion
« 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!!!!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #1 en: 29 de Mayo de 2011, 23:42:37 »
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
El papel lo aguanta todo

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #2 en: 30 de Mayo de 2011, 00:28:43 »
MLO, gracias por tu respuesta, pero ya he probado...  y NUNCA entra en la interrupcion...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #3 en: 30 de Mayo de 2011, 10:23:50 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #4 en: 30 de Mayo de 2011, 10:33:51 »
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.

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #5 en: 30 de Mayo de 2011, 13:46:48 »
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... ¿?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #6 en: 30 de Mayo de 2011, 15:36:16 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #7 en: 30 de Mayo de 2011, 16:09:37 »
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?

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #8 en: 30 de Mayo de 2011, 16:21:34 »
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 !!!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #9 en: 30 de Mayo de 2011, 16:31:35 »
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!
No contesto mensajes privados, las consultas en el foro

Desconectado elfrancho

  • PIC16
  • ***
  • Mensajes: 101
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #10 en: 30 de Mayo de 2011, 19:40:02 »
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 !!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: RS232 PIC a PIC, no me funciona la interrupcion
« Respuesta #11 en: 30 de Mayo de 2011, 20:00:18 »
Pero seguramente no habilita el módulo UART, porque sino funcionaría ..
No contesto mensajes privados, las consultas en el foro


 

anything