TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: eloeloelo en 15 de Febrero de 2012, 14:47:19

Título: USART por interrupción - C18
Publicado por: eloeloelo 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.
   
Título: Re: USART por interrupción - C18
Publicado por: Miquel_S 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!
Título: Re: USART por interrupción - C18
Publicado por: eloeloelo 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.
Título: Re: USART por interrupción - C18
Publicado por: irukza 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.
Título: Re: USART por interrupción - C18
Publicado por: eloeloelo 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
Título: Re: USART por interrupción - C18
Publicado por: Miquel_S 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!