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
pickApick
Membre
Membre
Messages : 13
Enregistré en : août 2016

#1 Message par pickApick » lun. 1 août 2016 15:13

Bonjour tout le monde,


Voilà donc mon premier poste sur le forum. Je vais donc tacher d'être le plus clair possible. J'utilise un pic12F508 qui ne possède pas de registre d'interruption. Je voudrais ne pas utiliser delay_ms pour mes temporisations car ce dernier va bloquer pendant le delay mon pic.

Mon pic doit contrôler un module Bluetooth. Voilà le fonctionnement désiré. Si GP4 passe d'un état bas à haut alors j'envoie une pulse de 2s sur front descendant sur GP1 et je monitors GP5 qui passe alors à 0. Mon Bluetooth est alors allumé et en mode on.
SI par contre GP4 passe d'un état haut à bas j'envoie une pulse de 2s sur front descendant sur GP1 et je monitore GP5 qui passe alors à 1. Mon bluetooth est alors en mode off.
Il y a d'autre mode comme le pairing ou clearing mais je préfère y aller par étape. Il faut savoir que j'ai déjà réalisé ce programme sans machine à état et avec la routine delay_ms(2000) mais cette routine est bloquante ce qui est gênant car mon pic reste alors bloqué et ne fait rien d'autre.
Mon pic à une fréquence de 4MHZ je divise cette dernière par 4 et utilise un prescaler de 256. Mon timer TMRO compte alors jusqu'à 65ms.Mon gros problème est de pouvoir créer ma pulse sur front descendant avec un temps de 2 secondes sans bloquer mon pic. Sachant que je n'ai pas de registre d'interruption. Je suis donc ouvert à toutes remarques ou pistes. idea !

Merci d'avance pour votre aide et le temps consacré.

Voilà mon code actuel:

#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          // ode 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 delay;
     uint8_t synchro1;
     uint8_t synchro2;
    GPIO=0;
    TRISGPIO=0x18;     
    OPTION=0x18;
    synchro1=1;
    static enum BTState
    {
        BTOFF=0,
        BTON,
        PAIRING_MODE,
        CLEARING_MODE,
                
    }BTState=BTOFF;
    
    while(1)
    {
       switch(BTState)
    {
        case BTOFF:
            if(temps==32)//Si mon timer à fait 32*64ms= environ 2s
                GP1=!GP1;
                GP5=0;
                synchro1=1;
                else if ((GP4==1) && (synchro1==1))
            BTState=BTON;    
            break;
        case BTON:
            
            if(temps==32)
                GP1=!GP1;
                GP5=0;
                synchro1=0;
                BTState= CLEARING_MODE;
            else if (temps>12)
                BTState=PAIRING_MODE;
            else if ((GP4==0)&&(synchro1==0))
                BTState=BTOFF;
            break;
        case PAIRING_MODE:

            break;
           case CLEARING_MODE:
               break;
               
    }
    if(TMR0>=250)//64ms 
    {
        temps=temps+1;
    }
    }
    return;
}
Modifié en dernier par pickApick le lun. 1 août 2016 23:02, modifié 4 fois.

PIC12F508 machine à état et gestion du temps sans delay
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » lun. 1 août 2016 20:06

bonsoir,


C'est dommage d'utiliser un PIC aussi limité !
je ne savais pas qu'il existaait des PIC sans interruption !

regarde le 12F1840 en dip 8
un GRAND petit PIC
rien à voir avec le PIC12F508 ..
Aide toi, le ciel ou FantasPic t'aidera

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

#3 Message par pickApick » lun. 1 août 2016 20:23

paulfjujo a écrit :bonsoir,


C'est dommage d'utiliser un PIC aussi limité !
je ne savais pas qu'il existaait des PIC sans interruption !

regarde le 12F1840 en dip 8
un GRAND petit PIC
rien à voir avec le PIC12F508 ..


Bonsoir paulfjujo,

Je sais bien mais disons que le choix est fait et que je vais rester sur celui-ci. Je me dis que quand je prendrais un pic avec interruption ça me facilitera la chose :) . J'ai modifié un peu mon code et ma machine à état. Ma grande difficulté réside dans la création d'un front descendant sur 2secondes. Réaliser un signal périodique de 2 secondes ne me pose pas de problème (clignotement de led par exemple). Mais le front descendant me pose un problème. Des astuces ou pistes?

Code : Tout sélectionner

////DÈfinition des commandes prÈprocesseurs 
#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 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;
    
    while
(1)
    {
        if(TMR0>=250)// Boucle permettant de gérer les durées TMR0>=250 ==> environ 64ms
        {
            temps=temps+1;
        }
            
       switch
(BTState)
    {
           GP1=0;
        case BTOFF:    //1 er cas BT0FF
    {
        if(temps>=32//si le timer à bouclé 32 fois ou supérieur le temps écoulé est alors de 2 secondes donc GP1 repasse à 1 (Pulse descendante de 2s) 
                {
                    GP1=1;
                    temps=0;
                    synchro1=1;//bit synchro passe à 1 permettant ainsi de passer dans le cas du BTON 
                    GP5=1;
                }
            
                else if 
((GP4==1) && (synchro1==1)) 
                {
            BTState=BTON;    
            GP1
=0;
                }
            break;
        case BTON://cas BTON 
         
            if
(temps>=32//Même principe que pour BTOFF
            {
                GP1=1;
                temps=0;
                synchro1=0//bit synchro passe à 0 permettant ainsi de passer dans le cas du BTOFF
                GP5=0;
            }
       
            else if 
((GP4==0)&&(synchro1==0))
            {
                BTState=BTOFF;
                GP1=1;
            }
            
            break
;
            
               
    
}
       }
    }
    

}



Modifié en dernier par pickApick le lun. 1 août 2016 22:33, modifié 1 fois.

PIC12F508 machine à état et gestion du temps sans delay
Claudius
Avatar de l’utilisateur
Passionné
Passionné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#4 Message par Claudius » lun. 1 août 2016 21:56

Bonsoir,

Bienvenu pickApick sur ce forum ;-)

Cf. PIC12F508 machine à état et gestion du temps sans delay

NB: Comme quoi Fantas-Pic, est en train de gagner en popularité (Bravo, continuer ... ;-)

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

#5 Message par Jérémy » lun. 1 août 2016 22:18

Bonsoir à tous ,

Bienvenu à toi sur FantasPic . En espérant que tu trouves toute les réponses que tu es venus chercher !

Il est de coutume ( du moins je souhaiterais que ça le devienne) , de mettre la Data-Sheet de son PIC afin d’éviter aux membres de le chercher . Tu obtiendras plus de réponses à mon avis ! : La procédure .

Sur ce , ton probléme m’intéresse par defi. Mais j'ai du mal à comprendre ton histoire de front montant ?
Ma grande difficulté réside dans la création d'un front descendant sur 2secondes


- tu reset ton compteur : temps = 0;
Tu mets à zéro ta sortie GPx = 0;
dés que le compteur arrive a la consigne de 2 secondes tu met à 1 ta sortie . if ( compteur >= x)GPx=1;

Un truc du genre ? Ou alors j'ai mal compris ! dans cette situation un chronogramme est une aide primordiale ! les commentaires dans le code aiderait aussi à savoir ce que tu souhaite obtenir !

Pour détecter un front montant ou descendant, tu doit enregistrer la valeur à surveiller dans une variable et surveiller a chaque boucle si elle à changer !
Si elle à changée tu mémorise la nouvelle valeur et tu traite ! et ainsi de suite !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#6 Message par pickApick » lun. 1 août 2016 22:35

Jérémy a écrit :Bonsoir à tous ,

Bienvenu à toi sur FantasPic . En espérant que tu trouves toute les réponses que tu es venus chercher !

Il est de coutume ( du moins je souhaiterais que ça le devienne) , de mettre la Data-Sheet de son PIC afin d’éviter aux membres de le chercher . Tu obtiendras plus de réponses à mon avis ! : La procédure .

Sur ce , ton probléme m’intéresse par defi. Mais j'ai du mal à comprendre ton histoire de front montant ?
Ma grande difficulté réside dans la création d'un front descendant sur 2secondes


- tu reset ton compteur : temps = 0;
Tu mets à zéro ta sortie GPx = 0;
dés que le compteur arrive a la consigne de 2 secondes tu met à 1 ta sortie . if ( compteur >= x)GPx=1;

Un truc du genre ? Ou alors j'ai mal compris ! dans cette situation un chronogramme est une aide primordiale ! les commentaires dans le code aiderait aussi à savoir ce que tu souhaite obtenir !

Pour détecter un front montant ou descendant, tu doit enregistrer la valeur à surveiller dans une variable et surveiller a chaque boucle si elle à changer !
Si elle à changée tu mémorise la nouvelle valeur et tu traite ! et ainsi de suite !

Merci à toi j'ai mis la datasheet et commenté mon code. Nan tu as bien compris. Dès que GP4 passe de low à High une pulse sur niveau bas de 2 secondes est crée. Et si GP4 passe de high à low c'est la même punition :) .

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

#7 Message par Jérémy » lun. 1 août 2016 22:42

Merci à toi j'ai mis la datasheet et commenté mon code.

tu vas surtout faire exploser le serveur !!! :lol: Si tout le monde télécharge les DS sur le serveur FantasPic il ne va pas durer longtemps !

Merci de suivre cette procédure!!

Ok je regarde pour te faire un bout de code
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#8 Message par pickApick » lun. 1 août 2016 22:50

Jérémy a écrit :
Merci à toi j'ai mis la datasheet et commenté mon code.

tu vas surtout faire exploser le serveur !!! :lol: Si tout le monde télécharge les DS sur le serveur FantasPic il ne va pas durer longtemps !

Merci de suivre cette procédure!!

Ok je regarde pour te faire un bout de code


Ohlala bah je commence bien sur le forum moi :roll: .

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

#9 Message par Jérémy » lun. 1 août 2016 22:58

Ohlala bah je commence bien sur le forum moi :roll: .

:wink:

Sinon pourquoi tu passe par un switch case quand seulement deux cas de figures sont possibles ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#10 Message par pickApick » lun. 1 août 2016 23:03

Jérémy a écrit :
Ohlala bah je commence bien sur le forum moi :roll: .

:wink:

Sinon pourquoi tu passe par un switch case quand seulement deux cas de figures sont possibles ?


Eux que veux tu dire par un switch case?


Retourner vers « Langage C »

Qui est en ligne

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