2017-01-21 3 views
0

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;

UART

+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

Répondre

0

Salut Doynax merci pour la réponse. Le code d'initialisation a été généré par MCC et était buggé! J'ai reçu une réponse sur un autre forum:

Salut, Le code d'initialisation pour UART semble avoir été généré par MCC. Malgré cela, il démontre une mauvaise pratique de programmation, en ce sens qu'il active le module avant d'autres opérations de configuration. Ce qui est fait est contraire à ce qui est recommandé dans la fiche technique de cet appareil, et pour tous les autres appareils que j'ai examinés. Section Datasheet 19.2 Transmission en mode données 8 bits et section 19.3 Réception en données 8 bits ou 9 bits Mode: 1. Configuration de l'UARTx: a) Écrivez les valeurs appropriées pour les données, la parité et les bits d'arrêt. b) Écrire la valeur de débit en bauds appropriée dans le registre UxBRG. c) Configurer les bits d'activation et de priorité d'émission et de réception d'interruption. 2. Activez l'UARTx. 2. Activez l'UARTx en définissant le bit URXEN (UxSTA < 12>).

De même, dans le code généré, il y a une écriture dans TXREG = 0000; Ceci permet non seulement d'effacer le registre, mais aussi de mettre en file d'attente la transmission d'un premier octet dans le registre FIFO de l'émetteur.

Regards, Mysil

modification de la séquence d'initialisation résolu le problème!