Autor Tema: USART por interrupción - C18  (Leído 2933 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado eloeloelo

  • PIC10
  • *
  • Mensajes: 6
USART por interrupción - C18
« en: 15 de Febrero de 2012, 14:47:19 »
Hola!, recurro a su ayuda porque no he podido hacer andar el módulo USART por interrupción.
Les comento que es lo que quiero hacer: quiero mandar un dato por puerto serie, hacer otras cosas hasta que me llegue la respuesta generando una interrupción, atenderla, mandar el siguiente comando y mintras espero la siguiente respuesta seguir con el programa.
el código que armé en la interrupcion es:

    #pragma interruptlow LowISR
    void LowISR(void)
   {   INTCONbits.GIEH = 0;      // Disables all high-priority interrupts
       INTCONbits.GIEL = 0;      // Disables all low-priority interrupts
       //***Adquiero Datos SAS***   
      if(PIR1bits.RC1IF==1)
      {   LED1_IO =1;
         
         getsUSART((BYTE*)Datos[0],Longitud);
         
         LED2_IO =1;
            
         strncat(PaqueteTCP,(BYTE*)Datos[0],Longitud);
         for(j=0;j<Longitud;j++)
         { Datos[j]='\0';
         }
         j=0;
         i++;         
         if (i==NroCom)
         { i=0;
           PaqueteListo=1;
         }
         putcUART((BYTE)Comando);
         
                  
         PIR1bits.RC1IF = 0;
      }
      LED5_IO ^=1;
      TickUpdate();
      
      INTCONbits.GIEH = 1;      // Enables all high-priority interrupts
       INTCONbits.GIEL = 1;      // Enables all low-priority interrupts       
   }
    #pragma interruptlow HighISR
    void HighISR(void)
   {
   }
   
     #pragma code lowVector=0x18
    void LowVector(void){_asm goto LowISR _endasm}
    #pragma code highVector=0x8
    void HighVector(void){_asm goto HighISR _endasm}
    #pragma code


El problema es que me queda en la línea subrrayada, prové con getcUSART y un for, pero tampoco anduvo, las vbles son globales y las valores de comando y longitud los cargo cuando inicio el programa.
Muchas gracias por adelantado y gracias por su tiempo.
   
Leo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: USART por interrupción - C18
« Respuesta #1 en: 15 de Febrero de 2012, 15:09:25 »
Hola eloeloelo te paso un codigo que funciona sin fallos por si quieres revisarlo.
Código: C
  1. /**************************************************************************************/
  2. /* ** Prueba de comunicacion del modulo USART con Interrupcion de Alta Prioridad
  3. /* ** Encendemos 2 leds conectados al PORTB bits <0:1>
  4. /* ** LED ROJO ----> RB0
  5. /* ** LED AZUL ----> RB1
  6. /* ** Letra R ----> Led Rojo
  7. /* ** Letra A ----> Led Azul
  8.  
  9. /* ** Autor: Miquel Servera
  10. /* ** Fecha: 15-Febrero-2012
  11. /* ** Modelo de Micro: PIC18F4550
  12. /* ** Velocidad del Micro: 48MHz
  13.  
  14. /*************************************************************************************/
  15.  
  16. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  17.  
  18. #include <p18f4550.h>
  19.  
  20. /* ** Include para el USART ** */
  21.  
  22. #include <usart.h>
  23.  
  24. /* ** Configuracion de los Fuses del microcontrolador ** */
  25.  
  26. #pragma config PLLDIV   = 5         // (20 MHz crystal )
  27.     #pragma config CPUDIV   = OSC1_PLL2  
  28.     #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
  29.     #pragma config FOSC     = HSPLL_HS
  30.     #pragma config FCMEN    = OFF
  31.     #pragma config IESO     = OFF
  32.     #pragma config PWRT     = OFF
  33.     #pragma config BOR      = ON
  34.     #pragma config BORV     = 3
  35.     #pragma config VREGEN   = ON      //USB Voltage Regulator
  36.     #pragma config WDT      = OFF
  37.     #pragma config WDTPS    = 32768
  38.     #pragma config MCLRE    = ON
  39.     #pragma config LPT1OSC  = OFF
  40.     #pragma config PBADEN   = OFF
  41. //  #pragma config CCP2MX   = ON
  42.     #pragma config STVREN   = ON
  43.     #pragma config LVP      = OFF
  44. //  #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
  45.     #pragma config XINST    = OFF       // Extended Instruction Set
  46.     #pragma config CP0      = OFF
  47.     #pragma config CP1      = OFF
  48. //  #pragma config CP2      = OFF
  49. //  #pragma config CP3      = OFF
  50.     #pragma config CPB      = OFF
  51. //  #pragma config CPD      = OFF
  52.     #pragma config WRT0     = OFF
  53.     #pragma config WRT1     = OFF
  54. //  #pragma config WRT2     = OFF
  55. //  #pragma config WRT3     = OFF
  56.     #pragma config WRTB     = OFF       // Boot Block Write Protection
  57.     #pragma config WRTC     = OFF
  58. //  #pragma config WRTD     = OFF
  59.     #pragma config EBTR0    = OFF
  60.     #pragma config EBTR1    = OFF
  61. //  #pragma config EBTR2    = OFF
  62. //  #pragma config EBTR3    = OFF
  63.     #pragma config EBTRB    = OFF
  64.  
  65. /* ** Declaracion de Funciones a utilizar ** */
  66.  
  67. void ISRRecepcion(void);
  68.  
  69. /* ** Variables de uso general ** */
  70.  
  71. volatile char Dato,kbhit;
  72.  
  73. /* ** Seccion de codigo a partir de la direccion 0x0008 ** */
  74.  
  75. #pragma code interrupcion = 0x0008
  76. void VectorInterrupcion(void)
  77. {
  78. _asm goto ISRRecepcion _endasm
  79. }
  80. #pragma code // Cerramos seccion.-
  81. /* ** Rutina de Interrupcion ** */
  82.  
  83. #pragma interrupt ISRRecepcion
  84. void ISRRecepcion(void)
  85. {
  86. if(PIR1bits.RCIF==1)
  87. {
  88.         Dato=getcUSART(); // Leemos dato recibido.-
  89.         kbhit=1; // Indicamos que se ha recibido un dato.-
  90.         PIR1bits.RCIF=0; // Borramos flag.-
  91. }
  92. }
  93.  
  94. /* ** Funcion MAIN ** */
  95.  
  96. void main(void)
  97. {
  98.         TRISB=0x00;
  99.         LATB=0x00;
  100.  
  101.         OpenUSART( USART_TX_INT_OFF &
  102.                            USART_RX_INT_ON &
  103.                            USART_ASYNCH_MODE &
  104.                            USART_EIGHT_BIT &
  105.                            USART_CONT_RX &
  106.                            USART_BRGH_HIGH,155); // 19.200 baudios.-
  107.  
  108.         kbhit=0;
  109.  
  110.         RCONbits.IPEN=0; // Desabilitamos Prioridades.-
  111.         INTCONbits.PEIE=1; // Habilitamos Interrupcion de perifericos.-
  112.         INTCONbits.GIE=1; // Habilitamos Interrupcion Global.-
  113.  
  114.         putrsUSART("Prueba de Comunicacion USART \r");
  115.         putrsUSART("Seleccione una opcion del Menu \r");
  116.         putrsUSART("\r");
  117.         putrsUSART("R: Led ROJO \r");
  118.         putrsUSART("A: Led AZUL \r");
  119.         putrsUSART("\r");
  120.  
  121.         while(1)
  122.         {
  123.                 while(kbhit==0){}; // Esperamos a recibir dato.-
  124.                 kbhit=0;
  125.                 switch(Dato)
  126.         {
  127.  
  128.         case 0x52: // Letra R.-
  129.                 LATB=0b00000001;
  130.                 putrsUSART("Led ROJO ON \r");
  131.         break;
  132.  
  133.         case 0x41: // Letra A.-
  134.                 LATB=0b00000010;
  135.                 putrsUSART("Led ROJO OFF \r");
  136.                 putrsUSART("Led AZUL ON \r");
  137.         break;
  138.         }
  139.         }
  140. }

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado eloeloelo

  • PIC10
  • *
  • Mensajes: 6
Re: USART por interrupción - C18
« Respuesta #2 en: 15 de Febrero de 2012, 15:53:21 »
gracias por lo rapida de tu respuesta!!!  ((:-)) veo si mas tarde puedo probarlo...
me había olvidado de decir el PIC, es el 18F97J60 en la PICDem.Net 2.
Leo

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: USART por interrupción - C18
« Respuesta #3 en: 15 de Febrero de 2012, 16:24:48 »
Hola eloeloelo

Pareciera ser que no llega la cantidad de bytes que indicas en longitud. Tené en cuenta que esta función no tiene time out así que se va a quedar esperando que le lleguen todos los carcteres. Asegurate de que efectivamente esten llegando todos. Suerte.

Desconectado eloeloelo

  • PIC10
  • *
  • Mensajes: 6
Re: USART por interrupción - C18
« Respuesta #4 en: 16 de Febrero de 2012, 15:04:24 »
Hola eloeloelo

Pareciera ser que no llega la cantidad de bytes que indicas en longitud. Tené en cuenta que esta función no tiene time out así que se va a quedar esperando que le lleguen todos los carcteres. Asegurate de que efectivamente esten llegando todos. Suerte.


Probé poniendo un numero directamente y nada. probé de a un caracter y anda un poco pero la idea es traerme la cadena  desde la interrupción.
Voy a seguir probando y si encuentro la solucion la subo...
De todos modos si alguna tiene alguna otra idea no me enojo ;-) ... ejjejej
Leo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: USART por interrupción - C18
« Respuesta #5 en: 16 de Febrero de 2012, 16:55:53 »
Hola eloeloelo no soy el mas indicado para resolver el problema, no alcanzo a tanto, pero ¿Es correcto desactivar las interrupciones dentro de la interrupcion? ¿No deberia de hacerse dentro del main?

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything