Potřebuji zasvetit do přerušení. Kdy, jak proč ho používat? prosíl bych o nějaké informace… a nějaké příklady použití.
ps: programuji v C v asm se nevyznam
administrator: přejmenováno z "Přerušení 16f84a"
Potřebuji zasvetit do přerušení. Kdy, jak proč ho používat? prosíl bych o nějaké informace… a nějaké příklady použití.
ps: programuji v C v asm se nevyznam
administrator: přejmenováno z "Přerušení 16f84a"
Typicky: čtení stavůvstupů (tlačítka), generování timeoutu, sheduling událostí. Tohle všechno v přerušení od časovače. Od jiných zdrojů přerušení podle toho co potřebuješ. 84 toho zas tak moc neumí. Pokud programuješ v C, kompilátor se ti postará o zachování kontextu při přerušení.
Přerušení je velice praktická a hojně používaná věc. Například zobrazování na multiplexovaných LED displejích. K tomu se využívá přerušení od časovače. S PICama nedělám, nádledující příklad je pro AVRko, ale jako příklad použití přerušení nebude špatný.
Zobrazení nějakého údaje na 4-místném LED displeji s řízením jasu na základě okolního osvětlení :
Start MCU :
Kromě nastavení portů a ostatních používaných věcí potřebuješ :
Plus to, co ještě další potřebuješ.
Pak už následuje hlavní smyčka programu.
A teď, co dělají jednotlivá přerušení :
Přetečení časovače : Vezme data k rozsvícení následující segmentovky, pošle data na port a aktivuje příslušnou společnou anodu/katodu - tím rozsvítí příslušný zobrazovač. Vezme hodnotu načtenou z AD převodníku a uloží ji do registru pro OCR přerušení. V případě, že AD převodník neběží ve Free-running módu (po ukončení převodu se automaticky spustí znova), tak spustí nový AD převod.
OCR přerušení časovače - nastává v každém cyklu časovače, dříve, než časovač přeteče. Jeho hodnota závisí na načtené hodnotě z AD převodníku. V tomto přerušení se deaktivují společné anody/katody (není třeba zjišťovat která se má zhasnout) a na datové piny se pošle hodnota pro zhasnutí segmentů (tím se odstraní případné duchy v případě použití pomalejších tranzistorů pro spínání jednotlivých segmentů).
Přerušení od AD převodníku po ukončení převodu. Zajišťuje načtení hodnoty z AD převodníku pro uložení do OCR registru. Nic víc není potřeba.
Pro jednoduchost můžeš klidně třeba AD převodník a OCR vypustit (nevím, jestli OCR nebo jeho ekvivalent PICy umí). Displej bude fungovat stejně, jenom přicházíš o řízení jasu v závislosti na okolním osvětlení. V tom případě musí přerušení od přetečení časovače vypadat takto :
Deaktivovat společné anody/katody (není třeba zjišťovat která se má zhasnout) a na datové piny se pošlat hodnotu pro zhasnutí segmentů (tím se odstraní případné duchy v případě použití pomalejších tranzistorů pro spínání jednotlivých segmentů). Vzít data k rozsvícení následující segmentovky, pošat data na port a aktivovat příslušnou společnou anodu/katodu - tím rozsvítit příslušný zobrazovač.
V tomto okamžiku máš kompletně hotové zobrazování na LED displeji. Data na displeji v hlavním programu měníš tak, že zapisuješ data na 4 místa v paměti. O další věci kolem obsluhy displeje se v hlavním programu nestaráš.
Jak funguje přerušení jsem vystětloval B0sc0vi tady : http://forum.mcontrollers.com/t/16f54-spinani-vystupu-pres-preruseni/2612/1
Jak mam napsat přerušení v C pro pin RB0 /INT?