Zaslal: st říjen 10 2012, 15:25 Předmět: INT0 někdy nezareaguje
Zdravím,
mám problél s ATMEGA88 která běží na 20MHz s napětím 5V. Stavím řízení předstihu zapalování na motorku a na pinu INT0 zachytávám imlulzy od kliky. Vyskytl se mi problém v tom že občas INT0 nezareaguje, nespustí interrupt a to tak jednou za cca 20 pulzů.
Hodil jsem jí tedy na bastlící destičku a zapojil tak že na INT0 mám tlačítko a pullup rezistor 4k7. + mám připojenou na PC3 diodu aby bylo jasně vidět jak se to chová. Interrupt je nastaven tak aby reagoval jak na náběžnou tak sestupnou hranu.
kód:
ISR (INT0_vect)
{
PORTC=!PORTC;
}
int MAIN (void)
{
while(1)
{
;
}
}
Stimhle kódem by to mělo teoreticky při stisku tlačítka rozsvítit a při puštění zhasnout. Problém je v tom, že mačkám a funguje, jenomže jednou za pár stisknutí to na jednu hranu nezareaguje, interupt se nespustí a celé se to otočí. Při zmáčknutí dioda zhasne, při puštění se rozsvítí. A zase furt do kola... Prostě jednou za čas to na nějakou hranu nezareaguje. Setkal už se s tím někdo?
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: st říjen 10 2012, 15:30 Předmět:
Zákmity kratší než délka běhu přerušení. _________________ Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
a zakážeš přerušení hned po jeho vyvolání a povolíš po návratu z obslužného podprogramu?
Informace o poloze kliky snímáš nejspíš opticky, takže problém zákmitů se tím eliminuje dřív než by vznikl?
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: st říjen 10 2012, 17:30 Předmět:
Dej do toho testu dvě či tři podmínky na stálost stavu na vstupu vzdálený od sebe "vhodnou dobu" - to musíš posoudit sám. Pokud kontrola neprojde, nereaguj a vrať se z přerušení. _________________ Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
Přesně tak, zákmity na tlačítku. Google images: contact bouncing
Při 20MHz je na jednu instrukci 0.05us, takže CPU je strašně rychlé a zachytí i jehlové impulsy.
Řešení
1/ po INT0 přerušení od INT0 zakaž např. na 1ms a pak zase povol. Tím potlačíš "falešné" spínání.
2/ na vstup přidej RC filtr, který špičky "odfiltruje"
Děkuju moc všem za pomoct.
Udělal jsem to nakonec tak že když přijde přerušení tak ho maskou zakážu a povolím až dál v programu. Příští týden to zajdu přeměřit do laboratoře.
Jen se chci informovat jak to je když maskou zakážu a pak povolím přerušení. Smaže se flag nebo ne? Jde o to aby mi nezustal vyset flag a až přerušení povolím tak aby se hned nevyvolalo přerušení. Já totiž pořádně nevím jak ho smazat a to jak sem to dělal asi moc nefunguje.
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: st říjen 10 2012, 20:32 Předmět:
Nesmaže, ale nemůžu to říct univerzálně. Najdi si registr s příznaky přerušení. Smaže se jen po vyvolání přerušení. _________________ Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
Založen: Apr 02, 2011 Příspěvky: 18465 Bydliště: Nový Bydžov
Zaslal: st říjen 10 2012, 23:53 Předmět:
Nematla se Ti tam do toho naky dalsi preruseni od neceho jinyho a nebo nemas tam nejaky zretezeni preruseni? At Megu skoro neznam, ale u regulaci s 8051 jsem si s tim uzil svy, hlave kdyz se pouzivalo preruseni od vice zarizeni (casovac, seriova lajna, prevodnik...)
Jirka
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: čt říjen 11 2012, 12:09 Předmět:
TommyNET napsal(a):
Takže podle tohodle co jsem našel v datasheetu tak flag se smaže pokud na příslušný bit uložím jedničku.
EIFR=0x01
Jasně, že to jde smazat "ručně", stejně jako nastavit. Taky to někdy preventivně používám, aby se mě přerušení nezavolalo znovu hned po návratu. Jen si nejsem jistý tou jedničkou, ale je to u megy klidně možný. _________________ Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
Nematla se Ti tam do toho naky dalsi preruseni od neceho jinyho a nebo nemas tam nejaky zretezeni preruseni? At Megu skoro neznam, ale u regulaci s 8051 jsem si s tim uzil svy, hlave kdyz se pouzivalo preruseni od vice zarizeni (casovac, seriova lajna, prevodnik...)
Jirka
Samozřejsmě že v celém programu mám ještě jedno přerušení a to od čítače když přeteče, ale mám nastaveno nepřerušitelné přerušení takže si musí počkat až to běžící se dokončí a pak může začít teprve to další v pořadí. I tak jsou obě přerušení směšně krátká vzhedem k tomu jak často se spouštějí. Takže nehrozí nějaký kolaps.
Problém bude asi opravdu nějaký ten zákmit na INT0. Po odskoku do přerušení ho teda zakážu po chvilce smažu flag a povolím. Teď už to musím jen otestovat.
Kdybych to řešil já, tak v obslužné rutině udělám:
1) Smažu příznak přerušení, takže jakákoliv změna na vstupu od tohoto momentu mi po ukončení tohoto přerušení vyvolá hned nové a dozvím se o ní.
2) Načtu hodnotu na sledovaném vstupu. To musím udělat až po smazání příznaku v bodě 1. Kdybych to udělal obráceně, tak mi některé změny mohou utéct.
3) Zpracuji načtenou hodnotu. Typicky ji porovnám s poslední schovanou od minule, a pokud se liší (tj. je změna), něco udělám.
4) Povolím přerušení a ukončím obslužnou rutinu. Typicky jednou instrukcí, aby se mi přerušovací rutiny nevnořovaly do sebe. Bývá na to instrukce "iret", "retfie", "rti", atd. Nevím, co máš ty.
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
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.