Autor Tema: Problema con int_rda y pic16f877  (Leído 3529 veces)

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

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Problema con int_rda y pic16f877
« en: 07 de Septiembre de 2009, 16:50:05 »
Hola a todos,
espero que estas vacaciones os hayan ido bien, estoy tratando de realizar un proyecto para comunicarme con el Hyperterminal y un 16f877, para empezar estoy probando un código sencillo ya que es la primera vez que utilizo interrupciones por usart, el código es este, como vereis mas sencillo imposible, la idea es que salte la interrupcion al recibir un caracter y me muestre "DATO RECIBIDO" en el lcd, y se me queda el b2 encendido y el display indica rs232= pero da igual que mande caracteres por el terminal, como no tengo puerto com en el pc estoy usando un MM232R de Ftdi chip como conversor de usb a rs232, supongo que esta bien porque en otras pruebas que he hecho si consigo enviar del PIC al PC y cuando mando un caracter por el PC en la salida de MM232R tengo señal medida con el osciloscópio, en fín que me esta colmando la paciencia......GRACIAS DE ANTEMANO.
#include <16F877.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES DEBUG                    //Debug mode for use with ICD
#use delay(clock=4000000)
#include <lcd8bits_entrenador.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,restart_wdt)
#int_RDA
char valor;
void serial_isr()
{
printf(lcd_putc,"\fDato_recibido");
valor=getchar();
output_high(pin_b1);

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   lcd_init();
   star:
   {
    output_high(pin_b2);
   }
   printf(lcd_putc,"\frs232in= %4x",valor);
   delay_ms(100);
   goto star;
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con int_rda y pic16f877
« Respuesta #1 en: 07 de Septiembre de 2009, 21:22:09 »
Está mal ubicado la definición de la variable valor, luego no es recomendable hacer muy larga la rutina dentro de la interrupción, así sería lo ideal:

Código: C
  1. #include <16F877.h>
  2. #device ICD=TRUE
  3. #device adc=8
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES BROWNOUT                 //Reset when brownout detected
  9. #FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES NOWRT                    //Program memory not write protected
  12. #FUSES DEBUG                    //Debug mode for use with ICD
  13. #use delay(clock=4000000)
  14. #include <lcd8bits_entrenador.c>
  15. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  16.  
  17. char valor;
  18. int1 Llego_dato=0;
  19.  
  20. #int_RDA
  21. void serial_isr()
  22. {
  23.  
  24.    valor=getchar();
  25.    output_high(pin_b1);
  26.    Llego_dato=1;
  27. }
  28. void main()
  29. {
  30.    setup_adc_ports(NO_ANALOGS);
  31.    setup_adc(ADC_OFF);
  32.    setup_psp(PSP_DISABLED);
  33.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  34.    setup_timer_1(T1_DISABLED);
  35.    setup_timer_2(T2_DISABLED,0,1);
  36.    enable_interrupts(INT_RDA);
  37.    enable_interrupts(GLOBAL);
  38.    lcd_init();
  39.    
  40.    while(1){
  41.       output_high(pin_b2);
  42.       while(Llego_dato==0){}
  43.       Llego_dato=0;
  44.       printf(lcd_putc,"\fDato_recibido\nrs232in= %x",valor);
  45.    }
  46. }


En este caso se utiliza una bandera para determinar cuando ha llegado un dato desde el puerto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con int_rda y pic16f877
« Respuesta #2 en: 08 de Septiembre de 2009, 02:06:48 »
Muchas gracias,
en cuanto pueda lo pruebo en el entrenador y te digo.


Gracias

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con int_rda y pic16f877
« Respuesta #3 en: 19 de Septiembre de 2009, 13:47:19 »
Hola Suky,
por fin he vuelto de viaje y he estado probando, y la verdad es que no se como algo tan sencillo me esta tocando tanto las narices, he reducido el la funcion de int_rda a simplemente encencer un led pero no funciona, solo se me enciende el led cuando desconecto la sesion del hyperterminal, he probado ademas del con el modulo usb-rs232, haciendome un conversor con un max 232 y usando mi viejo pc, y nada de nada, te adjunto el código por si eres tan amable de ayudarme.
¡¡Estoy empezando a pensar en volverme al Picbasic¡¡¡ :lol:

#include <16F877.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES DEBUG                    //Debug mode for use with ICD
#use delay(clock=4000000)
#include <lcd8bits_entrenador.c>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
char valor;
int1 Llego_dato=0;
#int_RDA
void serial_isr()
      {
      valor=getchar();
      output_high(pin_b1);
      Llego_dato=1;
      }
      void main()
      {
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
      setup_psp(PSP_DISABLED);
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
      star:
      {
      output_high(pin_b2);
      delay_ms(200);
      output_low(pin_b2);
      delay_ms(200);
      if(llego_dato==1)
      {
      output_high(pin_b1);
      }
      else
      {
      output_low(pin_b1);
      }
      goto star;
      }
      }


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con int_rda y pic16f877
« Respuesta #4 en: 19 de Septiembre de 2009, 13:57:21 »
Hola.

No es muy recomendable usar goto.

Es mejor usar while(true) tal como esta en el codigo del amigo Suky.

Saludos
El papel lo aguanta todo

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con int_rda y pic16f877
« Respuesta #5 en: 20 de Septiembre de 2009, 07:37:47 »
Ok, lo tengo en cuenta, de todos modos lo he probado con while(1) y no va, la verdad es que estoy un poco desesperado, no se si a alguien se le ocurre algo mas?


Gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con int_rda y pic16f877
« Respuesta #6 en: 20 de Septiembre de 2009, 08:18:49 »
¿Has probado a recibir por la USART sin interrupción?
Yo haría un bucle que siempre preguntase por kbhit() y cuando la respuesta fuera afirmativa recibiera el carácter con getc().

Si ese método funciona, puedes estar seguro que los caracteres están llegando bien al PIC, y entonces peléate con la interrupción.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con int_rda y pic16f877
« Respuesta #7 en: 20 de Septiembre de 2009, 11:22:16 »
Bueno.

Podria ser que no coincidan las dos configuraciones de la USART. Verifica que sea el COM correcto y que tenga el mismo baud y las demas charadas.

Saludos
El papel lo aguanta todo

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con int_rda y pic16f877
« Respuesta #8 en: 21 de Septiembre de 2009, 03:20:27 »
ok compañeros,
a ver si puedo hacer la prueba cuanto antes, ya os comentaré.


Saludos.


 

anything