Snažím se rozchodit enkodér na ATTiny84. Jelikož má pouze jeden INT pin, jsem nucen použít PCINT a tím jsem ochuzen o nastavení podmínky pro vyvolání přerušení a o rozpoznání který pin přerušení spustil. Používám
tenhle enkodér zapojený dle datasheetu (zkoušel jsem i opačné zapojení aby impulsy byly 1, ne 0). Výstupy enkodéru na osciloskopu jsou v příloze. Podle chování bych předpokládal, že ISR() bude zavoláno 4x, při každé změně. A port PINB na který je enkodér připojen bude vypadat cca takto
Kód: Vybrat vše
// otočka doleva, PINB0 a PINB1 jsou připojeny k enkoderu
PINB = 0010
PINB = 0000
PINB = 0001
PINB = 0011
// otočka doprava
PINB = 0001
PINB = 0000
PINB = 0010
PINB = 0011
Jenomže ISR() je zavoláno pouze 3x a někdy dokonce jen 2x. Zdá se jakoby některé změny/přerušení vynechával. Výstup je obvykle takovýto
Kód: Vybrat vše
// doleva
PINB = 0010 nebo PINB = 0010
PINB = 0000 PINB = 0011
PINB = 0011
// doprava
PINB = 0001 nebo PINB = 0001
PINB = 0010 PINB = 0011
PINB = 0011
Frekvenci jsem používal 1MHz interní a teď mám 4MHz interní (8MHz s děličkou). Tady je nastavení přerušení
Kód: Vybrat vše
void _initInterrupt() {
DDRB |= (1 << PB2);
DDRB &= ~(1 << PINB0) | ~(1 << PINB1) | ~(1 << PINB2);
GIMSK |= (1 << PCIE1);
GIFR |= (1 << PCIF1);
PCMSK1 |= (1 << PCINT8) | (1 << PCINT9) | (1 << PCINT10);
sei();
}
ISR(PCINT1_vect){ }
Zapomněl jsem na něco, nebo kde může být chyba? Je možné že ATTiny nestíhá zachytit změny signálu při rychlejších otočkách? Protože většinou dvě přerušení jsou po opakovaných otočení. Naneštěstí je to náhodné, někdy dvě pak tři, pak několikrát zase dvě a tím pak nejsem schopný vyhodnotit jestli jde o levou nebo pravou otočku.