Sisällysluettelo:

AVR -mikrokontrolleri. Vaihda LED -valoja painonapilla. Painikkeiden poistaminen käytöstä: 4 vaihetta
AVR -mikrokontrolleri. Vaihda LED -valoja painonapilla. Painikkeiden poistaminen käytöstä: 4 vaihetta

Video: AVR -mikrokontrolleri. Vaihda LED -valoja painonapilla. Painikkeiden poistaminen käytöstä: 4 vaihetta

Video: AVR -mikrokontrolleri. Vaihda LED -valoja painonapilla. Painikkeiden poistaminen käytöstä: 4 vaihetta
Video: Светодиодная гирлянда на микроконтроллере | Микроконтроллеры с нуля #7 2024, Marraskuu
Anonim
Image
Image

Tässä osiossa opimme tekemään ohjelmointikoodin ATMega328PU: lle kolmen LEDin tilan vaihtamiseksi painikekytkimen tulon mukaan. Olemme myös tutkineet ratkaisuja "Switch Bounce" -ongelmaan. Kuten tavallisesti, koomme sähköpiirin AVR ATmega328: n pohjaan tarkistaakseen ohjelmakoodin toiminnan.

Vaihe 1: AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan avulla Atmel Studio 7

AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla
AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla
AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla
AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla
AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla
AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan Atmel Studio 7 avulla

Jos sinulla ei ole Atmel Studiota, lataa ja asenna se.

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

Ensimmäisillä riveillä meillä on kääntäjä määrittelee.

F_CPU määrittää kellotaajuuden hertseinä ja on yleinen avr-libc-kirjastoa käyttävissä ohjelmissa. Tässä tapauksessa viivästysrutiinit käyttävät sitä määrittämään, miten aikaviiveet lasketaan.

#ifndef F_CPU

#define F_CPU 16000000UL // kertoo ohjaimen kristallitaajuuden (16 MHz AVR ATMega328P) #endif

#include // otsikko, joka mahdollistaa tiedonkulun hallinnan nastojen yli. Määrittää nastat, portit jne.

Ensimmäinen sisällytystiedosto on osa avr-libc-tiedostoa ja sitä käytetään melkein missä tahansa AVR-projektissa, jonka parissa työskentelet. io.h määrittää käyttämäsi suorittimen (minkä vuoksi määrität osan kääntäessäsi) ja sisältää puolestaan sopivan IO -määritysotsikon käyttämäämme sirua varten. Se yksinkertaisesti määrittää vakiot kaikille nastoille, porteille, erityisille rekistereille jne.

#include // otsikko, joka mahdollistaa ohjelman viiveen

Kirjasto util/delay.h sisältää joitakin rutiineja lyhyille viiveille. Käyttämämme toiminto on _delay_ms ().

Käytämme määritelmiä painikkeemme ja LED -valojen porttien ja nastojen ilmoittamiseen. Tällaisten määrittelylausekkeiden avulla meidän on vain muokattava kolmea helposti löydettävää linjaa, jos siirrämme LEDin toiseen I/O-nastaan tai käytämme toista AVR: ää.

#define BUTTON1 1 // painikekytkin kytketty porttiin B nasta 1

#define LED1 0 // Led1 kytketty porttiin B nasta 0 #define LED2 1 // Led2 kytketty porttiin C nasta 1 #define LED3 2 // Led3 kytketty porttiin D nasta 2

Kaksi viimeistä määrittelevät lausekkeiden asennusajat millisekunteina kytkimen kytkemiseksi pois ja odotusaika ennen kuin painikkeen toinen painallus sallitaan. Kytkentäaika on säädettävä aikaan, joka kuluu kytkimen siirtymiseksi digitaalisesta korkeudesta digitaaliseen matalaan kaikkien pomppimisten jälkeen. Välitön käyttäytyminen vaihtelee kytkimestä toiseen, mutta tyypillisesti 20-30 millisekuntia riittää.

#define DEBOUNCE_TIME 25 // aika odottaa, kun poistopainike poistetaan

#define LOCK_INPUT_TIME 300 // aika odottaa painikkeen painamisen jälkeen

void init_ports_mcu ()

{

Tätä toimintoa kutsutaan vain kerran ohjelman alussa alustamaan käyttämämme tulolähtönastat.

Painikkeessa käytämme PORT- ja PIN -rekistereitä kirjoittamiseen ja lukemiseen. AVR -laitteilla luemme PIN -koodin käyttämällä sen PINx -rekisteriä ja kirjoitamme PIN -koodiin käyttämällä sen PORTx -rekisteriä. Meidän on kirjoitettava painikerekisteriin, jotta vedokset voidaan ottaa käyttöön.

LED -valoa varten meidän on käytettävä vain PORT -rekisteriä kirjoittamiseen, mutta tarvitsemme myös datasuuntarekisterin (DDR), koska I/O -nastat on oletusarvoisesti asetettu tuloiksi.

Ensinnäkin asetamme LEDien I/O -nastat lähtöksi käyttämällä niiden datasuuntarekisteriä.

DDRB = 0xFFu; // Aseta kaikki PORTB -nastat lähtöksi.

Aseta seuraavaksi napin nasta nimenomaisesti tuloksi.

DDRB & = ~ (1 <

Seuraavaksi PORTB -nastat asetetaan korkealle (+5 volttia) kytkemään se päälle. Lähdön nastat ovat aluksi korkealla, ja koska LED-valomme on kytketty aktiiviseksi, se kytkeytyy päälle, ellemme sammuta sitä nimenomaisesti.

Ja lopuksi otamme käyttöön sisäisen vetovastuksen painikkeessa käyttämässämme tulonastassa. Tämä tehdään yksinkertaisesti antamalla yksi porttiin. Kun se on määritetty tuloksi, se mahdollistaa pull-upien käytön ja kun se on määritetty ulostulona, se yksinkertaisesti tuottaa korkean jännitteen.

PORTB = 0xFF; // Aseta kaikki PORTBin nastat HIGH. Led on päällä, // myös ensimmäisen nastan PORTB: n sisäinen Pull Up -vastus on käytössä. DDRC = 0xFFu; // Aseta kaikki PORTC -nastat lähtöksi. PORTC = 0x00u; // Aseta kaikki PORTC -nastat alhaisiksi, mikä sammuttaa sen. DDRD = 0xFFu; // Aseta kaikki PORTD -nastat lähtöksi. PORTD = 0x00u; // Aseta kaikki PORTD -nastat alhaiseksi, mikä sammuttaa sen. }

unsigned char button_state ()

{

Tämä toiminto palauttaa boolen arvon, joka ilmaisee, painettiinko painiketta vai ei. Tämä on koodilohko, jota suoritetaan jatkuvasti äärettömässä silmukassa ja siten pollataan painikkeen tila. Tässä myös poistamme kytkimen.

Muista nyt, että kun painamme kytkintä, tulon ulostulonappi vedetään maahan. Odotamme siis, että tappi laskee.

/ * painiketta painetaan, kun BUTTON1 -bitti on tyhjä */

jos (! (PINB & (1 <

Teemme sen tarkistamalla, onko bitti selkeä. Jos bitti on selvä ja osoittaa, että painiketta on painettu, viivytetään ensin DEBOUNCE_TIME -määrittämä aika, joka on 25 ms, ja tarkistetaan sitten painikkeen tila uudelleen. Jos painiketta painetaan 25 ms: n jälkeen, kytkimen katsotaan olevan poistettu käytöstä ja valmis käynnistämään tapahtuman, joten palaamme 1 kutsurutiiniin. Jos painiketta ei paineta, palaamme soittorutiiniin 0.

_viive_ms (DEBOUNCE_TIME);

jos (! (PINB & (1 <

int main (mitätön)

{

Päärutiinimme. Päätoiminto on ainutlaatuinen ja erotettu kaikista muista toiminnoista. Jokaisella C -ohjelmalla on oltava täsmälleen yksi päätoiminto (). tärkein on missä AVR alkaa suorittaa koodiasi, kun virta kytketään ensimmäisen kerran, joten se on ohjelman aloituspiste.

allekirjoittamaton char n_led = 1; // aluksi LED -numero palaa nyt

Toiminnon kutsu käytettävien I/O -nastojen alustamiseen:

init_ports_mcu ();

ääretön silmukka, jossa ohjelmamme toimii:

samalla (1)

{

Kun button_state palauttaa yhden osoittamalla, että painiketta painettiin ja poistettiin käytöstä, vaihdetaan sitten LEDien nykyinen tila vuorotellen n_led -parametrin mukaan.

if (button_state ()) // Jos painiketta painetaan, vaihda LED -tilan tila ja viive 300 ms (#define LOCK_INPUT_TIME)

{kytkin (n_led) {tapaus 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); tauko;

Nämä lausunnot käyttävät C -bittioperaattoreita. Tällä kertaa se käyttää yksinomaista OR -operaattoria. Kun XOR PORTAA vaihdettavan bitin bittiarvolla, yksi bitti muuttuu vaikuttamatta muihin bitteihin.

tapaus 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); tauko; tapaus 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // nollaa LED -numero; } n_led ++; // seuraava LED syttyy _delay_ms (LOCK_INPUT_TIME); }} paluu (0); }

Joten nyt, kun suoritat tämän ohjelman, sinun pitäisi pystyä painamaan painiketta, jotta LED-valot vaihtuvat. LOCK_INPUT_TIME: n määrittämän viiveen vuoksi voit painaa ja pitää painettuna painiketta, joka saa LEDit sammumaan ja syttymään jatkuvasti (hieman yli 275 ms välein).

Ohjelmointi on valmis.

Seuraava vaihe on rakentaa projekti ja ohjelmoida heksatiedosto mikrokontrolleriin avrdude -ohjelman avulla.

Voit ladata main.c -tiedoston ohjelmalla c -koodissa:

Vaihe 2: Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin

Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin
Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin
Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin
Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin

Lataa ja asenna AVRDUDE. Viimeisin saatavilla oleva versio on 6.3: Lataa zip -tiedosto

Kopioi ensin ohjelman heksatiedosto AVRDUDE -hakemistoon. Minun tapauksessani se on ButtonAVR.hex

Kirjoita sitten DOS -kehoteikkunaan komento: avrdude –c [ohjelmoijan nimi] –p m328p –u –U flash: w: [heksatiedoston nimi].

Minun tapauksessani se on: avrdude –c ISPProgv1 –p m328p –u –U -salama: w: ButtonAVR.hex

Tämä komento kirjoittaa heksatiedoston mikro -ohjaimen muistiin.

Katso video, jossa on yksityiskohtainen kuvaus mikro -ohjaimen flash -muistin polttamisesta:

Mikro -ohjaimen flash -muisti poltetaan…

Ok! Nyt mikrokontrolleri toimii ohjelmamme ohjeiden mukaisesti. Tarkistetaan se!

Vaihe 3: Laitteistokytkimen poistaminen käytöstä

Laitteistokytkimen poistaminen käytöstä
Laitteistokytkimen poistaminen käytöstä

Ohjelmistokytkimen poistamisen lisäksi voimme käyttää laitteistokytkimen poistotekniikkaa. Tällaisen tekniikan perusidea on käyttää kondensaattoria suodattamaan pois nopeat muutokset kytkinsignaalista.

Mikä arvo kondensaattori kannattaa valita? Tämä riippuu viime kädessä siitä, kuinka huonosti painike toimii tässä ongelmassa. Jotkut painikkeet voivat näyttää valtavan pomppimiskäyttäytymisen, mutta toisilla on hyvin vähän. Alhainen kondensaattorin arvo, kuten 1,0 nanofaradia, reagoi hyvin nopeasti, eikä sillä ole juurikaan vaikutusta pomppimiseen. Päinvastoin, suurempi kondensaattorin arvo, kuten 220 nanofaradia (mikä on vielä melko pieni kondensaattoreiden osalta), tarjoaa hitaan siirtymisen aloitus- ja lopetusjännitteestä (5 voltista 0 volttiin). Siirtyminen 220 nanofaradin kapasiteetilla on kuitenkin todellisessa mielessä melko nopeaa, ja sitä voidaan siten käyttää huonosti toimivissa painikkeissa.

Vaihe 4: Sähköpiiri

Virtapiiri
Virtapiiri
Virtapiiri
Virtapiiri
Virtapiiri
Virtapiiri

Liitä komponentit kaavion mukaisesti.

Suositeltava: