Përmbajtje:

Mikrokontrolluesi AVR. Ndryshoni LED -të duke përdorur një çelës butoni me shtytje. Butoni i Shtypjes Debouncing .: 4 Hapa
Mikrokontrolluesi AVR. Ndryshoni LED -të duke përdorur një çelës butoni me shtytje. Butoni i Shtypjes Debouncing .: 4 Hapa

Video: Mikrokontrolluesi AVR. Ndryshoni LED -të duke përdorur një çelës butoni me shtytje. Butoni i Shtypjes Debouncing .: 4 Hapa

Video: Mikrokontrolluesi AVR. Ndryshoni LED -të duke përdorur një çelës butoni me shtytje. Butoni i Shtypjes Debouncing .: 4 Hapa
Video: LED blinking one after the other, on loop 2024, Korrik
Anonim
Image
Image

Në këtë pjesë, ne do të mësojmë Si të bëjmë programin C kodin për ATMega328PU për të ndryshuar statusin e tre LED -ve sipas hyrjes nga një çelës butoni. Gjithashtu, ne kemi eksploruar një zgjidhje për problemin e "Switch Bounce". Si zakonisht, ne do të montojmë qarkun elektrik në bazë të AVR ATmega328 për të kontrolluar punën e kodit të programit.

Hapi 1: Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në C Code duke përdorur Platformën e Integruar të Zhvillimit Atmel Studio 7

Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në C Code Duke përdorur Platformën e Zhvillimit të Integruar Atmel Studio 7
Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në C Code Duke përdorur Platformën e Zhvillimit të Integruar Atmel Studio 7
Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në C Code Duke përdorur Platformën e Zhvillimit të Integruar Atmel Studio 7
Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në C Code Duke përdorur Platformën e Zhvillimit të Integruar Atmel Studio 7
Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në Kodin C Duke përdorur Platformën e Integruar të Zhvillimit Atmel Studio 7
Shkrimi dhe Ndërtimi i Aplikacionit të Mikrokontrolluesit AVR në Kodin C Duke përdorur Platformën e Integruar të Zhvillimit Atmel Studio 7

Nëse nuk keni Atmel Studio, duhet ta shkarkoni dhe instaloni.

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

Linjat e para që kemi disa përpilues përcakton.

F_CPU përcakton frekuencën e orës në Hertz dhe është e zakonshme në programet që përdorin bibliotekën avr-libc. Në këtë rast përdoret nga rutinat e vonesës për të përcaktuar mënyrën e llogaritjes së vonesave kohore.

#ifndef F_CPU

#define F_CPU 16000000UL // tregues i frekuencës kristalore të kontrolluesit (16 MHz AVR ATMega328P) #endif

#include // header për të mundësuar kontrollin e rrjedhës së të dhënave mbi kunjat. Përcakton kunjat, portet, etj.

Skedari i parë i përfshirë është pjesë e avr-libc dhe do të përdoret në pothuajse çdo projekt AVR në të cilin punoni. io.h do të përcaktojë CPU që po përdorni (kjo është arsyeja pse ju specifikoni pjesën kur përpiloni) dhe nga ana tjetër do të përfshijë titullin e duhur të definicionit IO për çipin që ne po përdorim. Thjesht përcakton konstantet për të gjitha kunjat, portet, regjistrat tuaj të veçantë, etj.

#include // header për të aktivizuar funksionin e vonesës në program

Përdorimi/vonesa e bibliotekës përmban disa rutina për vonesa të shkurtra. Funksioni që do të përdorim është _delay_ms ().

Ne përdorim definicionet për të deklaruar butonin tonë dhe portet dhe kunjat e LED. Përdorimi i deklaratave të përcaktuara si kjo na lejon të modifikojmë vetëm 3 rreshta të lehtë për tu gjetur nëse e zhvendosim LED në një kunj të ndryshëm I/O ose përdorim një AVR tjetër.

#define BUTTON1 1 // kaloni i butonit i lidhur me portën B pin 1

#define LED1 0 // Led1 i lidhur me portën B pin 0 #define LED2 1 // Led2 i lidhur me portën C pin 1 #define LED3 2 // Led3 i lidhur me portën D pin 2

Dy të fundit përcaktojnë kohën e konfigurimit të deklaratave, në milisekonda, për të anuluar ndërprerësin dhe kohën për të pritur para se të lejoni një shtypje tjetër të butonit. Koha e debunimit duhet të përshtatet me kohën që i duhet kalimit për të kaluar nga niveli i lartë dixhital në atë të ulët dixhital pas gjithë kërcimit. Sjellja e kërcimit do të ndryshojë nga kalimi në kalim, por 20-30 milisekonda është zakonisht mjaft e mjaftueshme.

#define DEBOUNCE_TIME 25 // koha për të pritur ndërsa butoni "de-kërcim"

#përcaktoni LOCK_INPUT_TIME 300 // koha për të pritur pas shtypjes së një butoni

void init_ports_mcu ()

{

Ky funksion thirret vetëm një herë në fillim të programit tonë për të inicializuar kunjat e daljes hyrëse që do të përdorim.

Për butonin, ne do të përdorim regjistrat PORT dhe PIN për të shkruar dhe lexuar. Me AVR, ne lexojmë një kunj duke përdorur regjistrin PINx dhe i shkruajmë një kunj duke përdorur regjistrin PORTx. Duhet të shkruajmë në regjistrin e butonave për të mundësuar tërheqjet.

Për LED ne duhet vetëm të përdorim regjistrin PORT për të shkruar, megjithatë, ne gjithashtu kemi nevojë për regjistrin e drejtimit të të dhënave (DDR) pasi kunjat e I/O janë të vendosur si hyrje si parazgjedhje.

Së pari, ne po vendosim kunjat e I/O të LED si një dalje duke përdorur regjistrin e drejtimit të të dhënave.

DDRB = 0xFFu; // Vendosni të gjitha kunjat e PORTB si dalje.

Tjetra, vendosni në mënyrë të qartë pinin e butonit si një hyrje.

DDRB & = ~ (1 <

Tjetra, kunjat PORTB janë vendosur lartë (+5 volt) për ta ndezur. Kunjat e daljes janë fillimisht të larta, dhe meqenëse LED-i ynë është i lidhur në mënyrë aktive-i lartë, ai do të ndizet nëse nuk e fikim në mënyrë eksplicite.

Dhe së fundi, ne aktivizojmë rezistencën e brendshme tërheqëse në kunjin hyrës që po përdorim për butonin tonë. Kjo bëhet thjesht duke nxjerrë një në port. Kur konfigurohet si hyrje, duke bërë kështu rezulton në mundësimin e tërheqjeve dhe kur konfigurohet si dalje, duke bërë kështu thjesht do të prodhojë një tension të lartë.

PORTB = 0xFF; // Vendosni të gjitha kunjat e PORTB si LART. Led është ndezur, // gjithashtu është i aktivizuar rezistenca e brendshme Pull Up e pinit të parë PORTB. DDRC = 0xFFu; // Vendosni të gjitha kunjat e PORTC si dalje. PORTC = 0x00u; // Vendosni të gjitha kunjat e PORTC të ulëta që e fikin atë. DDRD = 0xFFu; // Vendosni të gjitha kunjat e PORTD si dalje. PORTD = 0x00u; // Vendosni të gjitha kunjat e PORTD të ulët, gjë që e fik atë. }

butoni i_nënshkruar button_state ()

{

Ky funksion kthen një vlerë booleane që tregon nëse është shtypur apo jo butoni. Ky është blloku i kodit me të cilin po ekzekutohet vazhdimisht në lakin e pafund dhe kështu po voton gjendjen e butonit. Kjo është gjithashtu ajo ku ne debonojmë kalimin.

Tani, mbani mend se kur shtypim çelësin, kunja dalëse e tërheqjes tërhiqet në tokë. Kështu, ne po presim që kunja të ulet.

/ * butoni shtypet kur BUTTON1 bit është i qartë */

nëse (! (PINB & (1 <

Ne e bëjmë këtë duke kontrolluar nëse bit është i qartë. Nëse biti është i qartë, duke treguar se butoni është i shtypur, ne së pari vonojmë për sasinë e kohës të përcaktuar nga DEBOUNCE_TIME që është 25ms dhe pastaj kontrollojmë përsëri gjendjen e butonit. Nëse butoni është i shtypur pas 25ms atëherë çelësi konsiderohet të jetë i hequr dhe i gatshëm për të shkaktuar një ngjarje dhe kështu ne kthehemi 1 në rutinën tonë të thirrjes. Nëse butoni nuk është i shtypur, ne i kthejmë 0 rutinës sonë të thirrjes.

_vonesa_ms (DEBOUNCE_TIME);

nëse (! (PINB & (1 <

int kryesore (e pavlefshme)

{

Rutina jonë kryesore. Funksioni kryesor është unik dhe i veçuar nga të gjitha funksionet e tjera. Çdo program C duhet të ketë saktësisht një funksion kryesor (). kryesore është aty ku AVR fillon të ekzekutojë kodin tuaj kur rryma ndizet për herë të parë, kështu që është pika hyrëse e programit.

shenjë e panënshkruar n_led = 1; // Fillimisht numri LED është i ndezur tani

Thirrja e funksionit për të inicializuar kunjat I/O që përdoren:

init_ports_mcu ();

lak i pafund ku programi ynë funksionon:

ndërsa (1)

{

Kur butoni_state kthen një që tregon se butoni është shtypur dhe depozituar, atëherë ndryshoni statusin aktual të LED -ve me radhë sipas parametrit n_led.

nëse (butoni_stat ()) // Nëse butoni shtypet, kaloni gjendjen e LED -it dhe vononi për 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {rasti 1: PORTB ^= (1 << LED1]; PORTC ^= (1 << LED2]; pushim;

Këto deklarata përdorin operatorë C bitwise. Këtë herë po përdor operatorin ekskluziv OR. Kur ju XOR PORTIN me vlerën e bitit të bitit që dëshironi të kaloni, ai bit ndryshon pa ndikuar në pjesët e tjera.

rasti 2:

PORTC ^= (1 << LED2]; PORTD ^= (1 << LED3]; pushim; rasti 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1]; n_led = 0; // rivendosni thyerjen e numrit LED; } n_led ++; // LED tjetër ndizet _delay_ms (LOCK_INPUT_TIME); }} kthimi (0); }

Pra, tani, kur e ekzekutoni këtë program, duhet të jeni në gjendje të shtypni butonin e shtypjes te LED që po ndryshojnë. Për shkak të vonesës sonë të përcaktuar nga LOCK_INPUT_TIME, ju mund të shtypni dhe mbani butonin i cili do të bëjë që LED -të të fiken dhe ndizen me një ritëm të qëndrueshëm (pak më shumë se çdo 275ms).

Programimi ka përfunduar.

Hapi tjetër është ndërtimi i projektit dhe programimi i skedarit gjashtëkëndësh në mikrokontrollues duke përdorur programin avrdude.

Ju mund të shkarkoni skedarin main.c me programin në kodin c:

Hapi 2: Transferimi i skedarit HEX të Programit në Flash Memory të Çipit

Transferimi i skedarit HEX të programit në kujtesën flash të çipit
Transferimi i skedarit HEX të programit në kujtesën flash të çipit
Transferimi i skedarit HEX të programit në kujtesën flash të çipit
Transferimi i skedarit HEX të programit në kujtesën flash të çipit

Shkarkoni dhe instaloni AVRDUDE. Versioni i fundit i disponueshëm është 6.3: Shkarkoni skedarin zip

Së pari, kopjoni skedarin gjashtëkëndësh të programit në drejtorinë AVRDUDE. Në rastin tim është ButtonAVR.hex

Pastaj, shkruani në dritaren e shpejtë të DOS komandën: avrdude –c [emri i programuesit] –p m328p –u –U flash: w: [emri i skedarit tuaj gjashtëkëndësh].

Në rastin tim është: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Kjo komandë shkruan skedar gjashtëkëndësh në kujtesën e mikrokontrolluesit.

Shikoni videon me një përshkrim të hollësishëm të djegies së kujtesës flash të mikrokontrolluesit:

Memoria flash e mikrokontrolluesit po digjet…

Ne rregull! Tani, mikrokontrolluesi punon në përputhje me udhëzimet e programit tonë. Le ta kontrollojmë!

Hapi 3: Zhbllokimi i ndërrimit të harduerit

Kalimi i harduerit Debouncing
Kalimi i harduerit Debouncing

Përveç zhbllokimit të ndërprerësve të softuerit, ne mund të përdorim teknikën e zhbllokimit të ndërrimit të harduerit. Ideja themelore pas një teknike të tillë është përdorimi i një kondensatori për të filtruar ndryshimet e shpejta në sinjalin e kalimit.

Çfarë vlere kondensatori duhet zgjedhur? Kjo përfundimisht do të varet nga sa dobët funksionon butoni në lidhje me këtë problem të veçantë. Disa butona mund të shfaqin një sjellje të jashtëzakonshme kërcimi, por të tjerët do të kenë shumë pak. Një vlerë e ulët e kondensatorit si 1.0 nanofarada do të reagojë shumë shpejt, me pak ose aspak efekt në kërcimin. Anasjelltas, një vlerë më e lartë e kondensatorit siç janë 220 nanofaradët (e cila është ende mjaft e vogël për sa i përket kondensatorëve) do të sigurojë një kalim të ngadalshëm nga tensioni fillestar në atë përfundimtar (5 volt në 0 volt). Kalimi i parë me një kapacitet 220 nanofarad është akoma mjaft i shpejtë në kuptimin e botës reale, dhe kështu mund të përdoret në butona me performancë të dobët.

Hapi 4: Qarku Elektrik

Qarku Elektrik
Qarku Elektrik
Qarku Elektrik
Qarku Elektrik
Qarku Elektrik
Qarku Elektrik

Lidhni komponentët në përputhje me diagramin skematik.

Recommended: