Tartalomjegyzék:

AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógomb kikapcsolása: 4 lépés
AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógomb kikapcsolása: 4 lépés

Videó: AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógomb kikapcsolása: 4 lépés

Videó: AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógomb kikapcsolása: 4 lépés
Videó: LDmicro 18: Ublox NEO-6M GPS Alarm Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Július
Anonim
Image
Image

Ebben a részben megtanuljuk, hogyan kell C programprogramot készíteni az ATMega328PU számára, hogy a három LED állapotát a gombkapcsoló bemenete szerint változtassa. Ezenkívül feltártunk egy megoldást a „Switch Bounce” problémára. A szokásos módon az AVR ATmega328 bázisán összeszereljük az elektromos áramkört, hogy ellenőrizhessük a programkód működését.

1. lépés: AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával

AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával
AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával
AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával
AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával
AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával
AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio 7 integrált fejlesztői platform használatával

Ha nincs Atmel Studio, töltse le és telepítse.

www.microchip.com/mplab/avr-support/atmel-studio-7

Az első néhány sorban van néhány fordítói definíciónk.

Az F_CPU határozza meg az óra frekvenciáját Hertzben, és gyakori az avr-libc könyvtárat használó programokban. Ebben az esetben a késleltetési rutinok határozzák meg, hogyan kell kiszámítani az időkéséseket.

#ifndef F_CPU

#define F_CPU 16000000UL // megmondja a vezérlő kristályfrekvenciáját (16 MHz AVR ATMega328P) #endif

#include // fejléc lehetővé teszi az adatáramlás vezérlését a csapok felett. Meghatározza a csapokat, portokat stb.

Az első include fájl az avr-libc része, és szinte minden AVR projektben használható lesz. Az io.h meghatározza az Ön által használt CPU -t (ezért adja meg az alkatrészt a fordítás során), és tartalmazza a megfelelő IO definíció fejlécet az általunk használt chiphez. Egyszerűen meghatározza az összes pin, port, speciális regiszter stb.

#include // fejléc a késleltető funkció engedélyezéséhez a programban

A util/delay.h könyvtár tartalmaz néhány rutinot a rövid késésekhez. Az általunk használt függvény a _delay_ms ().

A define -t használjuk a gomb és a LED -ek portjainak és csapjainak deklarálásához. Az ilyen definiálási utasítások használata lehetővé teszi, hogy csak 3 könnyen megtalálható sort kell módosítanunk, ha a LED-et egy másik I/O tűre helyezzük, vagy más AVR-t használunk.

#define BUTTON1 1 // gombkapcsoló a B port 1 -es érintkezőjéhez van csatlakoztatva

#define LED1 0 // Led1 csatlakozik a B porthoz 0 érintőképernyő

Az utolsó kettő meghatározza a beállítási időket, ezredmásodpercben, hogy kikapcsolja a kapcsolót, és a várakozási időt, mielőtt engedélyezheti a gomb újabb megnyomását. A visszapattanási időt hozzá kell igazítani ahhoz az időhöz, ameddig a váltónak szüksége van arra, hogy a digitális magasról digitális mélypontra váltson az összes pattogás után. Az ugrálási viselkedés kapcsolóról kapcsolóra eltérő lehet, de általában 20-30 milliszekundum elég.

#define DEBOUNCE_TIME 25 // ideje várni a "visszapattanás" gomb megnyomására

#define LOCK_INPUT_TIME 300 // a gombnyomásra várni kell

void init_ports_mcu ()

{

Ezt a funkciót csak egyszer hívjuk meg a programunk elején, hogy inicializáljuk az általunk használt bemeneti kimeneti csapokat.

A gombhoz a PORT és PIN regisztereket fogjuk használni íráshoz és olvasáshoz. Az AVR -k esetén PIN -kódot olvasunk a PINx -regiszter segítségével, és írunk egy PIN -kódra a PORTx -regiszter segítségével. A felhúzások engedélyezéséhez írnunk kell a gombnyilvántartásba.

A LED -hez csak a PORT regisztert kell használnunk, hogy írjunk, azonban szükségünk van az adatirány -regiszterre (DDR) is, mivel az I/O tűk alapértelmezés szerint bemenetként vannak beállítva.

Először a LED I/O csapjait állítjuk kimenetként az adatirány -regiszter segítségével.

DDRB = 0xFFu; // Állítsa be a PORTB összes csapját kimenetként.

Ezután kifejezetten állítsa be a gombostűt bemenetként.

DDRB & = ~ (1 <

Ezután a PORTB csapokat magasra állítják (+5 volt), hogy bekapcsolják. A kimeneti csapok kezdetben magasak, és mivel a LED-ek aktív-magasan vannak bekötve, bekapcsol, hacsak nem kapcsoljuk ki kifejezetten.

És végül engedélyezzük a belső felhúzó ellenállást a bemeneti tüskén, amelyet a gombunkhoz használunk. Ez egyszerűen úgy történik, hogy az egyiket kiírja a portra. Ha bemenetként van konfigurálva, ez lehetővé teszi a felhúzást, és kimenetként történő konfigurálás esetén egyszerűen magas feszültséget eredményez.

PORTB = 0xFF; // Állítsa a PORTB összes csapját HIGH értékűre. A LED be van kapcsolva, // az első csap PORTB belső felhúzó ellenállása is engedélyezve van. DDRC = 0xFFu; // A PORTC összes csapjának beállítása kimenetként. PORTC = 0x00u; // Állítsa a PORTC összes csapját alacsonyra, ami kikapcsolja. DDRD = 0xFFu; // A PORTD összes csapjának beállítása kimenetként. PORTD = 0x00u; // Állítsa a PORTD összes csapját alacsonyra, ami kikapcsolja. }

unsigned char button_state ()

{

Ez a függvény logikai értéket ad vissza, jelezve, hogy megnyomta -e a gombot. Ez a kódblokk, amelyet folyamatosan hajtanak végre a végtelenített ciklusban, és így lekérdezi a gomb állapotát. Itt is kikapcsoljuk a kapcsolót.

Ne feledje, hogy amikor megnyomjuk a kapcsolót, a bemeneti kimeneti csap a földhöz húzódik. Így várjuk, hogy a csap alacsony legyen.

/ * a gomb megnyomásakor a BUTTON1 bit tiszta */

ha (! (PINB & (1 <

Ezt úgy tesszük, hogy ellenőrizzük, hogy a bit tiszta -e. Ha a bit világos, jelezve, hogy a gomb le van nyomva, először késleltetjük a DEBOUNCE_TIME által meghatározott ideig, ami 25 ms, majd újra ellenőrizzük a gomb állapotát. Ha a gombot 25 másodperc elteltével lenyomják, akkor a kapcsoló kikapcsolt állapotúnak tekinthető, és készen áll esemény kiváltására, így visszatérünk 1 -hez a hívó rutinunkhoz. Ha a gomb nincs lenyomva, akkor 0 -ra térünk vissza a hívási rutinunkhoz.

_delay_ms (DEBOUNCE_TIME);

ha (! (PINB & (1 <

int main (void)

{

Fő rutinunk. A fő funkció egyedi és elkülönül minden más funkciótól. Minden C programnak pontosan egy fő () függvénnyel kell rendelkeznie. fő, ahol az AVR elkezdi végrehajtani a kódot, amikor először bekapcsol, tehát ez a program belépési pontja.

előjel nélküli char n_led = 1; // kezdetben a LED -szám világít

A funkció hívása a használt I/O érintkezők inicializálásához:

init_ports_mcu ();

végtelen ciklus, ahol a programunk fut:

míg (1)

{

Amikor a button_state visszaad egyet, amely jelzi, hogy a gombot megnyomták és kikapcsolta, majd a LED -ek aktuális állapotát az n_led paraméter szerint váltja.

if (button_state ()) // Ha megnyomja a gombot, kapcsolja be a LED állapotát és a késleltetést 300 ms -ig (#define LOCK_INPUT_TIME)

{switch (n_led) {1. eset: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); szünet;

Ezek az állítások C bites bázisú operátorokat használnak. Ezúttal az exkluzív OR operátort használja. Ha XOR a portot a váltani kívánt bit bitértékével, akkor az egyik bit megváltozik anélkül, hogy a többi bitre hatással lenne.

2. eset:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); szünet; 3. eset: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // reset LED number break; } n_led ++; // a következő LED bekapcsol _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Tehát most, amikor ezt a programot futtatja, képesnek kell lennie arra, hogy megnyomja a nyomógombot a LED-ek váltásához. A LOCK_INPUT_TIME által meghatározott késleltetés miatt lenyomva tarthatja a gombot, aminek következtében a LED -ek állandóan (alig több mint 275 ms -onként) ki- és bekapcsolnak.

A programozás befejeződött.

A következő lépés a projekt és a hex fájl programozása a mikrovezérlőbe az avrdude program segítségével.

Letöltheti a main.c fájlt programmal c kódban:

2. lépés: A program HEX fájljának átvitele a chip flash memóriájába

A program HEX fájljának átvitele a chip flash memóriájába
A program HEX fájljának átvitele a chip flash memóriájába
A program HEX fájljának átvitele a chip flash memóriájába
A program HEX fájljának átvitele a chip flash memóriájába

Töltse le és telepítse az AVRDUDE programot. A legújabb elérhető verzió a 6.3: Töltse le a zip fájlt

Először másolja be a program hexadecimális fájlját az AVRDUDE könyvtárba. Esetemben a ButtonAVR.hex

Ezután írja be a DOS parancssori ablakba a következő parancsot: avrdude –c [programozó neve] –p m328p –u –U flash: w: [a hexafájl neve].

Esetemben ez: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Ez a parancs hex fájlt ír a mikrokontroller memóriájába.

Nézze meg a videót a mikrovezérlő flash memóriájának égetésének részletes leírásával:

A mikrokontroller flash memóriájának égetése…

Rendben! Most a mikrokontroller programunk utasításainak megfelelően működik. Nézzük meg!

3. lépés: A hardverkapcsoló kikapcsolása

Hardverkapcsoló kikapcsolása
Hardverkapcsoló kikapcsolása

A szoftverkapcsoló -visszaváltás mellett hardveres kapcsoló -visszaváltási technikát is alkalmazhatunk. Az ilyen technika alapgondolata az, hogy kondenzátort használnak a kapcsolójelben bekövetkező gyors változások kiszűrésére.

Milyen kondenzátort érdemes választani? Ez végső soron attól függ, hogy a gomb milyen rosszul teljesít az adott problémával kapcsolatban. Egyes gombok óriási ugráló viselkedést mutathatnak, mások viszont nagyon keveset. Az alacsony kondenzátorérték, mint az 1,0 nanofarad, nagyon gyorsan reagál, alig vagy egyáltalán nem befolyásolja a visszapattanást. Ezzel szemben egy magasabb kondenzátorérték, például 220 nanofarad (ami még mindig kicsi a kondenzátorok tekintetében), lassú átmenetet biztosít a kezdő feszültségről a végfeszültségre (5 voltról 0 voltra). A 220 nanofarad kapacitású átmenet azonban a valós értelemben még mindig elég gyors, és így használható a gyengén teljesítő gombokra.

4. lépés: Elektromos áramkör

Elektromos áramkör
Elektromos áramkör
Elektromos áramkör
Elektromos áramkör
Elektromos áramkör
Elektromos áramkör

Csatlakoztassa az alkatrészeket a vázlatos rajz szerint.

Ajánlott: