Egy egyszerű program avr mikrokontrollerre C nyelven

Az utolsó cikkben elemeztük a program struktúráját az AVR Assembler-en, összeállítottunk egy egyszerű áramkört és elvégeztük a mikrokontroller firmware-jét. A mikrokontrollerhez két LED-et csatlakoztattak, amelyeket felváltva villogtunk.

Itt nézd meg a mintaprogram az AVR mikrovezérlő C nyelven (C), amely ugyanazt a fogalmat, mint a példa a program Assembly, ezért meg kell dolgozni ugyanazt az elrendezést, mint a legutóbbi cikket. A LED-eket egyszerűen csak felváltva, de kicsit másképp és késleltetve késlelteti.

Röviden a C programozási nyelvről

Kezdetben a C nyelvet a Unix operációs rendszerben használták az alkalmazások írásához és az operációs rendszer magjához. Később más platformokra terelték, ami rendkívül népszerűvé tette.

Ha a programozás C-ben AVR mikrokontrollerek használt készlet könyvtárak avr-libc és fordító avr-gcc, amelynek a felszerelése a Linux, mi már kitaláltam egy korábbi cikkben.

A C program forráskódja

Lehet, hogy soha nem írtak programokat a C nyelvre - nincs mit aggódni. Annak érdekében, hogy az első programot írja az AVR C-re és kísérletezzen vele, elég alapos ismeret a Linux konzolon való munkához. Később megtalálja a hiányzó információkat, és tanulmányozza mindazt, amire szüksége van.

A C program következő kódja a következő műveleteket hajtja végre (cselekvési algoritmus):

  • világítsuk meg az 1 LED-et, és enyhén késleltetjük (kétszer egymás után);
  • hosszabb késéssel;
  • világítsuk meg a 2-es LED-et, és enyhén késleltessük (kétszer egymás után);
  • kezdje újra.

Itt van a program forráskódja, amely a fenti algoritmus szerint működik:

String "#include "kapcsolja az" io.h "fájlt az aktuális forrás fájlhoz, és a" #include "sort "- kapcsolja be a" delay.h "fájlt.

A "locate" parancs használatával megtudhatja, hol találhatók ezek a fájlok Linux alatt. Például keressük azokat az útvonalakat, ahol az "io.h" fájlok találhatók, és szűrjük az "avr" kombinációt tartalmazó eredményeket:

Ennek eredményeképpen megkapjuk az összes olyan elérési útvonalat, ahol az "io.h" megjelenik a névben, és az elérési út tartalmazza az "avr" sztringet:

Itt láthatjuk, hogy a szükséges fájl az "/usr/lib/avr/include/avr/io.h" útvonalon van. Tartalmát tekintve látható, hogy tartalmaz más AVR-fájlok (AVR-eszköz-specifikus IO-definíciók) felvételét is, amelyek viszont a választott mikrokontroller típusától függenek. Ebben az esetben a mikrokontroller típusa (MCU típus) a "-mmcu = atmega8" (ATmega8) paraméterre van megadva, amikor az avr-gcc fordítóparancsot hívják.

Az én esetemben, az ATmega8 mikrokontroller segítségével a fájlt „io.h” köti össze a következő fájl - „iom8.h” (Input Output Mega8), ez tárolja az összes definíciót változók, mint például a PD0, PD-1 PB8, DDRD, DDRB, RAMSTART, RAMEND és sok más dolog.

A "cat" parancs használatával csak a megadott karakterkombinációt vagy szót tartalmazhatja a fájlban:

Ez a parancs kiadja ezt a szöveget:

Így láthatod, milyen konstansok és definíciók vannak az avr-gcc könyvtárban az Input-Output műveletekkel, azok értékeivel és sokkal többet az Ön mikrokontrolleréhez!

A "delay.h" fájl tartalmazza a késleltetési funkciók meghatározását, különösen a "_delay_ms" függvény kódját, amelyet a példában használunk. Az időeltolódás kiszámításához ezek a függvények az "F_CPU" állandó értéket használják, amelyet korábban a kód elején deklaráltunk.

A "void main (void)" karakterlánc kezdődik a program testének balkezes göndör gerincjével, és jobb oldali ">" brace-vel fejeződik be a lista alján. Tehát kijelentettük, hogy a fő funkció melyik programot indítja el, a funkciót testületek zárójelben veszi, és a "void" kulcsszavak azt jelentik, hogy a függvény nem fogadja el és nem ad vissza semmilyen adatot, ebben az esetben.

Fontos tudni, hogy C-ben a ";" pontosvessző karakter egy speciális karakter - egy üres operátor (ami nem tesz semmit), és azt mondja a fordítónak, hogy ez a parancs vége.

A vonal „int delay_ms_1 = 100;” bejelentettük egy új változót „delay_ms_1” a típusú „int” (egész, egész típusú értékek -32.768-32.767) és hozzárendelt értéke 100. szolgál ez a programunk, hogy a késedelem ezredmásodperc amikor mindegyik LED villog.

A következő sorban, "int delay_ms_2 = 300;" inicializáljuk a változót is, amely az egyes LED-ek villogása közötti késleltetési időt határozza meg - 300 milliszekundum.

Következő lesz a "DDRD | = (1 <

A következő parancs megegyezik az előzővel, kivéve, hogy a DDRD port PD1 csatornáját állítja be.

A PD0 és PD1 csatornákhoz (a chip 2 és 3 szekcióihoz) csatlakoztunk LED-eket, amelyek fényerejét mi vezéreljük.

A "PORTD | = (1 <

Következő, végre egy kis késleltetés „_delay_ms (delay_ms_1);” okozó _delay_ms funkciót, és adja át érvként változó delay_ms_1, amely már tartalmaz egy sor 100.

A "PORTD" =

(1 <

(1 <

(1 <

"(az összes bit megváltoztatása az ellenkezőre).

Az alábbi sorokat ismét végre megadása és bitek Regitra port PD0 PORTD telepítve késleltetett „delay_ms_1”, mint mi, hogy a csatlakoztatott LED csatorna PD0 meggyulladhat, és eloltani (villogás, pislogás).

A "_delay_ms (delay_ms_2);" vonal hosszabb késleltetés a "delay_ms_2" változó értéke alatt, amely 300-nál nagyobb (300 milliszekundum késleltetés).

Következő gyártunk kétszer megadása és bitek PD-1 (2-edik bit byte-nyilvántartás) a nyilvántartásba PORTD port, mint kényszeríteni a villódzó LED, amely össze van kötve a csatorna port PD-1 PORTD mikrokontroller.

A fenti parancsok befejezése után mindent újra végtelen hurokban kezdünk ", míg (1)".

A legnehezebb megérteni itt talán a megfelelő bitek telepítését a kikötőkben. Erről részletesebben a következő cikk foglalkozik: Az AVR mikrokontrollerek kezelése C, bitműveletekben.

A program összeállítása és villogása az MK-ben

A program összeállításához a forráskódot a "leds_blinking.c" nevű fájlba mentjük. Ha már van Geany környezeted, csak kattints a "Compile" gombra a fordításhoz. A programfájl C-ba történő összeállításához a konzolon a következő parancsot kell futtatnia:

Ennek eredményeként a munka, ha nincs hiba, megkapjuk leds_blinking.o objektum fájlt, amelyből ki kell bontania az szükséges adatokat a mikrokontroller firmware (esetemben ATmega8 Activity Kit Manual, paraméterek „-mmcu = atmega8”).

Az adatok kivonására és egy firmware fájl létrehozására az Intel Hex formátumban, kattintson a "Build" gombra a Geany-ban. A konzolról a kívánt fájlt a következő paranccsal kaphatja meg:

Most, hogy megvan a firmware fájlt Intel HEX formátumú rögzíti annak tartalmát (I) a flash memória a mikrokontroller, a művelet elvégzéséhez, akkor nyomja meg az előkészített környezet Geany kapcsolatfelvétel gomb „Run illetve megtekintheti a jelenlegi file” (végrehajtás). A konzolon végrehajthatja a firmware-t az avrdude paranccsal (ATmega8, "-p m8" paraméter, az USBAsp programozó "-c usbasp"):

Közvetlenül a firmware után egy reset parancsot (RESET) küldenek az MC-nek, és a program megkezdi a chip végrehajtását, amelyet a villogó LED jelez. A RESET manuálisan is elvégezhető, ehhez újra csatlakoztatva a mikrokontrollert.

Célszerű minden lépést végrehajtani (összeállítás + hex fájl + firmware készítése), és figyelemmel kísérheti a konzolon vagy a Geany információs panelen megjelenő információkat. Ez segít a hibák és megjegyzések észlelésében, ha valami nem működik megfelelően.

C nyelv és AVR Si dokumentáció

Brian Kernighan és Dennis Ritchie - C programozási nyelven: brian-kernighan-and-dennis-ritchie-c-language.pdf.zip (2,1Mb, PDF).

Herbert Shildt - A C: gerbert-shildt-c-complete-guide.zip teljes útmutatója (912Kb, HTML).

Ha lehetséges, vásároljon meg egy jó és friss útmutatót a C papírra, hogy könnyebben tanulhasson és dolgozhasson.

A fenti linken olvasható dokumentáció (angol nyelven) közvetlenül a helyszínen, vagy töltse le a fájlt HTML és PDF, akkor az összes szükséges információt a avr-libc programozási AVR mikrokontrollerek.

következtetés

Miután elérted a fenti kód magabiztos munkáját, próbáld meg kísérletezni vele. Győződjön meg arról, hogy minden LED kétszer villog, mint a példában, de három vagy négy. Is kísérletezni kell az idő késleltetésével.

Kapcsolódó cikkek