Bonjour,
j'utilise un PIC18F6722 pour réaliser une communication RS485 MODBUS, la réception et l'envoi se passe correctement, mais la détection se fait par polling:
Et je voudrais réaliser la détection par interruption, mais je ne vois pas comment réaliser cela. Vu que j'ai déja une génération d'IT par un TImer, comment ça se passe pour la priorité?Code:for(;;) { if (RCIF) { fonction =ReadMBFrame(); if (fonction == 3) readRegResponse(); else writeBadRequest(fonction); ENABLE_DRIVER_RS485 = 0; } }
Pour ma part, je déclare une interruption toujours comme cela:
Pourriez me dire comment faire pour le module EUSUART (module de gestion de COM ext) ?Code:#pragma interrupt DEMARRAGE void DEMARRAGE(void) { if (RCONbits.TO == 0) // Test du drapeau d'IT du WDT { _asm RESET _endasm } if(INTCON3bits.INT1IE) // Présence d'un interruption sur INT1 { if(INTCON3bits.INT1IF) // Si le flag d'INT est activé { myState = START; // Démarrage du programme INTCON3bits.INT1IF=0; // Effacement du flag d'interruption } } if(INTCON3bits.INT3IE) // Présence d'un interruption sur INT3 { if(INTCON3bits.INT3IF) // Si le flag d'INT est activé { LCD_ONOFF = 0; BACKLIGHT = 0; INTCON3bits.INT3IF=0; } } if(INTCONbits.TMR0IE) // Présence d'un interruption sur Timer0 { if(INTCONbits.TMR0IF) // Si le flag INT du Timer est activé { TMR0H = 0xE1; // Valeur pour obtenir un Timer de 400ms TMR0L = 0x7C; // Valeur pour obtenir un Timer de 400ms flagIT_Backlight++; // Incrémentation de la variable flagIT_Backlight flagIT_ScreenStandby++; // Incrémentation de la variable flagIT_ScreenStandby flagIT_400ms = 1; // Mise à 1 du flag Timer 400ms flagIT_GEStart++; INTCONbits.TMR0IF = 0; // Effacement du flag d'interruption } } } #pragma code high_vector=0x08 void TIMER_400MS(void) { _asm goto DEMARRAGE _endasm } #pragma code
MErci d'avance
-----