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

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#1 Message par jo7 » jeu. 21 juin 2018 10:30 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

J'aimerais effectuer une interruption avec un bouton-poussoir et une LED mais je n'arrive pas à trouver la méthode pour créer une interruption. J'ai actuellement un programme qui tourne bien mais la fonction d'interruption est plus efficace lorsqu'on a plusieurs sous-programmes à gérer. J'utilise l'outil de développement MPLAB X IDE v4.01 avec un PIC16F18345.
Si vous pouvez m'aider, je suis preneur ! Merci d'avance ! ;)
code actuel:

Code : Tout sélectionner

// CONFIG1
#pragma config FEXTOSC = OFF        // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
#pragma config RSTOSC = HFINT1      // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
#pragma config CLKOUTEN = OFF       // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
#pragma config CSWEN = ON           // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
//#pragma config FCMEN = OFF          // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config MCLRE = ON           // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
#pragma config PWRTE = OFF          // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF           // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
#pragma config LPBOREN = OFF        // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = SBOREN       // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)
#pragma config BORV = LOW           // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
#pragma config PPS1WAY = OFF        // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
#pragma config STVREN = OFF         // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
#pragma config DEBUG = OFF          // Debugger enable bit (Background debugger disabled)

// CONFIG3
#pragma config WRT = OFF            // User NVM self-write protection bits (Write protection off)
#pragma config LVP = ON             // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)

// CONFIG4
#pragma config CP = OFF             // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
#pragma config CPD = OFF            // Data NVM Memory Code Protection bit (Data NVM code protection disabled)

// PORT A
#define ICSPDAT         RA0                     // Port de programmation
#define POWER           RA1                     // Retour d etat charge batterie
#define MCLR            RA3                     // Port de programmation

// PORT B
#define ledR            RB7                     // +LED rouge

// PORT C
#define BP              RC5                     // Bouton poussoir

#include <xc.h>

#define _XTAL_FREQ  8000000                     // Oscillateur réglé à 8MHz

#define ON      0                               // Led tirée au +VCC
#define OFF     1

unsigned char etat_Bp = 0;


void main(void)
{

    // Reglages des entrees/sorties
    TRISA = 0x0B;                         // Choix entrees/sorties
    LATA = 0x00;                          // RAZ des ports
    ANSELA = 0x00;                        // Choix mode analogique/numerique    
    WPUA = 0x02;                          // Resistances de pull-up interne
    
    TRISB 
= 0x00;                         // Choix entrees/sorties
    LATB = 0x80;                          // RAZ des ports
    ANSELB = 0x00;                        // Choix mode analogique/numerique
    WPUB = 0x00;                          // Resistances de pull-up interne 
    
    TRISC 
= 0x20;                         // Choix entrees/sorties
    LATC = 0xC0;                          // RAZ des ports
    ANSELC = 0x18;                        // Choix mode analogique/numerique
    WPUC = 0x20;                          // Resistances de pull-up interne
    
  
    
    while
(1)   // boucle infinie
    {
       if ((etat_Bp <) && (BP == 0)) // Si le bouton est appuyé => niveau 0 !
        {   
          __delay_ms
(1);   // attend la fin des rebons mecaniques
           if (BP == 0)  // on confirme  si il est encore  appuyé !
            {
               etat_Bp++;
               ledR = ON;
               
                while
(BP==0);    //    il faut le relacher ce BP !
            }
        } // if
       
       if 
((etat_Bp >1) && (BP == 1))  // BP relaché, tiré au +VCC par Pull up
       {
           __delay_ms(1);  // attend la fin des rebons mecaniques
          if (BP == 1)  // il est bien relaché
           {
             etat_Bp = 0;
             ledR = OFF;         
           
}
       } //if
    } //while  
}

Question sur l'interruption avec un PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » jeu. 21 juin 2018 11:23 lien vers la Data-Sheet : Cliquez ici

Bonjour jo7,

Je ne connais pas MPLAB mais c'est très proche de mikroC . J'arrive donc a comprendre ton programme !

L'appui sur un BP ne nécessite généralement pas d'interruption, car l'appui est long et généralement on a le temps de faire autre chose ( sauf si le programme est bloquant) .
Pour une interruption sur BP, il faut activer les interruptions sur changement d'état d'un PIN. Toutes ne le font pas, il faut regarder ta DS pour choisir la PIN sur laquelle branché ton BP. Mais je pense que ce n'est pas une bonne solution tout dépend du contexte genre un arrêt d'urgence ?

Si je suis ton bout de code :

1 - premier appui sur le BP allume la led . Incrémente ta variable etat_Bp qui passe à 1 .
2 - second appui tu allumes encore ta led( qui est déjà allumée), tu incrémentes ta variable qui passe donc à 2. Tu attends de relacher le BP, et dans la foulée tu éteins ta led .

J'en déduis, un appui ta l'allume, un autre tu l'éteins ? C'est bien ca ?

SI j'ai bon il y a 100 fois plus simple .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#3 Message par jo7 » jeu. 21 juin 2018 11:43 lien vers la Data-Sheet : Cliquez ici

Bonjour,

Oui c'est bien ça concernant mon programme. Etant donné que je suis en apprentissage dans une start up dans le service électronique, Je suis le seul électronique. Le collaborateur m'a demandé tout simplement de gérer un bouton poussoir avec une interruption pour bien comprendre le fonctionnement car je vais rajouter au fur et à mesure des fonctions donc des interruptions seront très utiles par la suite. Je voulais savoir comment s'y prendre au niveau syntaxe. :-D

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#4 Message par jo7 » jeu. 21 juin 2018 16:35 lien vers la Data-Sheet : Cliquez ici

Bonjour,
J'ai modifié mon code avec une interruption mais il ne se passe rien du tout. Je ne comprends pas d'où vient les erreurs. Si j'arrive à bien comprendre les interruptions cela va m'être très bénéfique par la suite car j'ai beaucoup de mal avec la logique de programmation. Voici mon code actuel:

Code : Tout sélectionner

// CONFIG1
#pragma config FEXTOSC = OFF        // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled)
#pragma config RSTOSC = HFINT1      // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz))
#pragma config CLKOUTEN = OFF       // Clock Out Enable bit (CLKOUT function is enabled; FOSC/4 clock appears at OSC2)
#pragma config CSWEN = ON           // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = OFF          // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config MCLRE = ON           // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled)
#pragma config PWRTE = OFF          // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF           // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored)
#pragma config LPBOREN = OFF        // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = SBOREN       // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)
#pragma config BORV = LOW           // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V)
#pragma config PPS1WAY = OFF        // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be set and cleared repeatedly (subject to the unlock sequence))
#pragma config STVREN = OFF         // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will not cause a Reset)
#pragma config DEBUG = OFF          // Debugger enable bit (Background debugger disabled)

// CONFIG3
#pragma config WRT = OFF            // User NVM self-write protection bits (Write protection off)
#pragma config LVP = ON             // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.)

// CONFIG4
#pragma config CP = OFF             // User NVM Program Memory Code Protection bit (User NVM code protection disabled)
#pragma config CPD = OFF            // Data NVM Memory Code Protection bit (Data NVM code protection disabled)

// PORT A
#define ICSPDAT         RA0                     // Port de programmation
#define POWER           RA1                     // Retour d etat charge batterie
#define MCLR            RA3                     // Port de programmation
#define Vactiv          RA5                     // Grille transistor ventilateur

// PORT B
#define ledR            RB7                     // +LED rouge

// PORT C
#define BP              RC5                     // Bouton poussoir

#define ON              0                       // Led tirée au +VCC
#define OFF             1                       // Led tiréé au gnd


#define _XTAL_FREQ      8000000                // Oscillateur réglé à 8MHz

#include <xc.h>

unsigned int i;
unsigned char etat_Bp = 0;


void interrupt Interrupt_bp (void)
{

    if(PIE0bits.IOCIE && PIR0bits.IOCIF) {
        etat_Bp++;
        PIR0bits.IOCIF = 0;  // clear this interrupt condition
    }
}


void main(void)
{
     
     
// Reglages des entrees/sorties
    TRISA = 0b00001011;                         // Choix entrees/sorties
    LATA = 0b00000000;                          // RAZ des ports
    ANSELA = 0b00000000;                        // Choix mode analogique/numerique    
    WPUA = 0b00000010;                          // Resistances de pull-up interne
    
    TRISB 
= 0b00000000;                         // Choix entrees/sorties
    LATB = 0b10000000;                          // RAZ des ports
    ANSELB = 0b00000000;                        // Choix mode analogique/numerique
    WPUB = 0b00000000;                          // Resistances de pull-up interne 
    
    TRISC 
= 0b00100000;                         // Choix entrees/sorties
    LATC = 0b11000000;;                         // RAZ des ports
    ANSELC = 0b000110000;                        // Choix mode analogique/numerique
    WPUC = 0b00100000;                          // Resistances de pull-up interne
    
    
//Reglages du Timer0
    T0CON1 = 0b01000000;                       // Timer 16 bits sans postcaler
    T0CON0 = 0b10000000;                       // Source Fosc/4 sans postcaler
    
    
//Reglage des interuptions
    INTCON = 0b11000000;                        // Autorisation des interuptions
    PIE0bits.IOCIE = 1;                         // Activation interruption changement d'etat
    IOCCFbits.IOCCF7 = 1;                       // RAA flag IT
    

    while 
(1){

                                          
    
}
}

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#5 Message par jo7 » jeu. 21 juin 2018 16:38 lien vers la Data-Sheet : Cliquez ici

Ai-je besoin d'utiliser un Timer pour gérer une interruption?

Question sur l'interruption avec un PIC16F18345
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#6 Message par Gérard » jeu. 21 juin 2018 17:22 lien vers la Data-Sheet : Cliquez ici

jo7 a écrit :Ai-je besoin d'utiliser un Timer pour gérer une interruption?


Ben non.
Par définition, une interruption arrive n'importe quand. Il faut traiter l'interruption et le programme revient là où il était avant.
Pourquoi veux-tu utiliser un Timer?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Question sur l'interruption avec un PIC16F18345
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » jeu. 21 juin 2018 19:26 lien vers la Data-Sheet : Cliquez ici

bonsoir

il faudrait exprimer clairement ce que tu attends de ton programme ...

...mais il ne se passe rien du tout. ..


normal , tu ne fais rien dans le main ....
et pas grand chose dans l'interrupt
en supposant qu'elle s'arme bien ..

tu aurais un terminal connecté sur (RC6 ) UART TX
un TXREG1='*'; placé dans l'interruption permettrait de voir si celle ci s'execute bien ..


eventuellement rajoute 8 leds sur le PORTC et

Code : Tout sélectionner


 while 
(1){
   
    LATC
=  etat_Bp;   
    Delay_ms
(500);   // on va pas aller à fond la caisse   !                              
    }


mais il faudrait traiter, eliminer les rebonds de tes BP
qu'il faut isoler du PORTB
et mettre quelques delais de 10ms

à verifier si il ne faut pas lire l'etat du PORTB pour désarmer l'interruption ?
Aide toi, le ciel ou FantasPic t'aidera

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#8 Message par jo7 » jeu. 21 juin 2018 22:13 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

J'aimerais à l'aide d'une interruption détecter un appui pour ensuite allumer la Led qui est sur la broche RB7 et le bouton -poussoir RC5. C'est pour prendre en main le fonction d'une interruption car par la suite je vais utiliser ce bouton pour activer le mode veille du PIC. Donc voilà en bref ce que je souhaiterais. ; :-)

Question sur l'interruption avec un PIC16F18345
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2586
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » ven. 22 juin 2018 09:49 lien vers la Data-Sheet : Cliquez ici

bonjour,

... la Led qui est sur la broche RB7 et le bouton -poussoir RC5. ..


tu demarres déja sur un mauvais choix,
vu que c'est sur le portB où 'il y a possibilité d'associer une interruption avec une pin d'entree.

soit l'interruption concernant les 4 bits RB7,6,5,4
ou RB0

je te conseille de lire la datasheet de ton PIC

oops Autan pour moi...
une breve lecture de cette datasheet
figure 15-1
montre que ce MCU PEUT AUSSI avoir un mode interrupt sur le portC
(IOCCP.B5, IOCCN.B5 , IOCIE, IOCCF.B5 )
donc tu pourrais garder ta config initiale BP sur RC5 et Led sur RB7

traiter l'anti rebond dans l'interrupt ,
et allumer ou pas la led.
ou armer un flag dans l'interrupt et traiter le flag dans le main program pour decider de l'allumage de la led ou pas.
Modifié en dernier par paulfjujo le ven. 22 juin 2018 10:09, modifié 1 fois.
Aide toi, le ciel ou FantasPic t'aidera

Question sur l'interruption avec un PIC16F18345
jo7
Débutant
Débutant
Messages : 67
Enregistré en : février 2018

#10 Message par jo7 » ven. 22 juin 2018 10:06 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Voici le schéma en détail pour que vous voyez bien les différents ports de ce PIC.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

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