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š :
- Vyhradit 4 byty v SRAM pro 7-segmentové zobrazovače.
- Nastavit rychlost časovače tak, aby refresh celého displeje byl alespoň 100Hz => časovač musí přetéct alespoň 400x za sekundu.
- Nastavit pro časovač přerušení pro OVF a OCR (Přetečení a Output Comapre = přerušení při překročení nastavené hodnoty časovače)
- Nastavit AD převodník na Free-running mód nebo spouštět převod při každém přetečení časovače.
- Pro AD převodník nastavit přerušení po ukončení převodu.
AD převodník snímá hodnotu okolního osvětlení na děliči odpor/fotoodpor a výsledek předává do proměnné pro zhasnutí disleje.
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