Sisukord:
- Samm: AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis, kasutades integreeritud arendusplatvormi Atmel Studio 7
- 2. samm: programmi HEX -faili ülekandmine kiibi välkmällu
- 3. samm: riistvaralüliti tühistamine
- Samm: elektriline vooluahel
Video: AVR mikrokontroller. Lülitage LED -id sisse lülitusnupu abil. Vajutage nupule: 4 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:48
Selles jaotises õpime, kuidas teha programmi C koodi ATMega328PU jaoks, et muuta kolme LED -i olekut vastavalt nupulüliti sisendile. Samuti oleme uurinud lahendusi probleemile "Switch Bounce". Nagu tavaliselt, paneme AVR ATmega328 baasile kokku elektrikontuuri, et kontrollida programmikoodi tööd.
Samm: AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis, kasutades integreeritud arendusplatvormi Atmel Studio 7
Kui teil pole Atmel Studio'i, peaksite selle alla laadima ja installima.
www.microchip.com/mplab/avr-support/atmel-studio-7
Esimesed paar rida on meil mõned kompilaatorid.
F_CPU määrab kella sageduse hertsides ja on levinud programmides, mis kasutavad avr-libc raamatukogu. Sel juhul kasutavad seda viivitusrutiinid ajaviivituste arvutamiseks.
#ifndef F_CPU
#define F_CPU 16000000UL // ütle kontrolleri kristallsagedust (16 MHz AVR ATMega328P) #endif
#include // päis, et võimaldada andmevoo juhtimist nööpnõelte üle. Määrab tihvtid, pordid jne.
Esimene kaasamisfail on osa avr-libcist ja seda kasutatakse peaaegu igas AVR-projektis, millega töötate. io.h määrab teie kasutatava protsessori (seetõttu määrate selle koostamisel osa) ja lisab omakorda kasutatava kiibi jaoks sobiva IO määratluse päise. See määratleb lihtsalt kõigi teie tihvtide, portide, eriregistrite jms konstandid.
#include // päis, et lubada programmis viivitusfunktsioon
Raamatukogu util/delay.h sisaldab lühikeste viivituste jaoks mõnda rutiini. Funktsioon, mida me kasutame, on _delay_ms ().
Kasutame määratlusi oma nupu ja LED -i portide ja tihvtide deklareerimiseks. Selliste defineerimislausete kasutamine võimaldab meil muuta ainult kolme hõlpsasti leitavat rida, kui teisaldame LED-i teisele sisend-/väljundpistikule või kasutame teist AVR-i.
#define BUTTON1 1 // nupu lüliti, mis on ühendatud porti B tihvtiga 1
#define LED1 0 // Led1 ühendatud pordiga B tihvt 0 #define LED2 1 // Led2 ühendatud pordiga C tihvt 1 #define LED3 2 // Led3 ühendatud D -pistikuga 2
Viimased kaks määravad avalduste seadistamise aja millisekundites, et lüliti välja lülitada, ja ooteaeg, enne kui lubate nuppu uuesti vajutada. Tagasilöögiaega tuleb kohandada ajaga, mis kulub lülitil pärast kõigi põrkamiste üleminekut digitaalselt kõrgelt madalale. Põrkekäitumine on lülitilt erinev, kuid tavaliselt piisab 20–30 millisekundist.
#define DEBOUNCE_TIME 25 // aeg oodata, kuni nupp "tagasilöök" tühistatakse
#define LOCK_INPUT_TIME 300 // aeg pärast nupuvajutust oodata
tühine init_ports_mcu ()
{
Seda funktsiooni kutsutakse meie programmi alguses vaid üks kord, et lähtestada sisendväljundi tihvtid, mida me kasutame.
Nupu jaoks kasutame kirjutamiseks ja lugemiseks registreid PORT ja PIN. AVR -idega loeme PIN -registri abil PIN -koodi ja kirjutame PIN -koodi kasutades selle PORTx -registrit. Tõmbamiste lubamiseks peame nupuregistrisse kirjutama.
LED -i jaoks peame kirjutamiseks kasutama ainult registrit PORT, kuid vajame ka andmesuuna registrit (DDR), kuna sisend-/väljundpistikud on vaikimisi seadistatud sisenditeks.
Esiteks seadistame LED -i I/O kontaktid väljundiks, kasutades selle andmesuuna registrit.
DDRB = 0xFFu; // Määra kõik PORTB -i tihvtid väljundiks.
Seejärel seadke sisendiks selgesõnaliselt nööpnõel.
DDRB & = ~ (1 <
Seejärel seadistatakse PORTB -tihvtid selle sisselülitamiseks kõrgele (+5 volti). Väljundtihvtid on esialgu kõrgel ja kuna meie LED on juhtmega aktiivselt ühendatud, lülitatakse see sisse, kui me seda selgesõnaliselt välja ei lülita.
Ja lõpuks lubame sisemise tõmbetakistuse sisendpoldil, mida me oma nupu jaoks kasutame. Seda tehakse lihtsalt sadamasse ühe väljaandmisega. Kui see on sisendiks konfigureeritud, võimaldab see tõmbeid ja väljundina konfigureerides väljund lihtsalt kõrgepinge.
PORTB = 0xFF; // Määra kõik PORTB -i tihvtid HIGH. Led on sisse lülitatud, // ka esimese tihvti PORTB sisemine tõmbetakistus on lubatud. DDRC = 0xFFu; // Määra kõik PORTC tihvtid väljundiks. PORTC = 0x00u; // Seadke kõik PORTC tihvtid madalaks, mis selle välja lülitab. DDRD = 0xFFu; // Määra kõik PORTD -i tihvtid väljundiks. PORTD = 0x00u; // Seadke kõik PORTD -i tihvtid madalaks, mis selle välja lülitab. }
allkirjastamata sümbol button_state ()
{
See funktsioon tagastab loogilise väärtuse, mis näitab, kas nuppu vajutati või mitte. See on koodiplokk, mida täidetakse pidevalt lõpmata silmusel ja seega küsitletakse nupu olekut. See on ka koht, kus lüliti välja lülitame.
Pidage nüüd meeles, et kui vajutame lülitit, tõmmatakse sisendväljundi tihvt maapinnale. Seega ootame, millal pin läheb madalale.
/ * nuppu vajutatakse, kui BUTTON1 bit on selge */
kui (! (PINB & (1 <
Me teeme seda, kontrollides, kas bit on selge. Kui bit on selge, mis näitab, et nupp on alla vajutatud, viivitame kõigepealt DEBOUNCE_TIME määratletud ajaga, mis on 25 ms, ja kontrollime seejärel nupu olekut uuesti. Kui nuppu vajutatakse pärast 25 sekundit, loetakse lüliti tühjaks ja valmis sündmuse käivitamiseks ning seega naaseme 1 oma helistamisrutiini juurde. Kui nuppu ei vajutata, naaseme oma helistamisrutiini 0 juurde.
_delay_ms (DEBOUNCE_TIME);
kui (! (PINB & (1 <
int main (tühine)
{
Meie peamine rutiin. Põhifunktsioon on ainulaadne ja eraldatud kõigist teistest funktsioonidest. Igal C -programmil peab olema täpselt üks põhifunktsioon (). peamine on koht, kus AVR hakkab teie koodi käivitama, kui esmakordselt sisse lülitatakse, seega on see programmi sisenemispunkt.
allkirjastamata char n_led = 1; // esialgu on LED -number nüüd sisse lülitatud
Funktsiooni kutsumine kasutatavate sisend-/väljundpistikute lähtestamiseks:
init_ports_mcu ();
lõpmatu tsükkel, kus meie programm töötab:
samas (1)
{
Kui button_state tagastab ühe, mis näitab, et nuppu on vajutatud ja tühistatud, lülitatakse LED -ide praegune olek omakorda vastavalt parameetrile n_led.
if (button_state ()) // Kui nuppu vajutatakse, lülitage LED -i olekut ja viivitage 300 ms (#define LOCK_INPUT_TIME)
{lüliti (n_led) {juhtum 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); murda;
Need avaldused kasutavad C -bitiseid operaatoreid. Seekord kasutab see eksklusiivset VÕI operaatorit. Kui muudate sadama XOR -i bitti väärtusega, mida soovite ümber lülitada, muudetakse seda ühte bitti, ilma et see mõjutaks teisi bitte.
juhtum 2:
PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); murda; juhtum 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // reset LED number break; } n_led ++; // järgmine LED süttib _delay_ms (LOCK_INPUT_TIME); }} tagasitulek (0); }
Nüüd peaks selle programmi käivitamisel olema võimalik vajutada nupule, et LED-id lülituksid sisse. LOCK_INPUT_TIME määratletud viivituse tõttu võite vajutada ja hoida all nuppu, mille tõttu LED -id lülituvad välja ja süttivad ühtlase kiirusega (veidi rohkem kui iga 275 ms järel).
Programmeerimine on lõpetatud.
Järgmine samm on projekti koostamine ja hex -faili programmeerimine mikrokontrollerisse, kasutades programmi avrdude.
Faili main.c saate programmiga alla laadida c -koodis:
2. samm: programmi HEX -faili ülekandmine kiibi välkmällu
Laadige alla ja installige AVRDUDE. Viimane saadaval olev versioon on 6.3: laadige alla zip -fail
Esiteks kopeerige programmi kuueteistkümnendfail kataloogi AVRDUDE. Minu puhul on see ButtonAVR.hex
Seejärel tippige DOS -i viipaknasse käsk: avrdude –c [programmeerija nimi] –p m328p –u –U flash: w: [teie hex -faili nimi].
Minu puhul on see: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex
See käsk kirjutab hex -faili mikrokontrolleri mällu.
Vaadake videot mikrokontrolleri välkmälu põletamise üksikasjaliku kirjeldusega:
Mikrokontrolleri välkmälu põletamine…
Okei! Nüüd töötab mikrokontroller vastavalt meie programmi juhistele. Vaatame üle!
3. samm: riistvaralüliti tühistamine
Lisaks tarkvara lülitite tühistamisele saame kasutada riistvaralülitite tagasivõtmise tehnikat. Sellise tehnika põhiidee on kondensaatori kasutamine lülitussignaali kiirete muutuste filtreerimiseks.
Millise väärtusega kondensaator tuleks valida? See sõltub lõpuks sellest, kui halvasti nupp selle konkreetse probleemi puhul toimib. Mõned nupud võivad kuvada tohutut põrkumist, kuid teistel on neid väga vähe. Madal kondensaatori väärtus, näiteks 1,0 nanofaradi, reageerib väga kiiresti, mõjutades põrkumist vähe või üldse mitte. Ja vastupidi, kõrgem kondensaatori väärtus, näiteks 220 nanofaradi (mis on kondensaatorite osas veel üsna väike), tagab aeglase ülemineku algpingelt lõpppingele (5 volti kuni 0 volti). Üleminek 220 nanofaradi võimsusega on reaalses mõttes siiski üsna kiire ja seega saab seda kasutada halvasti toimivate nuppude puhul.
Samm: elektriline vooluahel
Ühendage komponendid vastavalt skemaatilisele skeemile.
Soovitan:
Lülitage LED sisse Interneti kaudu [MagicBlocks]: 10 sammu
LED -i sisselülitamine Interneti kaudu [MagicBlocks]: see õpetus õpetab teid Magicbitil LED -ide juhtimiseks Magicblocks -i abil
Atollic TrueStudio-lülitage LED sisse, vajutades STM32L100 abil nupule: 4 sammu
Atollic TrueStudio-lülitage LED sisse, vajutades STM32L100 abil nupule: Selles STM32 õpetuses räägin teile, kuidas lugeda STM32L100 GPIO-nööpi, nii et siin teen ühe Led-helenduse lihtsalt vajutades nupule
Lülitage LED sisse Watsoni vestlusega: 6 sammu
Lülitage LED sisse Watsoni vestlusega: mida vajate: Zagros Tehisintellekti Raspberry Pi komplekt
Lülitage arvuti sisse ja välja Google Home & Blynk abil: 6 sammu
Lülitage arvuti sisse ja välja Google Home & Blynk abil: Tere poisid ja tere tulemast sellesse õpetusse! Seekord näitan teile, kuidas arvuti oma Google Home'iga sisse lülitadaBEWARE !! LOE SEE !!: 1. Kindlasti isoleerige ühendused! Selle probleemi lahendamiseks valisin korpuse 3D printimise 2. Kui ühendate toite
Lülitage jootekolb sisse puuripatareiga!: 4 sammu (piltidega)
Lülitage jootekolb puuripatareiga toiteallikaks!: Juunis 2017 kolisin vanematekodust välja ja hakkasin oma maja rentima. Üks paljudest muudetud asjadest oli minu tööruum. Ma läksin 12 x 13 tolli toast 4 -tollise laua juurde, mis tähendas, et pidin tegema mõningaid muudatusi. Üks peamisi muudatusi oli sw