Képzési kurzus avr

Valójában a mikrokontroller időzítője egy digitális számláló, amely csak "kifinomult". Az órabemenet a számláló bemenetére kerül, a számláló a számláló ingadozása szerint növekszik. Események esetén - a számláló túlcsordult vagy értéke megegyezik a megadott értékkel - megszakítási kérelmet generál.

Vessünk egy pillantást arra, hogyan kell használni a T0 időzítőt Normál módban. Ebben az üzemmódban az időzítő a számlálási regiszter kezdeti értékétől a maximálisig (255-ig vagy 0xFF-ig) számít. Amikor a T0 időmérő a maximálisra számít, a TCNT0 számlálóregiszter túlcsordul a következő órajelben - visszaáll és a TOV0 jelző van beállítva. Ha a program globálisan engedélyezi a megszakításokat (a SREG regiszter I jelzője) és az időzítő T0 túlcsordulás megszakítását (TOIE0 jelző a TIMSK regiszterben), a mikrokontroller felhívja a megfelelő kezelőt. Ha a regiszterregiszter értéke egybeesik az OCR0 összehasonlító regiszterrel, akkor az OCF0 jelző van beállítva, és ha a megszakítás engedélyezve van az eseményhez, akkor egy match indít és kezelője elindul.

Tekintsünk gyakorlati problémára - 20 ms-onként meg kell vizsgálnunk a gombot. A mikrokontroller frekvenciája 8 MHz, a mikrokontroller ATmega16.

Az első dolog az, hogy meghatározzuk az időzítő prescaler választását és kiszámítsuk a TCNT0 regiszter regiszter kezdeti értékét.

A T0 időzítőt a mikrokontroller belső órajelétől vagy a külső T0-tól fogva tudjuk időzíteni. Belső órajelből történő működtetéskor a felhasználó kiválaszthatja a frekvencia megosztási tényezőit. A T0 időzítőnek öt lehetősége van a prescaler aránynak - 1, 8, 64, 256, 1024.

A feladat megoldásához a következőket vitatom. Ha a T0 egy órajel ciklusa 1 ms időtartamot kapott, azt kapnám. 20 ciklus 20 ms-ot ad. Melyik az időzítő preszkáló tényezője lehetővé teszi, hogy az órajel frekvenciáját 1 ms-ig közelítjük meg? Számíthatsz.

A mikrokontroller óraszáma Fcpu = 8000000 Hz
A Tcpu = 1 / Fcpu mikrokontroller órája
A T0 időzítő órája Tt0 = (1 / Fcpu) / k = k / Fcpu

K = 1024 esetén a T0 időzítő órajelének időtartama Tt0 = 1024/8000000 = 0,128 ms

Ez a maximális időtartam az időzítő óránkénti időzítésénél, amit a körülményeknek megfelelően kaphatunk (Fcpu = 8 MHz). Kisebb együtthatókkal az időszak még kisebb.

Nos, hagyja, hogy az időzítő egy órája legyen 0,128 ms, elég a regiszter ahhoz, hogy megszámolja ezt az időintervallumot és hány ciklust? A kívánt időintervallumot (20 ms) osztjuk meg egy órajel ciklusának időtartamával és megkapjuk a választ.

n = t / T = 20 ms / 0,128 ms = 156,25

Az egészre kerekítve 156 intézkedést kapunk. Ez kisebb, mint 255 (a regiszterregiszter maximális értéke), így elég a számláló regiszter TCNT0 száma.

A TCNT0 regiszterregiszter kezdeti értéke a T0 és a szükséges óraszámok maximális számának különbsége, azaz 256 - 156 = 100 között van. (A 256 a 8-bites időzítő maximális számának számítása.)

Úgy gondolom, most már világos, hogy hogyan kell kiszámítani a TCNT0 kezdeti értékét a Normal módra:

- számítsd ki egy órajel ciklusát Tt0 = k / Fcpu,
- számítsuk ki a kívánt ciklusszámot egy adott intervallumra n = t / Tto,
- kiszámítja a TCNT0 = 256 - n számláló regiszter kezdeti értékét.

Automatizálhatja ezt az eljárást makrókkal. Ez például:

De ilyen makróval óvatosnak kell lenni, bizonyos idő- és k-értékek bekövetkezhetnek.

Most menj a kódra. Ahhoz, hogy használni lehessen a T0 időzítő (és bármelyik másik) is, be kell állítania (inicializálni) és leírnia a megszakításkezelőt (ha használják).

Az időzítő inicializálása a következő lépésekből áll:

- stop timer,
- A normál üzemmód TCCR0-ra történő beállítása indítás nélkül,
- a TCNT0 kezdeti értékének beállítása,
- visszaállító zászlók a TIFR regiszterben,
- lehetővé téve a TIMSK túlcsordulás megszakítását,
- a prescaler beállítása TCCR0-ban, vagyis az időzítő indítása

Variációk lehetségesek ebben a sorrendben.

A feladatunk szerint az inicializálási kód így fog kinézni:

Az inicializálás második sora valójában haszontalan, az egyértelműséghez hozzáadódik. Világosan látja, hogy melyik időzített mód van beállítva.

A TIFR regiszterben lévő megszakítási jelzőket a megfelelő bithez 1 írja vissza. Ezt a műveletet úgy kell végrehajtani, hogy a regiszter felülírja a regisztert, nem pedig a bit sorrendben. És ezért.

Tételezzük fel, hogy a TIFR regiszterben két megszakítási jelző van beállítva - TOV1 és TOV0. TOV0 vissza kell állítanunk. Amikor a VAGY használatával megadja a szükséges kisülést, a következő dolog történik.

Ennek eredményeképpen mindkét zászlót eldobjuk, és vissza akartunk állítani.

A különböző fordítóprogramok megszakításkezelőinek leírásához használt szintaktika kicsit más. Az IAR`a esetében az esemény túlcsordulásakor a T0 időzítő megszakító kezelője így fog kinézni:

A kezelő első sora (TCNT0 = T_POLL;) felülírja a regiszterregisztert, majd beállítja a kezdeti értékét. Ha ezt nem teszi meg, akkor az időzítő továbbra is 0-tól számol. A számlálóregiszter felülírásához a megszakításkezelő elején kell futnia.

A feladatunk minden kódja hasonlónak fog kinézni. (A kód az IAR-re vonatkozik.) Más fordítók esetén meg kell változtatni a fejlécfájlokat és a megszakításkezelőt.)

Normál üzemmódban a T0 időzítő megváltoztathatja az OC0 kimenet állapotát, ha a számlálóregiszter és az összehasonlító regiszter egyezik. És még megszakítás nélkül is. A vezérlési opciókat a TCCR0 regiszter COM01 és COM00 bitjei határozzák meg.

Képzési kurzus avr


Íme egy példa egy olyan programra, amely téglalap alakú jelet generál az OS0 kimenetén.

Az OS0 kimenete az ellenkezőjét megváltoztatja a regiszterregiszter nulla értékével.

Az időzítő megszakításkezelőt (és minden más perifériát) a lehető legrövidebb idő alatt kell elvégezni.

Ha a számláló regiszter (vagy összehasonlító regiszter) számított értéke kerekítve van, akkor az időintervallumot az időzítő hibával számolja.

Ha hosszú ideig szeretne számolni, az időzítő elégtelen lehet. Ebben az esetben 16 bites időzítőt vagy szoftveres időzítést kell használni.

És az utolsó. Lehetséges, hogy az időzítő megszakításának feldolgozása késleltetésre kerül (például egy másik kezelő hibáján keresztül), és a TCNT0 regiszter már néhány órai ciklust számol. Ha egyszerűen felülírja a TCNT0 értékét, akkor a következő megszakítást később hívják fel, mint szükséges. Kiderül, hogy az előző (késleltetett) és az új megszakítások nem élnek túl a kívánt intervallumon.

Ezt a helyzetet a regiszterregiszter újrarendezésével lehet simítani:

TCNT0 = TCNT0 + startValue;

A regiszterregiszter aktuális értékének az inicializált nyilvántartással való kiegészítése figyelembe veszi ezeket az extra intézkedéseket. Az igazság az egyik, DE! Ha a startValue értéke nagy, akkor a hozzáadási művelet miatt a számlálási regiszter túlcsordulhat.

Például startValue = 250, és az időzítő 10 számmal lett kezelve. Ezután az összeadási művelet eredményeként ez az eredmény:

8 számjegyet kapunk 260-ról, hogy 4-et kapjunk. A TCNT0 4-et fog írni.

AVR tanfolyam. Az időzítő a T0 számláló. Nyilvántartásban. n1


Képzési kurzus avr

Kapcsolódó cikkek