Osetreni zakmitu tlacitka na ext preruseni

sw ošetření zákmitů tlačítka? Ne, nějak takhle (program jen symbolicky). Časovač běží neustále, stejně je často potřeba pro měření intervalů, může čítat např. po 1 milisekundě. Reakce na tlačítka by měla být v hlavním programu a ne v přerušení, protože může být potřeba volat jiné funkce, některé i s prodlevami, to by se mohlo z přerušení špatně používat. A také by hrozila kolize kdyby k zařízením chtěl přistupovat hlavní program. Proto je vhodnější aby přerušení předávalo jen flagy a bylo co nejkratší.

[code]volatile char btn1_byl_stisk = 0; // priznak, ze byl stisk tlacitka btn1
char btn1_citac = 0; // citac doby po kterou tlacitko nereaguje na novy stisk
volatile unsigned short citac_casu = 0; // citac casu po 1 ms (není potreba pro tlacitka)

ISR ( preruseni od tlacitka )
{
if (btn1_citac == 0) btn1_byl_stisk = 1;
btn1_citac = 200;
}

ISR ( preruseni casovace 1 ms )
{
if (btn1_citac != 0) btn1_citac–;
citac_casu++;
}

char StiskBtn1(void) // byl stisk tlacitka btn1 ?
{
char ok = btn1_byl_stisk;
btn1_byl_stisk = 0;
return ok;
}

int main(void)
{
while(1)
{
if (StiskBtn1())
{
// … tady je nejaka akce na stisk tlacitka Btn1
}
}
}
[/code]
Doplňkově příklad použití měření času čítačem:

[code]unsigned short CasMs(void) // dej aktualni cas v ms (pozor - povoli preruseni!)
{
unsigned short cas;
cli();
cas = citac_casu;
sei();
return cas;
}

// presne cekani po dany pocet ms (pozor - povoli preruseni!)
// jen na ukazku pouziti mereni casu, spis se pouzije podobne
// v programu paralelne s jinymi procesy, napr. pro mereni time-outu

void CekejMs(unsigned short ms)
{
unsigned short stary_cas = CasMs();
while(CasMs() - stary_cas < ms) {}
}

// nebo v programu:
unsigned short ubehly_cas;
unsigned short stary_cas = CasMs();
while (1)
{
if (… nejaka udalost)
{
ubehly_cas = CasMs() - stary_cas;
stary_cas += ubehly_cas; // posun casove znacky pro pristi test
}

// nebo pro zjisteni timeoutu udalosti, napr. vypadek spojeni:
if (CasMs() - stary_cas >= TIMEOUT)
{
	// obsluha timeoutu udalosti
}

}[/code]