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

Erreur Programme LED + BP PIC16F18345
jo7
Débutant
Débutant
Messages : 34
Enregistré en : février 2018

#1 Message par jo7 » mer. 7 mars 2018 14:02 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

J'ai un petit problème sur mon programme. Il consiste à allumer une led rouge (RB7) à l'aide d'un bouton poussoir (RC5). Quand j'appuie sur le bouton, la LED s'allume au bout d'un certain temps et s'éteint après plusieurs appuis. Je n'arrive pas simplement à allumer et éteindre une led avec ce bouton poussoir. J'utilise MPLAB X IDE v4.01 pour la programmation du PIC. Si quelqu'un pourrait m'aider, avec plaisir ! :-D

Voici le programme actuel
 ! Message de modération :
Mis en forme du code

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)

#include <xc.h>

// 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

#define _XTAL_FREQ  16000000

int etat_Bp = 0;
unsigned char unite;



void main(void)
{

        // Reglages des entrees/sorties
    TRISA = 0b00001011;                         // Choix entrees/sorties
    LATA = 0b00000000;                          // RAZ des ports
    ANSELA = 0;                                 // Choix mode analogique/numerique    
    INLVLA = 0b00000010;                        // Niveaux TTL
    WPUA = 0b00000010;                          // Resistances de pull-up interne
    TRISB = 0b01010000;                         // Choix entrees/sorties
    LATB = 0b10000000;                          // RAZ des ports
    ANSELB = 0;                                 // Choix mode analogique/numerique
    INLVLB = 0b10000000;                        // Niveaux TTL
    SLRCONB = 0b10101111;                       // Slew rate
    WPUB = 0;                                   // Resistances de pull-up interne 
    TRISC = 0b00111000;                         // Choix entrees/sorties
    LATC = 0b11000000;                          // RAZ des ports
    ANSELC = 0b00011000;                        // Choix mode analogique/numerique
    INLVLC = 0b11000111;                        // Niveaux TTL
    SLRCONC = 0b11111111;                       // Slew rate
    WPUC = 0b00100000;                          // Resistances de pull-up interne
   
    
       
 
     while
(1)   // boucle infinie
     {
       if (BP == 1){
          __delay_ms(30);
          etat_Bp = 1;
          ledR = 1;
        }
       
       if 
(etat_Bp == 1 && (BP == 0))
       {
          unite ++;
          etat_Bp = 0;
          ledR = 0;
          __delay_ms(30);
              
        
}
    }

}
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Erreur Programme LED + BP PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2041
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » mer. 7 mars 2018 20:00 lien vers la Data-Sheet : Cliquez ici

Bonsoir ici,

Pour ton probléme , c'est juste une question de logique ! J'ai fais un tuto dessus mais peut etre qu'il n'est pas très clair.
Je ne connais pas MAP LABX . alors ce sera à toi d'adapter le code .

Dans ta boucle met des commentaires cela t'aidera.

Si le bouyton est appuyé tu rentre dans une boucle ? OK
Ensuite tu attends 30 millisecondes pour eviter justement les fameux rebonds ud BP . OK

Ensuite tu léve un drapeau et tu allume ta led ??? Là il y a un probléme . Il faut que tu refasse le test de condition "si le bp est appuyé ou non" ? Sinon ta pause ne sert a rien.

Si il s'agit d'un simple bouton poussoir ( suivant le code qu'il y a derriere) , il est préférable de faire une boucle du genre
Tant que le bouton est appuyé je reste ici

While(BP ==1); Ainsi tu téssure d'avoir relache le BP

Code : Tout sélectionner

     while(1)   // boucle infinie
     
{
       if (
BP == 1){       // Si le bouton est appuyé ...
          
__delay_ms(30);
           if (
BP == 1){
               
etat_Bp 1;
               
ledR 1;
             }
        }
       
       if (
etat_Bp == && (BP == 0))
       {
          
unite ++;
          
etat_Bp 0;
          
ledR 0;
          
__delay_ms(30);
              
        }
    } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Erreur Programme LED + BP PIC16F18345
jo7
Débutant
Débutant
Messages : 34
Enregistré en : février 2018

#3 Message par jo7 » jeu. 8 mars 2018 10:12 lien vers la Data-Sheet : Cliquez ici

Bonjour Jeremy,

J'ai essayé ton code ça ne fonctionne pas, il faut que je revois la logique. Merci de ton aide si tu as d'autre infos, je suis preneur ! :-)

Erreur Programme LED + BP PIC16F18345
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 975
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#4 Message par paulfjujo » jeu. 8 mars 2018 14:26 lien vers la Data-Sheet : Cliquez ici

attention au niveau logique !
BP appuyé = niveau zero
il faut aussi initialiser le point de depart sur un etat reel possible .
etat_Bp=0;

Code : Tout sélectionner



  
// init au depart !
  
etat_Bp 0;
  
  .. 
etc ..
  
 while(
1)   // boucle infinie
     
{
       if ( (
etat_Bp == 0) && (BP == 0// Si le bouton est appuyé => niveau 0 !
      
{   
          
__delay_ms(30);   // attend la fin des rebons mecaniques
           
if (BP == 0)  // on confirme ;, il est appuyé !
            
{
               
etat_Bp 1;
               
ledR 1;
               }
        } 
// if
       
       
if (etat_Bp == && (BP == 1))  // BP relaché, tiré au +VCC par Pull up
       
{
           
__delay_ms(30);  // attend la fin des rebons mecaniques
          
if (BP == 1)  // il est bien relaché
      
{
             
etat_Bp 0;
          
unite ++;
            
ledR 0;         
           }
       } 
//if
   
//while
   
   
.. etc 
    

Erreur Programme LED + BP PIC16F18345
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 975
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#5 Message par paulfjujo » jeu. 8 mars 2018 14:27 lien vers la Data-Sheet : Cliquez ici

attention au niveau logique !
BP appuyé = niveau zero
il faut aussi initialiser le point de depart sur un etat reel possible .
etat_Bp=0;

Code : Tout sélectionner



  
// init au depart !
  etat_Bp = 0;
  
  
.. etc ..
  
 while
(1)   // boucle infinie
     {
       if ( (etat_Bp == 0) && (BP == 0) // Si le bouton est appuyé => niveau 0 !
      {   
          __delay_ms
(30);   // attend la fin des rebons mecaniques
           if (BP == 0)  // on confirme ;, il est appuyé !
            {
               etat_Bp = 1;
               ledR = 1;
               }
        } // if
       
       if 
(etat_Bp == 1 && (BP == 1))  // BP relaché, tiré au +VCC par Pull up
       {
           __delay_ms(30);  // attend la fin des rebons mecaniques
          if (BP == 1)  // il est bien relaché
      {
             etat_Bp = 0;
          unite ++;
            ledR = 0;         
           
}
       } //if
   } //while
   
   
.. etc 
    


exit du rebond sur mon clavier !

Erreur Programme LED + BP PIC16F18345
jo7
Débutant
Débutant
Messages : 34
Enregistré en : février 2018

#6 Message par jo7 » jeu. 8 mars 2018 15:15 lien vers la Data-Sheet : Cliquez ici

J'ai essayé ton programme, rien ne se passe. Je trouve ça pas normal alors que le code est correct :mur:
Peut-être c'est une histoire de configuration d'entrée-sortie. Je ne sais pas, j'ai mis une horloge interne à 8MHz. On va trouver la solution je l'espère ! :roll:

Erreur Programme LED + BP PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2041
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » jeu. 8 mars 2018 15:23 lien vers la Data-Sheet : Cliquez ici

Le hic c'est qu'on a l'impression d'avoir seulement la moitié des éléments à la vue de tes photos de la carte .

Sur ton BP il faut aussi un R de Pull UP ? je ne la vois pas sur le schéma ? est elle activée en interne ?

AS tu fais clignoter cette LED au départ , sans appui sur le BP pour vérifier que ton programme tourne bien? que tu OSC est bon ? que ta LED est bien branchée ?

Pas de souci on devrait réussir à faire clignoter une LED quand même :langue:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Erreur Programme LED + BP PIC16F18345
jo7
Débutant
Débutant
Messages : 34
Enregistré en : février 2018

#8 Message par jo7 » jeu. 8 mars 2018 15:41 lien vers la Data-Sheet : Cliquez ici

Non je n'ai pas essayé encore de faire clignoter la led. Je vais commencer par ce programme pour ensuite gérer le bouton poussoir. la résistance est activée en interne normalement.

Erreur Programme LED + BP PIC16F18345
jo7
Débutant
Débutant
Messages : 34
Enregistré en : février 2018

#9 Message par jo7 » jeu. 8 mars 2018 15:44 lien vers la Data-Sheet : Cliquez ici

J'ai vérifié aussi sur un oscilloscope, le signal du bouton. On est en 5V en et en appuyant sur le bouton --> 0V.

Erreur Programme LED + BP PIC16F18345
Jérémy
Administrateur du site
Administrateur du site
Messages : 2041
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » jeu. 8 mars 2018 16:15 lien vers la Data-Sheet : Cliquez ici

jo7 a écrit :Source du message On est en 5V en et en appuyant sur le bouton --> 0V.


Donc :

Code : Tout sélectionner

     while(1)   // boucle infinie
     
{
       if (
BP == 0){       // Si le bouton est appuyé ...
          
__delay_ms(30);
           if (
BP == 0){
               
etat_Bp 1;
               
ledR 1;
             }
        }
       
       if (
etat_Bp == && (BP == 1))
       {
          
unite ++;
          
etat_Bp 0;
          
ledR 0;
          
        }
    }  
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité