Ne!
Přerušení funguje takto:
- Jakmile nastane událost přerušení, nastaví se příslušný příznak přerušení.
- Procesor dokončí probíhající instrukci, zjistí že je nastavený příznak a skočí na kód obsluhy přerušení (ISR).
- Automaticky zakáže všechna přerušení a vynuluje příznak.
- Vykoná kód přerušení.
- Automaticky povolí všechna přerušení.
- Vrátí se do hlavního programu.
Takže v přerušení program nemůže být znovu přerušen.
Pokud během přerušení nastane další událost přerušení, nastaví se jeho příznak a nic dalšího se neděje.
Teprve po skončení obsluhy přerušení a návratu do hlavního programu zjistí procesor že je nastavený příznak a vyvolá nové přerušení.
Napíšu můj kód rozvláčněji aby byl srozumitelnější.
[code]ISR(TIMER0_OVF_vect) // přeteče za cca 0,5 ms
{
static uint8_t nova_hodnota, stara_hodnota;
nova_hodnota = PINC;
if (bit_is_clear(stara_hodnota,0) && bit_is_set(nova_hodnota,0))
hodnoty[0]++;
if (bit_is_clear(stara_hodnota,1) && bit_is_set(nova_hodnota,1))
hodnoty[1]++;
if (bit_is_clear(stara_hodnota,2) && bit_is_set(nova_hodnota,2))
hodnoty[2]++;
if (bit_is_clear(stara_hodnota,3) && bit_is_set(nova_hodnota,3))
hodnoty[3]++;
if (bit_is_clear(stara_hodnota,4) && bit_is_set(nova_hodnota,4))
hodnoty[4]++;
if (bit_is_clear(stara_hodnota,5) && bit_is_set(nova_hodnota,5))
hodnoty[5]++;
stara_hodnota = nova_hodnota;
}
[/code]