jyrry píše:
jestli jsem dobre pochopil syntaxi, tak pri kazdem impulzu prectu (a vynuluji) timer a pokud je cas do pristiho impulzu v relaci 510us-1910us, tak ten cas zapisu do pole a navysim index prvku pole; kdyz je ten cas delsi, vynuluji index a jedu znova... ju?
V podstatě ano. Pro jistotu uvedu svůj popis.
V každém přerušení k němuž dochází při změně na příslušném PPM pinu tj. ať už dojde ke změně stavu z 0 na 1 nebo z 1 na 0 tak je vyvolána funkce napojená na příslušné přerušení v daném případě je to funkce
read_ppm().
Ve funkci
read_ppm() vždy nejprve uložíš hodnotu čítače
TCNT1 do proměnné
counter. Pak
TCNT1 vynuluješ.
TCNT1 automaticky čítá s periodou 0,5 mikrosekundy.
Je-li hodnota
counter < 1020 (tj. 510 us) uložíš ji do proměnné
pulse a nic víc.
Je-li hodnota
counter > 3820 vynuluješ proměnnou
channel, která je index do pole dá se říct kanálů.
Je-li hodnota
counter v rozmezí
1020 až 3820 (tj. 510us až 1910us) tak se na index pole channel zapíše hodnota odpovídající polovině ze sumy aktuální hodnoty
counter a dříve uložené hodnoty v proměnné
pulse přičemž proměnná
pulse se po nastavení na nějakou nenulovou hodnotu nevynuluje dokud nenastane situace kdy bude hodnota
counter nulová a tak se při každém dalším průchodu kdy je
counter v rozmezí
1020 až 3820 hodnota
pulse přičítá k hodnotě
counter.
Všechny proměnné deklarované uvnitř funkce
read_ppm() (tj.
pulse,
counter a
channel) jsou
static což znamená, že před prvním voláním kódu jsou automaticky vynulovány, ale i když jsou napsány uvnitř funkce tak z hlediska udržení naposledy nastavené hodnoty se chovají jako by byly globální tj. jako by byly napsané mimo funkci podobně jako pole ppm akorát s tím rozdílem, že nejsou přímo přístupné mimo funkci
read_ppm().
Jakmile se tedy některá z těchto
static proměnných nastaví na nějakou hodnotu tak ta hodnota v ní zůstává v platnosti i při následném volání funkce
read_ppm() do té doby dokud uvnitř této funkce není změněna.
Kód:
int ppm[16];
...
// Funkce přerušení
void read_ppm()
{
static unsigned int pulse;
static unsigned long counter;
static byte channel;
counter = TCNT1;
TCNT1 = 0;
if (counter < 1020) {
pulse = counter;
} else if (counter > 3820) {
channel = 0;
} else {
ppm[channel] = (counter + pulse) / 2;
channel++;
}
}