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
PIC12F508 machine à état et gestion du temps sans delay
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Une autre ébauche en prenant tout en compte
La création d'une fonction pulse serait préférable pour harmoniser le code .
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 .
PIC12F508 machine à état et gestion du temps sans delay
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?
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+
a bientot
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+
a bientotPIC12F508 machine à état et gestion du temps sans delay
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.
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 = 1 ; // 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 = 0 ; // 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
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+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
PIC12F508 machine à état et gestion du temps sans delay
Bonsoir,
Salut maï...
Je suis également parti depuis longtemps lorsque j'ai lu avec stupéfaction:
Allez, un petit cadeau pickApick: on faisait comment avant 1995 ;-)
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 ;-)
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
PIC12F508 machine à état et gestion du temps sans delay
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 ;-)
). 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.Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 17 invités



