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

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

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

  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 : https://forum.mcontrollers.com/t/16f54-spinani-vystupu-pres-preruseni/2612/1

Jak mam napsat přerušení v C pro pin RB0 /INT?

saeedsolutions.blogspot.cz/2012/ … -code.html