Frecvența ceasului pe care funcționează microcontrolerul AVR. determină viteza de funcționare. Pentru unele aplicații în timp real (de exemplu, pentru biblioteca V-USB), frecvența ceasului este un parametru important din care depinde - dacă programul va funcționa sau nu. Prin urmare, este important să puteți determina frecvența ceasului pe care operează microcontrolerul.
[Ce afectează viteza ceasului microcontrolerului? ]
Răspunsul la această întrebare este simplu - viteza de lucru. Durata fiecărui ciclu de ceas al microcontrolerului AVR corespunde, de obicei, duratei de execuție a unei instrucțiuni în limba de asamblare (deși există instrucțiuni de asamblare, timpul de execuție fiind de 2, 3 și chiar 4 cicluri). Adică, cu cât este mai mare viteza ceasului, cu atât mai repede funcționează microcontrolerul, cu atât este mai precis răspunsul său la evenimentele externe. Pentru aplicațiile în timp real (de exemplu, pentru lucrul programatic cu protocolul USB prin biblioteca V-USB), poate fi necesar să se cunoască foarte precis durata executării fiecărei instrucțiuni de program.
În plus, multe dispozitive hardware periferice sunt integrate în miezul AVR - ADC, UART, SPI, I2C și multe altele. Funcționarea tuturor acestor noduri depinde de frecvența ceasului. De exemplu, nu puteți seta cu precizie viteza UART (RS-232) dacă nu cunoașteți viteza ceasului.
Pentru a calcula întârzierile, programul folosește adesea funcții macro funcționale delay_us și delay_ms. Corectitudinea funcționării lor depinde în mod direct de cât de mult frecvența de operare a microcontrolerului AVR corespunde constantei programului F_CPU.
Astfel, este important să știm cum se formează frecvența ceasului și să se poată determina valoarea reală. Să analizăm cele mai populare variante ale temporizării microcontrolerului AVR pentru a afla cum să determinăm frecvența ceasului de lucru.
Foarte des (și acest lucru se aplică breadboard AVR-USB-MEGA16, AVR-USB162, AVR-USB162MU, metaboard, userial [1]), frecvența ceasului de funcționare a AVR este exact egală cu frecvența oscilatorului de cristal (sau cuarț), care este conectat la microcontroler. În acest caz, prescalerul (prescaler) încorporat este oprit prin siguranțe (sau programabil). Mai jos sunt exemple de apariție a rezonanților de cuarț cu marcaje, unde cifrele indică frecvența de lucru a rezonatorului de cuarț.
Fotografia din stânga arată un fragment din vechea versiune a panoului AVR-USB-MEGA16 cu un oscilator de cristal de 16 MHz. Multe exemple de programe și firmware-ul gata sunt compilate pentru această frecvență de cuarț. În partea dreaptă este o nouă versiune a AVR-USB-MEGA16 cu cuarț de 12 MHz.
Aplicațiile care rulează cu USB pe breadboard AVR-USB-MEGA16, trebuie să țină cont de frecvența de ceas a microcontrolerului, adică. E. Ar trebui să fie compilate exact frecvența de cuarț, care este montat pe breadboard, în caz contrar, programul nu va funcționa. Motivul este simplu - interfață USB are parametri de timp stricte, de exemplu, parametrii semnalelor D +, D- niveluri logice durata 0 și 1 trebuie îndeplinite foarte precis ... Acești parametri pentru plăcile de dezvoltare AVR-USB-MEGA16 controlate de bibliotecă V-USB, atunci când software-ul este procesat la un protocol de nivel scăzut USB. Precizia este menținută de codul scris în virtutea limbii de asamblare, unde durata semnalului corespunde numărului necesar de comenzi NOP. Prin urmare, programul de lucru este legat de frecvența rezonatorului de cuarț, și microcontroler firmware-ul ar trebui să fie compilate cu precizie la frecvența de ceas de lucru. Pentru biblioteca V-USB aceste frecvențe pot fi 12, 15, 16, 16,5, 20 MHz (frecvențele utilizate cel mai frecvent 12 și 16 MHz).
În program, frecvența ceasului este setată de constante speciale (de exemplu, F_CPU), care sunt apoi verificate de către preprocesorul compilatorului - pentru a conecta corect modulul de cod necesar. Constanta F_CPU este adesea setată în makefile și este trecută la compilator prin opțiunile din linia de comandă. Constanta poate fi de asemenea specificata in fisierul de antet al programului C (asa numitul antet, fisier cu extensia * .h).
Fii atent atunci când alegeți să programați frecvența ceasului pentru microcontroler - dacă ați programat accidental microcontroler, care funcționează la o frecvență de 12 MHz, firmware-ul greșit (de exemplu, care este proiectat să funcționeze la o frecvență de 16 MHz), veți obține un dispozitiv inoperabil USB care nu va determinată de sistemul de operare. Multe întrebări de la utilizatori (de ce dispozitivul USB nu funcționează.) Se datorează unei viteze incorecte a ceasului firmware.
Această fotografie prezintă o metaboard cu un microcontroler ATmega328-PU și un rezonator de quartz de 16 MHz. Și aici, pentru aplicațiile USB, este folosită procesarea software a protocolului bazat pe biblioteca V-USB. Prin urmare, tot ceea ce sa spus despre frecvența cuarțului pentru panoul AVR-USB-MEGA16, se aplică în mod egal și metaboard-ului.
Această fotografie prezintă un fragment al panoului AVR-USB162 cu cuarț instalat la 16 MHz. Aici folosim microcontrolerul AT90USB162 cu o interfață hardware USB, deci este mult mai rapid să rezolvăm sarcina de procesare a protocolului USB decât un microcontroler AVR normal. Aici, de asemenea, frecvența ceasului pe care funcționează microcontrolerul este importantă - pentru aplicațiile cu cuarț puteți utiliza cuarț pentru frecvențe de 8 sau 16 MHz, dar programul trebuie să ia acest lucru foarte strict.
[Funcționarea microcontrolerului din ceasul intern]
Pentru aplicațiile în care nu este nevoie să generați cu precizie intervalele de timp necesare sau când nu este nevoie să obțineți performanța maximă a microcontrolerului AVR, puteți utiliza generatorul RC încorporat. Frecvența acestui generator este de 8 MHz, în mod implicit este împărțită la 8 și, ca rezultat, microcontrolerul funcționează la o frecvență de 1 MHz. Divizorul poate fi programat pentru diferiți factori de divizare și poate fi de asemenea dezactivat, astfel încât viteza maximă a ceasului de funcționare a microcontrolerului poate fi de 8 MHz. Avantajul unui astfel de generator este că nu este necesar să se utilizeze un rezonator cuarț exterior, circuitul este simplificat, dispozitivul radio electronic final poate fi mai ieftin în producție. Dezavantajul este că inexactitatea generatorului RC limitează sfera de aplicare a unei astfel de opțiuni pentru obținerea frecvenței ceasului.
Generator Variant (RC-oscilator, cuarț exterior, raport divizare în frecvență) determinată de către microcontroler AVR Fyuz. AVR microcontroler Fyuz poate fi schimbat doar de un programator extern (interfețe ISP, JTAG, sau pot fi aplicate la așa-numitul „paralel“ Programming Interface). Cele mai multe microcontrolere AVR, care provin de la plante Atmel, livrate configurate să funcționeze de la un oscilator intern, activat de 8 divizor, t. E. Când energizat încep imediat să lucreze la o frecvență de 1 MHz. În anumite limite, frecvența ceasului poate fi ajustată în funcție de software-ul prin înregistrarea valorilor constantelor în registrul special de tuning. Aflați mai multe despre setarea și calendarul Fyuz AVR microcontroler puteți învăța de la foaie de date în microcontroler.
Unele microcontrolere permit PLL să fie folosite pentru a obține frecvența ceasului. Această abreviere înseamnă Faza Blocat Bloc, ceea ce înseamnă fază-blocat bucla, PLL. Înțelesul este că microcontrolerul funcționează din frecvența ceasului intern, care este generată prin înmulțirea și împărțirea frecvenței generatorului RC intern, iar frecvența generatorului RC este reglată programabil. Un bun exemplu de utilizare a unui astfel de generator este aplicația V-USB cu microcontroler ATtiny45 (sau ATtiny85), de exemplu USBrelay [2]. Microcontrolerul funcționează la 16,5 MHz, obținut utilizând un oscilator RC și un PLL. Frecvența este ajustată cu precizie programată de semnalele de sincronizare de la începutul cadrului USB (așa-numitul semnal SOF, Start of Frame), care au o frecvență foarte mare de 1 ms. Pentru mai multe informații despre PLL, consultați fișa tehnică a microcontrolerului și codul sursă USB-releu [2].
[Determinarea frecvenței ceasului utilizând un osciloscop]
În unele cazuri complexe, este dificil de știut în avans cu ce frecvență funcționează microcontrolerul. De exemplu, un rezonator extern nu este etichetat sau vă îndoiți de modul în care oscilatorul intern RC a fost programat cu siguranțe.
Dacă se utilizează o cavitate externă (cuarț sau ceramică), frecvența ceasului poate fi determinată prin conectarea la piciorul de ieșire al generatorului de ceas - atingând sonda unuia dintre picioarele rezonatorului. Aveți grijă, trebuie să vă conectați la ieșirea generatorului, iar joja de osciloscop trebuie să aibă o capacitate mică de intrare (mai mică, cu atât mai bună, de preferință nu mai mult de 20 pF). De obicei, o capacitate mică de intrare a sondei este obținută atunci când sonda osciloscopică este trecută la un raport de divizare 1:10). Pentru a afla exact ce picior al microcontrolerului este ieșirea, consultați fișa tehnică a microcontrolerului. Osciloscopul va afișa frecvența ceasului la ieșirea oscilatorului, iar frecvența ceasului de funcționare a microcontrolerului va fi egală cu această frecvență, luând în considerare raportul prescaler (dacă este pornit prin siguranțe sau programabil).
Când se utilizează un oscilator RC intern și când nu sunteți sigur că sunt programate corect prescaler-urile de procesare a cuptorului programate, măsurarea duratei instrucțiunilor programului vă poate ajuta. În acest caz, puteți introduce în ciclul principal al programului principal două comenzi simple pentru setarea și resetarea oricărui port selectat al microcontrolerului și apoi cu ajutorul unui osciloscop pentru a măsura durata recepționată a semnalului de ieșire pe acest port. Iată un exemplu simplu al unui astfel de program (este afișat numai fragmentul de cod care controlează piciorul portului PB0):
Principiul determinării frecvenței ceasului este simplu. În acest exemplu de cod, vedeți două comenzi care controlează bitul 0 al portului B, care se urmează unul pe celălalt (scriind o constantă în registrul PORTB). Prima comandă stabilește nivelul de ieșire al piciorului PB0 la starea jurnalului. 1, a doua comandă din jurnal. 0. Această măsurare a nivelului poate fi verificată printr-un osciloscop prin conectarea sondei la piciorul portului PB0. Fiecare comandă de scriere din registrul PORTB este compilată într-o comandă de asamblare, durata căreia poate fi învățată din foaia de date de pe microcontroler. În acest exemplu, comenzile ORI și ANDI vor fi utilizate. având o durată de 1 ciclu. Astfel, între prima și a doua comandă va trece timpul unui ciclu, o perioadă de ceas a microcontrolerului, adică durata pulsului jurnalului. 1 va fi egal cu durata perioadei de lucru. Figura simplifică forma de undă a semnalului la ieșirea portului PB0 și frecvența ceasului corespunzătoare.
Durata impulsului este log. 1 la ieșirea portului PB0 poate fi măsurat cu un osciloscop și să se determine frecvența ceasului pe care operează microcontrolerul.