Programare microcontrolere atmega. Cum se scrie cod pentru AVR, programând microcontrolere Atmel AVR în C

Există diferite limbaje de programare pentru microcontrolerele AVR, dar poate cele mai potrivite sunt asamblarea și C, deoarece aceste limbaje implementează cel mai bine toate capabilitățile necesare pentru gestionarea hardware-ului microcontrolerului.

Limbajul de asamblare este un limbaj de programare de nivel scăzut care utilizează setul de instrucțiuni directe al microcontrolerului. Crearea unui program în acest limbaj necesită o bună cunoaștere a sistemului de comandă al cipului programabil și suficient timp pentru a dezvolta programul. Limbajul de asamblare este inferior C în viteza și ușurința dezvoltării programului, dar are avantaje notabile în dimensiunea codului executabil final și, în consecință, în viteza de execuție a acestuia.

C vă permite să creați programe cu un confort mult mai mare, oferind dezvoltatorului toate beneficiile unui limbaj de nivel înalt.
Trebuie remarcat încă o dată că arhitectura și sistemul de comandă al AVR au fost create cu participarea directă a dezvoltatorilor compilatorului limbajului C și ia în considerare caracteristicile acestui limbaj. Compilarea codului sursă C este rapidă și produce cod compact și eficient.

Principalele avantaje ale C față de assembler: viteza mare de dezvoltare a programului; universalitate care nu necesită un studiu amănunțit al arhitecturii microcontrolerului; o mai bună documentare și lizibilitate a algoritmului; disponibilitatea bibliotecilor de funcții; suport pentru calcule în virgulă mobilă.

Limbajul C combină armonios capabilitățile de programare de nivel scăzut cu proprietățile unui limbaj de nivel înalt. Capacitatea de programare la nivel scăzut vă permite să operați cu ușurință direct pe hardware, iar proprietățile limbajului de nivel înalt vă permit să creați cod de program ușor de citit și modificabil. În plus, aproape toate compilatoarele C au capacitatea de a folosi inserții de asamblare pentru a scrie secțiuni de program care sunt critice în ceea ce privește timpul de execuție și consumul de resurse.

Într-un cuvânt, C este cel mai convenabil limbaj atât pentru începătorii care se familiarizează cu microcontrolerele AVR, cât și pentru dezvoltatorii serioși.

Compilatoarele sunt folosite pentru a converti codul sursă al unui program într-un fișier firmware al microcontrolerului.

Atmel oferă un compilator de asamblare puternic care este inclus în mediul de dezvoltare Atmel Studio care rulează pe Windows. Alături de compilator, mediul de dezvoltare conține un depanator și un emulator.
Atmel Studio este complet gratuit și disponibil pe site-ul web Atmel.

În prezent, există destul de multe compilatoare C pentru AVR. Cel mai puternic dintre ei este considerat a fi compilatorul de la IAR Systems din Stockholm. La mijlocul anilor '90, angajații săi au participat la dezvoltarea sistemului de comandă AVR. IAR C Compiler are capabilități extinse de optimizare a codului și vine ca parte a mediului de dezvoltare integrat IAR Embedded Workbench (EWB), care include, de asemenea, un compilator de asamblare, linker, manager de proiect și bibliotecă și depanator. Prețul versiunii complete a pachetului este de 2820 EUR. Pe site-ul companiei puteți descărca o versiune de evaluare gratuită pentru 30 de zile sau o versiune nelimitată cu o limită de dimensiune a codului de 4 KB.

Compania americană Image Craft din Palo Alto, California produce un compilator în limbaj C care a câștigat o popularitate destul de mare. JumpStart C pentru AVR are o optimizare de cod acceptabilă și un preț nu prea mare (de la 50 USD la 499 USD în funcție de versiune). Versiunea demo a JumpStart C pentru AVR este complet funcțională timp de 45 de zile.

Compilatorul Român Code Vision AVR C a câștigat nu mai puțin popularitate; prețul versiunii complete a acestui compilator este relativ mic și se ridică la 150 EUR. Compilatorul vine cu un mediu de dezvoltare integrat, care, pe lângă caracteristicile standard, include o caracteristică destul de interesantă - CodeWizardAVR Automatic Program Generator. Prezența unui terminal serial în mediul de dezvoltare vă permite să depanați programe folosind portul serial al microcontrolerului. Puteți descărca o versiune de evaluare gratuită de la dezvoltatori cu o limită de dimensiune a codului de 4 KB și salvarea dezactivată a codului sursă generat în C.

Compania MikroElektronika, situată în orașul sârb Belgrad, produce o întreagă familie de compilatoare pentru microcontrolere AVR. Un compilator pentru limbajul C numit mikroC PRO pentru AVR costă 249 USD. Există și mikroBasic și mikroPascal la același preț. Există versiuni demo pe site-ul web al dezvoltatorilor cu o limită de dimensiune a codului de 4096 de octeți. Avantajul acestei familii de compilatoare este o singură platformă și o singură ideologie, care poate oferi o tranziție ușoară nu numai între limbi, ci și între microcontrolere (există versiuni de compilator pentru PIC, STM32, 8051...).

Mediul de dezvoltare integrat a devenit cu adevărat iconic. Include compilatoare C și asamblare puternice, programatorul AVRDUDE, un depanator, un simulator și multe alte programe și utilitare suport. WinAVR se integrează perfect cu mediul de dezvoltare AVR Studio de la Atmel. Asamblatorul este identic ca cod de intrare cu asamblatorul AVR Studio. Compilatoarele C și assembler au capacitatea de a crea fișiere de depanare în format COFF, ceea ce vă permite să utilizați nu numai instrumente încorporate, ci și să utilizați puternicul simulator AVR Studio. Un alt avantaj important este că WinAVR este distribuit gratuit, fără restricții (producătorii acceptă Licența Publică Generală GNU).

Ca rezumat, merită să spunem că WinAVR este o alegere ideală pentru cei care încep să stăpânească microcontrolerele AVR. Acest mediu de dezvoltare este considerat ca fiind principalul în acest curs.

Operațiile pe biți se bazează pe operațiunile logice pe care le-am acoperit mai devreme. Ele joacă un rol cheie în programarea AVR și a altor tipuri de microcontrolere. Aproape niciun program nu poate face fără utilizarea operațiunilor pe biți. Înainte de aceasta, le-am evitat în mod deliberat pentru a facilita procesul de învățare a programării MK.

În toate articolele anterioare, am programat doar porturi I/O și nu am folosit componente suplimentare încorporate, de exemplu, cronometre, convertoare analog-digitale, întreruperi și alte dispozitive interne fără de care MK își pierde toată puterea.

Înainte de a trece la stăpânirea dispozitivelor încorporate ale MK, trebuie să învățați cum să controlați sau să verificați biții individuali ai registrelor AVR MK. Anterior, am efectuat o verificare sau am stabilit simultan cifrele întregului registru. Să ne dăm seama care este diferența și apoi să mergem mai departe.

Operații pe biți

Cel mai adesea, atunci când programam microcontrolere AVR, l-am folosit, deoarece este mai vizual în comparație cu și este bine înțeles pentru programatorii MK începători. De exemplu, trebuie să setăm doar al 3-lea bit al portului D. Pentru a face acest lucru, așa cum știm deja, putem folosi următorul cod binar:

PORTD = 0b00001000;

Cu toate acestea, cu această comandă setăm a 3-a cifră la unu și resetam toate celelalte (0, 1, 2, 4, 5, 6 și a 7-a) la zero. Acum să ne imaginăm o situație în care biții 6 și 7 sunt utilizați ca intrări ADC și în acest moment un semnal de la un dispozitiv este primit la pinii MK corespunzători și folosim comanda de mai sus pentru a reseta aceste semnale. Drept urmare, microcontrolerul nu le vede și crede că semnalele nu au ajuns. Prin urmare, în loc de o astfel de comandă, ar trebui să folosim alta care să seteze doar al 3-lea bit la unul, fără a afecta biții rămași. Pentru a face acest lucru, se utilizează de obicei următoarea operație pe biți:

PORTD |= (1<<3);

Vom discuta mai jos sintaxa acesteia în detaliu. Și acum încă un exemplu. Să presupunem că trebuie să verificăm starea celei de-a treia cifre a registrului PIND, verificând astfel starea butonului. Dacă acest bit este resetat la zero, atunci știm că butonul este apăsat și apoi este executat codul de comandă, care corespunde stării butonului apăsat. Anterior am fi folosit următoarea notație:

dacă (PIND == 0b00000000)

(orice cod)

Cu toate acestea, cu ajutorul său, verificăm nu doar al 3-lea bit, ci toți biții registrului PIND simultan. Prin urmare, chiar dacă butonul este apăsat și bitul dorit este resetat, dar în acest moment este primit un semnal la alt pin al portului D, valoarea corespunzătoare va fi setată la unu, iar condiția dintre paranteze va fi falsă. Ca urmare, codul din interiorul acoladelor nu va fi executat nici măcar atunci când butonul este apăsat. Prin urmare, pentru a verifica starea unui al 3-lea bit individual al registrului PIND, trebuie utilizată o operație pe biți:

dacă (~PIND & (1<<3))

(orice cod)

Pentru a lucra cu biți individuali ai microcontrolerului, limbajul de programare C are instrumente care pot fi utilizate pentru a schimba sau verifica starea unuia sau a mai multor biți individuali simultan.

Setarea unui singur bit

Pentru a seta un singur bit, cum ar fi portul D, se folosește o operație SAU pe biți. Acesta este ceea ce am folosit la începutul articolului.

PORTD = 0b00011100; // valoarea initiala

PORTD = PORTD | (1<<0); применяем побитовую ИЛИ

PORTD |= (1<<0); // сокращенная форма записи

PORTD == 0b00011101; // rezultat

Această comandă setează bitul zero și lasă restul neschimbat.

De exemplu, să instalăm încă al 6-lea bit al portului D.

PORTD = 0b00011100; // starea inițială a portului

PORTD |= (1<<6); //

PORTD == 0b01011100; // rezultat

Pentru a scrie unul la mai mulți biți separati simultan, de exemplu porturile zero, șase și șapte B Se aplică următoarea notație.

PORTB = 0b00011100; // valoarea initiala

PORTB |= (1<<0) | (1<<6) | (1<<7); //

PORTB == 0b1011101; // rezultat

Resetarea (reducerea la zero) biților individuali

Pentru a reseta un singur bit, sunt utilizate simultan trei comenzi discutate anterior: .

Să resetam al 3-lea bit al registrului PORTC și să lăsăm restul neschimbat.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

Să efectuăm acțiuni similare pentru a 2-a și a 4-a cifră:

PORTC = 0b00111110;

PORTC &= ~((1<<2) | (1<<4));

PORTC == 0b00101010;

Comutarea biților

Pe lângă setare și resetare, este folosită și o comandă utilă care comută un singur bit în starea opusă: unu la zero și invers. Această operațiune logică este utilizată pe scară largă în crearea diferitelor efecte de iluminare, de exemplu, o ghirlandă de Anul Nou. Să ne uităm la exemplul PORTA

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

Să schimbăm starea biților zero, al doilea și al șaselea:

PORTA = 0b00011111;

PORTA ^= (1<<0) | (1<<2) | (1<<6);

PORTA == 0b01011010;

Verificarea stării unui bit individual. Permiteți-mi să vă reamintesc că verificarea (spre deosebire de scriere) unui port I/O se realizează prin citirea datelor din registrul PIN.

Cel mai adesea, testarea este efectuată prin una dintre cele două instrucțiuni de buclă: if și while. Suntem deja familiarizați cu acești operatori mai devreme.

Verificarea bitului pentru prezența unui zero logic (resetare) cu dacă

dacă (0==(PIND & (1<<3)))

Dacă al treilea bit al portului D este șters, atunci Code1 este executat. În caz contrar, Code2 este executat.

Acțiuni similare sunt efectuate cu această formă de înregistrare:

dacă (~PIND & (1<<3))

Verificarea bitului pentru prezența unei unități logice (setare) cu dacă

dacă (0 != (PIND & (1<<3)))

dacă (PIND & (1<<3))

Cele două bucle de mai sus funcționează în mod similar, dar pot avea, datorită flexibilității limbajului de programare C, o formă diferită de notație. Operatorul != înseamnă nu este egal. Dacă al treilea bit al portului PD I/O este setat (unul), atunci Code1 este executat; dacă nu, Code2 este executat.

Se așteaptă ca bit să se reseteze in timp ce

în timp ce (PIND & (1<<5))

Code1 va fi executat atâta timp cât al 5-lea bit al registrului PIND este setat. Când îl resetați, Code2 va începe să se execute.

Se așteaptă ca bit să fie setat in timp ce

Aici, sintaxa C vă permite să scrieți cod în două dintre cele mai comune moduri. În practică, se folosesc ambele tipuri de înregistrare.

Salutare tuturor. După cum am promis, de astăzi începem să studiem programarea microcontrolerelor AVR (folosind Atmega8 ca exemplu). Pentru acei cititori care sunt interesați de programarea unei plăci Arduino, nu vă faceți griji, articolele pe acest subiect vor continua :) .

Se poate pune o întrebare logică de ce, dintr-un număr de alte microcontrolere (denumite în continuare MK), a fost aleasă ca cea experimentală. MK AVR. Există mai multe motive pentru aceasta:

  • MK AVR disponibil universal;
  • Au un preț destul de mic;
  • Puteți găsi multe programe gratuite pe Internet care vă vor ajuta când lucrați cu date MK.
  • În plus, există o mulțime de articole scrise și forumuri unde puteți adresa întrebări despre date. MK AVR.

După cum am spus mai devreme, vom folosi MK ca subiect de testare. Atmega8. Dece el?

Acest microcontroler are 3 porturi I/O. Pe langa asta, este destul de ieftin.

Prin porturi înțelegem magistralele de date care pot funcționa în două direcții opuse (adică de ieșire și de intrare).

U Atmega8 3 porturi. Portul B este format din 8 pini (numerotate 0,1,2,3,4,5,6,7). Portul C este format din 7 pini (numerotate 0,1,2,3,4,5,6). Portul D este format din 8 pini (numerotate 0,1,2,3,4,5,6,7).

Microcontrolerul poate fi alimentat de la 3,3 și 5 V. Cu o tensiune de alimentare de 5 V, frecvența maximă de ceas este de 16 MHz, iar cu o tensiune de alimentare de 3,3 V, frecvența maximă de ceas este de 8 MHz. Deocamdată, să nu ne deranjam cu frecvențele de ceas.

Alimentarea este furnizată la pinul 7, iar împământarea este furnizată la pinul 8.

Descarcă gratis. Descărcat, instalat, lansat :)

Primul loc pentru a începe să vă familiarizați cu Atmel Studio este crearea unui proiect.

Selectați Fișier -> nou -> proiect.

Se va deschide o fereastră de selecție. Selectați folderul „Browse” în care vom salva proiectele scrise. Am creat un folder pentru proiecte în avans.

Atribuim un nume proiectului, în cazul meu lesson_avr_1

Acordați atenție casetei de selectare „creați directorul pentru soluție”. Dacă caseta de selectare este bifată, atunci în folderul pe care l-am ales pentru a salva proiectele, va fi creat un folder separat pentru proiectul curent.

Asta e tot - proiectul a fost creat.

Să începem configurarea proiectului pe care l-am creat. Faceți clic pe Projest -> proprietăți lesson_avr_1 sau (alt+F7)

Accesați fila Instrument. Alegem - simulator. Acțiunile pe care le întreprindem vor face posibilă depanarea codului scris. Salvați modificările. Puteți salva modificările într-un fișier (actual) sau în toate fișierele de proiect simultan. Închideți setările.

Kiselev Roman, mai 2007 Articol actualizat la 26 mai 2014

Deci, ce este un microcontroler (denumit în continuare MK)? Acesta este, relativ vorbind, un mic computer găzduit într-un singur circuit integrat. Are un procesor (unitate aritmetică logică sau ALU), memorie flash, memorie EEPROM, multe registre, porturi I/O, precum și clopote și fluiere suplimentare, cum ar fi cronometre, contoare, comparatoare, USART-uri etc. După ce este aplicată alimentarea , microcontrolerul pornește și începe să execute programul stocat în memoria sa flash. În același timp, poate controla o mare varietate de dispozitive externe prin porturile I/O.

Ce înseamnă acest lucru? Aceasta înseamnă că în MK puteți implementa orice circuit logic care va îndeplini anumite funcții. Aceasta înseamnă că MK este un microcircuit, al cărui conținut intern, de fapt, îl creăm noi înșine. Acest lucru permite, după ce au cumpărat mai multe MK-uri complet identice, să asamblați circuite și dispozitive complet diferite pe ele. Dacă doriți să faceți modificări în funcționarea unui dispozitiv electronic, nu va trebui să utilizați un fier de lipit; va trebui doar să reprogramați MK. În acest caz, nici măcar nu trebuie să îl eliminați de pe dispozitiv dacă utilizați un AVR, deoarece aceste MK-uri acceptă programarea în circuit. Astfel, microcontrolerele fac puntea dintre programare și electronică.

AVR-urile sunt microcontrolere pe 8 biți, adică ALU-urile lor pot efectua operații simple cu doar numere de 8 biți într-un singur ciclu de ceas. Acum este timpul să vorbim despre ce MK vom folosi. Lucrez cu un ATMega16 MK. Este foarte comun și poate fi achiziționat în aproape orice magazin de piese radio pentru aproximativ 100 de ruble. Dacă nu îl găsiți, atunci puteți cumpăra orice alt MK din seria MEGA, dar în acest caz va trebui să căutați documentație pentru el, deoarece aceleași „picioare” ale diferitelor MK-uri pot îndeplini funcții diferite și prin conectarea, s-ar părea, Dacă toate concluziile sunt corecte, este posibil să obțineți un dispozitiv funcțional sau poate doar un nor de fum împuțit. Când cumpărați un ATMega16, asigurați-vă că acesta vine într-un pachet DIP mare cu 40 de pini și, de asemenea, cumpărați o priză pentru acesta în care să poată fi introdus. Pentru a lucra cu el, veți avea nevoie și de dispozitive suplimentare: LED-uri, butoane, conectori etc.

ATMega16 are un număr foarte mare de funcții diverse. Iată câteva dintre caracteristicile sale:

  • Frecvența maximă de ceas – 16 MHz (8 MHz pentru ATMega16L)
  • Majoritatea comenzilor sunt executate într-un singur ciclu de ceas
  • 32 de registre de lucru pe 8 biți
  • 4 porturi I/O complete de 8 biți
  • două timer/contoare pe 8 biți și unul pe 16 biți
  • Convertor analog-digital (ADC) pe 10 biți
  • generator de ceas intern la 1 MHz
  • comparator analogic
  • interfețe SPI, I2C, TWI, RS-232, JTAG
  • programare în circuit și autoprogramare
  • modul de modulare a lățimii impulsului (PWM).

Caracteristicile complete ale acestui dispozitiv, precum și instrucțiunile de utilizare a acestuia, pot fi găsite în cartea de referință (Fișa de date) pentru acest MK. Adevărat, este în engleză. Dacă știți engleza, asigurați-vă că descărcați această fișă de date, care conține o mulțime de informații utile.

Să trecem în sfârșit la treabă. Vă recomand să faceți o placă specială de dezvoltare și depanare pentru microcontroler, pe care să puteți asambla orice circuit electric cu un microcontroler fără fier de lipit (sau aproape fără acesta). Utilizarea unei astfel de plăci va facilita foarte mult lucrul cu MK și va accelera procesul de învățare a programării acestuia. Arata cam asa:

De ce vei avea nevoie pentru asta?

În primul rând, veți avea nevoie de placa în sine. Am cumpărat unul gata făcut la un magazin de piese radio pentru 115 ruble. Apoi i-am lipit toate piesele necesare. Rezultatul este un lucru incredibil de convenabil, pe care puteți asambla orice circuit electric în câteva minute, conectând cabluri și instalând microcircuite și indicatoare.

Pentru a conecta elementele circuitului, este foarte convenabil să folosiți cabluri cu conectori la capete. Acești conectori sunt așezați pe „picioarele” care ies în afara fiecărui port al MK. Microcontrolerul trebuie instalat în priză și nu lipit pe placă, altfel va fi foarte dificil să îl scoateți dacă îl ardeți accidental. Mai jos este pinout-ul ATMEGA16 MK:

Să explicăm ce picioare ne interesează acum.

  • VCC - alimentarea este furnizată aici (4,5 - 5,5 V) de la o sursă stabilizată
  • GND – masă
  • RESET – resetare (la nivel de tensiune joasă)
  • XTAL1, XTAL2 – aici este conectat un rezonator de cuarț
  • PA, PB, PC, PD – porturi de intrare/ieșire (A, B, C și respectiv D).

Orice produs care produce 7-11 V DC poate fi folosit ca sursă de alimentare. Pentru o funcționare stabilă a MK, este necesară o sursă de alimentare stabilizată. Ca stabilizator, puteți utiliza microcircuite seria 7805. Acestea sunt stabilizatoare liniare integrate, a căror intrare este alimentată cu 7-11 V de curent nestabilizat direct, iar ieșirea este de 5 V de curent stabilizat. Înainte și după 7805, trebuie să instalați condensatori de filtru (electrolitice pentru filtrarea interferențelor de joasă frecvență și ceramice pentru frecvența înaltă). Dacă nu găsiți un stabilizator, atunci puteți utiliza ca sursă de alimentare o baterie de 4,5 V. MK trebuie alimentat direct de la acesta.

Mai jos este o diagramă a conexiunii MK:

Să ne dăm seama acum ce este aici.

BQ1 este un rezonator de cuarț care stabilește frecvența de funcționare a MK. Puteți seta orice până la 16 MHz, dar întrucât intenționăm să lucrăm în viitor cu un port COM, vă recomand să folosiți rezonatoare pentru următoarele frecvențe: 14,7456 MHz, 11,0592 MHz, 7,3725 MHz, 3,6864 MHz sau 1,8432 MHz (mai târziu va deveni clar de ce). Am folosit 11,0592 MHz. Este clar că cu cât frecvența este mai mare, cu atât viteza dispozitivului este mai mare.

R1 este un rezistor de tragere care menține o tensiune de 5 V la intrarea RESET. Un nivel scăzut de tensiune pe această intrare indică o resetare. După resetare, MK pornește (10 - 15 ms) și începe din nou executarea programului. Deoarece aceasta este o intrare de înaltă impedanță, nu o puteți lăsa „atârnând în aer” - un mic pickup pe ea va duce la o resetare neașteptată a MK. Exact pentru asta este R1. Pentru fiabilitate, recomand și instalarea condensatorului C6 (nu mai mult de 20 µF).

SB1 – buton de resetare.

Rezonatorul de cuarț și condensatorul de filtru C3 ar trebui să fie amplasate cât mai aproape posibil de MK (nu mai mult de 5-7 cm), deoarece în caz contrar pot apărea interferențe în fire, ceea ce duce la defecțiuni ale MK.

Dreptunghiul albastru din diagramă conturează programatorul însuși. Este convenabil să îl faceți sub forma unui fir, al cărui capăt este conectat la portul LPT, iar celălalt într-un anumit conector de lângă MK. Firul nu trebuie să fie excesiv de lung. Dacă apar probleme cu acest cablu (de obicei nu apar, dar se poate întâmpla orice), va trebui să lipiți adaptorul Altera ByteBlaster. Cum se face acest lucru este scris în descrierea programatorului AVReal.

Acum că ne-am ocupat de hardware, este timpul să trecem la software.

Există mai multe medii de dezvoltare pentru programarea AVR. În primul rând, acesta este AVR Studio - sistemul de programare oficial de la Atmel. Vă permite să scrieți în asamblare și programe de depanare scrise în asamblare, C și C++. IAR este un sistem comercial de programare în C, C++ și limbaj de asamblare. WinAVR este un compilator open source. AtmanAVR este un sistem de programare pentru AVR cu o interfață aproape la fel ca Visual C++ 6. AtmanAVR vă permite, de asemenea, să depanați programe și conține multe funcții de ajutor care ușurează scrierea codului. Acest sistem de programare este comercial, dar, conform licenței, îl puteți folosi gratuit timp de o lună.

Vă sugerez să începeți să lucrați cu IAR ca cel mai transparent mediu de dezvoltare. În IAR, un proiect este creat în întregime manual; prin urmare, după ce ați finalizat mai multe proiecte, veți ști deja clar ce înseamnă fiecare linie de cod și ce se va întâmpla dacă o modificați. Când lucrați cu AtmanAVR, fie va trebui să utilizați un șablon pre-creat, care este foarte greoi și greu de înțeles pentru o persoană fără experiență, fie aveți multe probleme cu fișierele antet atunci când asamblați proiectul de la zero. După ce ne-am ocupat de IAR, ne vom uita ulterior la alți compilatori.

Deci, mai întâi, obțineți niște IAR. Este foarte comun și găsirea lui nu ar trebui să fie o problemă. După descărcarea IAR 3.20 de undeva, instalați compilatorul/mediul de lucru și lansați-l. După aceasta puteți începe să lucrați.

După ce ați lansat IAR, selectați fișier/nou/spațiu de lucru, selectați calea către proiectul nostru și creați un folder pentru acesta și dați-i un nume, de exemplu, „Prog1”. Acum să creăm un proiect: Proiect/Creează un nou proiect... Să-i spunem și „Prog1”. Faceți clic dreapta pe titlul proiectului din arborele proiectului și selectați „Opțiuni”

Aici vom configura compilatorul pentru un anumit MK. În primul rând, trebuie să selectați tipul de procesor ATMega16 în fila Țintă, bifați caseta de selectare Activare definiții de biți în fișierele I/O-include din fila Configurare bibliotecă (astfel încât să puteți utiliza numele de biți ale diferitelor registre MK în codul programului ), și selectați acolo tipul de bibliotecă C /EU++. În categoria ICCAVR, trebuie să bifați caseta de selectare Activare suport multiocteți din fila Limbă și să dezactivați optimizarea din fila Optimizare (în caz contrar, va distruge primul nostru program).

Apoi, selectați categoria XLINK. Aici trebuie să determinați formatul fișierului compilat. Deoarece acum setăm opțiuni pentru modul de depanare, așa cum este descris în titlu, trebuie să obținem un fișier de depanare ca rezultat. Mai târziu îl vom deschide în AVR Studio. Pentru a face acest lucru, trebuie să selectați extensia.cof, iar tipul de fișier este ubrof 7.

Acum faceți clic pe OK, apoi schimbați Debug în Release.

Mergeți din nou la Opțiuni, unde toți parametrii, cu excepția XLINK, sunt setați la aceeași. În XLINK, schimbați extensia în .hex și formatul fișierului în intel-standard.

Asta e tot. Acum poți începe să scrii primul tău program. Creați o nouă sursă/text și introduceți următorul cod în el:

#include"iom16.h" scurt unsigned int i; gol principal( gol) (DDRB = 255; PORTB = 0; in timp ce(1) { dacă(PORTB == 255) PORTB = 0; altfel PORTB++; pentru(i=0; i

Fișierul „iom16.h” se află în folder (C:\Program Files)\IAR Systems\Embedded Workbench 3.2\avr\inc. Dacă utilizați un alt MK, de exemplu, ATMega64, atunci selectați fișierul „iom64.h”. Aceste fișiere de antet stochează informații despre MK: numele registrelor, biții din registre și numele întreruperilor. Fiecare pin individual al portului A, B, C sau D poate acționa fie ca intrare, fie ca ieșire. Acest lucru este determinat de Registrul de direcție a datelor (DDR). 1 face ca piciorul o ieșire, 0 o intrare. Astfel, setând, de exemplu, DDRA = 13, facem „picioarele” ieșiri PB0, PB2, PB3, restul - intrări, deoarece 13 în binar este 00001101.

PORTB este un registru care determină starea pinilor portului. După ce am scris 0 acolo, setăm tensiunea la toate ieșirile la 0 V. Apoi există o buclă fără sfârșit. Când programează MK, ei fac întotdeauna o buclă fără sfârșit în care MK efectuează o acțiune până când este resetat sau până când apare o întrerupere. În acest ciclu ei scriu, parcă, „cod de fundal”, pe care MK-ul îl execută ca ultim lucru. Aceasta ar putea fi, de exemplu, afișarea informațiilor pe un afișaj. În cazul nostru, conținutul registrului PORTB este mărit până la umplere. După aceea totul începe din nou. În cele din urmă, un ciclu de zece mii pentru buclă. Este necesar să se formeze o întârziere vizibilă în comutarea stării portului B.



Acum salvăm acest fișier în folderul de proiect ca Prog1.c, copiem fișierul iom16.h în folderul proiectului, selectați Proiect/Adăugați fișiere și adăugați „iom16.h” și „Prog1.c”. Selectați Release, apăsați F7, programul se compilează și ar trebui să apară mesajul:


Numărul total de erori: 0
Numărul total de avertismente: 0

Iată o fotografie cu programatorul meu:

Descărcați programatorul AVReal. Copiați-l (AVReal32.exe) în folderul Release/exe, unde ar trebui să se găsească fișierul Prog1.hex. Furnizăm energie MK, conectăm cablul de programare. Deschideți Far Manager (cel mai convenabil este să flashați MK), accesați acest folder, apăsați Ctrl+O. Din moment ce avem un MK complet nou, facem lucruri

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

Nu uitați să introduceți frecvența corectă dacă nu utilizați 11059200 Hz! În același timp, așa-numitul siguranțe – registre care controlează funcționarea acestuia (folosirea unui generator intern, Jtag etc.). După aceasta, este gata să primească primul program. Programatorului i se oferă ca parametri portul LPT utilizat, frecvența, numele fișierului și altele (toți sunt enumerați în descrierea AVReal). Formăm:

Avreal32.exe +Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

Dacă conexiunea este corectă, programatorul va raporta programarea cu succes. Nu există nicio garanție că acest lucru va funcționa prima dată (prima dată când apelați programul). Eu însumi sunt uneori programat a doua oară. Poate că portul LPT este defect sau există interferențe în cablu. Dacă apar probleme, verificați cu atenție cablul. Din proprie experiență, știu că 60% dintre defecțiuni sunt asociate cu o lipsă de contact la locul potrivit, 20% cu prezența unuia inutil și alte 15% cu lipirea eronată a lucrului greșit la lucru greșit. Dacă toate celelalte nu reușesc, citiți descrierea programatorului și încercați să construiți Byte Blaster.

Să presupunem că totul funcționează pentru tine. Dacă acum conectați opt LED-uri la portul B al MK (faceți acest lucru cu MK oprit și este recomandabil să includeți rezistențe de 300-400 ohmi în serie cu LED-urile) și aplicați putere, se va întâmpla un mic miracol - un „ val” va trece prin ele!

© Kiselev Roman
mai 2007

Sarcină: Să dezvoltăm un program pentru a controla un LED. Când butonul este apăsat, LED-ul se aprinde și când este eliberat, se stinge.

Mai întâi, să dezvoltăm o diagramă schematică a dispozitivului. Porturile I/O sunt folosite pentru a conecta orice dispozitiv extern la microcontroler. Fiecare dintre porturi este capabil să funcționeze atât ca intrare, cât și ca ieșire. Să conectăm LED-ul la unul dintre porturi și butonul la celălalt. Pentru acest experiment vom folosi un controler Atmega8. Acest cip conține 3 porturi I/O, are 2 timer/contor de opt biți și 1 de șaisprezece biți. De asemenea, la bord există un PWM cu 3 canale, un convertor analog-digital cu 6 canale pe 10 biți și multe altele. În opinia mea, un microcontroler este excelent pentru a învăța elementele de bază ale programării.

Pentru conectarea LED-ului vom folosi linia PB0, iar pentru a citi informațiile de pe buton vom folosi linia PD0. Diagrama este prezentată în Fig. 1.

Lecția nr. 2. comutare LED

Lecția nr. 3. LED intermitent

Lecția nr. 4. Lumini de mers

Lecția nr. 5. Lumini de mers folosind un cronometru

Lecția nr. 6. Lumini de mers. Utilizarea întreruperilor temporizatorului

Lecția nr. 7. Operatori de control al biților

Lecția nr. 8. Implementarea PWM

Dispozitivele digitale, de exemplu, un microcontroler poate funcționa numai cu două niveluri de semnal, de exemplu. zero și unu sau oprit și pornit. Astfel, îl puteți utiliza cu ușurință pentru a monitoriza starea încărcării, cum ar fi pornirea sau oprirea unui LED. De asemenea, îl puteți folosi pentru a controla orice dispozitiv electric folosind driverele adecvate (tranzistor, triac, releu etc.) Dar uneori aveți nevoie de mai mult decât doar „pornirea” și „oprirea” dispozitivului. Deci, dacă doriți să controlați luminozitatea unui LED (sau lampă) sau viteza unui motor de curent continuu, atunci semnalele digitale pur și simplu nu pot face acest lucru. Această situație este foarte comună în tehnologia digitală și se numește Modularea lățimii impulsului (PWM).

Acțiune