Obsah:

Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odskakovanie tlačidlom: 4 kroky
Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odskakovanie tlačidlom: 4 kroky

Video: Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odskakovanie tlačidlom: 4 kroky

Video: Mikrokontrolér AVR. Prepínajte diódy LED pomocou tlačidlového spínača. Odskakovanie tlačidlom: 4 kroky
Video: LDmicro 7: Простая логика охранной сигнализации (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
Image
Image

V tejto časti sa naučíme Ako vytvoriť programový kód C pre ATMega328PU na prepínanie stavu troch LED diód podľa vstupu z tlačidlového spínača. Tiež sme preskúmali riešenia problému s „Switch Bounce“. Ako obvykle, zostavíme elektrický obvod na základni AVR ATmega328, aby sme skontrolovali prácu programového kódu.

Krok 1: Písanie a vytváranie aplikácie mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7

Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7
Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7
Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7
Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7
Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7
Písanie a vytváranie aplikácií mikrokontroléra AVR v kóde C pomocou integrovanej vývojovej platformy Atmel Studio 7

Ak nemáte Atmel Studio, mali by ste si ho stiahnuť a nainštalovať.

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

Prvých niekoľko riadkov, ktoré definuje kompilátor.

F_CPU definuje taktovaciu frekvenciu v Hertzoch a je bežný v programoch používajúcich knižnicu avr-libc. V tomto prípade ho používajú rutiny oneskorenia na určenie spôsobu výpočtu časových oneskorení.

#ifndef F_CPU

#define F_CPU 16000000UL // informujúci o kryštálovej frekvencii ovládača (16 MHz AVR ATMega328P) #endif

#include // hlavička na povolenie riadenia toku údajov nad kolíkmi. Definuje piny, porty atď.

Prvý súbor zahrnutia je súčasťou avr-libc a bude použitý v takmer akomkoľvek projekte AVR, na ktorom pracujete. io.h určí procesor, ktorý používate (čo je dôvod, prečo uvediete časť pri kompilácii) a následne zahrnie príslušnú hlavičku definície IO pre čip, ktorý používame. Jednoducho definuje konštanty pre všetky vaše piny, porty, špeciálne registre atď.

#include // hlavička na povolenie funkcie oneskorenia v programe

Knižnica util/delay.h obsahuje niektoré rutiny pre krátke oneskorenia. Funkcia, ktorú budeme používať, je _delay_ms ().

Na deklarovanie portov a pinov našich tlačidiel a diód LED používame definície. Použitie takto definovaných príkazov nám umožňuje zmeniť iba 3 ľahko dostupné riadky, iba ak premiestnime diódu LED na iný I/O pin alebo použijeme iný AVR.

#define BUTTON1 1 // tlačidlový spínač pripojený k portu B, kolík 1

#define LED1 0 // Led1 pripojený k portu B pin 0 #define LED2 1 // Led2 pripojený k portu C pin 1 #define LED3 2 // Led3 pripojený k portu D pin 2

Posledné dva definujú časy nastavenia príkazov v milisekundách na odblokovanie prepínača a čas čakania, než povolíte ďalšie stlačenie tlačidla. Čas odskoku je potrebné prispôsobiť času, po ktorom prepínač prejde z digitálneho maxima na digitálne minimum po každom odrazení. Chovanie pri odraze sa bude líšiť od prepínača k prepínaču, ale 20-30 milisekúnd je zvyčajne celkom dostačujúcich.

#define DEBOUNCE_TIME 25 // čas čakania na tlačidlo „de-bouncing“

#define LOCK_INPUT_TIME 300 // čas čakania po stlačení tlačidla

neplatné init_ports_mcu ()

{

Táto funkcia sa nazýva iba raz na začiatku nášho programu, aby inicializovala vstupné výstupné piny, ktoré budeme používať.

Pokiaľ ide o tlačidlo, budeme na zápis a čítanie používať registre PORT a PIN. Pri AVR čítame pin pomocou registra PINx a zapisujeme na pin pomocou registra PORTx. Aby sme povolili vyťahovanie, musíme zapísať do registra tlačidiel.

V prípade diódy LED potrebujeme na zápis iba register PORT, potrebujeme však aj register smerov údajov (DDR), pretože vstupno -výstupné kolíky sú predvolene nastavené ako vstupy.

Najprv nastavíme I/O piny LED ako výstup pomocou registra smeru údajov.

DDRB = 0xFFu; // Nastaviť všetky piny PORTB ako výstup.

Ďalej explicitne nastavte kolík tlačidla ako vstup.

DDRB & = ~ (1 <

Ďalej sú kolíky PORTB nastavené na vysokú hodnotu (+5 voltov), aby sa zapli. Výstupné piny sú spočiatku vysoké a pretože naša LED dióda je zapojená aktívne-vysoko, zapne sa, pokiaľ ju výslovne nevypneme.

A nakoniec povolíme vnútorný výsuvný odpor na vstupnom kolíku, ktorý používame pre naše tlačidlo. To sa deje jednoducho odoslaním jedného do portu. Keď je to nakonfigurované ako vstup, výsledkom bude umožnenie príťahov a keď je to nakonfigurované ako výstup, bude to znamenať jednoducho výstup vysokého napätia.

PORTB = 0xFF; // Nastavte všetky piny PORTBU na VYSOKÉ. LED dióda je zapnutá, // taktiež je povolený interný pull up odpor prvého pinu PORTB. DDRC = 0xFFu; // Nastaviť všetky piny PORTC ako výstup. PORTC = 0x00u; // Nastavte všetky piny PORTC na minimum, čím sa vypne. DDRD = 0xFFu; // Nastaviť všetky piny portu ako výstup. PORTD = 0x00u; // Nastavením všetkých pinov PORTD na minimum sa vypne. }

nepodpísaný znak button_state ()

{

Táto funkcia vráti booleovskú hodnotu, ktorá označuje, či bolo tlačidlo stlačené alebo nie. Toto je blok kódu, ktorý sa neustále vykonáva v nekonečnej slučke, a preto zisťuje stav tlačidla. Tu tiež odpojíme prepínač.

Teraz si pamätajte, že keď stlačíme spínač, vstupný výstupný kolík je vytiahnutý na zem. Preto čakáme, kým kolík klesne.

/ * tlačidlo je stlačené, keď je BUTTON1 bit jasný */

if (! (PINB & (1 <

Robíme to tak, že skontrolujeme, či je bit jasný. Ak je bit jasný, čo naznačuje, že je tlačidlo stlačené, najskôr oneskoríme dobu definovanú DEBOUNCE_TIME, ktorá je 25 ms, a potom znova skontrolujeme stav tlačidla. Ak je tlačidlo stlačené po 25 ms, potom je spínač považovaný za odpojený a pripravený na spustenie udalosti, a tak sa vrátime k svojmu volajúcemu postupu 1. Ak tlačidlo nie je stlačené, vrátime sa 0 k rutine volania.

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

int main (prázdny)

{

Naša hlavná rutina. Hlavná funkcia je jedinečná a odlišuje sa od všetkých ostatných funkcií. Každý program C musí mať presne jednu hlavnú () funkciu. hlavné je miesto, kde AVR začne vykonávať váš kód pri prvom zapnutí napájania, takže je to vstupný bod programu.

znak bez znamienka n_led = 1; // LED číslo pôvodne svieti

Volanie funkcie na inicializáciu používaných I/O pinov:

init_ports_mcu ();

nekonečná slučka, v ktorej beží náš program:

zatiaľ čo (1)

{

Keď button_state vráti stav indikujúci, že bolo tlačidlo stlačené a zrušené, potom sa prepne aktuálny stav LED diód podľa parametra n_led.

if (button_state ()) // Ak je tlačidlo stlačené, prepnite stav LED a oneskorenie na 300 ms (#define LOCK_INPUT_TIME)

{prepínač (n_led) {prípad 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); prestávka;

Tieto príkazy používajú bitové operátory C. Tentoraz používa výhradného operátora ALEBO. Keď XOR PORT s bitovou hodnotou bitu, ktorý chcete prepnúť, tento jeden bit sa zmení bez ovplyvnenia ostatných bitov.

prípad 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); prestávka; prípad 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // reset LED prerušenia čísla; } n_led ++; // ďalšia LED sa rozsvieti _delay_ms (LOCK_INPUT_TIME); }} návrat (0); }

Takže teraz, keď spustíte tento program, mali by ste byť schopní stlačiť tlačidlo, aby sa LED diódy prepínali. Vzhľadom na naše oneskorenie definované LOCK_INPUT_TIME môžete stlačiť a podržať tlačidlo, čo spôsobí vypnutie a zapnutie LED diód konzistentnou rýchlosťou (o niečo viac ako každých 275 ms).

Programovanie je dokončené.

Ďalším krokom je zostavenie projektu a naprogramovanie hexadecimálneho súboru do mikrokontroléra pomocou programu avrdude.

Môžete si stiahnuť súbor main.c s programom v kóde c:

Krok 2: Prenos súboru HEX programu do pamäte Flash čipu

Prenos súboru HEX programu do pamäte Flash čipu
Prenos súboru HEX programu do pamäte Flash čipu
Prenos súboru HEX programu do pamäte Flash čipu
Prenos súboru HEX programu do pamäte Flash čipu

Prevezmite a nainštalujte AVRDUDE. Najnovšia dostupná verzia je 6.3: Stiahnite si súbor zip

Najprv skopírujte hexadecimálny súbor programu do adresára AVRDUDE. V mojom prípade je to ButtonAVR.hex

Potom do okna výzvy DOS zadajte príkaz: avrdude –c [meno programátora] –p m328p –u –U flash: w: [názov vášho hexadecimálneho súboru].

V mojom prípade je to: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Tento príkaz zapíše hexadecimálny súbor do pamäte mikrokontroléra.

Pozrite si video s podrobným popisom napaľovania pamäte flash mikrokontroléra:

Napaľovanie pamäte flash mikrokontroléra…

Dobre! Mikrokontrolér teraz pracuje v súlade s pokynmi nášho programu. Pozrime sa na to!

Krok 3: Odsunutie hardvérového prepínača

Hardvérové prepínanie debouncing
Hardvérové prepínanie debouncing

Okrem softvérového deboundingu softvérových prepínačov môžeme použiť aj techniku hardvérového debounouncing. Základnou myšlienkou tejto techniky je použiť kondenzátor na odfiltrovanie rýchlych zmien signálu prepínača.

Akú hodnotu kondenzátora by ste mali zvoliť? To bude v konečnom dôsledku závisieť od toho, ako zle tlačidlo funguje v súvislosti s týmto konkrétnym problémom. Niektoré tlačidlá môžu zobrazovať obrovské správanie pri odrážaní, iné však budú mať veľmi málo. Nízka hodnota kondenzátora, ako napríklad 1, 0 nanofarád, bude reagovať veľmi rýchlo, s malým alebo žiadnym vplyvom na odskakovanie. Naopak, vyššia hodnota kondenzátora, ako je 220 nanofarád (čo je na kondenzátory stále dosť malé), poskytne pomalý prechod z počiatočného na koncové napätie (5 voltov na 0 voltov). Prechod pozorovaný pri kapacite 220 nanofarád je však stále veľmi rýchly v zmysle skutočného sveta, a preto ho možno použiť na tlačidlách so slabým výkonom.

Krok 4: Elektrický obvod

Elektrický obvod
Elektrický obvod
Elektrický obvod
Elektrický obvod
Elektrický obvod
Elektrický obvod

Pripojte komponenty podľa schematického diagramu.

Odporúča: