Je travaille sur un UART piloté par interruption sur un appareil PIC24FJ256GB606. Mon code fonctionne très bien sauf que l'interruption de réception UART est faussement déclenchée pour la première fois: par ex. routine principale est: [code]PIC24FJ Fausse alarme déclenchée lors de la première exécution
int main(){
System_init();
uart_init();
// UART2_PPS
RPINR19bits.U2RXR= 21;
RPOR13bits.RP26R = 5;
TRISGbits.TRISG6 = 1;
TRISGbits.TRISG7 = 0;
uart_puts("\n**********************************************");
uart_puts("\nMy project ");
uart_puts("\n x");
uart_puts("\n x");
uart_puts("\n"__DATE__);
uart_puts("\n**********************************************");
return -1;
}
}
[/ code]
ISR est:
[code]void __attribute__ ((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF = 0;
uart_puts("False Trigger");
__delay_ms(1000);
}[/code]
Initialisation est:
[![\[code\]int uart_init()
{
int status = -1;
size_t i;
// STSEL 1; IREN disabled; PDSEL 8N; UARTEN enabled; RTSMD disabled; USIDL disabled; WAKE disabled; ABAUD disabled; LPBACK disabled; BRGH enabled; URXINV disabled; UEN TX_RX;
U2MODE = 0x8008;
// OERR NO_ERROR_cleared; URXISEL RX_ONE_CHAR; UTXBRK COMPLETED; UTXEN disabled; ADDEN disabled; UTXISEL0 TX_ONE_CHAR; UTXINV disabled;
U2STA = 0x0000;
// U2TXREG 0;
U2TXREG = 0x0000;
// BaudRate = 9600; Frequency = 4000000 Hz; U2BRG 103;
U2BRG = 0x0067;
// ADMADDR 0; ADMMASK 0;
U2ADMD = 0x0000;
rb_attr_t attr = {sizeof(_rbmem\[0\]), ARRAY_SIZE(_rbmem), _rbmem};
if (ring_buffer_init(&_rbd, &attr) == 0) {
U2MODEbits.UARTEN = 1; // And turn the peripheral on
U2STAbits.UTXEN = 1; //UART2 Transmit Enable
IFS1bits.U2RXIF = 0; //_U2RXIF = 0;
IEC1bits.U2RXIE = 1; //_U2RXIE = 1;
status = 0;
}
return status;
}\[/code\]][1]][1]
s'il vous plaît voir l'image ci-jointe et envisager de suivre, 1) microcontrôleur On ne s'attend pas à recevoir quoi que ce soit à ce stade. J'ai essayé d'exécuter le même code en laissant la ligne rx ouverte j'ai obtenu le même résultat. 2) Ce code fonctionne très bien si je désactive l'interruption de réception IEC1bits.U2RXIE = 0;
Je suis flou sur les détails du PIC24 mais la séquence d'initialisation de la broche en retard semble un peu louche. Je ne serais pas surpris si l'installation de routage RxD tardive entraîne un état initial bas sur l'entrée périphérique, ce qui entraîne l'interprétation du problème comme un bit de départ. Essayez de le déplacer. – doynax