Академический Документы
Профессиональный Документы
Культура Документы
Introduction
La machine dtat dans notre programme permet de crer et de grer le menu
pour lutilisateur. Elle indique le lien entre les diffrents tats afin que le menu
soit cohrent. Chaque tat est li une fonction ou un texte ou encore rien du tout.
Le clavier 4x4 permettra de passer dun tat un autre en fonction de la touche
appuye.
Un tat est dfini par cette structure :
typedef struct PROGMEM
{
unsigned char state; // Nom de ltat
PGM_P pText; // Texte associ
char (*pFunc)(char input); // Son pointeur de fonction
} MENU_STATE ;
Ltat suivant dpend de ltat o lon se situe et de lentre modifie. Elle aura
donc pour structure:
typedef struct PROGMEM
{
unsigned char state; // Nom de ltat
unsigned char input; // Entre permettant la modification
unsigned char nextstate; // Nom du prochain tat
} MENU_NEXTSTATE ;
Quand on a lensemble des tats, il est ncessaire dimplmenter les liens quils
existent entre eux. Pour cela, on utilise la structure de type NEXTSTATE. Elle
ressemble ceci :
const MENU_NEXTSTATE menu_nextstate[] PROGMEM = {
{Nom de ltat, Entre, Nom de ltat suivant associ,},
};
On peut donc constater que pour une entre partir dun tat, il ne peut y avoir
quun unique tat suivant. Mais cela nempche pas davoir plusieurs entres
diffrentes partir dun tat.
Dit prcdemment, chaque tat ne peut tre combin soit un texte, soit une
fonction, il est donc ncessaire de dvelopper cette ide en crant la table
explicitant ces proprits :
const MENU_STATE Menu_State[] PROGMEM = {
{STATE, STATE TEXT, STATE_FUNC,},
};
Logigramme machine dtats
Accueil
1.
Consigne 2. Out 4. Rglage 5.
Identificatio 1. Capteur 2. Sortie 3. Alarme
(affichage) (affichage) rgulateur Date/Heure
n
1. PWM 1. Set
Changer Changer 1. 3.
1. Set High 1. Rcurrence 2. PID Heure
consigne out Temprature 2. Relais Hysteresis
2. Set Low 2. Set Date
2. Luminosit 3.
Analogique 3. Stop
3. Humidit
4. ADC
1. BP 1. Set High
2.TI 2. Set Low
3. TD
4. TE
5. OUT0
Remarque :
- Pour chaque tat part les 3 premiers, il est possible de revenir ltat prcdent avec le bouton B signifiant BACK .
- Pour la partie alarme, au dpart il montre la valeur actuelle et demande ensuite si on veut vraiment la changer ou pas.
Ce principe est appliqu galement le rglage du rgulateur en mode PID et Hystrse.
Logique du systme
La logique de notre machine dtat est assez simple comprendre. Il tait
ncessaire que notre menu ne bloque pas lalgorithme sil devait attendre une
information de lutilisateur ou autre. La rgulation du moteur doit fonctionner
sans cesse en mode automatique.
Pour raliser cela, on a cr deux tats diffrents pour le mme point :
La fonction auto
char Fct_auto(char input)
{
automatique=1;
EEPROM_read_consigne();
char buffer[20];
LCD_clr();
LCD_setCursorXY(45,0);
LCD_puts ((uint8_t*)"CONSIGNE");
LCD_setCursorXY(0,20);
itoa(consigne[0],buffer,10);
LCD_puts (buffer);
LCD_puts ((uint8_t*)".");
itoa(consigne[1],buffer,10);
LCD_puts (buffer);
itoa(consigne[2],buffer,10);
LCD_puts (buffer);
LCD_setCursorXY(3,40);
LCD_puts ((uint8_t*)" A : Reglage");
LCD_setCursorXY(3,60);
LCD_puts ((uint8_t*)" B : BACK");
return ST_AUTO;
}
char buffer[20];
itoa(input,buffer,10);
Usart_Tx_String(buffer);
Usart_Tx_String("\n");
if(position!=0)
{
ti[position-1]=input-1;
}
else IDCB_Clignotement_ti =
OSEnregistrerCB_TIMER(clignotementti,500);
LCD_clr();
LCD_setCursorXY(2,0);
LCD_puts ((uint8_t*)"Constante integration:");
LCD_setCursorXY(0,20);
itoa(ti[0],buffer,10);
LCD_puts (buffer);
itoa(ti[1],buffer,10);
LCD_puts (buffer);
itoa(ti[2],buffer,10);
LCD_puts (buffer);
itoa(ti[3],buffer,10);
LCD_puts (buffer);
itoa(ti[4],buffer,10);
LCD_puts (buffer);
position++;
if(position==6)
{
position=0;
EEPROM_save_ti();
ti_int = (int)ti[4]+(10*((int)ti[3]))+(100*((int)ti[2]))
+(1000*((int)ti[1]))+(10000*((int)ti[0]));
itoa(ti_int,buffer,10);
Usart_Tx_String("Constante integration:");
Usart_Tx_String(buffer);
Usart_Tx_String("\n");
OSRetirerCB_TIMER(IDCB_Clignotement_ti);
return FCT_PID_TI;
}
else return ST_PID_TI_CHANGE;