Sisukord:

AVR mikrokontroller. Lülitage LED -id sisse lülitusnupu abil. Vajutage nupule: 4 sammu
AVR mikrokontroller. Lülitage LED -id sisse lülitusnupu abil. Vajutage nupule: 4 sammu

Video: AVR mikrokontroller. Lülitage LED -id sisse lülitusnupu abil. Vajutage nupule: 4 sammu

Video: AVR mikrokontroller. Lülitage LED -id sisse lülitusnupu abil. Vajutage nupule: 4 sammu
Video: LDmicro 1: Введение (программирование релейной логики ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
Image
Image

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

AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil
AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil
AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil
AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil
AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil
AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis integreeritud arendusplatvormi Atmel Studio 7 abil

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

Programmi HEX -faili ülekandmine kiibi välkmällu
Programmi HEX -faili ülekandmine kiibi välkmällu
Programmi HEX -faili ülekandmine kiibi välkmällu
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

Riistvaralüliti tühistamine
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

Elektriahel
Elektriahel
Elektriahel
Elektriahel
Elektriahel
Elektriahel

Ühendage komponendid vastavalt skemaatilisele skeemile.

Soovitan: