Založen: Jan 15, 2008 Příspěvky: 187 Bydliště: Olomouc
Zaslal: pá říjen 30 2020, 18:30 Předmět: ATTiny náhodné chování přerušení u rot. enkodéru
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:
// otočka doleva, PINB0 a PINB1 jsou připojeny k enkoderu
PINB = 0010
PINB = 0000
PINB = 0001
PINB = 0011
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.
Založen: Oct 25, 2009 Příspěvky: 146 Bydliště: Mor. Nová Ves, Břeclav
Zaslal: pá říjen 30 2020, 19:04 Předmět:
Na enkodér ti stačí jeden pin reagující na externí přerušení (PB2), teprve v jeho vektoru dle úrovně na dalším pinu zjišťuješ směr pootočení.
Mimochodem proč máš PB2 jako výstupní, ovládáš jím něco?
Mohlo by to vypadat např. takhle nějak:
kód:
ISR( INT0_vect)
{
if( PINA & (1<<PA7)) // Smer doleva
{
.....
}
else // Smer doprava
{
.....
}
}
Samozřejmě z toho pak plyne správné nastavení pro přerušení v registrech GIMSK a GIFR.
Založen: Jan 15, 2008 Příspěvky: 187 Bydliště: Olomouc
Zaslal: pá říjen 30 2020, 20:14 Předmět:
Na PB2 jsem měl LED na testování, ještě předtím, než jsem tam přiojil tlačítko enkodéru. Vypadá to, že jsem zapomněl ten řádek umazat, na dalším řádku totiž nastavuji stejně vstup na PINB2.
radek89 napsal(a):
Na enkodér ti stačí jeden pin reagující na externí přerušení (PB2)
Ach, chápu co tím myslíš. Takhle jsem nad tím nepřemýšlel, nicméně já potřebuji přerušení i na tlačítko na enkodéru, nejsem si teď jistý jestli můžu využít vektor INT na vektoru B a zároveň PCINT na vektoru A? S tím, že použiji dvakrát rutinu ISR() s jiným vektorem.
lesana87 napsal(a):
Záleží, co v tom přerušení děláš, jak dlouho trvá.
Pouze jsem vyhodnocoval bity jednotlivých pinů, případně výsledek posílal na display, nebo posílal na seriový výstup, možná to je příčina, ale to by nevysvětlilo proč to bylo náhodné.
Přerušení je asynchronní, v tom samotným už je notná dávka náhodnosti. V přerušení se nemá dělat nic, co trvá dlouho, žádný čekání na displej nebo na vyprázdnění bufferu USARTu. Blokujou se tím další přerušení.
A generovat od tlačítka přerušení je taky cesta do pekel. Reakční doba člověka je řádově 100ms, tak proč honit nějaký us. Takový tlačítko zvládne vygenerovat hezkých pár zákmitů po sobě a už tu máme kupu (úplně zbytečných) přerušení. Tlačítko (klávesnici) stačí číst periodicky třeba 20x za sekundu, snadno se pak ošetří i ty zákmity, dlouhé stisky, autorepeat...
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.