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

PIC12F508 machine à état et gestion du temps sans delay
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#21 Message par Jérémy » mar. 2 août 2016 14:03

Une autre ébauche en prenant tout en compte

Code : Tout sélectionner


int main
() {
     uint8_t chrono;
     uint8_t Temporaire;
     uint8_t Attente_2s;
     uint8_t Appui_long;
     uint8_t Appui_court;
     uint8_t BTON;
     uint8_t synchro1;
     uint8_t synchro2;
    GPIO=0; //Mise à 0 des E/S
    GP1=1; //GP1 à 1 initialement
    TRISGPIO=0x18;     //Définition des ports E/S
    OPTION=0x08; // définition du timer TMR0 :4mHz/4 *256
    synchro1=1;
    static enum BTState//Définition des états désirés du BTH
    {
        BTOFF=0,
        BTON,
        PAIRING_MODE,
        CLEARING_MODE,

    }BTState=BTOFF;

Temporaire = GP4;

while(
1)
 {
    if (TMR0>=195)// Boucle permettant de gérer les durées TMR0>=250 ==> environ 50ms
       {
          TMR0 = 0;
          chrono++;   // On incremente notre compteur de 50ms
       }


    if ( (Temporaire != GP4) && (Lancement ==0) ) // Si GP4 à changé ET Lancement=0
                                                  // Alors on execute l'action correspondante à son nouvel état
       {
           Attente_2s = 1 ;  // On dit qu'on à placer le chrono pour deux 2 secondes
           GP1 = 0;         // On fait une pulse sur front descendant
           chrono = 0;      // On RAZ le chrono

           if ( GP4 == 1)  // GP4 est passé à l'état haut
              {
                GP5 = 0;   // GP5 à 0 signifie BTON
              }
           else if   (GP4==0)      // GP4 est passé à l'état bas
              {
                GP5 = 1;   // GP5 à 1 signifie BTOFF
              }
          Temporaire = GP4; // Mise à jour de la variable temporaire
       }

     if  ( (Attente_2s == 1) && (chrono >= 40) ) //Si le lancement de la tempo est en cours ET quele chrono arrive à deux secondes
         {
            Attente_2s = 0;
            GP1 =1;      // On replace GP à l'état haut
         }
         
      if 
( (GP5==0) && (GP3==1) )    // Si on est mode BTON et que GP3 est à 1
         {
           chrono = 0;         // On RAZ le chrono
           while (GP3 ==1)     // On compte le temps d'appui sur GP3
                 {             // ATTENTION quand le GP3 est appuyé cela bloque le programme
                    if (TMR0>=195)// Boucle permettant de gérer les durées TMR0>=250 ==> environ 50ms
                       {
                          TMR0 = 0;
                          chrono++;   // On incremente notre compteur de 50ms
                       }
                 }
           if (chrono <= 5) // C'st donc un appui court on passe en pairing mode
              {
               Appui_court = 1; // On léve le flag
               GP1 = 0 ;        // Front descndant pour 200ms
              }
              else
              
{
                Appui_long = 1; // On léve le flag
                GP1 = 0;        // Fro,nt descendant pour 10s
              }
         }
         
       if 
( (Appui_court==1) && (chrono>=4) )// attente de 200ms activé et chrono arrive à 200ms
              {
               Appui_court = 0; // RAZ du Flag
               GP1 = 1 ;        // On repaase GP1 à l'état haut
              }
              
        if 
( (Appui_long==1) && (chrono>=200) )// attente de 10s activé et chrono arrive à 10s
              {
               Appui_long = 0; //RAZ du Flag
               GP1 = 1 ;       // On repaase GP1 à l'état haut
              }
 }
}

 


La création d'une fonction pulse serait préférable pour harmoniser le code .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

PIC12F508 machine à état et gestion du temps sans delay
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#22 Message par Guest » mar. 2 août 2016 17:04

Bonjour

Sujet très intéressant PAS de vecteur d'interruption.

Alors je vous propose cela utiliser le débordement du chien de garde pour faire un speudo vecteur INT comment?

Code : Tout sélectionner

            if ( nTO == 0) //test debordement du chien
              {
               mise a zero WDT;
                  OPTION=0x10;
                  Sauve WREG et STATUS               
                on incrémente le compteur temps ; //ici c'est comme INT'
              }
     
     programme PRINCIPALE


il faut bien sur placer le test en début programme car le chien fait un reset

j'ai fait rapide un petit test c'est ok sous MPLABX et bien sur debug

c'est une idée comme cela....
A+ dehors!! a bientot

PIC12F508 machine à état et gestion du temps sans delay
pickApick
Membre
Membre
Messages : 13
Enregistré en : août 2016

#23 Message par pickApick » mar. 2 août 2016 17:23

J'ai pour l'instant dans ma machine à état 2 états (BTOFF et BTON). Je vais essayer de retravailler le code pour rajouter le CLEARING et PAIRINGMODE.
J'ai repris tes variables Jérémy ce sera plus simple je pense. J'ai vu sur le forum un auto ou tu expliques pour l'anti rebond. Je pense m'y inspirer.

Code : Tout sélectionner

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <pic12f508.h>


#define XTAL_FREQ 4000000

// PIC12F508 Configuration Bit Settings
// CONFIG
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = ON          // Code Protection bit (Code protection on)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)
  
int main() {
     
uint8_t temps;
     
uint8_t temporaire;
     
uint8_t attente_2s;
     
uint8_t Appui_court;
     
uint8_t Appui_long;
    
GPIO=0;
    
GP1=1;
    
TRISGPIO=0x18;     
    
OPTION=0x08;
    
    
    
///DEBOUNCE 
    
    
    
    
   
    //////
    
static enum BTState
    
{
        
BTOFF=0,
        
BTON,       
    }
BTState=BTOFF;
    
temporaire=GP4;
    while(
1)
    {
        if(
TMR0>=195)
        {
            
TMR0=0;
            
temps=temps+1;
        }
            
        
        if((
attente_2s==1)&&(temps>=40))
            {
                
attente_2s=0;
                
GP1=1;
            }
        
        if ((
Appui_court==1) && (temps>=5))// attente de 200ms activé et chrono arrive à 200ms
              
{
               
Appui_court 0// RAZ du Flag
               
GP1 ;        // On repasse GP1 à l'état haut
              
}
              
        if ((
Appui_long==1) && (temps>=200))// attente de 10s activé et chrono arrive à 10s
              
{
               
Appui_long 0//RAZ du Flag
               
GP0 ;       // On repasse GP0 à l'état haut
              
}
       
       switch(
BTState)
    {
           
        case 
BTOFF:    
    {
        if((
temporaire!=GP4)&&(attente_2s==0))
           {
               
attente_2s=1;
               
GP1=0;
               
temps=0;
               if (
GP4==1)
               {
                   
GP5=0;
                   
BTState=BTON;
                   
               }
               else 
                {
                    
GP5=1;
                }
               
temporaire=GP4;
           }
           
            break;
        case 
BTON:
            
            if((
temporaire!=GP4)&&(attente_2s==0))
           {
               
attente_2s=1;
               
GP1=0;
               
temps=0;
               if (
GP4==1)
               {
                   
GP5=0;
               }
               else 
                {
                    
GP5=1;
                    
BTState=BTOFF;           
                }
               
temporaire=GP4;
           }
            if ((
GP5==0)&&(GP3==1))
            {
                
temps=0;
                while(
GP3==1)
                {
                    if(
TMR0>=195)
                    {
                        
TMR0=0;
                        
temps=temps+1;
                    }
                }
                if (
temps<=5)
                {
                    
Appui_court=1;
                    
GP1=0;
                }
                else if(
temps>=40)
                {
                    
Appui_long=1;
                    
GP0=1;
                }
                    
            }
            break;             
    }
       }
    }
    
}
 

PIC12F508 machine à état et gestion du temps sans delay
pickApick
Membre
Membre
Messages : 13
Enregistré en : août 2016

#24 Message par pickApick » mar. 2 août 2016 17:25

maï a écrit :Bonjour

Sujet très intéressant PAS de vecteur d'interruption.

Alors je vous propose cela utiliser le débordement du chien de garde pour faire un speudo vecteur INT comment?

Code : Tout sélectionner

            if ( nTO == 0) //test debordement du chien
              {
               mise a zero WDT;
                  OPTION=0x10;
                  Sauve WREG et STATUS               
                on incrémente le compteur temps ; //ici c'est comme INT'
              }
     
     programme PRINCIPALE


il faut bien sur placer le test en début programme car le chien fait un reset

j'ai fait rapide un petit test c'est ok sous MPLABX et bien sur debug

c'est une idée comme cela....
A+ dehors!! a bientot

J'avais pensé aussi au chien de garde mais j'ai toujours peur du reset qu'il peut effectuer. Par contre je ne comprends pas ton OPTION=0x10. Cela fait que TMR0 va de 2us à 256 us ça risque d'être compliqué pour atteindre des 10 secondes. Une erreur dans le prescaler nan?

PIC12F508 machine à état et gestion du temps sans delay
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#25 Message par Guest » mar. 2 août 2016 17:30

c'est ma config ,pour mon test .Tu mets bien TA CONFIG pour le diviseur et bien sur le chien.Pour la sauvegarde voir P32 de la DS j'ai vue que le registre option

suis parti.....

PIC12F508 machine à état et gestion du temps sans delay
Claudius
Avatar de l’utilisateur
Passionné
Passionné
Messages : 262
Âge : 70
Enregistré en : septembre 2015
Contact :

#26 Message par Claudius » mar. 2 août 2016 22:29

Bonsoir,

Salut maï...
maï a écrit:
suis parti.....

Je suis également parti depuis longtemps lorsque j'ai lu avec stupéfaction:
pickApick a écrit:
Eux que veux tu dire par un switch case ?

Allez, un petit cadeau pickApick: on faisait comment avant 1995 ;-)

PIC12F508 machine à état et gestion du temps sans delay
pickApick
Membre
Membre
Messages : 13
Enregistré en : août 2016

#27 Message par pickApick » mer. 3 août 2016 09:48

Claudius a écrit :Bonsoir,

Salut maï...
maï a écrit:
suis parti.....

Je suis également parti depuis longtemps lorsque j'ai lu avec stupéfaction:
pickApick a écrit:
Eux que veux tu dire par un switch case ?

Allez, un petit cadeau pickApick: on faisait comment avant 1995 ;-)


:lol: Ma question était sans doute mal posé Claudius. Je sais bien ce qu'est un switch case (Merci au passage pour ton lien Merci ! ). Je voulais surtout dire qu'elle serait la différence avec ma structure actuelle de ma machine à état. Car ma machine à état est à base de switch case.


Retourner vers « Langage C »

Qui est en ligne

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