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++;
}
}
avez-vous essayé juste 'vote' l'UART? Que se passe-t-il, reçoit-il les caractères d'accord? – gbulmer
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
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.' –