ATmega 168 PCINT: jak počítat přerušení od PinChangeInterrup

Ne!

Přerušení funguje takto:

  1. Jakmile nastane událost přerušení, nastaví se příslušný příznak přerušení.
  2. Procesor dokončí probíhající instrukci, zjistí že je nastavený příznak a skočí na kód obsluhy přerušení (ISR).
  3. Automaticky zakáže všechna přerušení a vynuluje příznak.
  4. Vykoná kód přerušení.
  5. Automaticky povolí všechna přerušení.
  6. 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]

Aha. Díky moc. Já žil v představě že se přerušení přeruší novým přerušením, což když nad tím tak uvažuju je vlastně blbost a nechápu jak mě to vůbec napadlo, představoval sem si zas jiný priority, no zmatek.

Zatím sem testoval jen v Proteusu, musím dopsat ještě jiné fce aby vše fungovalo i v praxi.
Každopádně díky moc všem. Je super že je tu tolik ochotných lidí.