Kazalo:

Mikrokrmilnik AVR. Preklopite LED z gumbom. Odstranitev pritiska na gumb: 4 koraki
Mikrokrmilnik AVR. Preklopite LED z gumbom. Odstranitev pritiska na gumb: 4 koraki

Video: Mikrokrmilnik AVR. Preklopite LED z gumbom. Odstranitev pritiska na gumb: 4 koraki

Video: Mikrokrmilnik AVR. Preklopite LED z gumbom. Odstranitev pritiska na gumb: 4 koraki
Video: ESP8266 ESP01 WI-FI-UART | Программирование LDmicro-Roboremo 2024, Julij
Anonim
Image
Image

V tem razdelku se bomo naučili, kako narediti programsko kodo C za ATMega328PU, da preklopi stanje treh LED diod glede na vnos s stikalom gumbov. Prav tako smo raziskali rešitve problema "Switch Bounce". Kot običajno bomo na osnovi AVR ATmega328 sestavili električno vezje, da preverimo delovanje programske kode.

1. korak: Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7

Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7
Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7
Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7
Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7
Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7
Pisanje in izdelava aplikacije mikrokontrolerja AVR v kodi C z uporabo integrirane razvojne platforme Atmel Studio 7

Če nimate programa Atmel Studio, ga prenesite in namestite.

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

Prvih nekaj vrstic, ki jih imamo, določa prevajalnik.

F_CPU definira frekvenco ure v Hercih in je pogosta v programih, ki uporabljajo knjižnico avr-libc. V tem primeru ga rutine zamude uporabljajo za določitev načina izračuna časovnih zamud.

#ifndef F_CPU

#define F_CPU 16000000UL // povedana frekvenca kristala krmilnika (16 MHz AVR ATMega328P) #endif

#include // glava za omogočanje nadzora pretoka podatkov nad zatiči. Določa zatiče, vrata itd.

Prva datoteka za vključitev je del avr-libc in bo uporabljena v skoraj vsakem projektu AVR, na katerem delate. io.h bo določil CPU, ki ga uporabljate (zato pri sestavljanju določite del) in nato vključil ustrezno glavo definicije IO za čip, ki ga uporabljamo. Preprosto definira konstante za vse vaše zatiče, vrata, posebne registre itd.

#include // glava za omogočanje funkcije zamika v programu

Knjižnični util/delay.h vsebuje nekaj rutin za kratke zamude. Funkcija, ki jo bomo uporabljali, je _delay_ms ().

Za definiranje vrat in zatičev gumbov in LED uporabljamo definicije. Uporaba takšnih izrazov definira nam omogoča, da spremenimo samo 3 vrstice, ki jih je enostavno najti, če LED premaknemo na drug V/I pin ali uporabimo drug AVR.

#define BUTTON1 1 // gumbno stikalo, priključeno na vhod B 1

#define LED1 0 // Led1 priključen na vrata B pin 0 #define LED2 1 // Led2 priključen na vrata C pin 1 #define LED3 2 // Led3 priključen na vrata D pin 2

Zadnja dva določita čas nastavitve stavkov v milisekundah, da prekineta stikalo in čas čakanja, preden omogočita nov pritisk gumba. Čas debloniranja je treba prilagoditi času, ki je potreben za prehod stikala z digitalnega visoko na digitalno nizko vrednost po vseh odskokih. Obnašanje se bo od stikala do stikala razlikovalo, vendar običajno zadostuje 20-30 milisekund.

#define DEBOUNCE_TIME 25 // čas za čakanje, medtem ko gumb "razveljavi"

#define LOCK_INPUT_TIME 300 // čas čakanja po pritisku gumba

void init_ports_mcu ()

{

Ta funkcija se pokliče samo enkrat na začetku našega programa za inicializacijo vhodnih izhodnih zatičev, ki jih bomo uporabljali.

Za gumb bomo za pisanje in branje uporabljali registre PORT in PIN. Pri AVR -jih beremo pin z njegovim registrom PINx in pišemo na pin z registrom PORTx. Za omogočanje vlečenja moramo pisati v register gumbov.

Za LED moramo za pisanje uporabiti le register PORT, vendar potrebujemo tudi register smeri podatkov (DDR), saj so vhodno/izhodni zatiči privzeto nastavljeni kot vhodi.

Najprej nastavimo vhodno -izhodne zatiče LED kot izhod s pomočjo registra smeri podatkov.

DDRB = 0xFFu; // Vse izhode PORTB nastavimo kot izhod.

Nato izrecno nastavite zatič gumba kot vhod.

DDRB & = ~ (1 <

Nato so zatiči PORTB nastavljeni visoko (+5 voltov), da jih vklopite. Izhodni zatiči so sprva visoki, in ker je naša LED aktivna, je vklopljena, razen če jo izrecno izklopimo.

In končno, omogočimo notranji vlečni upor na vhodnem zatiču, ki ga uporabljamo za naš gumb. To preprosto naredite tako, da eno vnesete v vrata. Če je konfigurirano kot vhod, to omogoči vlečenje in če je konfigurirano kot izhod, bi to preprosto dalo visoko napetost.

PORTB = 0xFF; // Vse nožice PORTB nastavite na VISOKE. LED je vklopljen, // omogočen je tudi notranji vlečni upor prvega zatiča PORTB. DDRC = 0xFFu; // Vse izhode PORTC nastavimo kot izhodne. PORTC = 0x00u; // Nastavite vse zatiče PORTC na nizko, kar izklopi. DDRD = 0xFFu; // Vse izhode PORTD nastavimo kot izhod. PORTD = 0x00u; // Vse pinove PORTD nastavite na nizko, kar izklopi. }

unsigned char button_state ()

{

Ta funkcija vrne logično vrednost, ki označuje, ali je bil gumb pritisnjen ali ne. Ta blok kode se nenehno izvaja v infinate zanki in tako raziskuje stanje gumba. Tu tudi zavračamo stikalo.

Spomnite se, da ko pritisnemo stikalo, se vhodni izhodni zatič potegne na tla. Tako čakamo, da se zatič spusti.

/ * gumb je pritisnjen, ko je bit BUTTON1 čist */

če (! (PINB & (1 <

To naredimo tako, da preverimo, ali je bit jasen. Če je bit jasen, kar kaže, da je gumb pritisnjen, najprej zamudimo za čas, ki ga določi DEBOUNCE_TIME in je 25ms, nato pa ponovno preverimo stanje gumba. Če je gumb pritisnjen po 25 ms, se šteje, da je stikalo sproščeno in pripravljeno za sprožitev dogodka, zato se vrnemo 1 v klicno rutino. Če gumb ni pritisnjen, se vrnemo 0 v klicno rutino.

_dey_ms (DEBOUNCE_TIME);

če (! (PINB & (1 <

int main (void)

{

Naša glavna rutina. Glavna funkcija je edinstvena in ločena od vseh drugih funkcij. Vsak program C mora imeti natanko eno funkcijo main (). main je mesto, kjer AVR začne izvajati vašo kodo, ko se prvič vklopi, zato je to vstopna točka programa.

brez podpisa char n_led = 1; // sprva je LED številka vklopljena

Klic funkcije za inicializacijo uporabljenih V/I zatičev:

init_ports_mcu ();

neskončna zanka, kjer teče naš program:

medtem ko (1)

{

Ko button_state vrne eno, ki označuje, da je bil gumb pritisnjen in odmaknjen, nato pa po vrsti preklopite trenutno stanje LED v skladu s parametrom n_led.

if (button_state ()) // Če je gumb pritisnjen, preklopite stanje LED in zakasnite 300 ms (#define LOCK_INPUT_TIME)

{switch (n_led) {primer 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); zlom;

Ti stavki uporabljajo bitne operaterje C. Tokrat uporablja izključni operater OR. Ko XOR PORT z bitno vrednostjo bita, ki ga želite preklopiti, se ta en bit spremeni brez vpliva na druge bite.

primer 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); zlom; primer 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // ponastavitev prekinitve številke LED; } n_led ++; // naslednja LED sveti _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Torej, ko zaženete ta program, bi morali imeti možnost, da pritisnete gumb, da LED-diode preklopijo. Zaradi naše zamude, ki jo določa LOCK_INPUT_TIME, lahko pritisnete in držite gumb, zaradi česar se LED -diode izklopijo in vklopijo s konstantno hitrostjo (malo več kot vsakih 275 ms).

Programiranje je končano.

Naslednji korak je vgradnja projekta in programiranje šestnajstiške datoteke v mikrokrmilnik s programom avrdude.

Datoteko main.c s programom lahko prenesete v kodo c:

Korak: Prenos datoteke HEX programa v bliskovni pomnilnik čipa

Prenos datoteke HEX programa v bliskovni pomnilnik čipa
Prenos datoteke HEX programa v bliskovni pomnilnik čipa
Prenos datoteke HEX programa v bliskovni pomnilnik čipa
Prenos datoteke HEX programa v bliskovni pomnilnik čipa

Prenesite in namestite AVRDUDE. Najnovejša različica, ki je na voljo, je 6.3: Prenesite datoteko zip

Najprej kopirajte šestnajstiško datoteko programa v imenik AVRDUDE. V mojem primeru je ButtonAVR.hex

Nato v okno poziva DOS vnesite ukaz: avrdude –c [ime programerja] –p m328p –u –U flash: w: [ime vaše šestnajstiške datoteke].

V mojem primeru je to: avrdude –c ISPProgv1 –p m328p –u –U bliskavica: w: Button AVR.hex

Ta ukaz zapiše šestnajstiško datoteko v pomnilnik mikrokrmilnika.

Oglejte si video s podrobnim opisom zapisovanja bliskovnega pomnilnika mikrokrmilnika:

Zapis flash pomnilnika mikrokrmilnika …

V redu! Zdaj mikrokrmilnik deluje v skladu z navodili našega programa. Preverimo!

3. korak: Odstranitev stikala strojne opreme

Razveljavitev stikala strojne opreme
Razveljavitev stikala strojne opreme

Poleg razveljavitve programskega stikala lahko uporabimo tudi strojno tehniko. Osnovna ideja te tehnike je uporaba kondenzatorja za filtriranje hitrih sprememb v stikalnem signalu.

Kakšno vrednost kondenzatorja je treba izbrati? To bo na koncu odvisno od tega, kako slabo deluje gumb glede te posebne težave. Nekateri gumbi lahko prikažejo izjemno odbijajoče vedenje, spet drugi bodo imeli zelo malo. Nizka vrednost kondenzatorja, kot je 1,0 nanofarad, se bo odzvala zelo hitro, z malo ali brez vpliva na odbijanje. Nasprotno pa bo višja vrednost kondenzatorja, na primer 220 nanofaradov (kar je še vedno precej majhno v smislu kondenzatorjev), zagotovila počasen prehod od začetne do končne napetosti (5 voltov do 0 voltov). Prehod z zmogljivostjo 220 nanofaradov je v resničnem smislu še vedno precej hiter in ga je zato mogoče uporabiti na gumbih s slabim delovanjem.

4. korak: Električno vezje

Električno vezje
Električno vezje
Električno vezje
Električno vezje
Električno vezje
Električno vezje

Priključite komponente v skladu s shematskim diagramom.

Priporočena: