internetul Windows. Android

Programarea MK de la zero. Microcontrolere de programare AVR.

Nu am o dată și nu doi spun că studiul MK ar trebui să fie început cu asamblorul. Acest lucru a fost dedicat unui întreg curs pe site (deși nu este foarte consistent, dar treptat le-am combinat la un tip adecvat). Da, este dificil, rezultatul nu va fi în prima zi, dar veți învăța să înțelegeți ce se întâmplă în controlerul dvs. Veți ști cum funcționează și nu pe maimuță să copieze sursele altor persoane și să încerce să înțeleagă de ce a încetat brusc să lucreze. În plus, SI este mult mai ușor de depășit de mijlocul de mijloc, care va ieși cu furci la momentul cel mai inoportun.

Din păcate, toată lumea dorește imediat rezultatul. Prin urmare, am decis să merg pe de altă parte - să fac formare pe Si, dar cu spectacolul lenjeriei sale. Un bun programator-ambalator îi ține întotdeauna bucata de fier pentru o squală, fără să-i dea un pas pentru a trece fără permisiune. Așa că va fi la începutul codului așa, atunci ce sa născut compilatorul și cum funcționează cu adevărat :)

Pe de altă parte, SI este o parte puternică este portabilitatea codului. Dacă, desigur, scrieți totul corect. Separarea algoritmilor de lucru și a implementărilor lor de fier în diferite părți ale proiectului. Apoi, pentru a transfera algoritmul la un alt MK, este suficient să rescrieți numai stratul de interfață, unde este scrisă totul la glandă și lăsați întregul cod de lucru așa cum este. Și, desigur, lizibilitatea. Sursa sursei Sash este mai ușor de înțeles la prima vedere (deși ... eu, de exemplu, nu-mi pasă de ce să flirtezi este cel puțin Si, cel puțin AFM :)), dar, din nou, dacă scrie totul corect. Cu aceste momente, voi acorda, de asemenea, atenție.

Ca o bucată experimentală de hardware pe care partea leului din toate exemplele va fi consiliul meu de depanare.

Primul program pe C pentru AVR

Alegerea unui compilator și a instalării mediului
Pentru AVR, există multe compilatoare diferite C:
În primul rând IAR AVR C. - aproape unic recunoscut ca cel mai bun compilator pentru AVR, pentru că Controlorul în sine a fost creat de colaboratorul apropiat al ATMEL și specialiștii din IAR. Dar pentru tot ceea ce trebuie să plătiți. Iar acest compilator nu este suficient pentru ceea ce este un software comercial scump, de asemenea, posedă un astfel de setări de mic dejun care le ia și îl compilează în ea ar trebui să fie gratat. Chiar nu am avut o prietenie cu el, proiectul a fost beat pe greșeli ciudate la etapa de legare (mai târziu a aflat că a fost o curbă de crack).

Al doilea vine Winavr GCC. - Compilator puternic de optimizare. Întreprinderile complete, platforme încrucișate, în general, toate bucuriile vieții. De asemenea, el se integrează perfect în AVR Studio, permițându-vă să depanați chiar acolo că Iadul este confortabil. În general, am ales-o.

De asemenea, există Codevision AVR C.- Compilator foarte popular. El a devenit popular în legătură cu simplitatea sa. Program de lucru Puteți intra în ea în câteva minute - Maestrul codului de plecare este promovat foarte mult, ștampila inițializării tuturor tipurilor de urechi. Sincer, îmi pare rău cu suspiciunea lui - cumva trebuia să dezasamblați un prog scris de acest compilator, un fel de sens, dar nu codul a fost obținut. O cantitate teribilă de televițiuni și operațiuni inutile, care a fost turnată într-un cod ușor și viteză lentă. Cu toate acestea, poate că a existat o greșeală în ADN a scris firmware-ul original. În plus, dorește bani. Nu la fel ca IAR, dar vizibil. Și în Demozhim nu oferă codul de mai mult de 2KB.
Sparge, desigur, există, dar dacă fură, deci un milion, în sensul lui IAR :)

Există deasemenea Image Craft AVR C și Microc. de la microelectronică. Nici să folosească alte utilizări, ci aici SWG. Foarte arat Micropascal.Topirea este un mediu și o bibliotecă de programare extrem de convenabilă. Cred că microc nu va fi mai rău, dar plătit și plătit.

Așa cum am spus, aleg Winavr. În trei motive: GRATUIT, se integrează în AVR Studio și este scris de doar un buzz cod finit pentru toate ocaziile.

Deci, descărcați-vă pentru a instala Studio Winavr C și AVR. Apoi, studioul este pus în primul rând, de sus, Winavr se rostogolește și se agață de studio sub forma unui plugin. Îți recomand cu insistență instalarea lui Winvr pe scurt, ceva de genul C: \\ Winavr, astfel, evitați grămezi de probleme cu căile.

Crearea unui proiect
Deci, studioul este livrat, Si este fixat, este timpul să încercați ceva de programat. Să începem cu un simplu, mai simplu. Rulați studioul, alegeți un nou proiect acolo, ca compilator AVR GCC și introduceți numele proiectului.

Deschide câmpul de lucru cu un fișier gol *.

Acum nu împiedică configurarea afișajului căilor în filele studioului. Pentru aceasta, înclinarea la:
Meniul Instrumente - Opțiuni - General - Filetabs și selectați "Numai fișier Numai" în lista derulantă. În caz contrar, va fi imposibil să lucrați - în fila va fi o cale completă a fișierului și nu va mai fi mai mult de două file pe ecran.

Configurarea proiectului
În general, crearea fișierului de realizare în care ar fi descrise toate dependențele. Și probabil este corect. Dar am crescut pe site-ul complet integrat ca uvision. sau AVR Studio. Această abordare este profund străină. Prin urmare, voi face în felul meu, toate studiourile.

Strângeți în buton cu o unelte.


Acestea sunt setările proiectului dvs. sau mai degrabă setarea generării automate a fișierului. Pe prima pagină trebuie doar să introduceți frecvența pe care va funcționa MK. Depinde de siguranțele biților, deci credem că frecvența este de 8000000gz.
De asemenea, acordați atenție șirului de optimizare. Acum există o optimizare în dimensiune. În timp ce pleacă așa cum este, atunci puteți încerca să jucați cu acest parametru. -O0 este optimizarea detașabilă deloc.

Următorul pas este de a configura căi. Primul lucru de adăugare a directorului proiectului dvs. există - veți pune o bibliotecă terță parte acolo. Lista va apărea "."

Realizați fișierul generat, îl puteți vedea în dosarul implicit din proiectul dvs., purtați prin ochi, vedeți ce este acolo.


Asta e tot. Jim Oriunde ok și du-te la sursă.

Formularea problemei
Fișa goală este atât de fluturată pentru a încorpora o idee dificilă, deoarece clipirea banală a diodei nu se inserează. Să luăm imediat un taur pentru coarne și să implementăm o legătură cu computerul - acesta este primul lucru pe care îl fac.

Va funcționa așa:
Sub sosirea portului COM, unitatea (codul 0x31) va lumina diodionul și când sosirea zero (cod 0x30) este stinsă. Mai mult, totul se va face pe întreruperi, iar sarcina de fundal va clipi o altă diodă. Pur și simplu și cu semnificație.

Colectați schema
Trebuie să conectăm modulul convertor USB-USART cu convertoarele Microcontroller USART. Pentru a face acest lucru, luați un jumper de două cabluri și puneți crucea în știfturile crucii. Adică, controlerul RX se conectează cu convertorul TX și convertorul TX cu controlerul RX.

Se pare că, ca rezultat, acesta este un astfel de schemă:


Conectarea altor concluzii, nutriție, descărcare, este standard

Noi scriem cod.

Faceți imediat o rezervare pe care nu o voi aprofunda în mod specific în descrierea limbii Si în sine. Pentru aceasta, există pur și simplu o cantitate extraordinară de material, variind de la limba clasică "SI de programare" de la K & R și terminând cu diferite tehnici.

O astfel de metodă a fost găsită în mine în fagure, am studiat odată această limbă pe ea. Acolo totul este scurt, de înțeles și în caz. Mă descurc treptat și rearanjat pe site-ul meu.

Nu există cu adevărat capitolul amânat, dar cred că nu este mult timp.

Este puțin probabil ca voi descrie mai bine, deci de la cursul de formare, în loc de o expunere detaliată a subtilităților albastre, voi da pur și simplu legături directe către anumite pagini ale acestei tehnici.

Adăugați biblioteci.
În primul rând, adăugăm bibliotecile și titlurile necesare cu definiții. La urma urmei, Si este un limbaj universal și trebuie să explice că lucrăm cu AVR, deci intrați în linia sursă:

1 #Include.

#Include.

Acest fișier este în dosar Winavr. Și conține o descriere a tuturor registrelor și a porturilor controlerului. Și există toate viclenile, cu referire la un controler specific, care este transmis de compilator prin face Fișier în parametru MCU. Și pe baza acestei variabile în proiectul dvs., un fișier antet cu o descriere a adreselor tuturor porturilor și registrelor este pe acest controler. Cum! Fără, de asemenea, este posibil, dar atunci nu veți putea utiliza numele simbolic al registrelor ca un SREG sau UDR și trebuie să vă amintiți adresa fiecăruia dintre "0xc1", și acesta este un cap.

Aceeași echipă în sine #Include.<имя файла> Vă permite să adăugați la proiectul dvs. Conținutul oricărui fișier text, de exemplu, un fișier care descrie funcțiile sau o bucată de alt cod. Și astfel încât directiva ar putea găsi acest dosar, am indicat căi de a proiecta proiectul nostru (directorul WINAVR este deja scris acolo).

Functie principala.
Programul din limba SI constă în funcții. Ele pot fi încorporate și aduse unul de celălalt în orice ordine și căi diferite. Fiecare funcție are trei parametri necesari:

  • Valoarea returnată, de exemplu, păcat (x) Returnează valoarea sinusului x. Ca și în matematică, pe scurt.
  • Parametrii transmis, același X.
  • Funcția corpului.

Toate valorile transmise și returnate trebuie să fie orice tip, în funcție de date.

Orice program pe C trebuie să conțină o funcție principal. Ca punct de intrare la programul principal, altfel este nifiga nu si :). În funcție de prezența principală în sursa altcuiva de la un milion de fișiere, se poate înțelege că acesta este capul programului în care totul începe. Deci, să ne întrebăm:

1 2 3 4 5 Int principal (void) (retur 0;)

int principal (void) (retur 0;)

Toate, mai întâi cel mai simplu program. A fost scris, nu contează că nu face nimic, tocmai am început.

Vom analiza ceea ce am făcut.
int. Acest tip de date pe care se întoarce funcția principală.

Desigur, într-un microcontroler principal. Nu pot returna nimic în principiu și în teorie ar trebui să fie void principal (void)Dar GCC este inițial ascuțit pe PC și există programul poate returna valoarea sistem de operare La finalizarea. Prin urmare, GCC ON. void principal (void) avertizare.

Aceasta nu este o greșeală, va funcționa, dar nu-mi plac varningurile.

nulă. Acest tip de date pe care le transmitem funcției în acest caz principal. De asemenea, nu pot lua nimic din afară, poetul nulă. - Dummy. Plugul este aplicat când nu este necesar să transmiteți nimic sau să reveniți.

Acestea sunt { } Figura brațe sunt un bloc software, în acest caz funcția corpului principal., va fi codul.

Întoarcere. - Aceasta este valoarea de returnare pe care o va oferi funcția principală la finalizare, deoarece suntem INT, adică numărul pe care trebuie să-l întoarcem numărul. Deși încă nu are sens, pentru că Pe microcontrolerul de la Main, noi, cu excepția nicăieri. Întoarce zero. Pentru nonfig. Iar compilatorul este de obicei inteligent și codul nu generează codul.
Deși, dacă pervertiți, apoi de la principal. Puteți merge la MC - de exemplu, cădeți în secțiunea Bootloader și îndepliniți-o, dar există deja o selecție de firmware la nivel scăzut, pentru a regla adresele de tranziție. Mai jos veți vedea și înțelegeți cum să faceți acest lucru. Pentru ce? Aceasta este o altă întrebare, în 99.999% din cazuri Acest Nafig nu este necesar :)

Făcut, a mers mai departe. Adăugați o variabilă, nu este necesară în special pentru noi și nu este necesar să introducem variabile, dar învățăm. Dacă variabilele sunt adăugate în corpul funcției - atunci sunt locale și există numai în această funcție. Când părăsiți funcția, aceste variabile sunt îndepărtate, iar memoria RAM este dată nevoilor mai importante. .

1 2 3 4 5 6 Int principal (void) (nesemnat char i; retur 0;)

int principal (void) (nesemnat char i; retur 0;)

nesemnat. Atât de nesalabile. Faptul este că, în reprezentarea binară, avem un bit de vârf pentru semnul, ceea ce înseamnă într-un byte (caractere) numărul + 127 / -128, dar dacă semnul aruncați deja de la 0 la 255. De obicei, semnul este nu e necesar. Astfel încât nesemnat..
i. - Acesta este doar numele variabilei. Nu mai.

Acum trebuie să inițializați porturile și UART.. Desigur, puteți să luați și să conectați biblioteca și să apelați un fel de uartinit (9600); Dar atunci nu veți ști ce sa întâmplat de fapt.

Facem acest lucru:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int principal (nul) (caractere nesemnate i; #define xtal 8000000L #define baudrate 9600L #Define baudidivid (Xtal / (16 * baudrate) -1) #Define hi (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xFF) ubrl \u003d lo (bauddivid); Ubrh \u003d hi (bauddividorul); UCSRA \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int principal (nuld) (nesemnat char i; #define xtal 8000000L #define baudrate 9600L #define bauddividiv (xtal / (16 * baudrate) -1) #define hi (x) ((x) \u003e\u003e 8) #define lo ( x) ((x) & 0xFF) Ubrl \u003d lo (bauddividor); Ubrh \u003d hi (bauddividiv); UCSRA \u003d 0; UCSRB \u003d 1<

Infricosator? De fapt, codul real aici este doar cinci linii de ultimă oră. Tot ce #Defini Acesta este un preprocesor macro-limbă. Aproape aceleași vârfuri ca și în asamblare, dar sintaxa este oarecum diferită.

Acestea vă vor facilita operațiunile de rutină pentru a calcula coeficienții necesari. În prima linie spunem acest lucru Xtal. Puteți înlocui în siguranță 80.000.000 și L.- Specificație tip, Mall lung sunt o frecvență a ceasului procesorului. La fel baudrate. - frecvența datelor de către UART.

bauddividorul. Deja mai complicată, expresia calculată prin formula a două dintre cele anterioare va fi înlocuită în schimb.
Bine si Lo. și SALUT Din acest rezultat va lua octeții mai tineri și seniori, pentru că Într-un byte, este clar să nu se potrivească. ÎN SALUT Schimbarea ICSE se face (parametrul de intrare al macro-ului) de opt ori în dreapta, ca rezultat, numai cel mai vechi octet va rămâne. A B. Lo. Facem un lot și cu un număr de 00ff, ca rezultat, numai cel mai tânăr octet va rămâne.

Deci, tot ceea ce se face ca #Defini Puteți arunca în siguranță, iar numerele dorite se numără pe calculator și le introduce imediat în UbbrL \u003d linii .... și Ubbrh \u003d ... ..

Poate sa. Dar! Fa asta Este categoric imposibil!

De asemenea, va lucra pentru a lucra, dar veți avea așa-numita numere magice - Valorile luate de neînțeles de unde nu este clar de ce și dacă dați un astfel de proiect în câțiva ani, atunci este greu de înțeles că va fi naibii. Da, și acum, doriți să schimbați viteza sau să schimbați frecvența cuarțului și totul va trebui să recalculați, așa că a schimbat un cuplu de Tsiferok în cod și totul în sine. În general, dacă nu doriți să vă bucurați de BydLokoder, faceți codul astfel încât să fie ușor de citit, a fost ușor de înțeles și ușor de modificat.

Apoi totul este simplu:
Toate aceste "Ubrl și Co" sunt registrele configurației transmițătorului cu care vom comunica cu lumea. Și acum am atribuit valorile necesare prin configurarea vitezei dorite și a modului potrivit.

Vizualizare de înregistrare 1< Înseamnă următoarele: Luați 1 și puneți-l în poziție Rxen. În zbor. Rxen. Aceasta este a patra parte a registrului UCSRB., astfel încât 1< formează un număr binar 00010000, Txen. - Acesta este un al treilea bit, și 1< DAST 00001000. Single "| Este stricat SAUastfel 00010000 |. 00001000 \u003d 00011000. Bițele de configurare necesare rămase sunt expuse în același mod și adăugate la Generalul General. Ca rezultat, numărul de asamblare este scris în UCSRB. Detaliile sunt scrise în Datashet pe MC în secțiunea USART. Deci, nu vă distrați de detalii tehnice.

Gata, este timpul să vedeți ce sa întâmplat. PIP-uri pe compilarea și lansarea emulării (Ctrl + F7).

Debugging.
Toate tipurile de bare de progres au fugit, studioul sa schimbat și o săgeată galbenă a apărut în apropierea funcției principale. Acesta este locul în care procesorul este în prezent curent și simularea pe pauză.

Faptul este că inițial, de fapt, ea stătea pe rândul Ubrl \u003d Lo (Bauddividorul); La urma urmei, faptul că avem în definit nu este cod, ci pur și simplu calcule preliminare, atunci simulatorul a fixat puțin. Dar acum își dădu seama că prima instrucțiune este finalizată și dacă urci într-un copac Vizualizare I / O, În secțiunea USART și câștigați acolo pe Byte Ubbrl, veți vedea că există deja acolo deja! 0x33.

Face încă un pas. Privind cum se schimbă conținutul unui alt registru. Deci, fuzionați pe toți, acordați atenție faptului că toți biții indicați sunt expuși așa cum am spus și este setat la un moment dat pentru întregul octet. Următoarea întoarcere nu funcționează, programul sa terminat.

Deschidere
Acum resetați simularea în zero. Faceți clic acolo Resetare (Shift + F5). Deschideți lista de dezasamblare, acum veți vedea ce se întâmplă în controlor de fapt. Vizualizare -\u003e dezasamblare. Și nu Yyaaaa !!! Asambl !!! Uzhos !!! DAR TU TREBUIE. Deci, mai târziu, când ceva nu merge bine, nu a îndrăznit la codul și nu a cerut problemelor nenorocite pe forumuri și a urcat imediat în pierdere și a urmărit unde aveți un stand. Nu este nimic teribil acolo.

În primul rând, va fi un top al seriei:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Jump 00000002: 940C0034 JMP 0x00000034 Jump 00000004: 940C0034 JMP 0x00000034 Jump 00000006: 940C0034 JMP 0x00000034 Jump 00000008: 940C0034 JMP 0x00000034 Jump + 0000000A: 940C0034 JMP 0x00000034 Jump + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E: 940C0034 JMP 0x00000034 Jump 00000010: 940C0034 JMP 0x00000034 Jump 00000012: 940C0034 JMP 0x00000034 Jump 00000014: 940C0034 JMP 0x00000034 Jump 00000016: 940C0034 JMP 0x00000034 Jump 00000018: 940C0034 JMP 0x00000034 Jump + 0000001A: 940C0034 JMP 0x00000034 Jump + 0000001C : 940C0034 JMP 0x00000034 Jump + 0000001E: 940C0034 JMP 0x00000034 Jump 00000020: 940C0034 JMP 0x00000034 Jump 00000022: 940C0034 JMP 0x00000034 Jump 00000024: 940C0034 JMP 0x00000034 Jump 00000026: 940C0034 JMP 0x00000034 Jump 00000028: 940C0034 JMP 0x00000034 Jump

00000000: 940C002A JMP 0x0000002A Jump 00000002: 940C0034 JMP 0x00000034 Jump 00000004: 940C0034 JMP 0x00000034 Jump 00000006: 940C0034 JMP 0x00000034 Jump 00000008: 940C0034 JMP 0x00000034 Jump + 0000000A: 940C0034 JMP 0x00000034 Jump + 0000000C: 940C0034 JMP 0x00000034 Jump + 0000000E : 940C0034 JMP 0x00000034 Jump 00000010: 940C0034 JMP 0x00000034 Jump 00000012: 940C0034 JMP 0x00000034 Jump 00000014: 940C0034 JMP 0x00000034 Jump 00000016: 940C0034 JMP 0x00000034 Jump 00000018: 940C0034 JMP 0x00000034 Jump + 0000001A: 940C0034 JMP 0x00000034 Jump + 0000001C: 940C0034 JMP 0x00000034 Jump + 0000001E: 940C0034 JMP 0x00000034 Jump 00000020: 940C0034 JMP 0x00000034 Jump 00000022: 940C0034 JMP 0x00000034 Jump 00000024: 940C0034 JMP 0x00000034 Jump 00000026: 940C0034 JMP 0x00000034 Jump 00000028: 940C0034 JMP 0x00000034 Jump

Acesta este tabelul vectorilor de întrerupere. Vom reveni la ea, în timp ce vă vedem și amintiți-vă că este. Prima coloană este adresa flash a blițului în care comanda minciună, al doilea cod de comandă al celei de-a treia echipă mnemonice, aceeași instrucțiune de asamblare, al treilea operand al echipei. Ei bine, un comentariu automat.
Deci, dacă arăți, atunci există tranziții solide. Și codul de comandă JMP este de patru octeți, conține adresa de tranziție înregistrată de Backward - octetul mai tânăr pentru adresa mai mică și codul comenzii de tranziție 940C

0000002B: BE1F Out 0x3F, R1 Out la locația I / O

Înregistrarea acestei adrese zero la 0x3F Dacă vedeți coloana I / O, atunci veți vedea că adresa 0x3F este adresa Registrului Registrului Registrului Sreg - Flag. Acestea. Resetăm SREG pentru a rula programul la condiții zero.

1 2 3 4 + 0000002C: E5CF LDI R28.0x5F Încărcarea imediată + 0000002D: E0D4 LDI R29.0x04 Încărcare imediată + 0000002E: BFDE Out 0x3e, R29 Out to I / O Localizare + 0000002F: BFCD Out 0x3d, R28 Out to I / O Localizare

0000002C: E5CF LDI R28.0x5F Încărcarea imediată + 0000002D: E0D4 LDI R29.0x04 Încărcare imediată + 0000002E: BFDE Out 0x3e, R29 Out to I / O Locul de amplasare + 0000002F: BFCD Out 0x3d, R28 Out to I / O Localizare

Aceasta este încărcarea indicatorului de stivă. Directorul direct în registrele I / O nu pot, numai prin registrul intermediar. Prin urmare, primul LDI în intermediar, și apoi de acolo în I / O. De asemenea, vă voi spune mai multe despre stivă. Între timp, se știe că aceasta este o zonă atât de dinamică de memorie, atârnând la capătul memoriei RAM și păstrează adresele și variabilele intermediare. Acum am arătat unde vom avea un stivă.

00000032: 940C0041 JMP 0x00000041 Salt

Salt la capătul Saaaeaee al programului și acolo avem o intervilă și înclinare strâns de sine:

1 2 +00000041: 94F8 CLI Global Inverrubire Dezactivare +00000042: CFF RJMP PC-0x0000 salt relativ

00000041: 94F8 CLI Global Inverrubire Dezactivare +00000042: CFFF RJMP PC-0x0000 salt relativ

Acest lucru este în cazul unor circumstanțe neprevăzute, cum ar fi ieșirea din funcția principală. De la o astfel de buclă, controlerul poate fi afișat fie cu o resetare hardware, fie este probabil, descărcarea de la câinele de supraveghere - Watchdog. Ei bine, sau, după cum am spus mai sus, corectați aceste locuri în editorul hexagonal și rutarea unde avem un suflet. De asemenea, acordați atenție faptului că există două tipuri de tranziții JMP și RJMP Primul este o tranziție directă la adresa. Este nevoie de patru octeți și poate face o tranziție directă în întreaga zonă de memorie. Al doilea tip de tranziție - RJMP - rudă. Echipa lui are doi octeți, dar tranziția pe care o face din poziția curentă (adrese) cu 1024 pași înainte sau înapoi. Și în parametrii săi, este indicat offset de la punctul curent. Folosit mai des, pentru că Este nevoie de două ori mai puțin spațiu în același timp, iar factorii lungi sunt rareori necesari.

1 +000034: 940C0000 JMP 0x00000000 Salt

00000034: 940C0000 JMP 0x00000000 Salt

Și acesta este un salt la începutul codului. Reporniți un fel. Puteți verifica, toți vectorii sari aici. Din această ieșire - dacă vă permiteți să permiteți întreruperile (ele sunt interzise în mod implicit) și veți fi întrerupte, dar nu există un handler, atunci va fi o resetare a programului - programul va arunca programul la început.

Functie principala. Totul este similar, chiar nu puteți descrie. Privind doar la registrele deja calculate numărul. Preprocessor compilator taxi !!! Deci, nu numere "magice"!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0x33 Încărcare imediată +000037: B989 out 0x09, R24 Out la I / O Locul 15: Ubrh \u003d Hi (Bauddividiv); +000038: BC10 out 0x20, R1 Out to I / O Locul 16: UCSRA \u003d 0; +000039: B81B Out 0x0b, R1 Out to I / O Locul 17: UCSRB \u003d 1<

Și aici este JAMB:

1 2 3 + 0000003E: E080 LDI R24.0x00 Încărcare imediată + 0000003F: E090 LDI R25.0x00 Încărcare imediată +00000040: 9508 RET SubruTine Return

0000003E: E080 LDI R24.0x00 Încărcare imediată + 0000003F: E090 LDI R25.0x00 Încărcare imediată +00000040: 9508 RET SUBROUTINE RETURN

Se întreabă de ce acest compilator adaugă un astfel de topmaster? Și acest lucru nu este altceva decât întoarce 0, apoi am identificat ca int principal (void). Așa că am câștigat mai mult de patru octeți nu înțeleg ce :) și dacă faceți un vid principal (void), acesta va fi doar RET, dar Varning va fi. Ce spun ei că nu întoarcem nimic la funcția principală. În general, faceți-l ca tine :)

Complicat? Pare să fie nu. Măriți performanța pas cu pas în modul de dezasamblare și în Pokery, deoarece procesorul efectuează instrucțiuni individuale, care se întâmplă cu registrele. Cum să treceți la comenzi și looping final.

Continuarea urmează în câteva zile ...

Offtop:
Alexei78. Gang un plugger de fixare pentru Firefox facilitarea navigării pe site-ul meu și forum.
Discuție și descărcare

Ministerul Educației și Științei din Federația Rusă

Instituția de învățământ de stat

educație profesională superioară

"Statul St. Petersburg

Universitatea Tehnică Naval »

E. V. Korotitsky, Yu. E. Korotitskaya

Bazele limbii Si pentru microcontrolere AVR

Tutorial

St.Petersburg

1. Elementele de bază ale limbii C pentru microcontrolere AVR

Limba universală C a fost dezvoltată ca un instrument pentru scrierea unui mediu de operare Unix.

Limba cu suporturile paradigme de programare procedural-orientate, adică Paradigm - set de proceduri interdependente.

Pentru limba SI, laconicitatea se caracterizează printr-un set modern de control al fluxului de execuție, structuri de date și un set extins de operațiuni.

    1. Preprocesorul limbii echipei sale

Preprocesorul (Macroprocesor) este o parte integrantă a limbii SI care procesează codul sursă al programului înainte de a trece prin compilator. Preprocesorul citește liniile de text și efectuează acțiunile definite de liniile de comandă. Dacă primul caracter dintr-un șir, altul decât un spațiu este #, atunci un astfel de șir este considerat de preprocesorul ca o echipă. Linii de comandă sunt numite directivă preprocesor.

Preprocesor CodevisionAkes mai multe directive. În fila. 1 este dată descrierii lor scurte.

Masa. 1 preprocesoare de preploitori de compilator CodevisionaleAvr

Directivă

Scop

Utilizate pentru a include în program

un alt dosar

Folosit pentru a înlocui unele unități lexicale ale limbajului Si altora, precum și pentru a genera macrocomenzi

Utilizate pentru anularea directivei #define

Utilizate pentru compilarea condiționată

Folosit pentru a schimba macrocomenzii încorporate _line_y_file_

Vă permite să opriți mesajul de eroare de compilare și afișare

Utilizate pentru a include în codul asamblorului sursă

Permite directive speciale de compilator

Toate directivele Preprocessor încep cu un semn #. După directivele preprocesorului, nu este pus punctul cu virgulă.

      1. #InClude Directiva.

Exemplu:

Directivă # include.

#Include "numele fișierului" și #include<имя_файла>

Nume de fișierconstă în numele fișierului.

Directivă # include.este utilizat pe scară largă pentru a activa așa-numitele fișiere de antet din program (fișiere de extensie . h.), conținând definițiile dispozitivelor periferice și a vectorilor de întrerupere a microcontrolerului utilizat, prototipurile funcțiilor bibliotecii, prototipurile de funcții definite de utilizator și așa mai departe.

#Include "file_name.h"

      1. #Define, directive #uldef

Directivă # definiacesta servește la înlocuirea unităților lexicale utilizate frecvent ale limbajului Si (constante, cuvinte cheie, operatori sau expresii) la altele, așa-numitele identificatori. Identificatori Înlocuirea textului sau a constantelor numerice constante numite. Identificatorii care înlocuiesc fragmentele programului sunt numite definiții macro Și definițiile macro pot avea argumente.

Directivă # definiare două forme sintactice:

# Identificator de text #define

# Identificator #define (listă de parametri) Text

Înainte de a întocmi un program de preprocesor în conformitate cu directiva # definiÎnlocuiți toate identificatorii întâlnite în program pentru a se potrivi cu textul.

Exemplu:

#Define A 15 #define în (a + 20) // Aceste directive vor fi înlocuite în textul programului

fiecare identificator a la numărul 15 și fiecare identificator în expresia (15 + 20) împreună cu parantezele sale înconjurătoare.

Exemplu:

#Define X (a, b, c) ((a) * (b) - (c)) // preprocesor în conformitate cu prezenta directivă, va fi înlocuit fragmentul y \u003d x (k + m, k-m, n); Pe un fragment


Amateurul modern este imposibil de imaginat fără microcontrolere, iar acest lucru este evident. În ultimele decenii, microcontrolerele diferitor producători au devenit larg răspândite în diferite domenii ale activității umane. Adesea ele pot fi găsite în cele mai neașteptate dispozitive și structuri. Suntem martorii computerizării și automatizării proceselor din jurul nostru. Adevărul este că, fără cunoașterea elementelor de bază ale programului, crearea unor dispozitive competitive moderne a devenit aproape imposibilă ...

Dacă citiți acest articol, probabil că ați avut o dorință de a înțelege modul în care funcționează microcontrolerele și cele mai probabile întrebări au apărut:

4. Ce literatură să studieze?

Să încercăm să răspundem la aceste întrebări.

1. Ce microcontroler alege să funcționeze?

Microcontrolerele pe 8 biți sunt foarte populare cu radio amatori Pic. Microchip Technology și. AVR. ATMEL, 16 biți MSP430. TI, precum și microcontrolerele pe 32 de biți, arhitectura Braţ.

În industrie, oarecum diferit, primul loc cu o marjă mare ocupă Renesas Electronics. pe al doilea Freescale., pe al treilea Samsung, atunci dute Microcip. și Ti.în continuare toate celelalte.
Popularitatea este determinată de preț și accesibilitate, disponibilitatea informațiilor tehnice și costul acompaniamentului de software joacă un rol considerabil.

Vom învăța microcontrolere AVR pe 8 biți, familii ATMEGA 8 și 16 serii. Alegerea a fost determinată, din nou accesibilitatea, prezența multor evoluții amatori, un număr mare de materiale educaționale. Prezența unei varietăți de componente încorporate și funcționalitatea acestei familii.

2. Care este utilizarea mediului de dezvoltare pentru programarea microcontrolerului selectat?

Pentru AVR, au fost create diferite medii de dezvoltare integrate (IDE, mediu de dezvoltare integrat).
IDE. - Acesta este un sistem software utilizat de programatori pentru a dezvolta software-ul (software), care include:
Editor de text,
Compilator și / sau interpret,
Instrumente de automatizare a asamblării,
Debugger.

Cele mai frecvente dintre ele Avstudio, ATMELSTUDIO, WINAVR, CODVISION, IAR Workbench.
Pentru a scrie programe, vom folosi gratuit IDE ATMELSTUDIO Versiunea 6 și mai mare.
Puteți descărca ATMEL STUDIO de pe site-ul oficial după înregistrare (înregistrarea este absolut gratuită și nu obligă nimic!)

ATMELSTUDIO vă permite să creați proiecte și să scrieți programe atât în \u200b\u200basamblare, cât și pe SI.

Inițial, există întotdeauna o întrebare: ce limbă de programare pentru a alege programe eficiente?

Voi răspunde simplu: trebuie să puteți scrie cel puțin două limbi de asamblare și Si. Asamblatorul este pur și simplu necesar atunci când trebuie să scrieți subrutine și macro-uri rapide și compacte, diverse drivere de dispozitiv. Dar când este necesar să creați un proiect în vrac, construit pe algoritmi complexi, fără să știe SI poate fi petrecut mult timp, în special în procesul de depanare și dacă există dorința de a se transfera la o altă platformă, de exemplu PIC18 sau STM , poate deveni o problemă imposibilă.
În plus, au apărut acum platformele de computere hardware Arduino.Lucrul cu care necesită cunoașterea limbajului SI ++.
Prin urmare, vom scrie programe atât în \u200b\u200basamblare, cât și în Si.

Pentru a vedea clar rezultatul lucrării dvs. fără a utiliza un fier de lipit sau o bullboard suficient pentru a instala programul Proteus..

3. Cum să clipească controlerul și ce dispozitive și axe suplimentare sunt necesare pentru munca convenabilă cu ele?

Folosim datorian. În plus, va trebui să achiziționați carduri de dumping, sursa de alimentare cu tensiunea de ieșire este de 5 volți. Este posibil să se folosească ca sursă de alimentare cu valuri mici prin aplicarea unei stabiliri de 5 volți.
Poate că în timp, vom oferi un proiect de construire a unei consiliile de depanare.

4. Ce literatură să studieze?

Dar, de exemplu:
Programare practică AVR pe asamblare. Revizie, 2011.
1000 și o schemă de microcontroler. 1-2. Rumik, 2010-2011
10 dispozitive practice pe cartea MK AVR 1-2. Kravchenko, 2008-2009
Dezvoltator de dispozitiv Tutorial la AVR MK. Belov, 2008.
Familiile MK AVR TINY și ATMEGA. EFSTIFEEV, 2008.
Codevisionavr. Manual pentru începători. Lebedev, 2008.
Microprocesor Controlul dispozitivelor, tiristoarelor, releelor. Belov, 2008.
Interfețe analogice Mk. Steward, Ball, 2007
Creați dispozitive pe MK AVR. Belov, 2007.
MK AVR în practica amatorului. Analiza completă a ATINGY2313. Belov, 2007.
Schimbul de date de rețea și firewall cu MK. Du-te, 2007.
Mk avr. Workshop pentru începători. Hartov, 2007.
Aplicație AVR Schemă, algoritmi, programe. Baranov, 2006.
Microcontrolere AVR. Curs introductiv. Morton, 2006.
Măsurarea, controlul și reglementarea utilizând AVR. Trmpet, 2006.
Programarea în limba C pentru AVR și PIC MK. Shpak, 2006.
Proiectarea dispozitivelor pe MK. Belov, 2005.
Mk este simplu, volumul 1-3. Frunze, 2002-2003
SI Limba de programare, ediția a 2-a. Kernigan, Ritchch, 2009
Programare Microcontrolere ATMEL în S. Prokopenko, 2012

5. În cazul în care pe Internet puteți pune întrebări și primiți răspunsuri specifice?

Puteți pune întrebări pe orice alt forum, unde într-un fel sau altfel afectate subiectul microcontrolerelor. Principalul lucru pe forumuri formulează corect întrebări pentru a primi în mod clar răspunsuri. Întrebările abstracte nu sunt binevenite și, cel mai probabil, în loc de un răspuns, veți obține critici grele sau întrebarea dvs. va fi ignorată!

Acum, ia în considerare favoritul nostru mai aproape, Atmega Microcontroller 8

Microcontroler AVR de înaltă performanță pe 8 biți cu consum redus
Progressive Risc Architecture
130 comenzi de înaltă performanță, majoritatea echipelor sunt efectuate pentru un ciclu de ceas
32 Înregistrare generală pe 8 biți
Lucru complet static
Se apropie de 16 mips (cu o frecvență de ceas de 16 MHz)
Built-in 2-ciclate multiple

Memoria non-volatilă și memoria de date
8 Memorie flash programabilă de 8 kbyte IntraSystem (flash auto-programabil în sistem)
Oferă 1000 de cicluri de ștergere / scriere
Sectorul suplimentar de coduri de boot cu biți de blocare independenți
A furnizat modul de citire / scriere simultan (citire în timp ce scrie)
512 octeți EEPROM.
Oferă 100.000 de cicluri de ștergere / înregistrare
1 kbyte încorporat sram
Programarea programului de blocare a software-ului utilizatorului

Periferia încorporată
Două timer / contor cu 8 biți cu un divizor preliminar separat, unul cu un mod de comparație
Un cronometru de 16 biți / contor cu un mod separat preliminar și moduri de captare și comparare
Contor de timp real cu generator separat
Trei canale PWM.
Convertor analog-digital cu 8 canale (în incinte TQFP și MLF)
6 canale cu precizie de 10 biți
Convertor analog-digital cu 6 canale (în carcasă PDIP)
4 canale cu precizie de 10 biți
2 canale cu precizie de 8 biți
Interfață serială cu 2 fire orientate spre octeți
Programabil în serie USART.
SPI interfață serială (plumb / sclav)
Cronometru de supraveghere programabil cu un generator încorporat separat
Comparator analogic încorporat

Funcții speciale de microcontroler
Resetați sursa de alimentare și detectorul programabil de tensiune de alimentare pe termen scurt
Generator RC construit calibrat
Surse de întrerupere internă și externă
Cinci moduri de consum redus: inactivitate, cu excepția puterii, alimentarea, regimul de așteptare și ADC

Concluzii I / O și Corps
23 linii programabile I / O
Carcasă PDIP de 28 de pini, carcasă TQFP de 32 de pini și carcasă de 32 de pini

Stresul operațional
2.7 - 5,5 V (ATMEGA8L)
4.5 - 5,5 V (ATMEGA8)

Frecventa de operare
0 - 8 MHz (ATMEGA8L)
0 - 16 MHz (Atmega8)

diferențe ATMEGA16 de la 8
16 Kbyte Intrashemternal Programabil memorie flash (flash în sistem auto-programabil)

Interfața JTAG (compatibilă cu IEEE 1149.1)
Abilitatea de a scana periferia care îndeplinește standardul JTAG
Suport îmbunătățit de depanare încorporat
Programare prin interfața JTAG: Flash, EEPROM de memorie, Jumpers și Bits Lock

Patru canal PWM / PWM

Convertor analogic cu 8 canale pe 10 biți
8 canale asimetrice
7 canale diferențiale (numai în cazul TQFP)
2 canale diferențiale cu un câștig programabil în 1, 10 sau 200 de ori (numai în cazul TQFP)

Șase moduri de consum redus: inactivitate, salvare de putere, pornire, regim de așteptare, scăzută și reducerea zgomotului ADC

32 Linii programabile I / O

Carcasă PDIP de 40 de pini și carcasă TQFP de 44 de pini

ATMELSTUDIO.

Dacă începeți doar, trebuie să descărcați și să instalați programul ATMELSTUDIO de pe pagina oficială ATMEL.COM
După instalarea programului ATMELSTUDIO, puteți trece la crearea proiectului.
Proiect - Acesta este programul dvs. pe care îl veți scrie, depanați și bliț, după compilarea, în memoria microcontrolerului.

Pentru a crea un proiect, trebuie să deschideți un program, apare acest screensaver,

și se deschide pagina de creare a proiectului

Pentru a crea un nou proiect, trebuie să faceți clic pe "PROIECT NOU ..."
În acest caz, o fereastră nouă se va deschide unde puteți selecta limba de programare, numele proiectului, locația sa, numele pachetului cu fișierele de proiect și capacitatea de a crea un catalog pentru utilizarea ulterioară în alte proiecte încrucișate. Pentru a crea un proiect în care vom programa în asamblare, trebuie să alegeți - Asamblare.După aceea, schimbați numele proiectului, locația sa și alegeți O.K.

Va apărea următoarea fereastră

Alege "Megaavr, 8 biți" și găsiți microcontrolerul de care aveți nevoie, am ales ATMEGA8. În partea dreaptă a dispozitivului Screamer apare o listă de dispozitive care rulează cu acest microcontroler, dintre care unul ne putem conecta. Alege O.K.

Apare pagina editorului de text, care vă permite să editați și să depanați programul. În timp ce pagina este curată, timp specificat și data creării și denumirii fișierului de proiect, numele de utilizator. Există ferestre de dispozitive opționale I / O, rapoarte de compilare a programului. acum noi


putem programa la asamblare.
În mod similar, este creat un proiect de programare în limba SI. Kiselev Roman, mai 2007 Articolul actualizat 26 mai 2014

Deci, ce este acest microcontroler (denumit în continuare MK)? Acest lucru, relativ vorbind, un mic computer situat într-un chip integrat. Are un procesor (dispozitivul aritmetic-logic sau ALU), memorie flash, memorie de eeprom, multe registre, porturi I / O, precum și "grinzi" suplimentare, cum ar fi cronometrele, contoarele, comparatoarele, USART etc. Microcontrolerul este încărcat după alimentarea și începe să execute programul înregistrat în memoria flash. În acest caz, poate controla cele mai diverse dispozitive externe prin porturile I / O.

Ce inseamna asta? Aceasta înseamnă că în MK puteți implementa orice schemă logică care va efectua anumite funcții. Aceasta înseamnă că MK este un microcircuit, conținutul intern al căruia, de fapt, ne-am creat. Ce permite, după cum ați cumpărat câteva MK complet identice, colectarea unor scheme și dispozitive complet diferite pe ele. Dacă doriți să efectuați orice modificare a funcționării dispozitivului electronic, nu va trebui să utilizați un fier de lipit, acesta va fi suficient pentru reprogramarea MK. În același timp, nu este necesar să o eliminați chiar de pe dispozitiv dacă utilizați AVR, deoarece aceste MK își mențin programele intraimale. Astfel, microcontrolerele elimină decalajul dintre programare și electronică.

AVR este microcontrolere pe 8 biți, adică, ALU poate efectua în permanență cele mai simple operații cu numere de 8 biți. Acum este timpul să vorbim despre ce vom folosi Mk. Lucrez cu ATMEGA16 MK. Este foarte frecvent și îl puteți cumpăra aproape în orice magazin de componente radio undeva pentru 100 de ruble. Dacă nu o găsiți - atunci puteți cumpăra orice alt MK din seria Mega, dar în acest caz trebuie să căutați o documentație pentru aceasta, deoarece aceleași "picioare" ale diferitelor MK pot efectua diferite funcții și, prin urmare, Conectarea, ar părea că are dreptate, toate concluziile, puteți avea un dispozitiv de lucru și poate doar norul de fum. Când cumpărați ATMEGA16, verificați dacă acesta este într-o incintă mare de 40 de tăiere, și cumpara, de asemenea, un panou la acesta în care poate fi introdus. Pentru a lucra cu el, vor avea nevoie, de asemenea, dispozitive suplimentare: LED-uri, butoane, conectori etc.

ATMEGA16 are un număr foarte mare de caracteristici largi. Iată câteva dintre caracteristicile sale:

  • Frecvența maximă a ceasului - 16 MHz (8 MHz pentru ATMEGA16L)
  • Cele mai multe echipe sunt efectuate pentru o bătaie
  • 32 de registre de operare pe 8 biți
  • 4 porturi de intrare / ieșire din 8 biți
  • două cronometri / metri de 8 biți și unul pe 16 biți
  • Convertor analog-to-digital de 10 biți (ADC)
  • generator de ceas intern pentru 1 MHz
  • comparator analogic
  • sPI, I2C, TWI, RS-232, JTAG Interfețe
  • programare de asigurare și auto-programare
  • modul de modulare a impulsurilor (PWM)

Caracteristicile complete ale acestui dispozitiv, precum și instrucțiunile pentru aplicarea acestora pot fi găsite în directorul (foaia de date) la acest MK. Adevărat, el este în limba engleză. Dacă știți limba engleză, atunci descărcați cu siguranță această fișă tehnică, există o mulțime de utilă în ea.

În sfârșit voi începe să plec. Vă recomandăm să faceți o taxă specială de maquetting pentru un microcontroler, pe care va fi posibilă colectarea oricărui circuit electric cu un microcontroler. Folosirea unui astfel de bord va facilita foarte mult munca cu MC și va accelera procesul de studiere a programării sale. Se pare așa:

Ce ai nevoie?

În primul rând, va fi necesară taxa. Am cumpărat un magazin de componente radio gata pentru 115 ruble. Apoi toate detaliile necesare lipite de ea. Sa dovedit un lucru incredibil de convenabil la care puteți colecta orice circuit electric într-o chestiune de minute prin overclockarea buclelor și instalarea microcircuitelor și a indicatorilor.

Pentru a conecta elementele circuitului, este foarte convenabil să se utilizeze bucle, la capetele căruia sunt instalate conectorii. Aceste conectori sunt puse pe "picioarele" lipind lângă fiecare port al MK. Microcontrolerul trebuie instalat în panou și nu să fie lipit la bord, altfel va fi foarte dificil să îl eliminați în cazul în care îl veți ridica. Mai jos este Cocolevka MK ATMEGA16:

Să explicăm ce picioare sunt acum interesate.

  • VCC - alimente aici (4,5 - 5,5 V) de la o sursă stabilizată
  • GND - Pământ
  • Resetare - Resetare (cu tensiune redusă)
  • Xtal1, Xtal2 - un rezonator de cuarț se conectează aici
  • Porturi PA, PB, PC, PD - I / O (A, B, C și D, respectiv).

Ca sursă de alimentare, puteți folosi tot ceea ce emite 7-11 în DC. Pentru o operațiune stabilă, MK are nevoie de mese stabilizate. Ca stabilizator, pot fi utilizate jetoanele din seria 7805. Acestea sunt stabilizatori integrale liniare, a căror intrare este furnizată 7-11 într-un curent constant nestabilizat, iar ieșirea este obținută 5 în stabilizat. Înainte de 7805 și după aceasta, trebuie să puneți condensatoare de filtrare (electrolitic pentru filtrarea interferențelor de frecvență joasă și ceramică pentru înălțime). Dacă nu este posibil să găsiți un stabilizator, atunci puteți utiliza o baterie de 4,5 V ca sursă de alimentare de la acesta, MK trebuie utilizat direct.

Mai jos, voi da schema de conectare MK:

Să vedem acum ce pentru ce.

BQ1 este un rezonator de cuarț care setă frecvența de funcționare a MK. Puteți pune orice până la 16 MHz, dar din moment ce intenționăm să lucrăm în viitor și cu portul COM, vă recomandăm să utilizați rezonatorii la următoarele frecvențe: 14.7456 MHz, 11.0592 MHz, 7.3725 MHz, 3 , 6864 MHz sau 1, 8432 MHz (mai târziu devine clar de ce). Am folosit 11.0592 MHz. Este clar că cu cât frecvența mai mare, cu atât este mai mare viteza dispozitivului.

R1 este un rezistor de strângere care acceptă tensiunea 5 V la intrarea de resetare. Nivelul de joasă tensiune la această intrare înseamnă resetare. După resetare, MK este încărcat (10-15 ms) și începe să efectueze din nou programul. Deoarece aceasta este o intrare de înaltă calitate, este imposibil să lași "chat în aer" - un mic vârf pe acesta va duce la o descărcare neprevăzută a MK. Este pentru asta am nevoie de R1. Pentru fiabilitate, recomand, de asemenea, instalarea condensatorului C6 (nu mai mult de 20 microf).

SB1 - Buton de resetare.

Rezonatorul cuarț și condensatorul de filtrare C3 trebuie amplasat cât mai aproape de MC (nu mai mult de 5-7 cm), deoarece vânzătorii pot apărea în fire, ceea ce duce la defecțiuni în funcționarea MC.

Dreptunghiul albastru din schemă trezește programul proprietar. Este convenabil să se efectueze sub forma unui fir, un capăt al cărui capăt este blocat în portul LPT, iar celălalt într-un anumit conector de lângă MK. Firul nu trebuie să fie excesiv de lung. Dacă există probleme cu acest cablu (de obicei nu apar, dar se întâmplă ceva), atunci va trebui să lipiți adaptorul Altera Byteblaster. Despre cum să faceți acest lucru este scris în descrierea programatorului Avreal.

Acum, când ne-am dat seama cu glanda, este timpul să mergem la software.

Programarea AVR are mai multe evoluții. În primul rând, este studioul AVR - sistemul oficial de programare de la ATMEL. Vă permite să scrieți pe programele de asamblare și de depanare scrise în Assembler, C și C ++. IAR este un sistem de programare comercială pe C, C ++ și Assembler. WINAVR - Compilator cu surse deschise. Atmanavr este un sistem de programare pentru AVR cu o interfață, aproape unul la unul "este același cu Visual C ++ 6. ATMANAVR vă permite, de asemenea, să depanați programe și conține multe funcții auxiliare care facilitează scrierea codului. Acest sistem de programare este comercial, dar, potrivit unei licențe, acesta poate fi utilizat pentru o lună "Nakhalyava".

Vă sugerez să începeți lucrul cu IAR ca fiind cel mai "transparent" mediu de dezvoltare. În IAR, proiectul este în întregime creat de "mânere", respectiv, făcând mai multe proiecte, veți ști deja în mod clar ce înseamnă fiecare linie a codului și ce se va întâmpla dacă este schimbat. Când lucrați cu ATMANAVR, va trebui fie să utilizați un șablon pre-creat, care este foarte voluminos și dificil de înțeles pentru o persoană care nu are experiență sau are multe probleme cu fișierele antetului atunci când asamblați proiectul "de la zero". După ce am înțeles cu IAR, vom lua în considerare mai târziu și alți compilatori.

Deci, pentru începuturi, раздar. Este foarte frecventă și găsirea sa nu ar trebui să fie o problemă. Prin descărcarea oricui IAR 3.20, setați compilatorul / mediul de lucru și executați-l. După aceea, puteți începe să lucrați.

Lansarea IAR, alegeți fișier / Nou / Spațiu de lucru, Alegeți calea spre proiectul nostru și creați un dosar pentru acesta și dați un nume, de exemplu, "Prog1". Acum creați un proiect: Proiect / Creați un nou proiect ... De asemenea, îl numim - "Prog1". Faceți clic pe clic dreapta pe antetul 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ă, în fila Configurare Bibliotecă, instalați definițiile Bitului Enable în fișierele I / O. Include (astfel încât să puteți utiliza numele biților de diferite registre MK în Codul programului), selectați tipul bibliotecii / UE ++. În categoria ICCAVR, trebuie să instalați Biff Activați suportul Multibyte în fila Optimizare și opriți optimizarea în fila de optimizare (altfel va strica primul nostru program).

Apoi, alegeți categoria XLINK. Aici trebuie să determinați formatul fișierului compilat. Deoarece acum specificăm opțiunile pentru modul de depanare (Debug), ceea ce este scris în titlu, atunci trebuie să primiți un fișier de depanare la ieșire. Mai târziu o vom deschide în AVR Studio. Pentru a face acest lucru, selectați extensia.cof și tipul de fișier este Ubrof 7.

Acum, faceți clic pe OK, apoi schimbați depanarea la eliberare.

Inducem din nou în opțiuni, unde toți parametrii, cu excepția lui Xlink expun la fel. În XLINK, schimbați extensia la HEX și formatul de fișier pe Intel Standart.

Asta e tot. Acum puteți să scrieți primul program. Creați o nouă sursă / text și scorați următorul cod în acesta:

#Include. "iom16.h" scurt nesemnat int; nulă. Principal ( nulă.) (DDRB \u003d 255; PORTB \u003d 0; in timp ce(1) { dacă (PORTB \u003d\u003d 255) PORTB \u003d 0; altfel. Portb ++; pentru (i \u003d 0; i

Fișierul "iom16.h" este în dosarul (Fișierele C: \\ Program) \\ IAR Systems \\ Workbench Embeddedded 3.2 \\ AVR \\ Inc. Dacă utilizați un alt MK, de exemplu, ATMEGA64, apoi selectați fișierul "iom64.h". În aceste fișiere antet, sunt stocate informații despre MK: numele registrelor, biți în registre, sunt determinate numele întreruperilor. Fiecare "picior" separat al portului A, B, C sau D poate funcționa fie ca o intrare, fie ca o ieșire. Acest lucru este determinat de registrul directorului de date (DDR). 1 face ieșirea "picior", 0 - intrare. Astfel, expunerea, de exemplu, DDRA \u003d 13, facem ieșirile "picioarelor" PB0, PB2, PB3, restul - intrările, deoarece 13 În codul binar va fi 00001101.

PORTB este un registru în care se determină starea "picioarelor" portului. Recuperarea de acolo 0, expunem la toate ieșirile de tensiune 0 V. Apoi este ciclul nesfârșit. Când programarea MK face întotdeauna o buclă infinită, în care MK efectuează orice acțiune până când scade sau până la întreruperea întreruperii. În acest ciclu, ei scriu ca fiind pentru "codul de fundal", pe care MK le desfășoară în ultima comandă. Aceasta poate fi, de exemplu, informații de ieșire pe afișaj. În cazul nostru, conținutul înregistrării PORTB crește până când este umplut. După aceea, totul începe mai întâi. În cele din urmă, pentru zece mii de cicluri. Este necesar să se formeze o întârziere vizibilă în comutarea stării portului V.



Acum salvăm acest fișier în dosarul proiectului ca Prog1.c, copiați în dosar cu fișierul de proiect OM16.H, selectați Project / Adăugare fișiere și adăugați "iom16.h" și "Prog1.c". Selectați versiunea, faceți clic pe F7, programul este compilat și ar trebui să apară un mesaj:


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

Voi da o fotografie a programatorului dvs .:

Descărcați programul Avreal. Copiați-l (Avreal32.exe) în dosarul de eliberare / exe, unde fișierul Prog1.hex trebuie să minți. Să furnizăm MK, să conectăm cablul programatorului. Deschidem Far Manager (este cel mai convenabil pentru a bloca mk), mergeți la acest dosar, apăsați Ctrl + O. Din moment ce avem un nou MK, te blochezi

avreal32.exe + mega16 -O11.0592MHz -p1 -fblev \u003d 0, JTAGEN \u003d 1, cksel \u003d f, sut \u003d 1 -w

Nu uitați să specificați corect frecvența dacă nu utilizați 11059200 Hz! În același timp, în MK sunt cusute de așa-numitul. Siguranțele - registrele care controlează munca (folosind un generator intern, JTAG etc.). După aceea, el este pregătit pentru primirea primului program. Programatorul este transmis ca parametri utilizați de portul LPT, frecvența, numele fișierului și altele (toate sunt enumerate în descrierea la Avreal). Recrutăm:

Avreal32.exe + mega16 -O11.0592MHz -P1 -E -W -Z -% Prog1.hex

În cazul conexiunii corespunzătoare, programatorul va raporta o programare de succes. Nu există nicio garanție că va funcționa prima dată (când mai întâi apelați programul). Eu însumi pot fi programat din a doua oară. Poate că portul LPT este buggy sau apare în cablu. Dacă aveți probleme, verificați cu atenție cablul. În experiența mea, știu că 60% din greșelile sunt asociate cu o lipsă de contact în locul potrivit, 20% - cu prezența într-un inutil și 15% - cu o lipire eronată nu la asta. Dacă nu se întâmplă nimic, citiți descrierea pentru programator, încercați să asamblați Byte Blaster.

Să presupunem că lucrați. Dacă conectați acum opt LED-uri la portul din MK (faceți-o în starea dezactivată a MK și este de dorit în mod consecvent cu LED-urile să includă rezistoare în 300-400 ohm) și să mă servească, apoi se va întâmpla un mic miracol - "Wave" va rula!

© Kiselev Roman
Mai 2007.

Microcontrolerele sunt mici, dar, în același timp, dispozitive foarte convenabile pentru cei care doresc să creeze diferite lucruri robotizate sau automatizate la domiciliu. În cadrul acestui articol, va fi luată în considerare programarea AVR pentru începători, diverse aspecte și nuanțe ale acestui proces.

Informații generale

Microcontrolerele pot fi găsite peste tot. Acestea sunt în frigidere, mașini de spălat, telefoane, mașini în producție, case inteligente și în multe dispozitive tehnice diferite. Utilizarea lor pe scară largă se datorează posibilității de a înlocui schemele analogice mai complexe și mai mari ale dispozitivelor. Programarea MK AVR vă permite să furnizați controlul autonom asupra dispozitivelor electronice. Aceste microcontrolere pot fi reprezentate ca fiind cel mai simplu computer care poate interacționa cu echipamentul extern. Deci, este sub forța de a deschide / închide tranzistoarele, să primească date de la senzori și să le afișeze pe ecrane. De asemenea, microcontrolerele pot efectua, de asemenea, o prelucrare de intrare diferită ca un computer personal. Dacă stăpâniți programele AVR de la zero și atingeți nivelul unui profesionist, atunci posibilitățile aproape nelimitate se vor deschide pentru a controla diverse dispozitive folosind porturile I / O, precum și modificările în codul acestora.

Puțin despre AVR.

Ca parte a articolului, va fi luată în considerare o familie de microcontrolere produse de ATMEL. Ei au o performanță destul de bună, ceea ce le permite să le folosească în multe dispozitive amatori. Aplicate pe scară largă în industrie. Pot fi găsite în această tehnică:

  1. Intern. Mașini de spălat, frigidere, microunde și așa mai departe.
  2. Mobil. Roboți, mijloace de comunicare și așa mai departe.
  3. Tehnica de calcul. Sisteme de control periferice, plăci de bază.
  4. Distractiv. Decorațiuni și jucării pentru copii.
  5. Transport. Sisteme de control și control al motorului.
  6. Echipament industrial. Sisteme de control al mașinilor.

Acest lucru, desigur, nu toate sferele. Acestea sunt utilizate acolo unde este profitabilă să nu se utilizeze un set de jetoane de control, ci un microcontroler. Acest lucru este posibil datorită consumului de energie redusă, iar programele sunt utilizate limbi cu și asambl, un pic modificat în familia microcontrolerului. O astfel de schimbare este necesară datorită capacităților slabe de calcul, care sunt calculate, de regulă, în zeci de kilobytes. Programarea AVR fără a studia aceste limbi nu este posibilă.

Cum să obțineți primul dvs. microcontroler?

Programarea AVR necesită:

  1. Disponibilitatea mediului de dezvoltare necesar.
  2. De fapt, microcontrolerele în sine.

Al doilea paragraf va lua în considerare mai detaliat. Există trei posibilități de a obține un dispozitiv dorit:

  1. Cumpărați direct microcontrolerul în sine.
  2. Obțineți un dispozitiv ca parte a unui designer (de exemplu - Arduino).
  3. Strângeți singur un microcontroler.

În primul punct nu este nimic complicat, așa că ne vom întoarce imediat la al doilea și al treilea.

Obțineți un dispozitiv în designer

De exemplu, faimosul Arduino va fi selectat. Aceasta este o platformă convenabilă cu fracțiune de normă pentru dezvoltarea rapidă și de înaltă calitate a diferitelor dispozitive electronice. Arduino include un set specific de componente pentru muncă (există diferite configurații). Este neapărat un controler AVR. Această abordare vă permite să începeți rapid dezvoltarea dispozitivului, nu necesită abilități și abilități speciale, are oportunități semnificative în ceea ce privește conectarea plăcilor suplimentare, precum și pe Internet, puteți găsi o mulțime de informații despre problemele de interes. Dar nu a fost fără minus. Cumpărăm Arduino, o persoană se privează mai bine să se prăbușească în programarea AVR, este mai bine să cunoaștem microcontrolerul, specificul muncii sale. De asemenea, negativ adaugă o linie relativ îngustă de modele, motiv pentru care este adesea necesar să cumpărați taxe pentru sarcini specifice. O caracteristică este, de asemenea, faptul că programarea pe "Si" aici este destul de diferită de forma standard. În ciuda tuturor dezavantajelor sale, Arduino este potrivit pentru studierea începătorilor. Dar nu este necesar să abuzați.

Adunarea independentă

Trebuie remarcat faptul că microcontrolerele AVR se deosebesc de nou-veniți suficient de prietenoși. Le puteți colecta singur cu componente accesibile, simple și ieftine. Dacă vorbim despre profesioniști, atunci această abordare vă permite să vă familiarizați mai bine cu dispozitivul, alegeți singuri componentele necesare, personalizând rezultatul final pentru cerințele avansate, utilizarea limbilor standard de programare și costuri reduse. Din minusuri, numai complexitatea asamblării de sine poate fi observată atunci când se desfășoară pentru prima dată și nu există cunoștințe și abilități necesare.

Cum să lucrați?

Deci, hai să spunem că întrebarea cu microcontrolerul a decis. Următorul va fi considerat că a fost cumpărat sau cumpărat independent. Ce altceva este necesar pentru a stăpâni programele AVR? În acest scop, este necesar mediul de dezvoltare (un notebook regulat este potrivit ca bază, dar vă recomand să vă opriți la Notepad ++). Deși există și alte programe pentru programarea AVR, dispoziția furnizată va fi capabilă să facă față tuturor cerințelor. Avem nevoie, de asemenea, de un programator. Acesta poate fi achiziționat la cel mai apropiat magazin, comandați pe Internet sau colectați-vă. Nu face rău și placa de circuite imprimate. Nu este obligatoriu, dar utilizarea sa vă permite să vă salvați nervii și timpul. De asemenea, cumpărat / creat independent. Și ultima este o sursă de alimentare. Pentru AVR, este necesar să se asigure tensiunea la 5V.

Unde și cum să înveți?

Crearea capodoperelor de la zero nu va funcționa. Cunoașterea, experiența și practica sunt necesare aici. Dar unde să le ia? Există mai multe moduri. Inițial, puteți căuta în mod independent informațiile necesare în rețeaua globală. Puteți scrie cursurilor de programare (la distanță sau cu normă întreagă) pentru a obține abilități de lucru de bază. Fiecare abordare are avantajele sale. Deci, cursurile de programare vor fi mai ieftine și poate gratuit. Dar dacă ceva nu reușește, atunci cu activități cu normă întreagă, un dezvoltator cu experiență va fi capabil să găsească cauza problemei. De asemenea, nu va fi superfluă să vă familiarizați cu literatura de specialitate care este în acces liber. Desigur, nu va funcționa pe unele cărți, ci să obțină cunoștințe de bază despre dispozitiv, programarea pe "Si", "Assembler" și alte momente de lucru pe care le puteți.

Porturi I / O

Acesta este un subiect extrem de important. Fără înțelegerea modului în care funcționează porturile I / O, programarea AVR intraheimabilă este posibilă deloc. La urma urmei, interacțiunea microcontrolerului cu dispozitive externe se efectuează tocmai atunci când sunt mediate. La prima vedere, novice poate părea că portul este un mecanism destul de încurcat. Pentru a evita o astfel de impresie, nu vom lua în considerare în detaliu schema de lucru, dar primesc doar o idee generală despre asta. Luați în considerare implementarea programului. Ca exemplu al dispozitivului, a fost selectat microcontrolerul ATMEGA8 - unul dintre cele mai populare din întreaga familie AVR. Portul I / O reprezintă trei registre care sunt responsabile pentru munca sa. La nivel fizic, ele sunt implementate ca picioarele. Fiecare dintre ele corespunde unui anumit bit în registrul de control. Fiecare picior poate lucra atât pentru a introduce informații, cât și pentru ieșirea sa. De exemplu, puteți închide funcția de aprindere cu LED sau apăsarea butonului apăsând butonul. Apropo, cele trei registre, care au fost spuse, sunt: \u200b\u200bPORTX, PINX și DDRX. Fiecare dintre ele este de opt biți (nu uitați că considerăm ATMEGA8). Asta este, un pic este angajat într-un anumit picior.

Registrele de lucru

Cea mai semnificativă în ceea ce privește orientarea este gestionarea DDRX. Este, de asemenea, opestic. Valorile pentru acesta pot fi înregistrate 0 sau 1. Cum se schimbă munca controlerului atunci când utilizați zerouri și unități? Dacă într-un anumit bit, setați 0, atunci picioarele corespunzătoare la acesta vor fi comutate în modul de intrare. Și va fi posibil să citiți datele care merg de la dispozitive externe. Dacă ați setat 1, microcontrolerul va putea controla ceva (de exemplu, dați o comandă la tranzistor pentru a sări peste tensiune și a luminii LED-ul). Al doilea cel mai important este PORTX. Acesta este angajat în controlul stării piciorului. Să luăm în considerare un exemplu. Să presupunem că avem un port de ieșire. Dacă vom seta o unitate logică în PORTX, semnalul de la microcontroler este trimis la dispozitivul de control pentru a începe munca. De exemplu, luminează LED-ul. Când setați zero, va renunța. Adică, lucrul cu registrul managerului DDRX în mod constant, nu este nevoie. Și în cele din urmă, să vorbim despre Pinx. Acest registru este responsabil pentru afișarea stării picioarelor controlerului atunci când este configurată în starea de intrare. Trebuie remarcat faptul că Pinx poate funcționa exclusiv în modul de citire. Nu scrie nimic de scris. Dar aici pentru a citi starea actuală a piciorului nu este o problemă.

Lucrați cu analogi

AVR nu sunt singurele microcontrolere. Această piață este împărțită între mai mulți producători mari, precum și între numeroasele dispozitive de imitație chinezești și case. În multe privințe, ele sunt similare. De exemplu, programarea PIC / AVR nu este foarte diferită. Și dacă există o înțelegere a ceva, atunci va fi ușor să înțelegeți totul. Dar vă recomandăm să începeți calea cu AVR datorită structurii sale competente, prieteniei către dezvoltator și prezența unui număr mare de materiale auxiliare, motiv pentru care procesul de dezvoltare poate fi accelerat în mod semnificativ.

Tehnica de siguranță

Când microcontrolerele AVR sunt programate pe "Si" sau pe "Assembler", este necesar să lucrați foarte atent. Faptul este că, prin stabilirea unei combinații definitive de registre și schimbarea setărilor interne, puteți bloca în siguranță microcontrolerul. Acest lucru este valabil mai ales că Fuuz. Dacă nu există încredere în corectitudinea acțiunilor dvs., este mai bine să vă abandonați utilizarea lor. Același lucru este valabil și pentru programatori. Dacă cumpărați echipament din fabrică, acesta va clipi microcontrolere fără probleme. Când se asamblează cu propriile mâini, poate apărea o situație tristă la care programatorul blochează dispozitivul. Acest lucru poate apărea atât din cauza erorii din codul programului, cât și prin problemele din acesta. Apropo, despre un alt moment (de acest timp pozitiv), care a fost menționat anterior, dar nu a fost niciodată dezvăluit complet. Acum, aproape toate microcontrolerele moderne au funcția de programare intra-hem. Ce înseamnă? Să presupunem că dispozitivul a fost prăbușit pe tablă. Și pentru ao schimba firmware-ului, acum nu este necesar să ajungeți suficient pentru a ajunge suficient, deoarece o astfel de intervenție poate deteriora microcontrolerul în sine. Este suficient să vă conectați la concluziile corespunzătoare și să îl reprogramați atunci când este mediată.

Ce model să alegeți?

Ca parte a articolului, a fost luată în considerare ATMEGA8. Acesta este un microcontroler mai degrabă mediocontrol pentru caracteristicile sale, care, totuși, suficient pentru majoritatea meșteșugurilor. Dacă există o dorință de a crea ceva la scară largă, atunci puteți lua un fel de monștri ca Atmega128. Dar ele sunt concepute pentru dezvoltatori mai experimentați. Prin urmare, dacă nu există o experiență suficientă, este mai bine să începeți cu dispozitive mici și simple. În plus, ele sunt semnificativ mai ieftine. Sunt de acord, un lucru blochează accidental microcontrolerul pentru o sută de ruble și complet diferit - pentru o jumătate de mie. Este mai bine să vă umpleți mâna și să vă ocupați de diverse aspecte ale funcționării, astfel încât în \u200b\u200burmătorii să nu piardă cantități semnificative. Inițial, puteți începe cu ATMEGA8 și apoi navigați pe nevoile dvs.

Concluzie

Astfel, a fost luată în considerare subiectul programării AVR în cele mai frecvente caracteristici. Desigur, puteți vorbi în continuare despre multe lucruri. Deci, de exemplu, marcajul microcontrolerelor nu a fost luat în considerare. Și poate spune foarte mult. Deci, în cea mai mare parte microcontrolere funcționează pe tensiune la 5V. În timp ce prezența, de exemplu, literele pe care le pot spune că numai 2,7 V. este suficientă pentru dispozitiv, după cum puteți, uneori cunoașterea etichetării poate juca un rol foarte important în ceea ce privește dispozitivele corecte și durabile. Timpul de funcționare a microcontrolerelor este, de asemenea, un subiect interesant. Fiecare dispozitiv este proiectat pentru o anumită perioadă. Deci, unii pot lucra o mie de ore. Alții au o rezervă de garanție la 10.000!