Lecții Avr 10

Astăzi știm că astfel o contra-cronometre în microcontrolere și ceea ce fac ei, și ce întrerupe și ceea ce ei au nevoie.

Timeri-contori - aceste dispozitive sau module într-un microcontroler, care, după cum sugerează și numele, întotdeauna ceva de spus. ei consideră fie la o anumită valoare sau la o valoare în care acestea biți. Ei cred că sunt în mod constant la aceeași viteză, cu viteza de frecvență de ceas microcontroler corectat pentru separatoare de frecvență pe care vom fi configurate în anumite registre.

Și aceste temporizatoare, contoare cred că în mod constant dacă le inițializa.

Cronometre în MC ATmega8 trei.

Doi dintre ei - acest lucru de opt biți cronometre, adică, cei care pot conta numai pentru a maximiza această valoare la 255. Vom fi de ajuns. Chiar dacă aplicăm divizorului de frecvență maximă, nu suntem atât de mult un moment numărat, noi chiar nu se poate găsi o jumătate de secundă. Și avem doar o astfel de sarcină la capete de acuzare de 1 secundă pentru a controla contul de acumulare cu LED-uri. Puteți folosi cu siguranță mai variabilă capacitate la o anumită valoare, dar ar fi în întregime un cont de hardware.

Dar există un alt timer - acesta este un timer plin de 16 biți. El nu numai 16 biți. dar există în ea mai mult anumite farmece, pe care nici un alt cronometre. Cu aceste opțiuni, vom introduce mai târziu.

Aici este timer-ul de 16-biți, și vom învăța și de a folosi acum. De asemenea, după ce să se familiarizeze cu timer-ul, va fi lipsit de valoare pentru a studia activitatea celelalte două, deoarece acestea sunt mult mai ușor. Cu toate acestea, cronometre 8 biți, în viitor, vom fi, de asemenea, luate în considerare, astfel încât să se realizeze sarcini mai complexe noi temporizarea nu va fi suficient.

Acum, pe scurt despre întreruperi.

Întreruperile (de intreruperi) - acestea sunt mecanismele care rup codul, în funcție de condițiile specifice sau circumstanțe specifice, care vor dicta unele dispozitive, module și anvelope care sunt în microcontroler.

În controlerul nostru ATmega8 există 19 tipuri de întreruperi. Iată-le în tabelul din documentația tehnică pentru controlerul

Lecții Avr 10

Ce tipuri de condiții pot fi? În cazul nostru, de exemplu, timer-ul a numărat până la o anumită valoare sau, de exemplu, la unele autobuz au venit bytes și alte condiții.

Acum, să ne uităm la cronometrul nostru de 16-biți sau TIMER1.

Aici este schema sa structurală

Lecții Avr 10

Ne vedem acolo TCNTn înregistrați. care se schimbă în mod constant numărul, ceea ce înseamnă că este în continuă creștere. Practic, aceasta este contorul. Acesta este cazul și numărul de magazine la care contorul de timp și numărate.

Și în registrele și OCRnA OCRnB (n litere - un număr de timer-ul, în cazul nostru va fi 1) - un registru în care înregistrăm numărul, care va fi comparat cu chilo TCNTn înregistrare.

De exemplu, am adus unele număr în cazul OCRnA și de îndată ce acest număr corespunde cu valoarea în registrul de cont, există o reziliere și suntem capabili de a procesa. întreruperi timer sunt foarte asemănătoare cu întârzierea obișnuită în cod, numai atunci când suntem în întârziere, am în acest moment nu se poate face orice cod (bine, din nou, metaforic „noi“, de fapt, ALU). Și când cronometrul a spus, intregul cod al programului nostru în acest moment efectuate în condiții de siguranță. Așa că am câștiga enorm, fără a da controler de mers în gol resursă uriașă pentru secunde sau chiar și o jumătate de secundă. În acest moment, ne putem ocupa de apăsări pe buton, ne putem ocupa, de asemenea, timer-ul, și multe altele.

Există, de asemenea, un TCCR registru. Acest registru - un registru de control. Sunt stabilite anumite biți responsabile pentru configurarea cronometrului.

De asemenea, există mai multe moduri de temporizare, am învățat, de asemenea, un pic pozdenee.

Se compune din două jumătăți, așa cum am konotroller de 8-biți, și nu poate fi registre de 16 biți. Prin urmare, într-o jumătate din registru (fizic și într-un caz) este stocată cea mai veche parte a registrului, iar celălalt - cel mai tânăr. Acesta poate fi, de asemenea, numit o pereche registru, format din două registre separate și TCCR1A TCCR1B. Numărul 1 indică faptul că registrul timer 1 face parte.

Registrele de Dany TCCR este responsabil pentru setarea divizorului la timer-ul nu este gândit atât de rapid cum spune el (sau mai degrabă anumite sale biți) pentru stabilirea unui anumit mod.

Pentru modul de setare întâlni biți WGM

Lecții Avr 10

Vedem aici o mulțime de soiuri de moduri.

Normal - acesta este modul normal, cronometrul contează până la sfârșitul anului.

PWM - PWM este de numai specii diferite, care este, timer-ul poate juca rolul de modulator puls lățime. Cu această tehnologie, ne vom întâlni în lecții ulterioare.

CTC - este resetat coincidență, este exact ceea ce vom avea nevoie. Aici apoi sravnivyutsya registrele TCNT și OCR. Există două moduri, avem nevoie în primul rând, în al doilea rând, de lucru cu alte registre.

Toate tipurile de regimuri noi nu învățăm în această lecție. Când avem nevoie de aceste moduri, apoi se confruntă.

Ei bine, să nu ne chinuiești documentare și în cele din urmă să încercați să obțineți ceva în orice registre aduc.

Codul, ca întotdeauna, a fost creat de la ultimul proiect. Pentru Proteus ca codul a fost copiat și redenumit cu lecțiile din trecut, și în proprietățile controlerului a fost calea către noul firmware. Proiectele vor fi numite Test07.

Ca întotdeauna încercați să compilați codul și rulați-l în Proteus. Dacă totul funcționează corect, apoi începe să adăugați un nou cod.

Adăugați o altă caracteristică, avantajul adăugării caracteristici la ultima lecție pe care am învățat. Funcția Cod poștal după funcția segchar înainte de funcția principală. După ce, datorită faptului că vom fi în cadrul noilor noastre funcții pentru a determina funcția segchar.

Mai mult decât atât, vom crea mai mult de o funcție, ci două. O caracteristică vom posta toate inițializarea codul de timer noastre, iar cealaltă funcția va fi un handler de întrerupere pe un cronometru, iar aceste funcții sunt specifice și să le folosească nu este necesar. Atunci când este nevoie, ele se vor produce în funcție de anumite condiții, care au fost specificate mai sus.

Prin urmare, prima funcție am nazvovom timer_ini

Această funcție, așa cum am văzut nu are nici argumente - nici o intrare, fără întoarcere. Să numim doar această funcție în funcția principală ()

unsigned char butcount = 0, butstate = 0;

Acum vom începe această funcție cod de umplere în liniște.

Pentru a începe cu un registru de control timer, astfel TCCR1B. Folosind operațiunea noastră preferate „sau“, suntem într-un anumit registru de biți zanesom yedinichku

void timer_ini (void)

TCCR1B | = (1<

De asemenea, există un cronometru care este mai mult un caz - TIMSK. Acest registru este responsabil pentru masca de întrerupere - Masca de întrerupere. Disponibil acest registru pentru toate cronometre, nu numai pentru primul, este comun. Aici, am stabilit OCIE1A biți registru. care ne va permite să corecteze tipul de întrerupere a TIMER1 COMPA

TCCR1B | = (1<

TIMSK | = (1<

Acum, să se joace cu rata de comparație înregistrează OCR1A (H și L). Acesta va avea puține să numere. OCR1AH ​​înregistra magazine număr mare de piese pentru comparație, iar registrul OCR1AL - mai tineri.

Dar, înainte de a conta, să scrie codul cu orice valoare a registrului, și apoi să le corecteze, după cum vom continua pentru a inițializa un compas, și el va participa, de asemenea, la calcularea timpului de numărare necesar. Fără divizor timer-ul este prea rapid pentru a conta.

TIMSK | = (1<

OCR1AH ​​= 0b10000000; // scrie la numărul de registru pentru comparație

TCCR1B | = (); // set compas.

În timp ce nici un separator nu este setat, din moment ce nu am fost încă luate în considerare. Să le vom face acest lucru.

In timp ce noi în registru este numărul OCR1A 0b1000000000000000, care corespunde cu numărul zecimal 32768.

Microcontrolerul lucrează pentru noi, așa cum am convenit, la o frecvență de 8000000 Hz.

8000000 pentru a diviza 32,768 obține aproximativ 244.14. Dar, cu o astfel de frecvență în hertzi, și va lucra cronometrul nostru, dacă nu aplicăm compas. Adică, numerele noastre vor fi schimbate de 244 de ori pe secundă, așa că nici măcar nu văd. Prin urmare, este necesar să se aplice un temporizator de divizare a frecvenței. Am ales divizorului 256. Ea ne doar potrivite, și chiar până la 1 Hz, vom ajusta numărul și apoi comparați.

Aici sunt ceea ce sunt separatoare pentru temporizator 1

Lecții Avr 10

Am subliniat în tabelul de noi necesare divizor. Ne vedem ce vrem să setați doar biți CS12.

Deoarece divizor de frecvență avem 256, atunci acest împărțitor vom împărți 8.000.000, pentru a primi 31250, care este, aici avem de a aduce într-un număr de TCNT. Până la acest număr și va lua cronometrul nostru pentru a număra până la 1 secundă. Numărul 31250 - este în 0b0111101000010010 reprezentarea binară. Zanesom număr dat într-o pereche de registru, și este de asemenea aplicabil divizor

OCR1AH ​​= 0b01111010; // scrie la numărul de registru pentru comparație

Cu această funcție toți.

Acum, funcția următoare - întrerupe handler de coincidență cronometru. Este scris ca aceasta

Iar corpul acestei funcții se va realiza de la sine pe faptul coincidenței numerelor.

Trebuie să fie variabilă. Noi declare la nivel global, la începutul fișierului

Prin urmare, din codul în principal () suntem aceeași uberom variabilă

unsigned char i;

Acum, de fapt, corpul handler. Aici vom apela funcția segchar. Apoi, va crește la 1 variabile i. Și așa că nu a mers dincolo de cifre unice, acesta va fi resetat atunci când această condiție

Acum, un pic de cod corect prima funcție principală (). D. Port este responsabil pentru starea segmentelor zabem Noștri, că, atunci când pornit, nu este aprins, deoarece cu anod comun. Atunci noi suntem aici zanesom numărul 0 în variabila globavlnuyu i, doar de dragul formularului. În general, de regulă, la început în variabilele neitsializirovannyh și așa este întotdeauna zero. Dar noi încă o inițializa. Și, cel mai important, pentru cronometrul de întrerupere la locul de muncă, nu este suficient pentru a include în timer-ul de inițializare. De asemenea, în general, pentru toate întreruperile de întrerupere la nivel mondial trebuie să fie rezolvate. În acest scop, există o sei funcție specială () - Set de întrerupere.

Acum, codul va fi ca acest lucru

De asemenea, trebuie să se conecteze în continuare întrerupere fișier bibliotecă prima

// unsigned char butcount = 0, butstate = 0;

Să colectăm codul nostru și verificați dacă acesta este de lucru pentru prima dată în Proteus. Dacă totul funcționează corect, apoi verificați, de asemenea, circuitul de viu

Lecții Avr 10

Totul funcționează pentru noi. Excelent!

Aici astfel, avem un cronometru. Dar, din moment ce nu au nici măcar un rezonator de cuarț, acest cronometru nu poate fi considerată corectă.

Cu toate acestea, astăzi vom învățat multe. Am aflat despre întrerupe, de asemenea, a învățat cum să se ocupe de ei, să învețe să lucreze cu cronometre, configurați registrele de mai multe noi microcontroler înainte ca am lucrat numai cu registrele de porturi. De asemenea, din cauza toate acestea, ne-am descărcat în mod semnificativ unitatea logică aritmetică a microcontrolerului noastre.

Cumpara programator aici (vanzator de încredere) USBASP USBISP 2.0