Работа МК по графу состояний (текстовое описания графа состояний на Си с условиями перехода и задержками):
- Код: Выделить всё • Развернуть
int Step=0; // Current step of sequence
int Next=0; // Next step of sequence
long Delay=0; // Delay before next sequence step
long DelayPrev=0; // Previous delay
long Time_s; // Счетчик равных промежутков времени (на таймере)
unsigned char Temp; // Temporary variable
...
...
switch(Step) // переход и обработка только текущего состояния графа
{
// ******* Step 0 ******* Restart delay
case 0:
Next = 1; // узел с безусловным переходом в узел №1 с задержкой 10 ед.
Delay = 10;
break;
// ******* Step 1 ******* Sensor sygnal wait
case 1:
...... ; // действия пока находимся в этом узле
if(Condition) // условие перехода в узел 2 с задержкой 2 ед.
{
Next = 2;
Delay = 2;
... // действия будут выполнятся во время задержки перехода
}
if(Condition2) // условие перехода в узел N с задержкой T ед.
{
Next = N;
Delay = T;
... // действия будут выполнятся во время задержки перехода
}
break;
// ******* Step X ******* // для каждого узла(состояния) ставим в соответствие уникальный номер, и расписываем
// условия выхода из этого узла
case X:
{
Next = Y;
Delay = Delay;
}
break;
};
// ******* Sequence processing *******
if(DelayPrev != Delay)
{
DelayPrev=Delay;
OffDelay(Delay, &DelaySeq, 1);
}
Temp = OffDelay(Delay, &DelaySeq, 0);
Temp = FN(&FrontStore, Temp);
if(Temp)
{
DelayPrev=0;
Delay=0;
Step=Next;
printf("Step number = %u ; Time = %u;\n\r",Step,Time_s); // ну это для отладки
}
// Вспомогательные функции
unsigned char OffDelay(long Delay, long *Storage, unsigned char Go) // OffDelay таймер.
{
if(Go) *Storage = Time_s;
return ( (Delay + *Storage) >= Time_s );
}
unsigned char FN(unsigned char *Store, unsigned char Value) // определение заднего фронта (спада) аргумента Value
{
bit tmp;
tmp = *Store && !Value;
*Store = Value;
return (unsigned char)tmp;
}