Sisällysluettelo:
- Vaihe 1: AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidun kehitysalustan avulla Atmel Studio 7
- Vaihe 2: Ohjelman HEX -tiedoston siirtäminen sirun flash -muistiin
- Vaihe 3: Laitteistokytkimen poistaminen käytöstä
- Vaihe 4: Sähköpiiri
Video: AVR -mikrokontrolleri. Vaihda LED -valoja painonapilla. Painikkeiden poistaminen käytöstä: 4 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:01
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
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
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ä
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
Liitä komponentit kaavion mukaisesti.
Suositeltava:
Automaattisen korjauksen poistaminen käytöstä vain yhdelle sanalle (iOS): 3 vaihetta
Automaattisen korjauksen poistaminen käytöstä vain yhdelle sanalle (iOS): Joskus automaattinen korjaus saattaa korjata jotain, jota et halua korjata, esim. tekstin lyhenteet alkavat tehdä isoja kirjaimia (esimerkiksi IMO -korjaus). Näin voit pakottaa sen lopettamaan yhden sanan tai lauseen korjaamisen poistamatta automaattista käytöstä
TV -kaukosäätimen painikkeiden korjaaminen: 5 vaihetta
TV -kaukosäätimen painikkeiden korjaaminen: Tietyt television kaukosäätimen painikkeet voivat kulua ajan myötä. Minun tapauksessani se oli kanava ylös ja kanava alas -painikkeet. Painikkeen pohjassa olevat koskettimet ovat todennäköisesti kuluneet. Näin korjasin omani
JTAG: n poistaminen käytöstä ennen Atmegas 40DIP: n lataamista Arduino IDE Mightycore -laitteella: 4 vaihetta
JTAG: n poistaminen käytöstä ennen Atmegas 40DIP: n käynnistystä Arduino IDE Mightycorella: Sain äskettäin käyttää atmegas 40 DIP: tä teollisuusjärjestelmien ohjaamiseen, koska tällainen mikro -ohjain tarjoaa monia analogisia tai digitaalisia I/O -laitteita, joten et tarvitse laajennuksia. 644p/1284p sisältää tavan ladata luomasi luonnos, joka
Mikrofonin poistaminen käytöstä tai poistaminen FireTV -ohjaimen versiossa 2: 3
Mikrofonin poistaminen käytöstä tai poistaminen FireTV -ohjaimessa Versio 2: Koska ei ole olemassa selvää ratkaisua mikrofonin poistamisesta käytöstä FireTV -ohjaimessa ohjelmistoasetusten avulla, ainoa vaihtoehto on poistaa mikrofoni fyysisesti. FireTV: n ensimmäinen versio ohjain, toinen ratkaisu voi auttaa
7 segmentin arvon lisääminen painonapilla 8051: 4 askelta (kuvilla)
7 -segmentin arvon lisääminen painonapilla 8051: Tässä projektissa aiomme kasvattaa seitsemän segmentin näyttöarvoa painamalla painiketta 8051 -mikrokontrollerilla