Trojkanálový termostat, termostat, časovač na ATmega8. Kuchynský časovač na ATmega8 Popis prevádzkových režimov časovača

01.11.2023 Ohrievače vody

Toto zariadenie poslúži každému, kto musí neustále variť, a spoľahlivo ochráni vašu kuchyňu pred nadmerným množstvom dymu. Toto zariadenie, ako už názov napovedá, je kuchynský časovač. Je určený na počítanie intervalov pri príprave rôznych jedál. Časovač má niekoľko tlačidiel, pomocou ktorých ľahko nastavíte čas od 1 minúty do 99 hodín. Odpočítavanie sa spustí automaticky 3 sekundy po nastavení času. Vďaka hlasnému pípaniu budete určite počuť, kedy je jedlo hotové. Zariadenie je zostavené na základe mikrokontroléra ATMega8.

Popis dizajnu

Srdcom zariadenia je mikrokontrolér U1 () s kremenným rezonátorom X1 (16 MHz) a reťazcom dvoch kondenzátorov C1 (22 pF) a C2 (22 pF). Stabilizátor U2 () s kondenzátormi C3 (100 µF) a C4 (47 µF) stabilizuje 5V napájacie napätie potrebné pre správnu činnosť mikrokontroléra a súvisiacich komponentov. Na konektor Zas sa privádza napätie 7-12V. Ak máte napájací zdroj s napätím 5-6V, môžete stabilizátor napätia z obvodu vylúčiť. Bzučiak B1 a anódy displeja W1 sú riadené tranzistormi T1 - T5 (), s odpormi R1 - R8 (3,3 kOhm), R17 (3,3 kOhm) a R18 (3,3 kOhm). Rezistory R9 - R16 (330 ohmov) obmedzujú prúd cez segmenty displeja. Na pripojenie programátora slúži konektor Prog a jeden R pin. Klávesnica časovača sa pripája ku konektoru Sw.

Výroba

Nákres plošného spoja pre zariadenie je v archíve na konci článku. Inštalácia dielov začína spájkovaním dvoch prepojok. Potom sú nainštalované všetky odpory a ďalšie prvky v poradí od najmenšieho po najväčšie. Quartz X1 musí byť „nízky“ – inštaluje sa pod displej – inak sa tam jednoducho nezmestí. Bzučiak B1 je možné prispájkovať na dosku, ako je znázornené na fotkách, no neskôr sa zistilo, že zvuk bol po zatvorení puzdra príliš tichý (napriek vyvŕtaným otvorom v puzdre). Je lepšie prilepiť bzučiak na jednu stranu puzdra (ako je znázornené na poslednej fotografii) a pripojiť ho drôtmi k doske. Klávesnica sa skladá z 5 neuzamykateľných tlačidiel 12x12mm priamo na prednej strane puzdra tak, aby ich stláčače boli mierne nad povrchom puzdra. Pre toto zariadenie je dobré použiť ako zdroj napájania nabíjačku na telefón kvôli nízkej hmotnosti a veľkosti.

Zdroj: cxem.net


Tento diagram sa tiež často zobrazuje:

Tento časovač je určený na nastavenie rýchlosti uzávierky od 5 sekúnd do 100 minút. Na jeho výstupe je pomerne výkonné elektromagnetické relé, ktoré umožňuje spínať prúd do 30A pri napätí 12V a prúd do 10A pri napätí 220V. Vďaka použitiu elektromagnetického relé môže časovač ovládať nielen vykurovacie alebo osvetľovacie zariadenia, ale aj elektronické zariadenia, ktoré sú kritické pre formu striedavého napájacieho napätia. Transformátorové napájanie v kombinácii s relé zabezpečuje úplné galvanické oddelenie elektronického obvodu časovača od siete.

Na komunikáciu medzi časovačom a operátorom slúži štvormiestny LED indikátor, ktorý obsahuje štyri veľmi staré 7-segmentové matice AL304, spojené do matice spojením segmentových pinov rovnakého mena. Samozrejme, môžete použiť modernejšie LED indikátory, a dokonca aj hotové štvormiestne matice pre dynamické zobrazenie.

Časovač sa ovláda tlačidlami S1, S2, S3, S4. Keď stlačíte tlačidlo S1, záťaž sa zapne a spustí sa časovač. Ak chcete nastaviť čas, počas ktorého má záťaž fungovať, musíte stlačiť S4. Na displeji budú blikať dve najvýznamnejšie číslice (minúty). Teraz môžete pomocou tlačidiel S2 a S3 nastaviť minúty. Potom musíte znova stlačiť S4. Teraz budú blikať číslice nižšieho rádu a pomocou tlačidiel S2 a S3 môžete nastaviť sekundy. Ak chcete nastavenia uložiť, znova stlačte S4. Teraz indikátor zobrazí nastavenú rýchlosť uzávierky. Ak chcete spustiť časovač, musíte stlačiť S1. Záťaž sa zapne a hodnoty indikátora sa začnú znižovať. Po uplynutí nastaveného času sa na indikátore objaví „OFF“ a záťaž sa vypne elektromagnetickým relé. Pre opakovanie stlačte dvakrát tlačidlo S1. Pri prvom stlačení tlačidla „OFF“ sa zmení na zobrazenie nastaveného času a pri druhom stlačení sa spustí časovač. Ovládanie relé cez pin 23 D1. Zapínanie je logická jednotka. Kľúč na VT5 a VT6 ovláda elektromagnetické relé K1. Takéto relé sa používajú v obvodoch autoalarmov. Môžu spínať jednosmerný prúd (12V) aj striedavý prúd (220V), pretože majú dobrú izoláciu.

Zdroj energie je vyrobený pomocou transformátora s nízkym výkonom. Pretože sekundárne vinutie transformátora je odpojené od stredu (12-0-12), usmerňovač nie je vyrobený pomocou mostíka, ale pomocou celovlnného obvodu pomocou dvoch diód VD2 a VD3. Ak má transformátor 12V vinutie bez odbočky, potom je potrebný usmerňovací mostík. Relé je napájané priamo z výstupu usmerňovača a zvyšok obvodu cez 5V regulátor napätia A1.

Pri flashovaní firmvéru je potrebné ho nastaviť tak, aby pracoval s interným 8 MHz oscilátorom.

Obvod je zostavený na zakúpenom prototype dosky plošných spojov, na jednej strane je mikroobvod a ďalšie časti a na druhej strane tlačidlá a indikátory. Výkonový transformátor mimo dosky.

Tranzistory KT315 je možné nahradiť KT3102 alebo akýmikoľvek analógmi. Tranzistor KT815 je možné nahradiť KT817, KT604. Dióda KD521 - takmer akýkoľvek analóg. Diódy v usmerňovači KD209 sú akékoľvek usmerňovacie diódy pre jednosmerný prúd nie nižší ako 150 mA. Integrovaný stabilizátor 7805 je možné nahradiť akýmkoľvek 5-voltovým, napríklad KR142EN5A. Alebo urobte stabilizátor pomocou parametrického obvodu s použitím dvoch tranzistorov a 5V zenerovej diódy. Čo sa týka ukazovateľov, bolo povedané vyššie. Môžu to byť ľubovoľné sedemsegmentové indikátory so spoločnou anódou (katódou).

Archív k článku "Časovač na Atmega8 a LED indikátory"
Popis: Firmvérové ​​súbory
Veľkosť súboru: 5,58 kB Počet stiahnutí: 4 319

V tomto návode budeme hovoriť o časovačoch.

Táto téma priamo súvisí s témou taktovania mikrokontrolérov. Preto vám odporúčam, aby ste si pred čítaním tejto lekcie prečítali predchádzajúcu.

Prečo teda potrebujeme časovač?

Pri budovaní projektov na mikrokontroléroch je často potrebné merať presné časové intervaly. Napríklad túžba blikať LED pri určitej frekvencii alebo sa pýtať na stav tlačidla v požadovaných časových intervaloch.

Časovače pomáhajú riešiť úlohy. Ale časovače mikrokontrolérov AVR nevedia, čo je sekunda, minúta alebo hodina. Oni však veľmi dobre vedia, čo je takt! Fungujú presne vďaka prítomnosti taktovania ovládača. To znamená, že časovač počíta počet cyklov regulátora, čím meria časové intervaly. Povedzme, že ovládač pracuje na frekvencii hodín 8 MHz, to znamená, že keď časovač napočíta do 8 000 000, uplynie jedna sekunda, napočítanie do 16 000 000, uplynú 2 sekundy atď.

Tu však prichádza prvá prekážka. Naše registre sú 8-bitové, to znamená, že môžeme počítať maximálne do 255, a ak vezmeme 16-bitový časovač, môžeme napočítať maximálne do 65535. To znamená, že za jednu sekundu musíme vynulovať časovač a obrovský počet krát! Samozrejme, môžete to urobiť, ak nemáte nič iné na práci. Ale jednoduché meranie času pomocou výkonného mikrokontroléra nie je vôbec zaujímavé. Tu nám príde na pomoc preddel. Vo všeobecnosti ide o medzičlánok medzi časovačom a frekvenciou hodín regulátora. Preddelička nám uľahčuje úlohu tým, že nám umožňuje rozdeliť hodinovú frekvenciu určitým číslom predtým, ako ju privedieme do časovača. To znamená, že nastavením preddeličky na 8 za 1 sekundu náš časovač napočíta do 1 000 000 namiesto 8 000 000 (samozrejme, s taktovacou frekvenciou ovládača 8 MHz). Už je to zaujímavejšie, však? A môžeme deliť nielen 8, ale aj 64 a dokonca 1024.

Teraz je čas zostaviť obvod, nastaviť náš časovač, preddeličku a urobiť aspoň niečo užitočné!

A dnes vyrobíme „bežiace svetlá“ z LED diód. To znamená, že rozsvietime 3 LED jednu po druhej s periódou 0,75 sekundy (to znamená, že doba prevádzky jednej LED je 0,25 sekundy). Zostavme si nasledujúci diagram:

Vypočítajte hodnoty odporov R 1-R 3 sami.

Ďalej sa pozrime na registre zodpovedné za činnosť časovačov. Celkovo má AtMega 8 3 časovače dva 8-bitové (Časovač 0, Časovač 2) a jeden 16-bitový (Časovač 1).

Dvojica registrov, 8-bitové registre TCNT 1H a TCNT 1L, spolu tvoria 16-bitový register TCNT 1. Tento register je otvorený pre zápis aj čítanie. Keď je spustený časovač 1, hodnota tohto registra sa pri každom počítaní zmení o jednu. To znamená, že register TCNT 1 zaznamenáva počet hodinových cyklov, ktoré časovač napočítal. Môžeme sem napísať aj ľubovoľné číslo v rozsahu od 0 do 2 až po 16. mocninu. V tomto prípade sa cykly hodín nebudú počítať od 0, ale od čísla, ktoré sme zaznamenali.

Register TIMSK je zodpovedný za prerušenia generované pri činnosti časovačov mikrokontroléra. Prerušenie je obsluha špeciálneho signálu prijatého, keď sa niečo zmení.. Akékoľvek prerušenie mikrokontroléra je možné povoliť alebo zakázať. Keď dôjde k povolenému prerušeniu, priebeh hlavného programu sa preruší a tento signál sa spracuje. Keď dôjde k vypnutému prerušeniu, tok programu sa nepreruší a prerušenie sa ignoruje. Bit TOIE 1 (Timer 1 Overflow Interrupt Enable) je zodpovedný za umožnenie prerušenia pretečenia počítacieho registra TCNT 1 časovača 1. Pri zápise 1 do tohto bitu je prerušenie povolené a pri zápise 0 je vypnuté. Toto prerušenie generuje časovač 1 pri dosiahnutí maximálnej hodnoty registra TCNT 1 O prerušeniach si povieme viac v ďalšej lekcii.

Za konfiguráciu časovača 1 je zodpovedný register TCCR 1B. V tomto prípade bitmi CS 10-CS 12 nastavíme hodnotu preddeličky podľa nasledujúcej tabuľky.

Zvyšné časti nás zatiaľ nezaujímajú.

K dispozícii je tiež register TCCR 1A, ktorý vám umožňuje konfigurovať ďalšie prevádzkové režimy časovača, napríklad PWM, ale o nich v samostatnom článku.

A teraz kód v C:

#define F_CPU 16000000UL #include #include uint8_t num=0; ISR(TIMER1_OVF_vect) ( PORTD=(1<2) ( num=0; ) TCNT1=61630;//Počiatočná hodnota časovača ) int main(void) ( DDRD|=(1)<

#define F_CPU 16000000UL

#include

#include

uint8_t num = ;

ISR(TIMER1_OVF_vect)

PORTD = (1<< num ) ;

num++;

ak (počet > 2)

num = ;

TCNT1 = 61630; //Počiatočná hodnota časovača

int main (void)

DDRD |= (1<< PD0 ) | (1 << PD1 ) | (1 << PD2 ) ;

TCCR1B |= (1<< CS12 ) | (1 << CS10 ) ; //Predelovač = 1024

TIMSK |= (1<< TOIE1 ) ; //Povoliť prerušenie pretečenia časovača 1

TCNT1 = 61630; //Počiatočná hodnota časovača

sei(); //Povoliť prerušenia

zatiaľ čo (1)

//Hlavná slučka programu, je prázdna, pretože všetka práca prebieha v prerušení

ASM kód:

Zostava (x86)

Zahrnúť "m8def.inc" rjmp štart .org OVF1addr rjmp TIM1_OVF začiatok: ldi R16,LOW(RamEnd) out SPL,R16 ldi R16,HIGH(RamEnd) out SPH,R16 ldi R16,1 ldi,0R1701RDdi R17,0b00000101 výstup TCCR1B,R17 ldi R17,0b11110000 výstup TCNT1H,R17 ldi R17,0b10111110 výstup TCNT1l,R17 ldi R17,0b0000SKpR100 výstup Tmp_no_r100 hlavný _OVF: výstup PORTD,R16 lsl R16 cpi R16,8 brlo label_1 ldi R16,1 label_1: ldi R17,0b10111110 výstup TCNT1L,R17 ldi R17,0b11110000 výstup TCNT1H,R17 reti

Zahrnúť „m8def.inc“

Rjmp štart

Org OVF 1addr

Rjmp TIM 1_OVF

začať:

Ldi R 16, LOW (RamEnd)

Vyšlo SPL, R 16

Ldi R 16, HIGH (RamEnd)

Out SPH, R 16

Ldi R 16, 1

Ldi R 17, 0b00000111

Z DDRD, R 17

Ldi R 17, 0b00000101

Vyšlo TCCR 1B, R 17

Ldi R 17, 0b11110000

Vyšlo TCNT 1H, R 17

Ldi R 17, 0b10111110

Časovač odpočítavania vám pomôže presne zmerať časový interval v rozsahu od 1 sekundy do 24 hodín.

Dnes už nikoho neprekvapíte dizajnom časovača, pretože... V predaji a na internete je toľko podobných zariadení, koľko chcete. A zdá sa, že všetky časovače sú si navzájom podobné. A keď začnete podrobnejšie uvažovať o funkciách obvodu, nájdete v ňom pre seba nejaké nepríjemnosti.

Z týchto dôvodov som vytvoril program časovača, ktorý spĺňa nasledujúce parametre:
– kompaktný dizajn a jednoduché zapojenie;
– funkčné tlačidlové ovládanie;
– pri ovládaní tlačidiel duplikácia akcií na LCD;
– nastavenie času s presnosťou na sekundu;
– rozsah počítania od 1 sekundy do 24 hodín;
– funkcia štart, pauza;
– funkcia vynulovania odpočítavania a nastavených časových hodnôt;
– pri dosiahnutí hodnoty 00.00.00 sa pohon zapne;

V tomto projekte boli zrealizované všetky zadané úlohy.

Lekcia 10

Časovače-počítadlá. Prerušenia

Dnes zistíme, čo to je časovače-počítadlá v mikrokontroléroch a prečo sú potrebné, ako aj to, čo je preruší a prečo sú tiež potrebné.

Časovače-počítadlá- sú to zariadenia alebo moduly v mikrokontroléri, ktoré, ako už názov napovedá, neustále niečo počítajú. Počítajú sa buď do určitej hodnoty, alebo do hodnoty rovnajúcej sa ich bitovej hĺbke. Neustále počítajú rovnakou rýchlosťou, s rýchlosťou taktovacej frekvencie mikrokontroléra, upravenej pre frekvenčné deličy, ktoré budeme konfigurovať v určitých registroch.

A tieto počítadlá časovačov neustále počítajú, ak ich inicializujeme.

Časovače v MK Atmega8 tri.

Dvaja z nich sú osembitovýčasovače, teda také, ktoré vedia počítať maximálne len do 255. Táto hodnota nám stačiť nebude. Aj keď použijeme maximálny frekvenčný delič, nielenže nedokážeme napočítať sekundu, ale ani pol sekundy. A našou úlohou je presne toto: počítať až 1 sekundu, aby sme kontrolovali nárast počtu LED indikátora. Môžete samozrejme použiť aj zvýšenie premennej na určitú hodnotu, ale chcel by som kompletne hardvérový výpočet.

Ale je tu ešte jeden časovač - toto je plnohodnotný 16-bitovýčasovač. On nielen 16-bitový, ale stále má určité čaro, ktoré iné časovače nemajú. S týmito možnosťami sa zoznámime neskôr.

Práve tento 16-bitový časovač budeme dnes študovať a používať. Po oboznámení sa s týmto časovačom vás nebude stáť nič ani nezávislé štúdium fungovania ostatných dvoch, pretože sú oveľa jednoduchšie. Napriek tomu budeme v budúcnosti uvažovať aj o 8-bitových časovačoch, keďže jeden časovač nám na komplexnejšie úlohy stačiť nebude.

Teraz stručne o prerušeniach.

Prerušenia (Prerušenia) sú mechanizmy, ktoré prerušujú kód v závislosti od určitých podmienok alebo určitého prostredia, ktoré bude diktovať určité zariadenia, moduly a zbernice umiestnené v mikrokontroléri.

Náš ovládač Atmega8 obsahuje 19 typov prerušení. Tu sú všetky v tabuľke v technickej dokumentácii k regulátoru

Aké podmienky môžu existovať? V našom prípade napríklad časovač narátal do určitej hodnoty, alebo napríklad na nejaký autobus dorazil bajt a ďalšie podmienky.

Momentálne spracujeme prerušenie, ktoré sa nachádza v tabuľke umiestnenej vyššie na pozícii 7 - TIMER1 COMPA, volali na adresu 0x006.

Teraz sa pozrime na náš 16-bitový časovač resp ČASOVAČ1.

Tu je jeho bloková schéma

Vidíme tam register TCNTn, v ktorej sa počet neustále mení, čiže neustále narastá. V praxi ide o počítadlo. To znamená, že tento register ukladá číslo, do ktorého časovač napočítal.

A do registrov OCRnA A OCRnB(písmená n sú číslo časovača, v našom prípade to bude 1) - sú to registre, do ktorých zadáme číslo, s ktorým sa bude porovnávať číslo v registri TCNTn.

Napríklad sme zadali nejaké číslo do registra OCRnA a akonáhle sa toto číslo zhoduje s hodnotou v počítacom registri, dôjde k prerušeniu a budeme ho môcť spracovať. Časovače s prerušeniami sú veľmi podobné bežnému oneskoreniu v kóde, len keď sme v oneskorení, potom nemôžeme v tom čase spustiť žiadny kód (no, opäť obrazne „my“, v skutočnosti ALU). A keď sa počíta časovač, celý kód nášho programu sa v tomto čase ticho spustí. Takže enormne vyhrávame a nedovolíme, aby obrovské zdroje ovládača boli nečinné na sekundu alebo dokonca pol sekundy. V tomto čase zvládneme kliknutia na tlačidlá, ktoré zvládneme aj v časovači a mnoho iného.

Existuje aj register TCCR. Tento register je riadiacim registrom. Tam sú nakonfigurované určité bity, ktoré sú zodpovedné za konfiguráciu časovača.

Časovač má tiež niekoľko režimov, s ktorými sa tiež zoznámime trochu neskôr.

Skladá sa z dvoch polovíc, keďže náš radič je 8-bitový a nemôže mať 16-bitové registre. Preto je vysoká časť registra uložená v jednej polovici registra (a fyzicky v jednom registri) a nízka časť je uložená v druhej polovici. Môžete to nazvať aj párom registrov pozostávajúci z dvoch samostatných registrov TCCR1A a TCCR1B. Číslo 1 znamená, že register patrí k časovaču 1.

Tento register TCCR má na starosti nastavenie deliča, aby sa časovač nepočítal tak rýchlo, a tiež je zodpovedný (alebo skôr jeho určité bity) za nastavenie určitého režimu.

Bity WGM sú zodpovedné za nastavenie režimu

Vidíme tu množstvo rôznych režimov.

Normálne- toto je normálny režim, časovač počíta až do konca.

PWM- Toto PWM iba rôzne odrody, to znamená, že časovač môže hrať úlohu modulátor šírky impulzu. S touto technológiou sa zoznámime v ďalších lekciách.

CTC- toto je zhodou okolností reset, presne to, čo potrebujeme. Tu sa porovnávajú registre TCNT a OCR. Existujú dva takéto režimy, prvý potrebujeme, druhý pracuje s iným registrom.

V tejto lekcii nebudeme študovať všetky typy režimov. Keď budeme tieto režimy potrebovať, potom na to prídeme.

No netrápme sa dokumentáciou a skúsme konečne niečo zapísať do nejakých registrov.

Kód bol ako vždy vytvorený z predchádzajúceho projektu. Pre Proteus bol tiež skopírovaný a premenovaný kód z poslednej lekcie a vo vlastnostiach ovládača bola uvedená cesta k novému firmvéru. Projekty pomenujeme Test07.

Skúsme, ako vždy, skompilovať kód a spustiť ho v Proteuse. Ak všetko funguje dobre, začneme pridávať nový kód.

Pridajme ešte jednu funkciu, keďže sme sa v minulej lekcii naučili pridávať funkcie. Kód funkcie bude umiestnený za funkciou segchar a pred hlavnou funkciou. Potom kvôli tomu, že v našej novej funkcii zavoláme funkciu segchar.

Navyše nevytvoríme jednu funkciu, ale dve. Všetok inicializačný kód pre náš časovač umiestnime do jednej funkcie a druhá funkcia bude obsluha prerušení časovača a takéto funkcie sú špecifické a netreba ich volať. Keď to bude potrebné, zavolajú sa v závislosti od určitých podmienok, ktoré boli špecifikované vyššie.

Preto zavoláme prvú funkciu timer_ini

//———————————————

neplatnétimer_ini( neplatné)

{

}

//———————————————

Taktiež oddeľme naše funkcie, ako aj niektoré kompletné bloky s deklaráciou globálnych premenných, s prototypmi funkcií, od seba týmito riadkami, ktoré kvôli prítomnosti dvoch lomiek vpredu kompilátor nespracuje a berte ich ako komentáre. Vďaka týmto vymedzeniam uvidíme, kde jedna funkcia končí a iná začína.

Táto funkcia, ako vidíme, nemá žiadne argumenty – ani vstup, ani návrat. Okamžite zavolajme túto funkciu vo funkcii main().

nepodpísanécharbutcount=0,butstate=0;

timer_ini();

Teraz začneme túto funkciu pomaly napĺňať kódom.

Začnime s riadiacim registrom časovača, napríklad TCCR1B. Pomocou našej obľúbenej operácie „ALEBO“ zadáme jednotku do určitého bitu registra

neplatnétimer_ini( neplatné)

TCCR1B|= (1<< WGM12);

Z komentára vidíme, že pracujeme s režimovými bitmi a z nich nastavíme len bit WGM12, zvyšok necháme ako nuly. Na základe toho sme nakonfigurovali tento režim:

Časovač má tiež nasledujúci register: TIMSK. Tento register je zodpovedný za masky prerušenia - Maska prerušenia. Tento register je dostupný pre všetky časovače, nielen pre prvý, je spoločný. V tomto registri nastavíme bit OCIE1A, čo umožní typ prerušenia, ktorý potrebujeme TIMER1 COMPA

TCCR1B|= (1<< WGM12); // nastavenie režimu CTC (resetovanie zhodou okolností)

TIMSK|= (1<< OCIE1A);

Teraz sa pohráme so samotnými porovnávacími registrami OCR1A(H a L). Aby ste to dosiahli, budete musieť urobiť trochu matematiky. Registrovať OCR1AH ukladá vedúcu časť čísla na porovnanie a register OCR1AL- najmladší.

Ale predtým, než budeme počítať, napíšme kód s ľubovoľnými hodnotami tohto registra a potom ho opravíme, pretože potom inicializujeme deliteľa a bude sa podieľať aj na výpočte potrebného času počítania. Bez oddeľovača bude časovač počítať príliš rýchlo.

TIMSK|= (1<< OCIE1A); //nastaví bit povolenia prerušenia 1. počítadla tak, aby sa zhodoval s OCR1A(H a L)

OCR1AH= 0b10000000;

OCR1AL= 0b00000000;

TCCR1B|= ( ); //nastavíme deliteľa.

Zatiaľ nenastavujeme žiadneho deliteľa, keďže to ešte nemáme vypočítané. Poďme to spraviť.

Aktuálne v našom registri OCR1A nájde sa číslo 0b1000000000000000, čo zodpovedá desatinnému číslu 32768.

Náš mikrokontrolér pracuje, ako sme sa dohodli, na frekvencii 8 000 000 Hz.

Vydelením 8 000 000 číslom 32 768 získate približne 244,14. Toto je frekvencia v hertzoch, na ktorej bude náš časovač pracovať, ak nepoužijeme delič. To znamená, že naše čísla sa budú meniť 244-krát za sekundu, takže ich ani neuvidíme. Preto budete musieť použiť delič frekvencie časovača. Vyberme si deličku číslom 256. Je pre nás ako stvorený a potom ho pomocou porovnávacieho čísla opravíme presne na 1 Hz.

Tu sú deliče pre 1 časovač:

Zvýraznil som deliteľa, ktorý potrebujeme v tabuľke. Vidíme, že nám stačí nastaviť bit CS12.

Keďže náš frekvenčný delič je 256, vydelíme týmto deličom 8000000, dostaneme 31250 a toto je číslo, ktoré musíme zadať do TCNT. Náš časovač bude počítať až po toto číslo, aby počítal do 1 sekundy. Číslo 31250 je 0b0111101000010010 v binárnom vyjadrení. Dajme toto číslo do páru registrov a aplikujme aj deliteľa

OCR1AH= 0b 01111010 ; //zapíšte číslo do registra na porovnanie

OCR1AL= 0b 00010010 ;

TCCR1B|= (1<< CS12 ); //nastavíme deliteľa.

To je všetko s touto funkciou.

Teraz ďalšou funkciou je obsluha prerušenia s koincidenčným časovačom. Je to napísané takto

ISR( TIMER1_COMPA_vect)

{

}

A telo tejto funkcie sa vykoná samo pri výskyte zhody čísel.

Budeme potrebovať premennú. Deklarujme to globálne, na začiatku súboru

#include

//———————————————

nepodpísanéchari;

//———————————————

V súlade s tým odstránime rovnakú premennú z kódu vo funkcii main().

intHlavná( neplatné)

nepodpísanéchari;

Poďme tiež komentovať celý kód v nekonečnej slučke. Jeho úlohu teraz bude hrať časovač a myslím si, že sa s tým vyrovná rovnako dobre a ešte lepšie, bez toho, aby „kohokoľvek“ zasahoval.

zatiaľ čo(1)

{

// for(i=0;i<10;i++)

// {

// while (butstate==0)

// {

// ak (!(PINB&0b00000001))

// {

// if(butcount< 5)

// {

//butcount++;

// }

//inak

// {

// i=0;

//butstate=1;

// }

// }

//inak

// {

// if(butcount > 0)

// {

//butcount—;

// }

//inak

// {

//butstate=1;

// }

// }

// }

// segchar(i);

// _delay_ms(500);

//butstate=0;

// }

Teraz vlastne telo funkcie handlera. Tu zavoláme funkciu segchar. Potom zvýšime o 1 premennú i. A aby neprekročila jednociferné číslo, za tejto podmienky ho vynulujeme

ISR( TIMER1_COMPA_vect)

ak( i>9) i=0;

segchar( i);

i++;

Teraz trochu opravíme kód na začiatku funkcie main(). Port D, ktorý je zodpovedný za stav segmentov, nastavíme na jednotky, aby sa nám pri zapnutí nerozsvietil indikátor, keďže má spoločnú anódu. Potom sem do globálnej premennej i vložíme číslo 0, len pre poriadok. Vo všeobecnosti platí, že pri spustení sú neinicializované premenné vždy nulové. Ale aj tak ho inicializujeme. A čo je najdôležitejšie, aby prerušenie časovača fungovalo, nestačí ho zahrnúť do inicializácie časovača. Vo všeobecnosti tiež platí, že aby všetky prerušenia fungovali, musia byť povolené globálne prerušenia. Na to existuje špeciálna funkcia sei() — Nastaviť prerušenie.

Teraz bude kód vyzerať takto

DDRB= 0x00;

PORTD= 0b 11111111 ;

PORTB= 0b00000001;

i=0;

sei();

zatiaľ čo(1)

Na začiatok súboru musíme zahrnúť aj súbor knižnice prerušení

#include

#include

#include

Zatiaľ tiež nebudeme potrebovať premenné pre tlačidlo, pretože dnes s tlačidlom nebudeme pracovať. Poďme ich okomentovať

intHlavná( neplatné)

//nepodpísaný znak butcount=0, butstate=0;

timer_ini();

Poďme zostaviť náš kód a skontrolovať jeho výkon najskôr v Proteuse. Ak všetko funguje dobre, skontrolujeme to aj v živom okruhu

Všetko nám funguje. Skvelé!

Takto dopadli stopky. Ale keďže nemáme ani kremenný rezonátor, tieto stopky nemožno nazvať presnými.

Napriek tomu sme sa dnes veľa naučili. Dozvedeli sme sa o prerušeniach, naučili sme sa ich aj spracovať, naučili sme sa pracovať s časovačmi, konfigurovať niekoľko nových registrov mikrokontrolérov, predtým sme pracovali len s registrami portov. Aj vďaka tomu všetkému sme výrazne odbremenili aritmeticko-logické zariadenie nášho mikrokontroléra.

Pozrite si VIDEONÁVOD

Zobrazenia príspevku: 17 258