Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Interruption de basse priorité ne s'execute jamais.
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#1 Message par Superphénix » mar. 10 janv. 2023 19:58 lien vers la Data-Sheet : Cliquez ici

Bonjour

J'ai créé deux interruptions avec deux priorités différents.
L'interruption à haute priorité marche toujours, mais le programme ne rentre jamais dans celle de basse priorité.

Voilà mon code :

Code : Tout sélectionner

#include <XC.h>
#include <stdio.h>
#include <stdlib.h>

#pragma config OSC = INTIO67
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config BOREN = OFF
#pragma config MCLRE = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config STVREN = OFF

#define _XTAL_FREQ 4000000
#define BP_A PORTBbits.RB4   // RB4 et RB5 = boutons poussoires
#define BP_B PORTBbits.RB5
#define LED PORTCbits.RC5

void __interrupt(high_priority) Interrupt_Routine_H (void)
{
    if(INTCONbits.TMR0IF) // Si overflow Timer0
        {
            TMR0H = 243 ;         // Timer = 0.1s (si prescal=1:32)
            TMR0L = 203 ;         // Timer = 0.1s (si prescal=1:32)
            
            INTCONbits
.TMR0IF = 0 ; // Clear overflow flag Timer0
        }
}

void __interrupt(low_priority) Interrupt_Routine_L (void)
{
    if(INTCONbits.RBIF) // Si overflow changement sur Prot B
    {
        if(BP_A==0) { LED = 0 ; while(BP_A==0){} }
        if(BP_B==0)  { LED = 1 ; while(BP_B==0){} }
        INTCONbits.RBIF = 0 ; // Clear overflow flag PORTB
    }
}

int main(int argc, char** argv) 
{
    TRISA    = 0b00000001 ;
    TRISB    = 0b00111100 ;
    TRISC    = 0b00000000 ;
    PORTA   = 0b00000000 ;
    PORTB   = 0b00000000 ;
    PORTC   = 0b00000000 ;
    INTCON  = 0b10101000 ;
    INTCON2 = 0b00000100 ;
    T0CON   = 0b10000100 ;
    TMR0H   = 243 ; // Timer = 0.1s (si prescal=1:32)
    TMR0L   = 203 ; // Timer = 0.1s (si prescal=1:32)
    OSCCON = 0b01100010 ; //4MHz
    
    while
(1)
    {
        __delay_ms(1000) ;
    }
    
    return 
(EXIT_SUCCESS);
}


Si je place ceci :

Code : Tout sélectionner

if(INTCONbits.RBIF) // Si overflow changement sur Prot B
    {
        if(BP_A==0) { LED = 0 ; while(BP_A==0){} }
        if(BP_B==0)  { LED = 1 ; while(BP_B==0){} }
        INTCONbits.RBIF = 0 ; // Clear overflow flag PORTB
    }

dans celle de haute priorité, et que je mets RBIP à 1, alors le programme s'exécute et j'arrive dans l'exemple à allumer ou éteindre la LED.

PS: J'aurais dû utiliser les pins pour faire des external interrupt pour choisir front descendant, mais vu que j'ai déjà mon PCB c'est trop tard maintenant.

Merci d'avance.
Modifié en dernier par Superphénix le mar. 10 janv. 2023 20:41, modifié 1 fois.

Interruption de basse priorité ne s'execute jamais.
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » mar. 10 janv. 2023 20:34 lien vers la Data-Sheet : Cliquez ici

Je sais pas si j'ai bien compris la question, pour utiliser les priorités dans les interruptions, il faut faire IPEN=1 (par défaut IPEN = 0, compatibilité avec 16F, pas de priorité, une seule int en 08h).
Ensuite il faut autoriser les 2 priorités d'interruption haute et basse avec GIEH=1et GIEL=1.
L'ISR 08h de priorité haute interrompt l'ISR de priorité basse en cours d'exécution.
L'ISR 18h de priorité basse attend que l'ISR de priorité haute en cours d'exécution soit terminée pour se lancer.

Interruption de basse priorité ne s'execute jamais.
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#3 Message par Superphénix » mar. 10 janv. 2023 22:12 lien vers la Data-Sheet : Cliquez ici

Oupsi.. Je pensais avoir tout vérifié. C'était effectivement ça qui posait problème.
Merci!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités