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 ---
- 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 ---
Modérateur : Jérémy
Question sur l'interruption avec un PIC16F18345
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:
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 <2 ) && (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- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 .
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 .
Question sur l'interruption avec un PIC16F18345
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.![Très content :-D](./images/smilies/icon_e_biggrin.gif)
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.
![Très content :-D](./images/smilies/icon_e_biggrin.gif)
Question sur l'interruption avec un PIC16F18345
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:
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
Question sur l'interruption avec un PIC16F18345
- Gérard
Expert- Messages : 1653
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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?
Question sur l'interruption avec un PIC16F18345
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir
il faudrait exprimer clairement ce que tu attends de ton programme ...
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
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 ?
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 ?
Question sur l'interruption avec un PIC16F18345
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. ;![Sourire :-)](./images/smilies/icon_e_smile.gif)
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. ;
![Sourire :-)](./images/smilies/icon_e_smile.gif)
Question sur l'interruption avec un PIC16F18345
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
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
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.
... 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 oops](./images/smilies/CASJ1XDY.png)
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.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités