Sisällysluettelo:

AVR -kokoonpanon opetusohjelma 7: 12 vaihetta
AVR -kokoonpanon opetusohjelma 7: 12 vaihetta

Video: AVR -kokoonpanon opetusohjelma 7: 12 vaihetta

Video: AVR -kokoonpanon opetusohjelma 7: 12 vaihetta
Video: LDmicro 22: платы Arduino с AVRDUDESS (программирование микроконтроллеров с помощью LDmicro) 2024, Heinäkuu
Anonim
AVR -kokoonpanon opetusohjelma 7
AVR -kokoonpanon opetusohjelma 7

Tervetuloa opetusohjelmaan 7!

Tänään aiomme ensin näyttää, kuinka näppäimistö poistetaan, ja sitten kuinka käyttää analogisia tuloportteja kommunikoidaksesi näppäimistön kanssa. Teemme tämän käyttämällä keskeytyksiä ja yhtä johtoa tulona. Johdamme näppäimistön niin, että jokainen näppäimen painallus lähettää ainutlaatuisen jännitteen analogitulolle, jonka avulla voimme erottaa sen painikkeen jännitteen. Sitten annamme rekisterianalysaattorimme painetun numeron osoittaaksemme, että kaikki tapahtuu niin kuin pitääkin. On olemassa useita epäkohtia, joihin voit törmätä käytettäessä analogista digitaalimuunninta (ADC) ATmega328p: ssä ja niin Ota asiat muutamassa vaiheessa matkalla ja yritä selvittää, miten voit välttää niitä. Näemme myös, miksi analogia -digitaalimuuntimen käyttö ei ole paras tapa hallita näppäimistöä, vaikka se käyttää vähemmän mikrokontrollerin portteja. Tässä opetusohjelmassa tarvitset:

  1. näppäimistö. Voit ostaa yhden tai voit tehdä sen, mitä minä tein, ja puhdistaa yhden.
  2. 2 naaraspuolista näppäimistöä (jos poistat yhden)
  3. liitäntäjohdot
  4. leipälauta
  5. 4 1 Kohm -vastukset
  6. 1 15 Kohm -vastus
  7. 1 3.3 Kohm -vastus
  8. 1 180 ohmin vastus
  9. 1680 ohmin vastus
  10. digitaalinen yleismittari
  11. analysaattorisi opetusohjelmasta 5

Saatat haluta ohittaa ensimmäiset vaiheet, jos sinulla on jo näppäimistö, eikä sinun tarvitse poistaa sitä.

Tässä on linkki koko AVR-kokoonpanon opetusohjelmien kokoelmaan:

Vaihe 1: Poista näppäimistö 1

Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1
Näppäimistön poistaminen 1

Kauan sitten, kun jopa isovanhempasi olivat pelkkiä lapsia, ihmiset käyttivät kommunikoidakseen keskenään näiden oudon näköisten laitteiden kanssa, joissa oli pitkät kaapelit kiinni seinään. Niitä kutsuttiin "puhelimiksi" ja ne olivat yleensä halpoja muoviesineitä, jotka tekivät ärsyttävän äänen, kun joku soitti sinulle (ei niin, että tämän päivän "Justin Bieber" -soittoäänet eivät ole yhtä ärsyttäviä). Joka tapauksessa näissä laitteissa oli näppäimistöt, jotka olivat hyvin yksinkertaisesti kytkettyjä, joten ne on helppo poistaa, ja niissä on 2 ylimääräistä näppäintä ("uudelleenvalinta" ja "salama") ostamistasi näppäimistöistä, joita haluat ehkä käyttää uudelleen kuten "nuolinäppäimiä", "valikkopainikkeita" tai jotain muuta. Joten aiomme aloittaa poistamalla näppäimistön vanhasta puhelimesta. Ota ensin puhelin (käytän GE: tä, kuten kuvassa) ja irrota se erilleen paljastaaksesi johdot. Ota sitten taltta ja napsauta pois pienet muoviset nupit, jotka pitävät näppäimistöä painettuna, ja poista näppäimistö.

Vaihe 2: Poista näppäimistö 2

Pyyhi näppäimistö 2
Pyyhi näppäimistö 2
Pyyhi näppäimistö 2
Pyyhi näppäimistö 2
Pyyhi näppäimistö 2
Pyyhi näppäimistö 2

Ota nyt PVC -saha ja leikkaa muovi avaimenreikien ympäriltä ja leikkaa sitten reunan ympäri, jotta syvyys on oikea ja jättää ohuen näppäimistön.

Laita näppäimistö takaisin päälle käyttämällä pieniä tappeja, jotka jäävät sen jälkeen, kun olet irrottanut niiden yläosat viimeisessä vaiheessa, ja työnnä kuuma rauta yksinkertaisesti juotosraudalla jokaiseen tapin reikään, joka sulaa muovin ja levittää sen Näppäimistön alaosa muodostaa uudet "nupit", jotka pitävät näppäimistön paikallaan kuten ennenkin.

Tykkään tyhjentää kolme kaiutinta ja ehkä muut asiat, kuten kytkimet ja mitä muuta, jotka ovat taululla. Tällä kertaa en kuitenkaan aio tuhota kytkimiä ja muuta, koska meillä on tällä hetkellä muita tavoitteita. Siellä on myös TA31002 -lineaarinen IC, joka on puhelimen soittoääni. Tietolomake on helposti löydettävissä ja ladattavissa verkossa, ja siinä on tiedot ja ominaisuudet. Joten jätän sen juotettuna laudalle toistaiseksi ja pelaan sen kanssa myöhemmin. Haluaisin kytkeä sen oskilloskooppiin ja nähdä, mitä hienoja signaaleja voin saada siitä. Ehkä jopa tehdä siitä ovikello. Kuka tietää.

Joka tapauksessa, kun olet tuhonnut puhelimen ja poistanut osat, lopetamme näppäimistön valmistamisen.

Vaihe 3: Poista näppäimistö 3

Pyyhi näppäimistö 3
Pyyhi näppäimistö 3
Pyyhi näppäimistö 3
Pyyhi näppäimistö 3
Pyyhi näppäimistö 3
Pyyhi näppäimistö 3

Irrota juottimen sydän ja irrota nauhakaapelit näppäimistön pohjasta varmistaen, että piirilevyn reiät ovat avoimet, ja kiinnitä sitten kaksi naarasliitintä levylle, jossa reiät ovat. Sinun on luultavasti leikattava otsikot alas niin, että ne ovat 4-nastaisia otsikoita.

Nyt kun otsikot on kiinnitetty, voit liittää sen leipälautaan, ottaa yleismittarin ja testata avaimet työntämällä yleismittarin satunnaisten nastojen yli ja mittaamalla resistanssin. Tämän avulla voit kartoittaa avaimet. On vaikea nähdä, miten näppäimet on kytketty lähtöihin, kun katsot piiriä, mutta jos käytät yleismittaria, voit liittää sen mihin tahansa kahteen nastaan ja paina sitten painikkeita, kunnes näet numeron näytössä avoimen piirin sijasta. Tämä on avaimen pistoke.

Yhdistä kaikki näppäimet lähtötappeihin tällä tavalla.

Vaihe 4: Johdot näppäimistöllä

Johdot näppäimistö
Johdot näppäimistö
Johdot näppäimistö
Johdot näppäimistö

Noudata nyt kytkentäkaaviota ja kytke näppäimistö jousilevyyn.

Näin tämä toimii, kun asetamme 5 V: n vasemmalle puolelle ja oikea puoli menee GND: lle. Kaavion oikealla puolella oleva ensimmäinen nasta menee Atmega328p -mikrokontrollerin ensimmäiseen analogiseen nastaan. Kun painikkeita ei paineta, signaali on 0V, ja kun kutakin painiketta painetaan, analogisen portin tulo vaihtelee välillä 0V ja 5V ja eri määrä riippuen siitä, mitä näppäintä painettiin. Valitsimme vastusarvot niin, että jokainen polku sisältäisi muusta poikkeavan vastuksen. Mikro -ohjaimen analoginen portti ottaa analogisen signaalin ja jakaa sen 1024 eri kanavaan välillä 0V ja 5V. Tämä tarkoittaa, että jokaisella kanavalla on leveys 5V/1024 = 0,005 V/kanava = 5 mV/kanava. Analoginen portti voi siis erottaa tulojännitteet, kunhan ne eroavat yli 5 mV. Meidän tapauksessamme olemme valinneet vastusarvot siten, että mitkä tahansa kaksi näppäimen painallusta lähettävät jännitesignaalin, joka eroaa enemmän kuin tämä, joten mikrokontrollerin pitäisi pystyä helposti päättämään, mitä näppäintä painettiin. Suuri ongelma on, että koko järjestelmä on erittäin meluisa, joten meidän on valittava jännitealue, joka yhdistetään jokaiseen painikkeen painallukseen - mutta tulemme siihen hieman myöhemmin.

Huomaa, että pystymme ohjaamaan 14 painikkeen näppäimistöä käyttämällä vain yhtä tulolinjaa ohjaimeen. Tämä on yksi analogisten tulojen hyödyllisistä näkökohdista.

Nyt ensimmäinen yrityksemme ohjata näppäimistöä on saada näppäinpainallus aiheuttamaan keskeytys, keskeytysaliohjelma lukee analogisen tuloportin ja päättää, mitä näppäintä painettiin, ja sitten se lähettää tämän numeron rekisterianalysaattorin aliohjelmaan, joka näyttää avainarvo binäärinä 8 LED -valollamme, jotka asetimme opetusohjelmaan 5.

Vaihe 5: Yhdistä näppäimistö analysaattoriin

Kytke näppäimistö analysaattoriin
Kytke näppäimistö analysaattoriin
Kytke näppäimistö analysaattoriin
Kytke näppäimistö analysaattoriin

Kuvat osoittavat, kuinka haluamme kytkeä näppäimistön mikrokontrolleriin, jotta voimme nähdä tuloksen analysaattorin näytöllä. Pohjimmiltaan me yksinkertaisesti johdamme lähdön näppäimistöstä PortC -nastaan 0, jota kutsutaan myös ADC0: ksi ATmega328P: ssä.

On kuitenkin pari muutakin asiaa. Aiomme myös kytkeä napin PD2: een. Toisin sanoen vie johto 5 V: n kiskostasi painikkeeseen ja painikkeen toiselta puolelta PD2: lle, ja lopuksi haluamme irrottaa AREF -nastan 5 V: n kiskostamme ja jättää sen irrottamatta. Voisimme lisätä 0,1 mikrofaradin irrotuskondensaattorin, jos halusimme. Tämä on keraaminen kondensaattori, johon on kirjoitettu 104. Kaksi ensimmäistä numeroa ovat numero ja viimeinen numero on 10: n voima, jonka kerromme kertomalla sen saadaksemme vastauksen picofaradeina (pico tarkoittaa 10^-12), joten 104 tarkoittaa 10 x 10^4 pikofaradia, mikä on sama kuin 100 nanofaradia (nano tarkoittaa 10^-9), mikä on sama kuin 0,1 mikrofaradia (mikro tarkoittaa 10^-6). Joka tapauksessa tämä kaikki pysäyttää AREF -nastan, kun voimme käyttää sitä referenssitappina.

Haluamme myös 1 Mohm -vastuksen PD2: n ja maan välille. Aiomme asettaa PD2: n lähtönastaksi 0V ja laukaisemme positiivisella reunalla kyseisessä nastassa. Haluamme, että reuna katoaa heti, kun vapautamme painikkeen, joten asetamme tämän "vedettävä" -vastuksen sisään.

Haluamme painikkeen siksi, että haluamme laukaista analoginen-digitaalimuuntimemme sirun INT0-nastasta, joka on myös PD2. Lopulta haluaisimme, että näppäimen painallus laukaisee ADC: n ja antaa myös tulon muunnettavaksi ilman erillistä painiketta, mutta koska ajoitus toimii, aloitamme erillisellä painikkeella, joka laukaisee ADC: n, ja kun silitys kaikki vikoja ja ovat varmoja siitä, että kaikki toimii oikein, ratkaisemme melu- ja ajoitusongelmat, jotka aiheutuvat käynnistämisestä samasta painikkeen painalluksesta, jonka haluamme lukea.

Joten tällä hetkellä se toimii siten, että pidämme näppäintä painettuna, painamme sitten painiketta käynnistääksesi ADC: n ja päästämme sitten irti ja toivottavasti painamamme painikkeen binaarinen arvo näkyy analysaattorissa.

Joten kirjoitetaan jokin koodi, jolla tämä onnistuu.

Vaihe 6: Mitkä kytkimet meidän pitäisi asettaa?

Mitkä vaihtokytkimet meidän pitäisi asettaa?
Mitkä vaihtokytkimet meidän pitäisi asettaa?

Mietitään ensin, miten aiomme koodata tämän, jotta ohjain voi lukea syötteen näppäimistöltä ja muuttaa sen numeeriseksi arvoksi, joka vastaa painettua painiketta. joka on sisäänrakennettu Atmega328p -laitteeseen. Käytämme AREF: ää referenssijännitteenämme ja näppäimistön ulostulo yhdistetään PortC0- tai PC0 -porttiin. Huomaa, että tätä nastaa kutsutaan myös nimellä ADC0 analogia-digitaalimuunnin 0. Saatat olla hyvä idea, että luet kohdan 12.4 ATmega328P keskeytyksistä ja myös luvun 24 analogia-digitaalimuunnin ennen kuin saamme Jotta mikrokontrolleri voidaan määrittää niin, että se tietää mitä tehdä analogisella tulosignaalilla ja miten se toimii ohjelmamme kanssa, meidän on ensin asetettava muutama eri ADC liittyvät rekisteribitit. Nämä vastaavat olennaisesti ensimmäisten tietokoneiden vanhoja kytkimiä. Joko käännät kytkimen PÄÄLLE tai POIS PÄÄLTÄ tai vielä kauemmaksi kytket kaapeleita pistorasian ja toisen välille niin, että tien haaraan saavuttavat elektronit löytävät yhden portin suljetun ja toisen avoimen pakottaen sen eri tiellä piiri ja suorittaa siten erilaisen loogisen tehtävän. Kun koodaamme kokoonpanokielellä, meillä on läheinen pääsy näihin mikro -ohjaimen toimintoihin, mikä on yksi houkuttelevista asioista sen tekemisessä. Se on enemmän "kädet" ja paljon vähemmän tapahtuu "kulissien takana" ikään kuin. Joten älä ajattele näiden rekisterien asettamista tylsäksi tehtäväksi. Juuri tämä tekee kokoonpanokielestä mielenkiintoisen! Olemme saamassa hyvin henkilökohtaisen suhteen sirun sisäiseen toimintaan ja logiikkaan ja saamme sen tekemään juuri sen mitä haluamme - ei enempää eikä vähempää. Ei hukkaan menneitä kellojaksoja, joten tässä on luettelo kytkimistä, jotka meidän on asetettava:

  1. Sammuta virransäästö ADC -bitti PRADC, joka on PRR -rekisterin bitti 0, koska jos tämä bitti on päällä, se sammuttaa ADC: n. Tehonvähennysrekisteri on olennaisesti tapa sulkea pois virtaa käyttävät asiat, kun niitä ei tarvita. Koska käytämme ADC: tä, haluamme varmistaa, että sitä ei ole poistettu käytöstä tällä tavalla. (Katso PRADC sivulla 46)
  2. Valitse analogiseksi tulokanavaksi ADC0 kytkemällä MUX3… 0 pois päältä ADC Multiplexer Selection (ADMUX) -rekisteristä (katso taulukko 24-4, sivu 249), ne ovat oletusarvoisesti pois päältä, joten meidän ei todellakaan tarvitse tehdä tätä. Kuitenkin sisällytän sen, koska jos käytät joskus muuta kuin ADC0 -porttia, sinun on vaihdettava nämä kytkimet vastaavasti. Erilaisten MUX3-, MUX2-, MUX1-, MUX0 -yhdistelmien avulla voit käyttää mitä tahansa analogisia portteja tulona ja voit myös muuttaa niitä lennossa, jos haluat tarkastella joukkoa erilaisia analogisia signaaleja kerralla.
  3. Sammuta REFS0- ja REFS1 -bitit ADMUX -rekisteristä, jotta käytämme AREF -viitejännitettä sisäisen referenssin sijasta (katso sivu 248).
  4. Kytke ADLAR -bitti päälle ADMUXissa, jotta tulos "muutetaan vasemmalle", keskustelemme tästä valinnasta seuraavassa vaiheessa.
  5. Aseta ADC0D -bitti digitaalitulojen poistorekisteristä (DIDR0) sammuttaaksesi PC0 -digitaalitulon. Käytämme tätä porttia analogiseen tuloon, joten voimme yhtä hyvin poistaa sen digitaalisen tulon käytöstä.
  6. Aseta ISC0 ja ISC1 ulkoisen keskeytysohjausrekisterin A (EICRA) osoittamaan, että haluamme laukaista jännitesignaalin nousevalla reunalla INT0 -nastaan (PD2), katso sivu 71.
  7. Tyhjennä bitit INT0 ja INT1 ulkoisesta keskeytysmaskirekisteristä (EIMSK) osoittamaan, että emme käytä keskeytyksiä tällä nastalla. Jos ottaisimme keskeytykset käyttöön tässä nastassa, tarvitsemme keskeytyksen käsittelijän osoitteessa 0x0002, mutta sen sijaan asetamme sen niin, että signaali tällä tapilla laukaisee ADC -muunnoksen, jonka suorittamisen käsittelee ADC -muunnoksen täydellinen keskeytys klo. osoite 0x002A. Katso sivu 72.
  8. Ota ADC käyttöön asettamalla ADC -käyttöönotto (ADEN) -bitti (bitti 7) ADC -ohjaus- ja tilarekisterissä A (ADCSRA). Katso sivu 249.
  9. Voisimme aloittaa yhden muunnoksen asettamalla ADC: n aloitusmuunnosbitin (ADSC) joka kerta, kun halusimme lukea analogisen signaalin, mutta toistaiseksi haluaisimme sen lukevan automaattisesti aina, kun joku painaa painiketta, joten otamme sen sijaan käyttöön ADC: n Autotrigger Enable (ADATE) -bitti ADCSRA -rekisterissä, jotta liipaisu tapahtuu automaattisesti.
  10. Asetimme myös ADPS2..0 -bitit (AD Prescalar -bitit) arvoon 111 niin, että ADC -kello on CPU -kello jaettuna kertoimella 128.
  11. Valitsemme ADC -laukaisun lähteeksi PD2, jota kutsutaan myös INT0 (External Interrupt Request 0). Teemme tämän vaihtamalla eri bitit ADCSRB-rekisterissä (katso taulukko 24-6 sivulla 251). Taulukosta näemme, että haluamme ADTS0: n pois päältä, ADTS1: n päälle ja ADTS2: n pois päältä, jotta ADC laukaisee kyseisen nastan. Huomaa, että jos haluaisimme jatkuvasti ottaa näytteitä analogisesta portista, kuten jos lukisimme jotakin jatkuvaa analogista signaalia (kuten ääninäytteenottoa tai jotain), asettaisimme tämän vapaakäyntitilaan. Käyttämämme menetelmä, jolla asetamme liipaisun PD2: lle, laukaisee analogisen portin PC0 ADC -lukeman aiheuttamatta keskeytystä. Keskeytys tulee, kun muunnos on valmis.
  12. Ota ADC -keskeytyksen salliva (ADIE) -bitti käyttöön ADCSRA -rekisterissä niin, että kun analoginen digitaalimuunnos on valmis, se luo keskeytyksen, jolle voimme kirjoittaa keskeytyksenkäsittelijän ja laittaa sen osoitteeseen.org 0x002A.
  13. Aseta I -bitti SREG: ään keskeytysten ottamiseksi käyttöön.

Harjoitus 1: Muista lukea kunkin yllä olevan asetuksen tietolomakkeen osiot, jotta ymmärrät, mitä tapahtuu ja mitä tapahtuisi, jos muuttaisimme ne vaihtoehtoisiin asetuksiin.

Vaihe 7: Kirjoita keskeytyksenkäsittelijä

Viimeisessä vaiheessa huomasimme, että olemme asettaneet sen niin, että PD2: lla havaittu nouseva reuna laukaisee analogisen digitaalimuunnoksen PC0: ssa ja kun tämä muunnos on valmis, se aiheuttaa ADC Conversion Complete -katkoksen. Nyt haluamme tehdä jotain tämän keskeytyksen kanssa. Jos tarkastelet taulukkoa 12-6 sivulla 65, näet luettelon mahdollisista keskeytyksistä. Olemme jo nähneet RESET -keskeytyksen osoitteessa 0x0000 ja Timer/Counter0 Overflow -katkoksen osoitteessa 0x0020 edellisissä opetusohjelmissa. Nyt haluamme tarkastella ADC -keskeytystä, jonka taulukosta näemme osoitteessa 0x002A. Joten kokoonpanokielikoodimme alussa tarvitsemme rivin, joka lukee:

.org 0x002Arjmp ADC_int

joka siirtyy keskeytyksenkäsittelijällemme ADC_int, kun ADC on suorittanut muunnoksen. Joten miten meidän pitäisi kirjoittaa keskeytyskäsittelijämme? ADC toimii seuraavasti suorittamalla seuraava laskelma:

ADC = Vin x 1024 / Vref

Joten katsotaan mitä tapahtuu, jos painan näppäimistön "uudelleenvalinta" -painiketta. Siinä tapauksessa PC0: n jännite muuttuu johonkin arvoon, esimerkiksi 1.52V, ja koska Vref on 5V, meillä on:

ADC = (1,52 V) x 1024 /5 V = 311,296

ja niin se näyttäisi olevan 311. Jos haluaisimme muuttaa tämän takaisin jännitteeksi, käännämme laskelman vain päinvastaiseksi. Meidän ei kuitenkaan tarvitse tehdä tätä, koska emme ole kiinnostuneita todellisista jännitteistä vain niiden erottamisesta toisistaan. Kun muunnos on valmis, tulos tallennetaan 10-bittiseen numeroon, joka on sijoitettu ADCH- ja ADCL-rekistereihin, ja olemme saaneet sen "vasen säätö", mikä tarkoittaa, että 10-bitit alkavat ADCH: n bitistä 7 ja laskevat bitti 6 ADCL: stä (näissä kahdessa rekisterissä on yhteensä 16 bittiä ja käytämme vain 10 niistä, eli 1024 kanavaa). Voisimme saada tuloksen "oikeaksi oikaistuksi", jos haluaisimme tyhjentämällä ADLAR -bitin ADMUX -rekisteristä. Syy, jonka valitsemme vasemmanpuoleiseksi, johtuu siitä, että signaalimme ovat riittävän kaukana toisistaan, joten kanavanumeron kaksi viimeistä numeroa eivät ole merkityksellisiä. ovat luultavasti vain kohinaa, joten erotamme näppäinpainallukset käyttämällä vain ylempää 8 numeroa, toisin sanoen meidän on vain tarkasteltava ADCH: ta selvittääksemme, mitä painiketta on painettu. rekisteröi, muunna numero numeronäppäimistön arvoksi ja lähetä sitten arvo rekisterianalysaattorimme LED -valolle, jotta voimme varmistaa, että "9" sanomisen painaminen saa aikaan "00001001" -merkkivalon syttymisen. Vaikka meidän on ensin nähtävä, mitä ADCH: ssa näkyy, kun painamme erilaisia painikkeita. Joten kirjoitetaan yksinkertainen keskeytyskäsittelijä, joka lähettää ADCH: n sisällön analysaattorin näyttöön, joten tässä on mitä tarvitsemme:

ADC_int: lds -analysaattori, ADCH; lataa ADCH -arvo analysaattorimme EIFR, 0; poista ulkoinen keskeytyslippu, jotta se on valmis jatkamaan uudelleen

Tähän mennessä sinun pitäisi pystyä vain kopioimaan koodi analysaattoristamme opetusohjelmassa 5 ja lisäämään tämä keskeytys ja vaihtoasetukset ja suorittamaan se. Harjoitus 2: Kirjoita koodi ja suorita se. Varmista, että ADCH näkyy analysaattorin näytössä. Yritä painaa samaa näppäintä useita kertoja. Saatko aina saman arvon ADCH: ssa?

Vaihe 8: Kartoita näppäinpainalluksen arvot

Kartoita näppäinpainalluksen arvot
Kartoita näppäinpainalluksen arvot

Meidän on nyt muutettava ADCH: n arvot painikkeita vastaaviksi numeroiksi. Teemme tämän kirjoittamalla ADCH: n sisällön jokaiselle näppäinpainallukselle ja muuntamalla sen desimaaliluvuksi, kuten tein kuvassa. Keskeytyskäsittelyssämme pidämme kaikkia arvoja kutakin näppäinpainallusta vastaavana, jotta ADC kartoittaa mitä tahansa tällä alueella tietylle näppäinpainallukselle.

Harjoitus 3: Tee tämä kartoitus ja kirjoita sitten uudelleen ADC-keskeytysrutiinisi.

Tässä on mitä sain omalleni (sinun tulee todennäköisesti olemaan erilainen). Huomaa, että olen määrittänyt sen arvoalueella kullekin näppäimen painallukselle.

ADC_int:; Ulkoinen keskeytyskäsittelijä -analysaattori; valmistaudu uusiin numeroihin -painikeH, ADCH; ADC päivittyy, kun ADCH luetaan clccpi -painikeH, 240brlo PC+3; jos ADCH on suurempi, se on 1ldi -analysaattori, 1; niin kuormitusanalysaattori 1rjmp paluulla; ja palauta clccpi -painikeH, 230; jos ADCH on suurempi, 2brlo PC+3ldi -analysaattori, 2rjmp paluu clccpi -painikeH, 217brlo PC+3ldi -analysaattori, 3rjmp paluu clccpi -painikeH, 203brlo PC+3ldi -analysaattori, 4rjmp paluu clccpi -painikeH, 187brlo PC+3ldi -analysaattori, 5rjmp paluu clccpi -painike, 155brlo PC+3ldi -analysaattori, 6rjmp paluu clccpi -painikeH, 127brlo PC+3ldi -analysaattori, 255; asetamme salaman, koska kaikki onrjmp -palautus -clccpi -painikkeetH, 115brlo PC+3ldi -analysaattori, 7rjmp -paluu -clccpi -painikeH, 94brlo PC+3ldi -analysaattori, 8rjmp -paluu -clccpi -painikeH, 62brlo PC+3ldi -analysaattori, 9rjmp -paluu clccpi -painikeH, 37brlo PC+3ldi -analysaattori, 0b11110000; tähti on ylempi puoli onrjmp paluu clccpi painiketta H, 28brlo PC+3ldi analysaattori, 0rjmp paluu clccpi buttonH, 17brlo PC+3ldi analysaattori, 0b00001111; hajautusmerkki on alaosa onrjmp paluu clccpi -painikeH, 5brlo PC+3ldi -analysaattori, 0b11000011; uudelleenvalinta on ylhäällä 2 alhaalla 2rjmp paluu ldi -analysaattori, 0b11011011; muuten tapahtui virhe paluu: eläkkeelle

Vaihe 9: Version 1 koodi ja video

Olen liittänyt koodini tähän näppäimistöohjaimen ensimmäiseen versioon. Tässä tapauksessa sinun on painettava näppäintä ja sitten painiketta, jotta ADC lukee syötteen näppäimistöltä. Haluaisimme mieluummin olla painikkeen, mutta sen sijaan signaali muuntamiseen tulee itse näppäimen painalluksesta. Harjoitus 3: Kokoa ja lähetä tämä koodi ja kokeile sitä. Sinun on ehkä muutettava eri muunnoskynnyksiä vastaamaan näppäinpainalluksesi jännitteitä, koska ne todennäköisesti eroavat omastani. Mitä tapahtuu, jos yrität käyttää näppäimistön tuloa sekä ADC0: lle että ulkoiselle keskeytysnastalle painikkeen sijasta? Liitän myös videon tämän näppäinohjaimen ensimmäisen version toiminnasta. koodissani on osa, joka alustaa pino -osoittimen. On olemassa useita rekistereitä, jotka saatamme haluta työntää ja ponnahtaa pinosta, kun käsittelemme muuttujia ja mitä ei, ja on myös rekistereitä, jotka voimme haluta tallentaa ja palauttaa myöhemmin. Esimerkiksi SREG on rekisteri, jota ei säilytetä keskeytysten yli, joten eri toiminnon seurauksena asetetut ja poistetut liput voidaan muuttaa, jos keskeytys tapahtuu jonkin asian keskellä. Joten on parasta, jos painat SREG: n pinoon keskeytyksenkäsittelijän alussa ja ponnautat sen sitten pois keskeytyksenkäsittelijän lopussa. Olen asettanut sen koodiin näyttääkseni, miten se on alustettu, ja ennakoimaan, kuinka tarvitsemme sitä myöhemmin, mutta koska emme välitä siitä, mitä SREG: lle tapahtuu koodimme keskeytysten aikana, en käyttänyt pinoa tähän. että olen käyttänyt shift -toimintoa asettaakseen erilaisia bittejä rekistereihin alustuksen yhteydessä. Esimerkiksi rivillä:

ldi -lämpötila, (1 <> s EICRA, lämpötila

Komento "<<" yllä olevan koodin ensimmäisellä rivillä on vuorotoiminto. Se ottaa olennaisesti binaariluvun 1, joka on 0b00000001, ja siirtää sen vasemmalle numeron ISC01 määrällä. Tämä on ISC01 -nimisen bitin sijainti EICRA -rekisterissä. Koska ISC01 on bitti 1, numero 1 siirretään vasemmalle 1 -asentoon ja siitä tulee 0b00000010. Samoin toinen, ISC00, on EICRA: n bitti 0, joten numeron 1 siirto on nolla -asentoa vasemmalle. Jos katsot uudelleen, katso m328Pdef.inc -tiedosto, jonka latasit ensimmäisessä opetusohjelmassa ja olet käyttänyt evrr: tä sen jälkeen, huomaat, että se on vain pitkä lista ".equ" -lausekkeista. Huomaat, että ISC01 on yhtä kuin 1. Asentaja korvaa sen jokaisen esiintymän 1: llä ennen kuin edes alkaa koota mitään. Ne ovat vain nimiä rekisteribiteille, jotka auttavat meitä ihmisiä lukemaan ja kirjoittamaan koodia. Nyt pystysuora viiva kahden yllä olevan siirtotoiminnon välillä on looginen "tai" operaatio. Tässä on yhtälö:

0b00000010 | 0b00000001 = 0b00000011

ja tämä on mitä lataamme (käyttämällä "ldi") lämpötilaan. Syy, miksi ihmiset käyttävät tätä menetelmää arvojen lataamiseen rekisteriin, on se, että sen avulla voidaan käyttää bittinimeä vain numeron sijasta, mikä tekee koodista paljon helpompaa lukea. Käytämme ohjeita "ori" ja "andi". Näiden avulla voimme asettaa ja tyhjentää bittejä vastaavasti muuttamatta rekisterin muita bittejä. Esimerkiksi kun käytin

tai lämpötila (1

tämän "tai" -lämpötila 0b00000001: llä, joka asettaa nollapisteen bittiin 1 ja jättää kaikki muut ennallaan. Samoin kun kirjoitimme

andi temp, 0b11111110

tämä muuttaa nollan lämpötilan bitiksi 0 ja jättää kaikki muut ennallaan.

Harjoitus 4: Käy koodi läpi ja varmista, että ymmärrät jokaisen rivin. Saatat olla mielenkiintoista löytää parempia tapoja tehdä asioita ja kirjoittaa parempi ohjelma. On olemassa sata tapaa koodata asioita ja olen melko varma, että löydät paljon paremman tavan kuin minun. Saatat myös löytää (taivas varjelkoon!) Virheitä ja puutteita. Siinä tapauksessa haluaisin kuulla niistä, jotta ne voidaan korjata.

Okei, katsotaan nyt, pääsemmekö eroon tästä tarpeettomasta painikkeesta …

Vaihe 10: Version 2 koodi

Yksinkertaisin tapa päästä eroon painikkeesta on poistaa se kokonaan, unohtaa tulo PB2: een ja vaihtaa ADC vain "Free Running Mode" -tilaan.

Toisin sanoen yksinkertaisesti muuta ADCSRB -rekisteriä niin, että ADTS2, ADTS1 ja ADTS0 ovat nollia.

Aseta sitten ADCSRA: n ADSC -bitti arvoon 1, joka aloittaa ensimmäisen muunnoksen.

Lataa se nyt mikrokontrolleriisi ja huomaat, että oikea numero tulee näyttöön, kun painat painiketta ja vain kun painat painiketta. Tämä johtuu siitä, että ADC ottaa jatkuvasti näytteitä ADC0 -portista ja näyttää arvon. Kun otat sormesi pois painikkeesta, "painikkeen pomppiminen" aiheuttaa muutaman satunnaisarvon esiintymisen hyvin nopeasti ja sitten se palautuu 0V -tuloon. Koodissamme tämä 0V näkyy muodossa 0b11011011 (koska näppäimen painallus "0" käyttää jo 0b00000000 -näyttöarvoa)

Tätä ratkaisua emme kuitenkaan halua kahdesta syystä. Ensinnäkin meidän ei tarvitse pitää painiketta painettuna. Haluamme painaa sitä kerran ja näyttää numeron (tai käyttää sitä uudessa koodissa myöhemmässä opetusohjelmassa). Toiseksi emme halua ottaa jatkuvasti näytteitä ADC0: sta. Haluamme, että se ottaa yhden lukeman, muuntaa sen ja nukkuu, kunnes uusi näppäimen painallus laukaisee uuden tuloksen. Vapaa käynnitila on paras, jos ainoa asia, jonka haluat mikrokontrollerin tekevän, on jatkuvasti lukea jotakin analogista tuloa - kuten jos haluat näyttää reaaliaikaisia lämpötiloja tai jotain.

Joten etsitään toinen ratkaisu…

Vaihe 11: Kuinka pääsemme eroon painikkeesta? Versio 3

Kuinka pääsemme eroon painikkeesta? Versio 3
Kuinka pääsemme eroon painikkeesta? Versio 3

On monia tapoja, joilla voimme edetä. Ensin voisimme lisätä laitteiston päästä eroon painikkeesta. Voimme esimerkiksi yrittää asettaa transistorin piiriin näppäinpainalluksen lähtölinjalle, jotta se ottaisi pienen virran virtaa lähdöstä ja lähettäisi 5 V: n pulssin keskeytystapaan PD2.

Se olisi kuitenkin luultavasti vähintään liian meluisaa ja pahimmassa tapauksessa se ei antaisi tarpeeksi aikaa tarkkaan näppäinpainalluksen lukemiseen, koska näppäimistön jännitelähtö ei ehtisi vakiintua ennen kuin ADC -lukema tallennetaan.

Joten mieluummin keksimme ohjelmistoratkaisun. Haluaisimme lisätä keskeytyksen PD2 -nastaan ja kirjoittaa sille keskeytyskäsittelijän, joka kutsuu näppäimistön nastan yhden lukeman. Toisin sanoen pääsemme eroon automaattisen laukaisun keskeytyksestä ADC: stä ja lisäämme ulkoisen keskeytyksen, joka kutsuu ADC: n sisälle. Näin signaali ADC: n lukemiseen tulee sen jälkeen, kun PD2 -signaali on jo tapahtunut, ja tämä saattaa antaa asioille tarpeeksi aikaa pysähtyä tarkkaan jännitteeseen ennen PC0 -nastan lukemista ja muuntamista. Meillä olisi edelleen ADC -keskeytys, joka antaa tuloksen analysaattorin näyttöön lopussa.

Käydä järkeen? No tehdään se…

Katso liitteenä oleva uusi koodi.

Näet seuraavat muutokset:

  1. Lisäsimme rjmp: n osoitteeseen.org 0x0002 käsittelemään ulkoista INT0 -keskeytystä
  2. Muutimme EIMSK -rekisterin osoittamaan, että haluamme keskeyttää INT0 -nastan
  3. Vaihdoimme ADCSRA -rekisterin ADATE -nastan automaattisen laukaisun poistamiseksi käytöstä
  4. Pääsimme eroon ADCSRB -asetuksista, koska niillä ei ole merkitystä, kun ADATE on pois päältä
  5. Meidän ei enää tarvitse nollata ulkoista liipaisinlippua, koska INT0 -keskeytysrutiini tekee tämän automaattisesti, kun se on valmis - aiemmin meillä ei ollut keskeytysrutiinia, vaan laukaistimme ADC: n vain signaalista kyseisellä tapilla, joten meidän oli pyyhi lippu käsin.

Nyt keskeytyksenkäsittelijässä kutsumme yksinkertaisesti yhden muunnoksen ADC: stä.

Harjoitus 5: Suorita tämä versio ja katso mitä tapahtuu.

Vaihe 12: Työversion koodi ja video

Kuten näimme viimeisimmässä versiossa, painikkeen keskeytys ei toimi kovin hyvin, koska keskeytys laukaistaan nousevalla reunalla nastaan PD2 ja sitten keskeytyksen käsittelijä kutsuu ADC -muunnoksen. Kuitenkin ADC saa sitten jännitteen lukeman ennen kuin se on vakiintunut ja se lukee hölynpölyä.

Tarvitsemme viiveen PD2: n keskeytyksen ja PC0: n ADC -lukeman välillä. Teemme tämän lisäämällä ajastimen/laskurin, laskurin ylivuotokeskeytyksen ja viiveohjelman. Onneksi tiedämme jo, miten tämä tehdään opetusohjelmasta 3! Joten kopioimme ja liitämme tarvittavan koodin sieltä.

Olen antanut tuloksena olevan koodin ja videon, joka näyttää sen toiminnassa.

Huomaat, että lukemat eivät ole niin tarkkoja kuin voisi toivoa. Tämä johtuu todennäköisesti useista lähteistä:

  1. napautamme näppäimistön jännitelähdöstä PD2: n laukaisuun, mikä vaikuttaa PC0: n lukemaan.
  2. emme todellakaan tiedä kuinka kauan viivyttää liipaisimen jälkeen, jotta saat parhaan lukeman.
  3. ADC -muunnoksen suorittaminen kestää muutaman syklin, mikä tarkoittaa, että emme voi nopeuttaa näppäimistön laukaisua.
  4. itse näppäimistössä on todennäköisesti kohinaa.
  5. jne…

Joten vaikka onnistuimme saamaan näppäimistön toimimaan ja voisimme nyt käyttää sitä sovelluksissa käyttämällä näppäimen painallusarvoja jollakin muulla tavalla sen sijaan, että lähettäisimme ne analysaattorin näyttöön, se ei ole kovin tarkka ja se on erittäin ärsyttävää. Siksi mielestäni paras tapa kytkeä näppäimistöt on yksinkertaisesti liittää jokainen näppäimistön ulostulo eri porttiin ja päättää, mitä näppäintä painetaan, mitkä portit näkevät jännitteen. Se on helppoa, erittäin nopeaa ja erittäin tarkkaa.

Itse asiassa on vain kaksi syytä, miksi halutaan ajaa näppäimistöllä samalla tavalla kuin täällä:

  1. Se käyttää vain 2 mikrokontrollerimme nastaa 8 sijasta.
  2. Se on loistava projekti näyttää ADC: n eri näkökohdat mikrokontrollerissa, joka eroaa tavallisista asioista, joita voit löytää sieltä, kuten lämpötilalukemat, kääntyvät potentiometrit jne. pikemminkin kuin vain vapaasti käynnissä oleva CPU-syöksytila.

Joka tapauksessa, tässä on pari viimeistä harjoitusta sinulle:

Harjoitus 6: Kirjoita ADC-muunnoksen täydellisen keskeytyksen käsittelijä uudelleen käyttämään hakutaulukkoa. Toisin sanoen Joten se testaa analogisen arvon taulukon ensimmäisen kohteen kanssa ja jos se on suurempi, se palaa keskeytyksestä, jos ei, niin se lisää Z: tä taulukon seuraavaan kohtaan ja haarautuu takaisin testiin. Tämä lyhentää koodia ja puhdistaa keskeytysrutiinin ja saa sen näyttämään mukavammalta. (Annan mahdollisen ratkaisun seuraavassa vaiheessa) Harjoitus 7: Kytke näppäimistö kahdeksaan nastaan mikrokontrollerissa ja kirjoita sille yksinkertainen ohjain ja koe kuinka paljon se on mukavampaa. Voisitko kuvitella muutamia tapoja saada menetelmämme toimimaan paremmin?

Siinä kaikki tässä opetusohjelmassa. Olen liittänyt lopullisen version viitteillä. Kun lähestymme lopullista päämääräämme, käytämme näppäimistöä jälleen opetusohjelmassa 9 näyttääksemme, kuinka voit hallita seitsemää segmenttinäyttöä sen avulla (ja rakentaa jotain mielenkiintoista, joka käyttää puhelimen näppäimistön ylimääräisiä näppäimiä), ja sitten siirry sen sijaan painikkeiden hallintaan (koska tämä menetelmä sopii paremmin lopputuotteeseen, johon näillä opetusohjelmilla rakennamme), ja hyllymme vain näppäimistön.

Nähdään ensi kerralla!

Suositeltava: