2012-04-12 2 views
0

J'ai travaillé avec ce code pendant des jours et je n'arrive pas à comprendre pourquoi mes interruptions ne sont pas déclenchées. Je sais que les données arrivent avec succès parce que j'ai utilisé une sonde sur un analyseur logique, aussi mon débit en bauds est correct car je peux transmettre avec UART avec succès. À ce stade, je suis perdu, j'ai lu la fiche technique encore et encore et je n'arrive pas à comprendre mon problème. Je vais essayer d'inclure seulement le code relatif mais assez pour que vous puissiez voir comment les choses fonctionnent dans mon projet.Aucune interruption n'est déclenchée dans la réception UART sur PIC18F2680

S'il vous plaît laissez-moi savoir si vous voyez des problèmes avec ce code.

Merci!

extraits de code de main.c:

// USART RX interrupt priority 
    IPR1bits.RCIP = 0; 
    IPR1bits.TXIP = 0; 

    // configure the hardware USART device 
    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & 
     USART_CONT_RX & USART_BRGH_LOW, 14); 

extraits de code de interrupts.c

//---------------------------------------------------------------------------- 
    // Low priority interrupt routine 
    // this parcels out interrupts to individual handlers 
    #pragma code 
    #pragma interruptlow InterruptHandlerLow 

    // This works the same way as the "High" interrupt handler 

    void InterruptHandlerLow() { 

    // check to see if we have an interrupt on USART RX 
    if (PIR1bits.RCIF) { 
     PIR1bits.RCIF = 0; //clear interrupt flag 
     uart_recv_int_handler(); 
    } 
    // check to see if we have an interrupt on USART TX 
    if (PIR1bits.TXIF && PIE1bits.TXIE) { 
     // cannot clear TXIF, this is unique to USART TX 
     // so just call the handler 
     uart_tx_int_handler(); 
    } 
    } 

UART RX Interrompre extrait Handler:

void uart_recv_int_handler() { 
     int msgLen; 

     //if (DataRdyUSART()) { 
     uc_ptr->buffer[uc_ptr->buflen] = RCREG; 
     //uc_ptr->buffer[uc_ptr->buflen] = ReadUSART(); 
      uc_ptr->buflen++; 
     } 
    } 
+1

avez-vous essayé juste 'vote' l'UART? Que se passe-t-il, reçoit-il les caractères d'accord? – gbulmer

+0

Je ne l'ai pas encore essayé, je vais pouvoir le tester demain après-midi et vous faire savoir comment ça s'est passé. – J2N

+1

Vous ne montrez pas et ne mentionnez pas les drapeaux d'activation d'interruption globale. La section 9 de la fiche technique indique que pour la stratégie d'interruption par défaut "INTCON <6>" est le bit "PEIE" qui active/ désactive toutes les sources d'interruption périphériques. INTCON <7> ' est le bit' GIE' qui active/désactive toutes interrompent sources. " Si vous avez activé les niveaux de priorité pour vos interruptions ('IPEN'), alors vous devez régler' GIEH' et 'GIEL.' –

Répondre

2

Avez-vous - Set trisC6/7 correctement? - si vous avez une partie avec des entrées analogiques multiplexées sur ces broches, les avez-vous désactivées? - Votre valeur BRG est-elle validée pour cette partie et ces paramètres d'oscillateur?

Voir aussi

http://www.piclist.com/techref/microchip/rs232.htm

J'émigré à DSPIC, mais je l'habitude de faire la réception série sous interruption. Ce I eu dans l'interruption (serialin1 est une puissance de deux tampon circulaire, lastserialin1 le pointeur en elle, et ser1bufinmask est la taille du tampon-1)

if (PIR1bits.RCIF == 1) /* check if RC interrupt (receive USART) must be serviced 
{ 
    while (PIR1bits.RCIF == 1) /* flag becomes zero if buffer/fifo is empty */ 
    { 
     lastserialin1=(lastserialin1+1)&ser1bufinmask; 
     serialin1[lastserialin1]=RCREG; 
    } 
} 

Pour initialiser l'UART I eu:

// Configure USART 
TXSTA = 0x20; // transmit enable 
RCSTA = 0x90; // spen en cren 
RCONbits.IPEN  = 1; /* Interrupt Priority Enable Bit. Enable priority levels on interrupts */ 

INTCONbits.GIE  = 1; /* Set GIE. Enables all high priority unmasked interrupts */ 
INTCONbits.GIEL = 1; /* Set GIEL. Enables all low priority unmasked interrupts */ 

TRISCbits.TRISC6 = 0; // page 237 
TRISCbits.TRISC7 = 1; // page 237 

Open1USART ( 
       USART_TX_INT_OFF 
       & 
      USART_RX_INT_ON & 
      USART_ASYNCH_MODE & 
      USART_EIGHT_BIT &   // 8-bit transmit/receive 
      USART_CONT_RX &    // Continuous reception 
         //    USART_BRGH_HIGH, 155);  // High baud rate, 155 eq 19k2 
      USART_BRGH_HIGH, brgval);  // High baud rate, 25 eq 115k2 

IPR1bits.RCIP  = 0; 
PIR1bits.RCIF  = 0; 

avec brgval calculé en utilisant

 #define GetInstructionClock() (GetSystemClock()/4) 
    #define GetPeripheralClock() GetInstructionClock() 

    // See if we can use the high baud rate setting 
    #if ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) <= 255 
     #define BRGVAL ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) 
     #define BRGHVAL (1) 
    #else // Use the low baud rate setting 
     #define BRGVAL ((GetPeripheralClock()+8*BAUD_RATE)/BAUD_RATE/16 - 1) 
     #define BRGHVAL (0) 
    #endif 
+1

Je crois que c'était le trisC6/7 bits qui m'a fait entrer. Merci! – J2N

Questions connexes