IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Générer une interruption PIC18F458


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut Générer une interruption PIC18F458
    Bonjour à tous,

    je cherche à me familiariser avec les interruptions sur PIC18F,

    j'ai fait un bout de code qui ne fonctionne pas correctement en simulation sur MPLAB, je n'arrive plus à ressortir de l'interruption.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <p18f458.h>
     
     
    #define led1 PORTAbits.RA0
    #define led2 PORTAbits.RA1	
    #define led3 PORTAbits.RA2
    #define led4 PORTAbits.RA3
    #define inter1 PORTBbits.RB5
     
     
    void InterruptHandlerHigh (void);
     
     
    //---------------------------------interruption------------------------
    #pragma code InterruptVectorHigh = 0x08
    void
    InterruptVectorHigh (void)
    {
      _asm
        goto InterruptHandlerHigh //jump to interrupt routine
      _endasm
    }
     
    //------------------------------------------------------------------------
    // High priority interrupt routine
     
    #pragma code
    #pragma interrupt InterruptHandlerHigh
     
    void
    InterruptHandlerHigh ()
    {
      if (INTCONbits.RBIF)
        {                                   
          INTCONbits.RBIF = 0;            // mise à 0 du flag c'est ici le pb !
    	led3=1;
    	led4=1;
    	led1=0;
    	led2=0;
        }
    }
     
     
     
     
    //------------programme_principal------------------------------------------
     
    void main (void)
    {
    	TRISB=0xFF*; // PORTB en entrée
    	ADCON1=0x07; // PORTA en digital
    	TRISA=0x00; // PORTDA en sortie
    	PORTA=0x00;
     
    	INTCON=0b10001000; // autorisation des interruptions sur RB4 à RB7
    	while(1)
    	{
    	led3=0;
    	led4=0;
    	led1=1;
    	led2=1;
    	}
     
     
    }
    une petite explication du fonctionnement supposé, à la mise sous tension les LEDS 1 et 2 s'allument, dés qu'il y a une interruption sur RB5 par exemple les LEDS 1 et 2 s'éteignent et les LEDS 3 et 4 s'allument.

    mon problème est que cette action INTCONbits.RBIF = 0; ne s'effectue pas, j'arrive pas à remettre RBIF à 0 donc je peux pas ressortir de mon interruption.

    avez vous une idée ?

    merci.

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    ne devrais tu pas autoriser de nouvelles interruption qu'a la fin de ta routine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void
    InterruptHandlerHigh ()
    {
      if (INTCONbits.RBIF)
        {                                   
     
    	led3=1;
    	led4=1;
    	led1=0;
    	led2=0;
        }
      INTCONbits.RBIF = 0;            // mise à 0 du flag c'est ici le pb !
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut
    tout d'abord merci de ta réponse,

    j'avais déjà essayer de supprimer le flag en fin de routine mais cela n'a pas marché,

    j'ai même essayé de le répéter plusieurs fois

    INTCONbits.RBIF=0;
    INTCONbits.RBIF=0;
    INTCONbits.RBIF=0;

    rien à faire ce satané RBIF reste à 1.

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Es-tu sûr que ça compile sans erreur? Un goto vers un label hors de la fonction courante me parait un peu violent. En plus un goto n'empile pas d'adresse de retour. Est-ce qu'en pas par pas dans ta simulation tu entres bien dans InterruptHandlerHigh ?

    A+

    Pfeuh

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut
    je compile sans erreurs,

    pour le goto j'ai juste utilisé la syntaxe qui est donné dans un fichier type de C18 pour definir les interruptions.

    je rentre bien dans InterruptHandlerHigh dés l'interruption sur RB5, j'ai verifié en mode pas à pas, par contre après impossible d'en sortir, j'observe RBIF avec le watch et il reste à 1 malgré l'instruction de remise à 0.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut
    toujours pas trouvé

Discussions similaires

  1. [ImageMagick] Générer une image à partir de plusieurs images ?
    Par fichtre! dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 16/02/2005, 15h32
  2. Détournement d'une interruption
    Par Invité dans le forum Assembleur
    Réponses: 18
    Dernier message: 16/02/2005, 13h49
  3. [ImageMagick] Comment générer une image d'un code à entrer ?
    Par MiJack dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 16/01/2005, 21h29
  4. Réponses: 2
    Dernier message: 14/07/2004, 16h55
  5. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo