Přerušení 16F84A - Kdy, jak a proč ho používat?

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š :

  1. Vyhradit 4 byty v SRAM pro 7-segmentové zobrazovače.
  2. Nastavit rychlost časovače tak, aby refresh celého displeje byl alespoň 100Hz => časovač musí přetéct alespoň 400x za sekundu.
  3. 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)
  4. 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.
  5. 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í :

  1. 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.

  2. 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ů).

  3. 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