Un program simplu pentru microcontroller avr în limba C

În ultimul articol, am analizat structura programului pe AVR Assembler, am asamblat un circuit necomplicat și am efectuat firmware-ul microcontrolerului. Două LED-uri au fost conectate la microcontroler, pe care am făcut-o alternativ să clipească.







Aici ne uităm la un program de probă pentru microcontroler AVR în limbaj C (C), care se va utiliza același concept ca și în exemplul unui program în Adunarea, așa că vom avea nevoie pentru a lucra același aspect ca și în ultimul articol. Intermitent LED-uri pe care le facem nu numai în rotație, și un pic diferit și cu întârzieri suplimentare.

Pe scurt despre limbajul de programare C

Inițial, limbajul C a fost utilizat în sistemul de operare Unix pentru scrierea aplicațiilor și nucleul sistemului de operare. Mai târziu a fost portat pe alte platforme, ceea ce ia adus popularitate foarte largă.

La dezvoltarea programelor în limbajul C pentru microcontrolerele AVR, se utilizează un set de compilatoare avr-libc și avr-gcc, pe care le-am instalat deja în Linux, într-unul din articolele anterioare.

Codul sursă al programului C

S-ar putea să fie că nu ați scris niciodată programe în limba C - nu este nimic de îngrijorat. Pentru a scrie primul program pe AVR C și a efectua experimente cu el, este suficientă cunoștințe de bază pentru a lucra cu consola în Linux. Mai târziu, puteți găsi informația lipsă de dvs. și studiați tot ceea ce aveți nevoie de voi.

Următorul cod pentru programul C va efectua următoarele acțiuni (algoritm de acțiune):

  • aprindeți LED-ul 1 și stingeți-l cu o mică întârziere (de două ori la rând);
  • efectuați o întârziere mai lungă;
  • aprindeți LED-ul 2 și stingeți-l cu o mică întârziere (de două ori la rând);
  • începe peste.

Aici este codul sursă al programului care funcționează conform algoritmului de mai sus:

String "# include "conectează fișierul" io.h "la fișierul sursă curentă și linia" #include "- conectează fișierul" delay.h ".

Puteți afla unde se află aceste fișiere în Linux utilizând comanda "localizați". De exemplu, vom căuta căile în care sunt localizate fișierele "io.h" și vom filtra rezultatele care conțin combinația "avr":

Ca rezultat, vom obține o listă de căi către toate fișierele în care apare "io.h" în nume, iar calea conține subrețele "avr":

Aici vedem că fișierul de care avem nevoie este pe calea "/usr/lib/avr/include/avr/io.h". După examinarea conținutului său, se poate observa că acesta conține includerea altor fișiere AVR (definiții IO specifice dispozitivului AVR), care, la rândul lor, depind de tipul de microcontroler pe care l-am ales. Tipul de microcontroler (MCU Type) în acest caz este specificat ca parametru "-mmcu = atmega8" (pentru ATmega8) atunci când este apelată comanda compilatorului "avr-gcc".

În cazul meu, microcontrolerul ATmega8 prin intermediul fișierului „io.h“ se conectează la fișierul următor - „iom8.h“ (intrare-ieșire Mega8), se stochează toate definițiile variabilelor, cum ar fi PD0, PD1, PB8, DDRD, DDRB, RAMSTART, RAMEND și mult mai mult.

De asemenea, utilizând comanda "pisică", puteți afișa numai liniile care conțin combinația de caractere sau cuvântul specificat în fișier:

Această comandă va afișa acest text:

Deci, puteți vedea ce constante și definiții sunt în biblioteca avr-gcc pentru a lucra cu operațiunile Input-Output, valorile lor și mult mai mult pentru tipul de microcontroler!

Fișierul "delay.h" conține definițiile funcțiilor de întârziere, în special, există codul funcției "_delay_ms", pe care îl vom folosi în exemplu. Pentru a calcula întârzierea, aceste funcții utilizează constanta "F_CPU", pe care am declarat-o mai devreme la începutul codului.

Șirul "void principal (void)" pornește de la brățara stângă a corpului programului nostru și se termină cu brațul drept ">" în partea de jos a listei. Așa că am declarat funcția principală "principală" cu care va începe programul, corpul funcției este luat în brațe, iar cuvintele cheie "void" înseamnă că funcția nu acceptă și nu returnează date în acest caz.







Este important să știm că în C, caracterul punct și virgulă ";" este un caracter special - un operator gol (care nu face nimic) și este folosit pentru a spune compilatorului că acesta este sfârșitul comenzii.

În linia de „int delay_ms_1 = 100;“ am anunțat o nouă variabilă „delay_ms_1“ cu „int“ tip (Integer, valori de tip întreg de la -32768 la 32767) și atribuie o valoare de 100. Acesta servește în programul nostru pentru a seta întârzierea în milisecunde când intermitent de fiecare LED-uri.

În linia următoare, "int delay_ms_2 = 300;" am inițializat și variabila, care va servi la setarea timpului de întârziere între clipirile LED-urilor individuale - 300 milisecunde.

Apoi vine comanda "DDRD | = (1 <

Următoarea comandă este identică cu cea precedentă, cu excepția faptului că setează canalul PD1 al portului DDRD.

La canalele PD0 și PD1 (picioarele 2 și 3 ale chipului) am conectat LED-uri, strălucirea căruia vom controla.

Șirul "PORTD | = (1 <

Apoi, efectuăm o mică întârziere în timp "_delay_ms (delay_ms_1);" apelarea funcției _delay_ms și transmiterea argumentului delay_ms_1 ca argument, care conține deja numărul 100.

Șirul "PORTD" =

(1 <

(1 <

(1 <

"(schimbarea tuturor biților către cele opuse).

In cele ce urmeaza vom efectua din nou setarea și resetarea de biți în Regitra portul PD0 PORTD instalat întârziat „delay_ms_1“, decât ne-am face LED-ul este conectat la canalul PD0 aprinde și stinge (flicker, clipire).

Linia "_delay_ms (delay_ms_2);" reprezintă o întârziere mai lungă folosind valoarea variabilei "delay_ms_2" care este mai mare de 300 (întârziere de 300 milisecunde).

Apoi, ștergem și reinițializăm bitul PD1 (al doilea bit din octetul de registru) din registrul portului PORTD, provocând blițul LED care este conectat la canalul PD1 al portului PORTD al microcontrolerului.

După finalizarea comenzilor de mai sus, totul începe din nou într-o buclă infinită "în timp ce (1)".

Cel mai greu de înțeles aici este, probabil, lucrul cu instalarea biților potriviți în porturi. Mai detaliat acest subiect este evidențiat în articol: Lucrul cu registrele AVR microcontroler în C, operațiunile de biți.

Compilarea și blițarea programului în MK

Pentru a compila programul, salvăm codul sursă într-un fișier numit "leds_blinking.c". Dacă aveți deja un mediu Geany, faceți clic pe butonul "Compilare" pentru a compila. Pentru a compila un fișier de program în C în consolă, trebuie să executați următoarea comandă:

Ca rezultat al activității, în cazul în care nu există nici o eroare, vom obține fișier obiect leds_blinking.o din care avem nevoie pentru a extrage datele necesare pentru firmware-ul nostru microcontroler (în cazul meu manual ATmega8 Kit de activitate, parametrul „-mmcu = ATmega8“).

Pentru a extrage date și a construi un fișier de firmware în formatul Intel Hex, trebuie să faceți clic pe butonul "Build" din Geany. Din consola, puteți obține fișierul dorit utilizând comanda:

Acum, că avem fișierul firmware-ul în format HEX Intel va înregistra conținutul (I) în memoria flash a microcontrolerului, pentru a efectua această operație, puteți apăsa în mediu pregătit Geany butonul de contact „Run sau pentru a vizualiza fișierul curent“ (Executare). În consola, puteți efectua firmware folosind echipa avrdude (optiunea ATmega8 "-p m8", programator USBAsp "-c usbasp"):

Imediat după firmware, o comandă de reset (RESET) va fi trimisă la MC și programul va începe executarea în cip, care va fi indicat de LED-urile intermitente. De asemenea, RESET poate fi efectuat manual, prin reconectarea puterii la microcontroler pentru aceasta.

Este recomandabil să efectuați toate etapele (compilația + construirea unui fișier hex + firmware) la rândul său și să monitorizați informațiile care apar în consola sau în panoul de informații Geany. Acest lucru va ajuta la detectarea erorilor și a remarci dacă ceva nu funcționează așa cum ar trebui.

Documentație pentru limba C și AVR Si

Brian Kernigan și Dennis Ritchie - Limba de programare C: brian-kernighan-and-dennis-ritchie-c-language.pdf.zip (2,1Mb, PDF).

Herbert Shildt - Un ghid complet pentru C: gerbert-shildt-c-complete-guide.zip (912Kb, HTML).

Dacă este posibil, cumpărați-vă un ghid bun și proaspăt pentru C în formă de hârtie pentru o învățare și o muncă ușoară.

Prin linkul de mai sus, puteți citi documentația (în limba engleză) direct pe site sau o puteți descărca într-un singur fișier în format HTML și PDF, există toate informațiile necesare cu privire la utilizarea bibliotecii avr-libc pentru programarea microcontrolerelor AVR.

concluzie

După ce ați realizat lucrarea de încredere a codului de mai sus, încercați să experimentați acest lucru. De exemplu, asigurați-vă că fiecare LED-uri clipește nu de două ori, ca în exemplu, dar trei sau patru. De asemenea, experimentați cu întârzieri în timp.







Articole similare

Trimiteți-le prietenilor: