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.