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.
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;
}


