Példa a telepítést és működés időzítő AVR, mainloop

A AVR mikrokontrollerek rendelkezik ilyen periféria modul, mint egy időzítő számláló. Összhangban a nevét, ott találja az időt. Y jelentése időzítő számláló TCNT nyilvántartás, amelyből el lehet olvasni, hogy mennyi idő telt el azóta, megkezdődik az időzítőt. Az érték ebben a nyilvántartásban nem percben vagy másodpercben, és a „papagájok” - „kullancs” időzítőt. Mi az egyik kullancs - attól függ, hogy az órajel, amelynél a dolgozó avr mikrokontroller és az időzítő beállításait.

Csak időzítő számláló konfigurálható frekvenciaosztóból, amely meghatározza, hogy hány lesz osztva órajel frekvenciája a mikrokontroller előtt tápláljuk időzítő számláló. Időtartam timer tick a kölcsönös a frekvencia hányadosaként kapott.

Például:
Óra frekvencia = 11059200 Hz (11.0592MHz)
Elválasztó = 1024
időzítő számláló jelentése = órajel-frekvencia / Divisor = 11059200/1024 = 10.800 Hz
Időtartamát (tick) = 1/10800 = 92.593 * 10 ^ -6 sec = 92.593 mikroszekundum

Beállításához az osztó által használt CS TCCR regiszter bitek.

Például időzítő 1 használt atmega8 TCCR1B regiszter bitek és CS10, CS11, CS12.

A függőség állapotát bites osztó CS időzítő 1 atmega8

TCCR1B = (1lt; lt; CS12) | (0lt; lt; CS11) | (1lt; lt; CS10); // xtall / 1024

AVR időzítő lehet 8 vagy 16 bit. Bitmélység határozza meg a maximális kullancsok száma, ami számít az időmérőt. 8 bites 256 kullancsok, 16 jelentése 65536.

Ebben az esetben, az egyik tick 92.593 mikroszekundum, illetve maximális érték, amely méri a 16 bites időzítő 92.593 * 65.536 * 10 ^ -6 = 6,068 másodperc, 8-bites - 0,0237 másodperc.

Amikor az időzítő a maximális értéket, túlcsordul, azaz Úgy kezdi a mérést nulla. Ez a helyzet lehet feldolgozni a megszakítás. Erre a célra szükséges, hogy megoldja a túlfolyó megszakítás időzítő és állítsa be a megszakítás engedélyező bit közös.

Mintakódja engedélyt időzítő megszakítás 1 avr atmega8:

TIMSK | = (1lt; lt; TOIE1); // lehetővé túlfolyó megszakítás időzítő számláló sei (); // állítsa a megszakítás engedélyező bit közös

Azt is meg kell határozni egy kezelőt az, hogy megszakítás -, hogy a funkció kerül meghívásra, amikor az időzítő túlcsordul.

Add, hogy ez a funkció kódot megváltoztatja az PB0 lábak, amelyhez a csatlakoztatott LED.

Példa megszakítás kezelő kódot időzítő 1 avr atmega8:

ISR (TIMER1_OVF_vect)

A LED állapota megváltozik 6 másodpercenként.

A LED állapotot vált egy 10 Hz frekvenciájú, az szükséges, hogy az időzítő számít a kullancsok nem 65536, hanem kevesebb. Mi kiszámítja a szükséges kullancsok száma:

Ahhoz, időzítő nem nulla, hanem egy bizonyos értéket, a inicializálás, és minden alkalommal a megszakítás TCNT1 Register rögzíti a számot (65536-1080) = 64456.

Felsorolja a végleges programot az időzítő 1 avr atmega8:

#include lt; avr / io.hgt; #include lt; avr / interrupt.hgt; ISR (TIMER1_OVF_vect)

Ahogy olvasható egyéb cikkek a „mikrokontroller AVR».

Archív forrásaival az avr-gcc (WinAvr) letölthető itt.

Artem Kolesnikov mondta:

Artyom Dvinin mondja:

Kösz a tippet. Igen igazad van, akkor ki kell egészíteni a cikket, vagy írjon külön megjegyzés.

Köszönöm. Észrevehetően. Van egy kérdésem. Az időzítő akkor kezdődik, amikor az MC. Mit lehet indítható és leállítható manuálisan (például a gomb megnyomásával).

Artyom Dvinin mondja:

Kérjük :)
Az időzítő elindul frekvenciaosztó nem nulla, illetve, hogy szükséges lenne, hogy állítsa le az időzítő nullázott frekvenciaosztóból például időzítő 1 atmega8 kell állítania bit CS12, CS11, CS10

Helló hogyan lehet a jelet az infravörös vevő (38 kHz) csatlakoztatva annak adatok PB0.
Nem tudom, hogy hogyan kell beállítani az időzítőt.
kérem, segítsen.
Köszönjük, hogy korábban.

Artyom Dvinin mondja:

Jó napot! És mi van a mikrokontroller?

Segíts kérlek. Most, hogy foglalkozik a UART az AVR Studio4 (mega8)
Azt szeretnénk, hogy egy programot. amelyben bemutatjuk hívószámon keresztül terminál. és a LED villog. is, például írtam 10, akkor villog 10 másodpercenként, és így tovább.
Segítség tanácsot kérem
Előre is köszönöm
Itt van a kód

Artyom Dvinin mondja:

Tud valaki az összeszerelési fel az időzítő beállítását és villogó fények a LED?

Jó napot!
Szükségem van a segítségedre! Nem vagyok programozó, kezdődik egyszerű - Arduino (tudom, rossz rajt, de ez történt). Itt a kód

Arduin nem hiszem, az idő kevesebb, mint 4 ms, meg kell dolgozni időzítő közvetlenül. De nem tudom, hogy mit és hogyan. Segíts, kérlek!

Artyom Dvinin mondja:

Nazar, egy jó nap!
Sajnos én nem azonnal reagál, nyári szünet ... egy kis szünetet a számítógép :)
Arduino - normál start, miközben a lehetőségek hiánya, valamilyen oknál fogva, hogy nem lehet használni, annál könnyebb, mint írni egy C cél.
Azt lehet mondani, hogyan lehet megoldani a problémát anélkül, könyvtárak Arduino, kizárólag arduinovsku díjat.
Mivel a fordító AVR-gcc vagy WinAvr.
Ha érdekli - írja, továbbra is beszélgetni :)

By the way, hogy milyen eszközt fejleszt?

Szia, Artem! Köszönöm a választ!
Ott van a probléma megoldódott, a készülék - a mérési kapacitást 1pF + 0,25 pF 1,5 mF + -2,5nF. Minden működik, de érdekes lenne, hogy mindent nem a Arduino IDE.
Itt van a kód:

(1 lt; lt; TOIE0); // letiltása Timer 0. TIMSK2 - =

Egy másik kérdés: hogyan az időzítő értéke lenne túlcsordulás tovább növekedett, és nem áll vissza, és elölről kezdeni az egészet? Ez, azt szeretnénk, hogy egy időzítő 32-bit. Hogy nem készíti el az egyedi határértékeket a mérés, de csak növeli az idő, hogy a kondenzátor feltöltődik.
Előre is köszönöm!

PS Tudok dobni shemku, ha érdekel.

Artyom Dvinin mondja:

Jó napot, Nazar!
Timer 16 avr kicsit, hogy megkapja a 32 bit lehet konfigurálni túlfolyó megszakítás, és ez a növekedés megszakad program számláló, nevezzük CNT.
Ezután a mért érték lesz (CNT <<16) + TCNT1;

A rendszer minden bizonnyal érdekes, kérjük, küldje el!

PS By the way, nekem úgy tűnik, ebben a sorban hiba:

míg a ((((ACSR - (1lt; lt; ACO)) == 0)) - (TCNT1 = 14001)

Az eset lehet, hogy van egy osztó = 1, azaz időzítő fut át ​​8MHz. Ugyanolyan gyakorisággal utasítás végrehajtása és a mikrokontroller (1-3 ciklus csapat). Kiderült, hogy ha a megszakítás kezelő kódvégrehajtáskor több mint 256 ciklus után a frekvencia csökken. Próbálja dizasemblirovat firmware és látni, hogy milyen kódot generálunk megszakítás kezelő.
Ahhoz, hogy a frekvencia nagyobb, mint 8 MHz / 256 akkor megpróbálják újraírni a felvezető assembly vagy használatban Timer1 CTC mód (Clear időzítő összehasonlítása).

azonnali és szükséges értéket a nyilvántartásba rekord OCR1A 16richnom formátum? és hogy biztos, hogy fel az értéket először a senior és junior tehát, hogy mint ez:

TCCR0 = (1lt; lt; 0) | (1lt; lt; 1); // Állítsa be a előosztó TIMSK | = (1lt; lt; TOIE0); // // ___________________________________________________ Timer1 TCCR1B = (1lt; lt; CS12) | (0lt; lt; CS11) | (0lt; lt; CS10); // Állítsa be a előosztó 256 TIMSK | = (1lt; lt; TOIE1); // TCNT1 = 0; // ___________________________________________________ TIMER2 // TCCR2 = (1lt; lt; CS12) | (0lt; lt; CS11) | (1lt; lt; CS10); // Állítsa be a előosztó 1024 // TIMSK | = (1lt; lt; TOIE2); //

2 taemerom mindenki számára, hiszen nem működik

Artyom Dvinin mondja:

Kérem, mondja meg. A ATtiny2313a konfigurált 16-bites időzítő regiszter TCCR1A mint bit: COMnA1: 0. COMnB1: 0, COMnC1: 0. Tól adatlap Azt olvastam, hogy a véletlen az összehasonlító regiszter (összhangban a rögzített értékek e nyilvántartások) meg fogja változtatni a feszültségszint az ellenkezője, hogy utolérje + 5 vagy 0. De nem értem, amikor aktiválja ezt a funkciót, hogy lehetséges-e változtatni az értékeket ezen lábak a programban?

Artyom Dvinin mondja:

Alexander, helló.
Kitett COMnA1 bit: 0. COMnB1: 0, COMnC1: 0 is szerepeltet alternatív kimeneti funkcióval, és megvonhatja tőle a munka, mint egy normál input-output port (azaz, tedd az értéke nem lesz képes programozni). Ugyanakkor nem szabad elfelejteni, hogy hozzanak létre a megfelelő kimenetet a kimenetet.

Alexander M. szerint:

Próbáltam flash programot ATMEGA 128 külső kristály 16MHz, a program valamilyen okból nem működik. Lehet, hogy ez szükséges, javítsa az értéket bitek?

Artyom Dvinin mondja:

Jó napot, Alexander.
Először próbálja egy egyszerű program?
Ha villog, az ügy a időzítési beállítást, ha nem, akkor nem működik a LED.

#include #include int main (void)

Segítség a kezdő!
Nem indul az időmérőt Attiny44

/////
#define F_CPU 8000000UL
#include

void init (void)
TCCR0B | = (1< TIMSK0 | = (1<>

ISR (TIM0_OVF_vect) // interrupt

int main (void)
init (); // inicializálja
sei (); // felbontása minden megszakítás
míg a (1)
ASM ( "NOP");
>
>

/////////////////////////
Ebben az esetben az időzítő nem is elkezdi számolni!
Mondd, mi a probléma ??
Köszi előre.

1. A IDE terhelés vázlat Arduino Leonardo, melyben az információk minden második USB kimenet. A konzol, látom a frissítés másodpercenként.
2. kötve, hanem a konzol Teraterm \ ttermpro.exe ». Az ablakban látom minden második frissítés.
3. Minden közel van, húzza ki az Arduino USB.
4. csatlakozni Arduino USB. Csatlakoztatom Teraterm \ ttermpro.exe ». Az ablakban látom a frissítés után 8 sekuund.

A jelentése könnyebb elhelyezni a számlálási regisztrálja nulla azonnal TCNT1 = 0;
Összehasonlításképpen regisztráljon annyi ciklust kell számolni, például 500 OCR1A = 500;
És állítsa az időzítő megszakítás véletlen. Ez az egész beállítási kód:

TCCR1A | = (0 < TCCR1 | = (0 < TCCR1B | = (0 < TIMSK | = (1 < OCR1A = 461; // A összehasonlítások száma (ha TCNT1 = OCR1A megszakítás történik véletlenül)
TCNT1 = 0; // A nulla érték megszámlálható timer regiszter / schotchika1

Kapcsolódó cikkek