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 :

Interruption sur RB0 [langage C]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut Interruption sur RB0 [langage C]
    Bonjour,

    je ouvre une nouvelle discussion, car le titre de ma dernière n'attire pas trop l'attention..
    Je suis débutant en C, et je souhaite réaliser un petit programme tout simple(je pensais) qui me permettrai comprendre un peu plus le fonctionnement des interruptions, pour cela je veux réaliser un ptit prog qui après un appui sur un BP branché sur RB0, cela allume une LED sur RB3 et suite a un autre appui sur le bouton poussoir, elle séteint et ainsi de suite...
    J'ai écris le programme suivant mais il ne fonctionne pas...savez vous d'ou cela peut il venir??
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    //fichier de declaration des registres internes du microcontroleur
    #include <p18f4682.h>
    #include <portb.h>    /* for the RB0/INT0 interrupt */
     
    //Déclaration des PORTXbits.RXX utilisés
    #define LED_ON PORTBbits.RB3
     
    //Configuration Bits
    #pragma config OSC = HS			//Config du type de l'oscillateur
     
     
    int ledstatut=0;
     
     
    //Sous programmes
    void init_uc(void);
    void ChargeurON (void);
     
     
     
    /* fonction interruption */
    void ChargeurON(void);
     
    // on déclare que lors d'une interruption
    #pragma code highVector=0x008
    void atInterrupthigh(void)
    {
    // on doit éxecuter le code de la fonction MyHighInterrupt
    _asm GOTO ChargeurON _endasm		
    }
    #pragma code // retour à la zone de code
     
    // ************************
    // ****  Interruptions ****
    // ************************
    #pragma interrupt ChargeurON 
    void ChargeurON(void)
    {
    if(ledstatut==0)
    {
    LED_ON=1;
    }
     
    if(ledstatut==1)
    {
    LED_ON=0;
    }
     
    ledstatut=LED_ON;
     
    INTCONbits.RBIF = 0; // Clear PORTB Interrupt Flag. 
    }
     
     
    /***************************************************************************
    *********************Programme Principal************************************
    ***************************************************************************/
    void main (void)
    {
    init_uc();				//Appel SP Initialisation du microcontroleur
     
    while(1)
    {
    OpenRB0INT (PORTB_CHANGE_INT_ON & /* enable the RB0/INT0 interrupt */
                  PORTB_PULLUPS_ON &    /* configure the RB0 pin for input */
                  FALLING_EDGE_INT);    /* trigger interrupt upon S3 button
                                           depression */
     
    PORTBbits.RB2=1;
     
     
    }
    }//Fin Programme Principal
     
     
     
     
     
    /***************************************************************************
    Nom   : void init_uc(void)
    Role  : Configuration et initialisation des Ports E/S
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void init_uc(void)
    {
     TRISA=0x00;					// PORTA en sortie
     TRISB=0x03;					// RB7-RB2 en sortie RB1-RB0 en entrée
     TRISC=0x1F;					// RC7-RC5 en sortie RC4-RC0 en entrée
     TRISD=0x4F;					// PORTD en sortie sauf RD7 RD5 RD4
     TRISE=0x00;					// PORTE en sortie
     
     PORTA=0x00;
     PORTB=0x00;
     PORTC=0x00;
     PORTD=0x00; 
     PORTE=0x00;
     
     ADCON1=0b00001111;				//Configuration du portA en numérique
    }
    Je vous remercie d'avance pour votre aide...
    Nicolas

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    As-tu essayé un programme simple avant de commencer avec les interruptions?

    -Je ferai un petit programme qui fait clignoter la LED.
    -Ensuite un autre qui copie l'état d'un BP vers la LED (mécanisme de polling).
    -Et enfin un programme qui utilise les interruptions.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Bonjour,

    je te remercie de t'intéresser au mon problème...
    J'ai quelques connaissance en programmation comme l'écriture sur LCD, le clignotement d'une led ,... mais je n'avais jamais utilisé les interruptions et ce que je veux faire enfait, j'ai une carte et je voudrais gérer le fonctionnement de ma carte avec un BP sur RB0
    1/Initialisation de la carte
    2/Mode Sleep du PIC
    3/et si appui sur BP(->interruption sur RB0)
    4/Programme lancé...
    5/et si je rappui sur le BP -> mode Sleep

    Mais avant ça je veut juste allumé et éteindre une LED...
    Je ne voulais pas trop me compliqué...
    As tu vu des erreurs dans programmes..(je pense qu'il y en a car ça ne fonctionne pas... )
    Merci encore
    Nicolas

  4. #4
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    mes corrections de ton code (mon code est non testé)

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    //fichier de declaration des registres internes du microcontroleur
    #include <p18f4682.h>
    #include <portb.h>    /* for the RB0/INT0 interrupt */
     
    //Déclaration des PORTXbits.RXX utilisés
    /* -fm- LED sur sortie sur Bit3 de port B */
    /* -fm- Nom de LED_ON pas très heureux */
    #define LED_ON PORTBbits.RB3
     
    //Configuration Bits
    #pragma config OSC = HS			//Config du type de l'oscillateur
     
    /* -fm- ajout du mot static */
    static int ledstatut=0;
     
    //Sous programmes
    void init_uc(void);
    void ChargeurON (void);
     
    /* fonction interruption */
    /* -fm- le prototype de la fonction déjà déclaré */
    /* void ChargeurON(void); */
     
    // on déclare que lors d'une interruption
    #pragma code highVector=0x008
    void atInterrupthigh(void) {
      // on doit éxecuter le code de la fonction MyHighInterrupt
      _asm GOTO ChargeurON _endasm		
    }
    #pragma code // retour à la zone de code
     
    // ************************
    // ****  Interruptions ****
    // ************************
    /* -fm- nom de fonction pas très heureux: basculeLED*/
    #pragma interrupt ChargeurON 
    void ChargeurON(void) {
      if ( ledstatut == 0) {
        LED_ON = 1;
        ledstatut = 1;
      }
      /* -fm - nous avons qu'une état possible */
      else if (ledstatut == 1) {
        LED_ON=0;
        ledstatut = 0;
      }
     
      /* -fm- pas sûr qu'en lisant le registre, on obtienne l'état de la LED*/
      /* ledstatut=LED_ON; */
     
      INTCONbits.RBIF = 0; // Clear PORTB Interrupt Flag. 
    }
     
     
    /***************************************************************************
    *********************Programme Principal************************************
    ***************************************************************************/
    void main (void) {
      init_uc();				//Appel SP Initialisation du microcontroleur
     
      /* -fm- On initialise le port qu'une seule fois */
      OpenRB0INT (PORTB_CHANGE_INT_ON & /* enable the RB0/INT0 interrupt */
                        PORTB_PULLUPS_ON &    /* configure the RB0 pin for input */
                        FALLING_EDGE_INT);    /* trigger interrupt upon S3 button                                        depression */
     
      /* -fm - Que fait cette instruction? */
      PORTBbits.RB2=1;
     
      while(1){
        /* -fm- on boucle en attendant l'interruption*/
      }
    }//Fin Programme Principal
     
     
    /***************************************************************************
    Nom   : void init_uc(void)
    Role  : Configuration et initialisation des Ports E/S
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void init_uc(void) {
      TRISA=0x00;					// PORTA en sortie
      TRISB=0x03;					// RB7-RB2 en sortie RB1-RB0 en entrée
      TRISC=0x1F;					// RC7-RC5 en sortie RC4-RC0 en entrée
      TRISD=0x4F;					// PORTD en sortie sauf RD7 RD5 RD4
      TRISE=0x00;					// PORTE en sortie
     
      PORTA=0x00;
      PORTB=0x00;
      PORTC=0x00;
      PORTD=0x00; 
      PORTE=0x00;
     
      ADCON1=0b00001111;				//Configuration du portA en numérique
    }

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Je te remercie...
    j'ai testé le code que tu m'as corrigé, et cela ne marche toujours pas, je vais regarder ce que tu as corriger et le fonctionnement.
    Si tu trouve autre chose, je suis preneur..
    Encore merci de ton aide
    Nicolas

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Personne n'aurai un petit exemple d'interruption, qui pourrait m'aider a continuer sur mon projet.
    Je n'arrive pas a voir pourquoi cela ne marche pas...
    Merci pour votre aide

    Nicolas

  7. #7
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Bonjour,
    je sais que c'est mieux de faire ses programmes tout seul(ça permet de mieux comprendre...)mais je suis vraiment bloqué...et ça depuis lundi, impossible de faire un programme qui marche...c'est pourtant pas bien compliqué(enfin c'est ce que je pensai) alors si quelqu'un peut venir a mon secours...
    Je lui serai tres reconnaissant...
    Encore merci
    Nicolas

  8. #8
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Peux-tu nous dire si ce programme fonctionne?

    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
     
    #include <delays.h> // fonctions de délais
    //fichier de declaration des registres internes du microcontroleur
    #include <p18f4682.h>
    #include <portb.h>    /* for the RB0/INT0 interrupt */
     
    //Déclaration des PORTXbits.RXX utilisés
    #define OUT_LED PORTBbits.RB3
     
    // Configuration Bits
    #pragma config OSC = HS			//Config du type de l'oscillateur
     
    /***************************************************************************
    Nom   : void init_uc(void)
    Role  : Configuration et initialisation des Ports E/S
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void init_uc(void) {
      TRISA=0x00;					// PORTA en sortie
      TRISB=0x03;					// RB7-RB2 en sortie RB1-RB0 en entrée
      TRISC=0x1F;					// RC7-RC5 en sortie RC4-RC0 en entrée
      TRISD=0x4F;					// PORTD en sortie sauf RD7 RD5 RD4
      TRISE=0x00;					// PORTE en sortie
     
      PORTA=0x00;
      PORTB=0x00;
      PORTC=0x00;
      PORTD=0x00; 
      PORTE=0x00;
     
      ADCON1=0b00001111;				//Configuration du portA en numérique
    } 
    /***************************************************************************
    *********************Programme Principal************************************
    ***************************************************************************/
    void main (void) {
      int etatLED = 0;
     
      /* Appel SP Initialisation du microcontroleur */
      init_uc();				
     
      while (1) {
        if (etatLED == 0) {
         etatLED = 1;
        }
        else {
         etatLED = 0;
        }
        OUT_LED = etatLED;
     
        /* On temporise (a voir en fonction de le fréquence de l'horloge) */ 
        Delay10KTCYx(0);
     
      }
    }//Fin Programme Principal

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Bonjour tout le monde,

    personne na de petite idée ce matin pour mon début dans les interruptions..?

    Bonne journée

    Nicolas

  10. #10
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    salutations, je travaille sur deux PIC18 (F4550 et F452) avec SDCC

    et dans la datasheet, concernant l'interrupt on change du PORTB
    on peux y lire:
    Citation Envoyé par datasheet 18f4550
    9.9 PORTB Interrupt-on-Change
    An input change on PORTB<7:4> sets flag bit, RBIF
    (INTCON<0>). The interrupt can be enabled/disabled
    by setting/clearing enable bit, RBIE (INTCON<3>).
    Interrupt priority for PORTB interrupt-on-change is
    determined by the value contained in the interrupt
    priority bit, RBIP (INTCON2<0>).
    à priori, l'interruption n'est levé que s'il y'as changement sur les pins 7 à 4.

    vérifie la datasheet de ton PIC, mais à priori ça ne dois pas être bien different

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    salut

    ca faisait aussi 2 jours que je cherchais à faire marcher les interruptions externes et ca y est j'ai trouvé.

    (saloperie va... encore une grande victoire de l'homme sur la machine)

    tu dois mettre le configuration bit
    "PORTB A/D Enable" à la valeur "PORTB 4:0 configured as digital I/O on reset"

    a+

Discussions similaires

  1. Informations sur les langages/outils de ce forum
    Par Idelways dans le forum Autres langages
    Réponses: 3
    Dernier message: 14/02/2018, 12h08
  2. livres sur le langage
    Par Bibouda dans le forum C
    Réponses: 12
    Dernier message: 14/02/2006, 01h56
  3. Participez aux meilleurs débats sur le langage C
    Par Franck.H dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/12/2005, 11h40
  4. [débat] Reflexion sur « quel langage ?»
    Par jack69 dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 23/05/2005, 08h30

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