Autor Tema: Interrupcion en recepcion usando uart1?  (Leído 1508 veces)

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

Desconectado Pedro

  • PIC10
  • *
  • Mensajes: 7
Interrupcion en recepcion usando uart1?
« en: 17 de Marzo de 2021, 15:50:22 »
Saludos, estoy utilizando pic18f25k22.
Utilizo compilador mikroC, he hecho un pequeño programita de prueba que al recibir "on" enciende un led en portc.b2 y lo sorprendente es que funciona bien en el simulador proteus pero cuando lo monto  los bytes no llegan. He repasado cableado , cambiado el xtal = 16Mhz y probado con otro pic 16f25k20 y tampoco. No se que se me escapa, he probado activando interrupcion alta, baja y nada.Gracias.

sbit led  at PORTC.b2 ;     //  puerto para led
sbit pled at TRISC.b2 ;     // configura puerto como salida
char  mensaje[8] ;

unsigned short xx = 0;

void interrupt()  {       //

     if(PIR1.RC1IF == 1){
             PIR1.RC1IF = 0 ;
             mensaje[xx] = UART1_Read();
             if(mensaje[xx] == '-'){xx = 0 ; }
             if(xx<sizeof(mensaje)){xx++;}

     }


}


void main() {

    ANSELA = 0xff ;            // entradas analogicas habilitadas
    ANSELB = 0x00 ;            // puertos  digitales habilitadas
    ANSELC = 0x00 ;            // puertos  digitales habilitadas
    TRISC =  0b10000000 ;      // RX entrada y TX salida
    pled = 0 ;                 // puerto led salida


    C1ON_bit = 0;               // comparadores deshabilitados
    C2ON_bit = 0;

    UART1_Init(9600);           // inicio uart1 9600
    delay_ms(100) ;


    INTCON = 0b11000000 ;       // configuracion registros para la interrupcion
    PIR1.RC1IF = 0 ;            // se borra flap
    PIE1.RC1IE = 1 ;            // se habilita interrupcion de recepcion
    IPR1.RC1IP = 0 ;            // interrupcion alta prioridad


   while(1){
     asm clrwdt ;

    if(strstr(mensaje,"on")> 0){
        led= 1 ;                 // enciende led
        delay_ms(2000) ;
        led = 0 ;                // apaga led
        delay_ms(2000) ;
       
        for(xx = 0 ; xx<sizeof(mensaje); xx++){mensaje[xx] = 0 ;}    // borra string recibido
        xx = 0 ;                                                     // variable a cero
   
     }

}} :?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion en recepcion usando uart1?
« Respuesta #1 en: 18 de Marzo de 2021, 18:58:49 »
Algunas cosas


- Configura correctamente los bit de configuraciones ( FUSES )
- Configura correctamente la velocidad del oscilador EN TU COMPILADOR, porque para que calcule correctamente los baudios, necesita saber bien bien cual es la frecuencia.
- el WDT

Código: C
  1. while(1){
  2.      asm clrwdt ;
  3.  
  4.     if(strstr(mensaje,"on")> 0){
  5.         led= 1 ;                 // enciende led
  6.         delay_ms(2000) ;
  7.         led = 0 ;                // apaga led

Si tenes activado el WDT, apenas entre a ese if, el led va a estar muy poco tiempo encendido, ya que 2000ms es muchisimo y va a actuar el WDT antes.

Código: C
  1. void interrupt()  {       //
  2.  
  3.      if(PIR1.RC1IF == 1){
  4.              PIR1.RC1IF = 0 ;
  5.              mensaje[xx] = UART1_Read();
  6.              if(mensaje[xx] == '-'){xx = 0 ; }
  7.              if(xx<sizeof(mensaje)){xx++;}
  8.      }
  9. }

Cuando usas UART1_Read() , es decir lees el registro RXREG, se borra automáticamente la bandera.


-------------------

Ahora pasemos a como lees los datos que llegan...

Si vas a simplemente buscar un "ON" podes comenzar a revisar los datos desde que llegan...

Código: C
  1. mensaje_a_escuchar[]="on";
  2. unsigned short indice=0;
  3.  
  4. void interrupt()  {       //
  5.  
  6.      if(mensaje_a_escuchar[indice] == UART1_Read()){
  7.              indice++;
  8.              if(indice == sizeof(mensaje_a_escuchar){llego=1}
  9.      } else  {
  10.      indice = 0;
  11.      }
  12. }

En tu main podes

Código: C
  1. while(1){
  2.  
  3.     if(llego){
  4.         led= 1 ;                 // enciende led
  5.         delay_ms(2000) ;
  6.         led = 0 ;                // apaga led
  7.         delay_ms(2000) ;
  8.         llego = 0;
  9.      }
  10. }

Y deshabilitar el WDT, debido a esos eternos delays.
« Última modificación: 18 de Marzo de 2021, 19:03:33 por KILLERJC »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Interrupcion en recepcion usando uart1?
« Respuesta #2 en: 18 de Marzo de 2021, 19:29:41 »
O eliminar esos “eternos delays  :D” por un control con timer e interrupción.


 

anything