Sisukord:

AVR Assembleri õpetus 7: 12 sammu
AVR Assembleri õpetus 7: 12 sammu

Video: AVR Assembleri õpetus 7: 12 sammu

Video: AVR Assembleri õpetus 7: 12 sammu
Video: MKS SGEN L V1.0 - A4988 Stepper Drivers 2024, Juuli
Anonim
AVR Assembleri õpetus 7
AVR Assembleri õpetus 7

Tere tulemast õppetundi 7!

Täna näitame kõigepealt, kuidas klahvistikku puhastada, ja seejärel näitame, kuidas kasutada klaviatuuriga suhtlemiseks analoogsisendporte. Seda teeme sisendina katkestuste ja ühe juhtme abil. Me ühendame klaviatuuri nii, et iga klahvivajutus saadab analoogsisendile ainulaadse pinge, mis võimaldab meil klahvi vajutamise pinget eristada. Seejärel väljastame registreerimisanalüsaatorile vajutatud numbri, et näidata, et kõik toimub nii, nagu peaks. ATmega328p -s analoog -digitaalmuunduri (ADC) kasutamisel võite kokku puutuda mitmete lõksudega ja nii me võtke asjad paaril etapil, et proovida ja mõista, kuidas neid vältida. Samuti näeme, miks analoog -digitaalmuunduri kasutamine ei ole parim viis klaviatuuri juhtimiseks, kuigi see kasutab teie mikrokontrolleri vähem porte. Selles õpetuses vajate:

  1. klahvistik. Võite ühe osta või saate teha seda, mida mina tegin, ja puhastada ühe.
  2. 2 naissoost päist klaviatuuri jaoks (kui te seda eemaldate)
  3. ühendavad juhtmed
  4. leivalaud
  5. 4 1 Kohm takistid
  6. 1 15 Kohm takisti
  7. 1 3.3 Kohm takisti
  8. 1180 oomi takisti
  9. 1680 oomi takisti
  10. digitaalne multimeeter
  11. analüsaator õpetusest 5

Kui teil on juba klaviatuur ja te ei pea seda tühjendama, võiksite esimesed sammud vahele jätta.

Siin on link minu AVR-i komplekteerija õpetuste kogu kogumikule:

Samm: klahvistiku eemaldamine 1

Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1
Klaviatuuri eemaldamine 1

Kaua aega tagasi, kui isegi teie vanavanemad olid alles lapsed, kasutasid inimesed üksteisega suhtlemiseks neid veidra välimusega seadmeid, millel olid pikad kaablid seina külge ühendatud. Neid kutsuti "telefonideks" ja need olid tavaliselt odavad plastikust asjad, mis tegid tüütu heli, kui keegi teile helistas (mitte, et tänapäeva "Justin Bieberi" helinad poleks võrdselt tüütud). Igal juhul olid nendel seadmetel klaviatuurid, mis olid väga lihtsalt juhtmega ühendatud ja nii on neid lihtne eemaldada ning neil on 2 lisaklahvi ("kordusvalimine" ja "välk") ostetavatelt klaviatuuridelt, mida võiksite uuesti kasutada nagu "nooleklahvid", "menüüklahvid" või midagi muud. Nii et alustame vanast telefonist klahvistiku eemaldamisega. Kõigepealt võtke telefon (ma kasutan GE -d, nagu on näidatud piltidel) ja eemaldage juhtmestik lahti. Seejärel võtke peitel ja eemaldage väikesed plastnupud, mis hoiavad klahvistikku, ja eemaldage klaviatuur.

2. toiming: eemaldage klaviatuur 2

Klaviatuuri eemaldamine 2
Klaviatuuri eemaldamine 2
Klaviatuuri eemaldamine 2
Klaviatuuri eemaldamine 2
Klaviatuuri eemaldamine 2
Klaviatuuri eemaldamine 2

Võtke nüüd PVC -saag ja lõigake plastik võtmeaukude ümbrusest ning lõigake seejärel serva ümber, et sügavus oleks õige, jättes õhukese klahvistiku.

Seejärel lülitage klahvistik uuesti sisse, kasutades väikseid naelu, mis jäävad alles pärast nende ülemise osa eemaldamist viimasel etapil, ja kasutage jootekolvi abil kuuma triikrauda lihtsalt igasse tihvtiavasse, mis sulatab plasti ja laotab selle üle klahvistiku põhja, moodustades uued nupud, mis hoiavad klaviatuuri paigal nagu varem.

Mulle meeldib laua peal kolm kõlarit ja võib-olla ka muid asju, nagu lülitid ja mis ei ole. Seekord ei kavatse ma aga lüliteid ja muid asju koristada, sest meil on hetkel muud eesmärgid. Samuti on seal TA31002 lineaarne IC, mis on telefoni helin. Andmeleht on hõlpsasti leitav ja Internetist alla laaditav, andes teavet ja funktsioone. Nii et ma jätan selle praegu joodetud lauale ja mängin sellega hiljem ringi. Tahaksin selle ostsilloskoobi külge ühendada ja vaadata, milliseid lahedaid signaale ma sealt välja saan. Võib -olla isegi teha sellest uksekell. Kes teab.

Igatahes, kui olete telefoni hävitamise ja osade puhastamise lõpetanud, lõpetame klaviatuuri tegemise.

3. samm: eemaldage klaviatuur 3

Klaviatuuri eemaldamine 3
Klaviatuuri eemaldamine 3
Klaviatuuri eemaldamine 3
Klaviatuuri eemaldamine 3
Klaviatuuri eemaldamine 3
Klaviatuuri eemaldamine 3

Kasutage desoldering -tahti ja eemaldage lintkaablid klaviatuuri alt, veendudes, et trükkplaadi augud on vabad, ja seejärel kinnitage kaks naissoost päist plaadi külge, kus augud asuvad. Tõenäoliselt peate oma päised lõikama nii, et need oleksid 4-kontaktilised.

Nüüd, kui päised on kinnitatud, saate selle juhtme külge ühendada, võtta multimeetri ja testida võtmeid, kleepides multimeetri juhuslike tihvtide külge ja mõõtes takistust. See võimaldab teil võtmed kaardistada. Ahelat vaadates on raske näha, kuidas klahvid on väljunditega ühendatud, kuid kui kasutate multimeetrit, saate selle ühendada mis tahes kahe tihvtiga ja seejärel vajutada nuppe, kuni näete ekraanil avatud ahela asemel numbrit. See on selle võtme otsik.

Sel viisil kaardistage kõik võtmed väljundnööpnõeltele.

Samm: ühendage klaviatuur juhtmega

Ühendage klaviatuur juhtmega
Ühendage klaviatuur juhtmega
Ühendage klaviatuur juhtmega
Ühendage klaviatuur juhtmega

Nüüd järgige ühendusskeemi ja ühendage klaviatuur leivaplaadiga.

Kuidas see töötab, paneme 5V vasakule küljele ja parem pool läheb GND -le. Diagrammi parempoolne esimene tihvt läheb Atmega328p mikrokontrolleri esimesesse meie analoogtihvti. Kui nuppe ei vajutata, on signaal 0V ja iga nupu vajutamisel jääb analoogpordi sisend vahemikku 0V kuni 5V, erineva summaga sõltuvalt sellest, millist klahvi vajutati. Valisime takisti väärtused nii, et iga tee sisaldaks takistust, mis erineb teistest. Mikrokontrolleri analoogport võtab analoogsignaali ja jagab selle 1024 erinevaks kanaliks vahemikus 0V kuni 5V. See tähendab, et igal kanalil on laius 5V/1024 = 0,005 V/kanal = 5 mV/kanal. Seega saab analoogport eristada sisendpingeid seni, kuni need erinevad rohkem kui 5 mV. Meie puhul oleme valinud takistite väärtused nii, et kaks klahvivajutust saadavad pingesignaali, mis erineb sellest rohkem, nii et mikrokontrolleril oleks lihtne otsustada, millist klahvi vajutati. Suur probleem on see, et kogu süsteem on väga mürarikas, nii et me peame valima pingevahemiku, mida iga nupuvajutusega kaardistada - kuid me käsitleme seda veidi hiljem.

Pange tähele, et me saame juhtida 14 nupuga klaviatuuri, kasutades ainult ühte kontrolleri sisendliini. See on analoogsisendite üks kasulikke aspekte.

Nüüd on meie esimene katse klahvistikku juhtida nii, et klahvivajutus põhjustab katkestuse, katkestuse alamprogramm loeb analoogsisendi pordi ja otsustab, millist klahvi vajutati, ning väljastab selle numbri meie registrianalüsaatori alamprogrammi, mis kuvab võtmeväärtus kahendkoodis meie 8 LED -il, mille seadsime õpetuses 5.

Samm: ühendage klaviatuur analüsaatoriga

Ühendage klaviatuur analüsaatoriga
Ühendage klaviatuur analüsaatoriga
Ühendage klaviatuur analüsaatoriga
Ühendage klaviatuur analüsaatoriga

Piltidel on näidatud, kuidas me tahame klaviatuuri mikrokontrolleriga ühendada, et saaksime oma analüsaatori ekraanil väljundit näha. Põhimõtteliselt ühendame väljundi klaviatuurilt lihtsalt PortC pin 0 -ga, mida ATmega328P -s nimetatakse ka ADC0 -ks.

Siiski on paar täiendavat asja. Samuti ühendame nupu PD2 -ga. S.t. viige juhe oma 5V rööbast nupule ja nupu teisest servast PD2 -sse ning lõpuks tahame AREF -i tihvti 5V rööbast lahti ühendada ja selle asemel lahti ühendada. Soovi korral võiksime sisestada 0,1 mikrofaradiga lahtiühendamise kondensaatori. See on keraamiline kondensaator, millele on kirjutatud 104. Esimesed kaks numbrit on arv ja viimane number on 10 võimsus, mille korrutame, et saada vastus picofaradides (pico tähendab 10^-12), seega 104 tähendab 10 x 10^4 pikofaraadi, mis on sama 100 nanofaradi (nano tähendab 10^-9), mis on sama kui 0,1 mikrofarad (mikro tähendab 10^-6). Igatahes on see kõik AREF -i tihvti stabiliseerimiseks, kui saame seda kasutada oma võrdlusnõelana.

Samuti soovime PD2 ja maa vahele 1 Mohm takisti. Me seame PD2 väljundpingeks 0 V juures ja käivitame selle tihvti positiivsel serval. Me tahame, et serv kaoks kohe, kui vabastame nupu, nii et sisestame selle "allapoole tõmmatud" takisti.

Põhjus, miks me seda nuppu soovime, on see, et tahame käivitada oma analoog-digitaalmuunduri kiibil oleva INT0 tihvti, mis on samuti PD2. Lõpuks tahaksime, et klahvivajutus käivitaks nii ADC kui ka sisendi teisendamise ilma eraldi nuputa, kuid ajastuse toimimise tõttu alustame kõigepealt ADC käivitamiseks eraldi nupuga ja kui kõik triikime vead välja ja oleme kindlad, et kõik töötab korralikult, siis tegeleme müra ja ajastamisega seotud probleemidega, mis kaasnevad sama nupuvajutusega, mida tahame lugeda.

Niisiis, praegu töötab see nii, et hoiame klahvi all, vajutame ADC käivitamiseks nuppu ja laseme lahti ning loodetavasti kuvatakse analüsaatoril nupu binaarne väärtus.

Nii et kirjutame mõne koodi, mis selle saavutab.

6. samm: millised lülitid peaksime seadistama?

Millised lülitid peaksime seadistama?
Millised lülitid peaksime seadistama?

Mõelgem kõigepealt sellele, kuidas me seda kodeerime, et kontroller saaks klaviatuurilt sisendit lugeda ja muuta selle numbriliseks väärtuseks, mis vastab vajutatud nupule. Kasutame analoog -digitaalmuundurit (ADC) mis on Atmega328p sisse ehitatud. Kasutame võrdluspingena AREF -i ja meie klaviatuuri väljund ühendatakse PortC0 või PC0 -ga. Pange tähele, et seda tihvti nimetatakse ka analoog-digitaalmuunduri 0 jaoks ADC0-ks. Enne kui saame, võiksite lugeda läbi lõigu 12.4 ATmega328P katkestuste kohta ja ka 24. peatüki analoog-digitaalmuunduri kohta. käivitatud või vähemalt need osad viitamiseks valmis. Mikrokontrolleri seadistamiseks nii, et see teaks, mida analoogsisendsignaaliga teha ja kuidas meie programmiga suhelda, peame esmalt seadistama mõned erinevad ADC -d seotud registripitsid. Need on sisuliselt samaväärsed esimeste arvutite vanade lülititega. Lülitate lüliti sisse või välja või veelgi kaugemale, kui ühendate kaablid ühe pistikupesa ja teise vahele, nii et teehargnemiseni jõudvad elektronid leiaksid ühe värava suletuna ja teise lahti, sundides selle mööda labürindi teist teed skeemi ja seega teistsuguse loogilise ülesande täitmist. Koostamiskeeles kodeerimisel on meil ligipääs mikrokontrolleri nendele funktsioonidele, mis on üks selle atraktiivsemaid asju. See on rohkem "käed külge" ja "kulisside taga" toimub palju vähem. Nii et ärge mõelge nende registrite seadistamisele tüütu ülesandena. See teebki koostamiskeele huvitavaks! Me saavutame väga isikliku suhte kiibi sisemise toimimise ja loogikaga ning paneme selle tegema täpselt seda, mida me tahame - mitte rohkem ega vähem. Pole raisatud kellatsükleid. Nii et siin on nimekiri lülititest, mille peame seadistama:

  1. Lülitage toite vähendamise ADC -bit PRADC välja, mis on PRR -registri bit 0, sest kui see bit on sees, lülitab see ADC -i välja. Võimsuse vähendamise register on sisuliselt võimalus välja lülitada erinevad asjad, mis kasutavad energiat, kui te neid ei vaja. Kuna kasutame ADC -d, tahame veenduda, et see pole sel viisil keelatud. (Vt PRADC lk 46)
  2. Valige analoogsisendikanaliks ADC0, lülitades MUX3… 0 välja ADC multiplekseri valiku (ADMUX) registris (vt tabel 24-4 lk 249), need on vaikimisi välja lülitatud, nii et me ei pea seda tegelikult tegema. Kuid ma lisan selle, sest kui kasutate kunagi mõnda muud pordi kui ADC0, peate need lülitid vastavalt ümber lülitama. Mitmed MUX3, MUX2, MUX1, MUX0 kombinatsioonid võimaldavad teil sisendina kasutada mis tahes analoogpordi ning neid saab ka käigu pealt muuta, kui soovite korraga vaadata hunnikut erinevaid analoogsignaale.
  3. Lülitage REFS0 ja REFS1 bitid ADMUX -registris välja, nii et me kasutame AREF -i oma võrdluspingena, mitte sisemisena (vt lk 248).
  4. Lülitage ADMUX -i ADLAR -bit sisse, nii et tulemus on vasakule reguleeritud, arutame seda valikut järgmises etapis.
  5. Seadistage digitaalse sisendi keelamise registris (DIDR0) olev ADC0D -bit, et lülitada digitaalne sisend välja PC0 -le. Me kasutame seda porti analoogsisendiks, nii et võime ka selle digitaalse sisendi keelata.
  6. Seadke ISC0 ja ISC1 välise katkestuskontrolli registrisse A (EICRA), et näidata, et tahame käivitada pingesignaali tõusvas servas INT0 tihvtile (PD2), vt lk 71.
  7. Kustutage bitid INT0 ja INT1 välise katkestusmaski registrist (EIMSK), et näidata, et me ei kasuta sellel tihvtil katkestusi. Kui lubame sellel tihvtil katkestused, vajame katkestuste käitlejat aadressil 0x0002, kuid selle asemel seadistame selle nii, et sellel tihvtil olev signaal käivitab ADC konversiooni, mille lõpetamisega tegeleb ADC konversiooni täielik katkestus kell aadress 0x002A. Vt lk 72.
  8. ADC lubamiseks seadistage ADC juhtimis- ja olekuregistris A (ADCSRA) bit ADC Enable (ADEN) (bit 7). Vt lk 249.
  9. Võiksime alustada ühe konversiooni, määrates iga kord, kui soovisime analoogsignaali lugeda, ADC algusmuundusbiti (ADSC), kuid praegu tahaksime seda automaatselt lugeda, kui keegi nuppu vajutab, seega lubame selle asemel ADC Autotrigger Enable (ADATE) bit ADCSRA registris, nii et käivitamine toimub automaatselt.
  10. Samuti määrasime ADPS2..0 bitti (AD Prescalar bitid) väärtuseks 111, nii et ADC kell on CPU kell jagatud koefitsiendiga 128.
  11. Valime ADC käivitamise allikaks PD2, mida nimetatakse ka INT0 (väline katkestustaotlus 0). Selleks teeme ADCSRB registris erinevate bitide ümberlülitamise (vt tabel 24-6 lk 251). Tabeli järgi näeme, et soovime ADTS0 välja lülitada, ADTS1 sisse lülitada ja ADTS2 välja lülitada, nii et ADC käivitab selle tihvti. Pange tähele, et kui me tahaksime pidevalt analoogporti proovida, näiteks kui loeme mõnda pidevat analoogsignaali (näiteks heliproovimist või midagi sellist), siis seame selle vabaks režiimiks. Meetod, mida kasutame PD2 käivitamise seadistamiseks, käivitab analoogpordi PC0 ADC lugemise ilma katkestust põhjustamata. Katkestus saabub siis, kui teisendus on lõppenud.
  12. Lubage ADCSRA registris ADC katkestamise lubamise (ADIE) bitt, nii et kui analoog -digitaalmuundamine on lõpule viidud, tekitab see katkestuse, millele saame kirjutada katkestuste töötleja ja panna aadressile.org 0x002A.
  13. Katkestuste lubamiseks seadistage SREG -s I -bit.

Harjutus 1: lugege kindlasti kõigi ülaltoodud sätete kohta asjakohaseid andmelehe jaotisi, et saaksite aru, mis toimub ja mis juhtuks, kui muudaksime need alternatiivseteks seadeteks.

Samm: kirjutage katkestuste käitleja

Viimases etapis nägime, et oleme selle seadistanud nii, et PD2 -l tuvastatud tõusev serv käivitab PC0 -l analoog -digitaalmuundamise ja kui see teisendus on lõpule viidud, katkestab see ADC -i konversiooni lõpuleviimise. Nüüd tahame selle katkestusega midagi ette võtta. Kui uurite tabelit 12-6 lk 65, näete võimalike katkestuste loendit. Varasemates õpetustes oleme juba näinud, et RESET katkestab aadressil 0x0000 ja taimer/loendur0 ülevool katkestatakse aadressil 0x0020. Nüüd tahame vaadata ADC katkestust, mida tabeli järgi näeme aadressil 0x002A. Seega vajame koostamiskeele koodi alguses rida, mis ütleb:

.org 0x002Arjmp ADC_int

mis hüppab meie katkestuste käitlejale nimega ADC_int, kui ADC on konversiooni lõpetanud. Niisiis, kuidas peaksime kirjutama oma katkestuste käitleja? ADC töötab järgmiselt:

ADC = Vin x 1024 / Vref

Nii et vaatame, mis juhtub, kui vajutan klaviatuuril nuppu "kordusvalimine". Sellisel juhul muutub PC0 pinge mõneks väärtuseks, näiteks 1,52 V, ja kuna Vref on 5 V juures, on meil:

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

ja nii ilmuks see 311. Kui me tahaksime selle pingeks teisendada, muudaksime arvutuse lihtsalt vastupidiseks. Me ei pea seda siiski tegema, kuna meid ei huvita tegelikud pinged, vaid nende eristamine. Kui teisendamine on lõpule viidud, salvestatakse tulemus 10-bitisele numbrile, mis on paigutatud ADCH ja ADCL registritesse ning oleme selle muutnud "vasakule reguleerituks", mis tähendab, et 10-bitised algavad ADCH 7. bitist ja lähevad alla ADCL -i bitti 6 (nendes kahes registris on kokku 16 bitti ja me kasutame neist ainult 10, st 1024 kanalit). Kui me tahame, võime tulemuse "õigesti reguleerida", kustutades ADLUX -i registri ADLAR -i. Põhjus, miks me valime vasakule kohandatud, on see, et meie signaalid on piisavalt kaugel, et kanali numbri kaks viimast numbrit pole asjakohased ja on ilmselt lihtsalt müra, nii et me eristame klahvivajutusi ainult kaheksa ülemise numbri abil, teisisõnu, peame vaatama ainult ADCH -d, et välja selgitada, millist nuppu vajutati. Nii et meie katkestuste käitleja peaks lihtsalt lugema numbri ADCH -st registreerige, teisendage see number klahvistiku väärtuseks ja saatke see väärtus meie registrianalüsaatori LED -idele, et saaksime kontrollida, kas "9" ütluse vajutamine süttib "00001001" vastavate LED -ide süttimiseks. kuigi me peame erinevate nuppude vajutamisel kõigepealt nägema, mis ADCH -s kuvatakse. Kirjutame lihtsalt lihtsa katkestuste käitleja, mis lihtsalt saadab ADCH sisu analüsaatori ekraanile. Nii et siin on see, mida me vajame:

ADC_int: lds analüsaator, ADCH; laadige ADCH väärtus meie analüsaatorissebi EIFR, 0; tühjendage väline katkestuslipp, et see oleks uuesti kasutamiseks valmis

Nüüdseks peaksite saama lihtsalt meie analüsaatorist koodi juhendis 5 kopeerida, lisada selle katkestuse ja lülitusseaded ning käivitada see. Harjutus 2: Kirjutage kood ja käivitage see. Veenduge, et teie analüsaatori ekraanil kuvatakse ADCH. Proovige sama klahvivajutust mitu korda vajutada. Kas saate ADCH -s alati sama väärtuse?

8. samm: kaardistage klahvivajutuse väärtused

Kaardistage klahvivajutuse väärtused
Kaardistage klahvivajutuse väärtused

Nüüd peame ADCH väärtused teisendama numbriteks, mis vastavad vajutatud klahvile. Me teeme selle, kirjutades iga klahvivajutuse jaoks välja ADCH sisu ja teisendades selle kümnendarvuks nagu mina pildil. Katkestuste käsitsemise rutiinis loeme igale klahvivajutusele vastavaks terve hulga väärtusi, nii et ADC kaardistab kõik selles vahemikus antud klahvivajutusele.

Harjutus 3: Tehke see kaardistamine ja kirjutage seejärel uuesti oma ADC katkestusrutiin.

Siin on see, mida ma oma jaoks sain (teie oma on tõenäoliselt erinev). Pange tähele, et olen selle seadistanud väärtuste vahemikuga iga klahvivajutuse jaoks.

ADC_int:; Väline katkestuskäsitleja analüsaator; valmistuge uute numbrite jaoks nuppH, ADCH; ADC värskendab, kui ADCH -d loetakse, clccpi buttonH, 240brlo PC+3; kui ADCH on suurem, siis on see 1ldi analüsaator, 1; nii koormusanalüsaator 1rjmp tagasivooluga; ja tagasi clccpi nuppH, 230; kui ADCH on suurem, siis 2brlo PC+3ldi analüsaator, 2rjmp tagasipöördumise clccpi nuppH, 217brlo PC+3ldi analüsaator, 3rjmp return clccpi buttonH, 203brlo PC+3ldi analüsaator, 4rjmp return clccpi buttonH, 187brlo PC+3ldi analüsaator, 5rjmp return clccpi nupp, 155brlo PC+3ldi analüsaator, 6rjmp tagasipöördumise clccpi nuppH, 127brlo PC+3ldi analüsaator, 255; me seadistame välklambi, kui kõik onrjmp tagasipöördumisklahvid, 115brlo PC+3ldi analüsaator, 7rjmp tagasipöördumisnupudH, 94brlo PC+3ldi analüsaator, 8rjmp tagasipöördumisklahvide nuppH, 62brlo PC+3ldi analüsaator, 9rjmp tagasipöördumisklahvide nuppH, 37brlo PC+3ldi analüsaator, 0b11110000; tärn on ülemine pool onrjmp tagasipöördumise clccpi nuppuH, 28brlo PC+3ldi analüsaator, 0rjmp return clccpi buttonH, 17brlo PC+3ldi analüsaator, 0b00001111; räsimärk on alumine pool onrjmp tagasipöördumise clccpi nuppH, 5brlo PC+3ldi analüsaator, 0b11000011; kordusvalimine on ülemine 2 alumine 2rjmp tagasipöördumise ldi analüsaator, 0b11011011; muidu tekkis tõrge return: reti

9. toiming: koodi ja video versioon 1

Lisasin oma koodi selle klaviatuuri draiveri esimese versiooni jaoks. Selle puhul peate vajutama klahvi ja seejärel nuppu, et ADC hakkaks klaviatuurilt sisendit lugema. See, mida me sooviksime, pole nupp, vaid signaal konversiooni tegemiseks pärineb klahvivajutusest endast. Harjutus 3: Koguge see kood üles ja laadige see üles ning proovige seda. Võimalik, et peate muutma erinevaid konversiooniläve, et need vastaksid teie klahvivajutuse pingetele, kuna need erinevad tõenäoliselt minu omadest. Mis juhtub, kui proovite nupu asemel kasutada klaviatuuri sisendit nii ADC0 kui ka välise katkestusnõela jaoks? Lisan ka video meie klahvivajutusdraiveri esimese versiooni toimimisest. Märkate, et minu koodis on sektsioon, mis initsialiseerib virnaosuti. On erinevaid registreid, mida võime muutujate ja mis-mitte-manipuleerimisel virnast välja tõrjuda ja poputada ning on ka registreid, mida soovime hiljem salvestada ja taastada. Näiteks SREG on register, mida katkestuste ajal ei säilitata, seega võib toimingute tulemusel seatud ja kustutatud erinevaid lippe muuta, kui katkestus tekib millegi keskel. Seega on kõige parem, kui vajutate katkestuste käitleja alguses SREG -i virnale ja katkestuste käitleja lõpus selle uuesti maha. Olen selle koodi sisestanud, et näidata, kuidas see on initsialiseeritud ja kuidas me seda hiljem vajame, kuid kuna me ei hooli sellest, mis juhtub SREG -iga meie koodi katkestuste ajal, ei kasutanud ma seda virna. et olen kasutanud nihutamistoimingut erinevate bittide seadistamiseks registritesse initsialiseerimisel. Näiteks reas:

ldi temp, (1 <> silmust EICRA, temp

Ülaltoodud koodi esimesel real olev käsk "<<" on nihkeoperatsioon. See võtab sisuliselt binaararvu 1, mis on 0b00000001, ja nihutab selle vasakule arvu ISC01 võrra. See on ISC01 -nimelise biti asukoht EICRA registris. Kuna ISC01 on bit 1, nihutatakse number 1 vasakule 1, et saada 0b00000010. Sarnaselt teine, ISC00, on EICRA bit 0 ja seega on numbri 1 nihe null positsiooni vasakule. Kui vaatate, vaadake uuesti faili m328Pdef.inc, mille laadisite alla esimeses õpetuses ja kasutate sellest ajast alates evrr -d, näete, et see on lihtsalt pikk nimekiri ".equ" avaldustest. Leiate, et ISC01 on võrdne 1. Monteerija asendab selle iga eksemplari 1 -ga, enne kui isegi midagi kokku panema hakkab. Need on lihtsalt registribittide nimed, mis aitavad meil inimestel koodi lugeda ja kirjutada. Nüüd on vertikaalne joon kahe ülaltoodud vahetuste vahel loogiline "või" operatsioon. Siin on võrrand:

0b00000010 | 0b00000001 = 0b00000011

ja seda me laadime (kasutades "ldi") temp. Põhjus, miks inimesed kasutavad seda meetodit väärtuste registrisse laadimiseks, on see, et see võimaldab kasutada numbri asemel biti nime ja see muudab koodi palju lihtsamaks. Samuti on kasutatud kahte muud tehnikat. Kasutame juhiseid "ori" ja "andi". Need võimaldavad meil vastavalt seadistada ja puhastada bitte, muutmata ühtki teist registri bitti. Näiteks kui ma kasutasin

õhutemperatuur (1

selle temp või 0b00000001, mis paneb nulliks bitti 1 ja jätab kõik ülejäänud muutmata. Ka siis, kui kirjutasime

andi temp, 0b11111110

see muudab null -bitti temperatuuriks 0 ja jätab kõik ülejäänud muutmata.

Harjutus 4: peaksite koodi läbi vaatama ja veenduma, et mõistate iga rida. Teil võib olla huvitav leida paremaid meetodeid asjade tegemiseks ja koostada parem programm. Asjade kodeerimiseks on sada võimalust ja olen üsna kindel, et leiate palju parema viisi kui minu oma. Samuti võite leida (hoidku taevas!) Vigu ja tegematajätmisi. Sel juhul tahaksin neist kindlasti kuulda, et neid saaks parandada.

Olgu, vaatame nüüd, kas saame sellest üleliigsest nupust lahti …

10. toiming: koodi versioon 2

Lihtsaim viis nupust vabanemiseks on see lihtsalt täielikult eemaldada, unustada sisend PB2 -le ja lülitada ADC lihtsalt vabale režiimile.

Teisisõnu muutke lihtsalt ADCSRB registrit nii, et ADTS2, ADTS1 ja ADTS0 oleksid nullid.

Seejärel määrake ADCSRA -s ADSC -bitiks 1, mis alustab esimest teisendust.

Nüüd laadige see oma mikrokontrollerisse üles ja leiate, et õige number ilmub ekraanile nupu vajutamise ajal ja ainult nupu vajutamise ajal. Selle põhjuseks on asjaolu, et ADC võtab pidevalt ADC0 pordi proove ja kuvab väärtuse. Kui võtate sõrme nupult ära, põhjustab "nupu põrkumine" väga kiiresti mõned juhuslikud väärtused ja seejärel taastub 0V sisend. Meie koodis kuvatakse see 0V kui 0b11011011 (kuna klahvivajutus "0" kasutab juba 0b00000000 kuva väärtust)

See pole aga lahendus, mida me soovime, kahel põhjusel. Esiteks ei taha me nuppu all hoida. Tahame seda üks kord vajutada ja numbrit kuvada (või kasutada hilisemas õpetuses mõnes uues koodis). Teiseks ei taha me ADC0 -st pidevalt proove võtta. Soovime, et see võtaks ühe lugemise, teisendaks selle ja magaks, kuni uus klahvivajutus käivitab uue konversiooni. Tasuta töörežiim on parim, kui ainus asi, mida soovite, et mikrokontroller teeks, oleks pidevalt mõnda analoogsisendit lugeda - näiteks kui soovite kuvada reaalajas temperatuuri või midagi sellist.

Nii et otsime veel ühe lahenduse…

11. samm: kuidas me nupust lahti saame? Versioon 3

Kuidas me nupust lahti saame? Versioon 3
Kuidas me nupust lahti saame? Versioon 3

Me saame jätkata mitmel viisil. Esiteks võiksime nupust vabanemiseks lisada riistvara. Näiteks võime proovida panna klahvivajutuse väljundliinile ahelasse transistori, et see võtaks väljundist väikese voolu ja saadaks 5 V impulsi katkestusnõelale PD2.

See oleks aga vähemalt liiga mürarikas ja halvimal juhul ei jätaks piisavalt aega klahvivajutuse täpseks lugemiseks, kuna klaviatuuri pingeväljundil pole aega enne ADC näidu salvestamist stabiliseeruda.

Seega mõtleme pigem välja tarkvaralahenduse. Me tahaksime lisada PD2 kontaktile katkestuse ja kirjutada sellele katkestuste töötleja, mis kutsub klahvistiku tihvti ühe lugemise. Teisisõnu, me vabaneme ADC -st autotrigger -katkestusest ja lisame välise katkestuse, mis kutsub selle sisse. Nii jõuab ADC lugemise signaal pärast PD2 signaali tekkimist ja see võib anda asjadele piisavalt aega enne PC0 tihvti lugemist ja teisendamist täpseks pingeks stabiliseerumiseks. Meil oleks ikkagi ADC lõpetamise katkestus, mis väljastab tulemuse lõpus analüsaatori kuvale.

On loogiline? No teeme ära…

Vaadake lisatud uut koodi.

Näete järgmisi muudatusi.

  1. INT0 välise katkestuse tegemiseks lisasime aadressile.org 0x0002 rjmp
  2. Muutsime EIMSK registrit, et näidata, et tahame INT0 tihvti katkestada
  3. Vahetasime ADCSRA registris oleva ADATE tihvti, et keelata automaatne käivitamine
  4. Me vabanesime ADCSRB seadetest, kuna need pole ADATE väljalülitamisel ebaolulised
  5. Me ei pea enam välist päästiku lippu lähtestama, kuna INT0 katkestusrutiin teeb seda pärast lõpetamist automaatselt - varem ei olnud meil katkestusrutiini, vaid käivitasime selle tihvti signaali ADC, nii et pidime kustutage see lipp käsitsi.

Nüüd kutsume katkestuste käitlejas lihtsalt ADC ühe konversiooni.

Harjutus 5: käivitage see versioon ja vaadake, mis juhtub.

12. samm: tööversiooni kood ja video

Nagu nägime viimasest versioonist, ei tööta nuppude katkestamine eriti hästi, sest katkestus käivitatakse tõusvas servas PD2 tihvti jaoks ja seejärel kutsub katkestuste käitleja ADC teisenduse. Siiski saab ADC pinge näidu enne, kui see on stabiliseerunud ja seega loeb jama.

Vajame viivitust PD2 katkestuse ja PC0 ADC lugemise vahel. Teeme seda, lisades taimerit/loendurit, loenduri ülevoolu katkestust ja viivitusrutiini. Õnneks teame juba 3. õpetusest, kuidas seda teha! Nii et me lihtsalt kopeerime ja kleepime sealt vastava koodi.

Olen andnud saadud koodi ja video, mis näitab selle toimimist.

Te märkate, et näidud ei ole nii täpsed, kui võiks loota. See on tõenäoliselt tingitud mitmest allikast:

  1. koputame klaviatuuri pingeväljundist PD2 käivitamiseks, mis mõjutab PC0 näitu.
  2. me ei tea tegelikult, kui kaua pärast päästikut viivitada, et saada parim lugemine.
  3. ADC konversiooni lõpuleviimiseks kulub paar tsüklit, mis tähendab, et me ei saa klahvistikku kiiresti käivitada.
  4. ilmselt on klahvistikus endas müra.
  5. jne…

Seega, kuigi meil õnnestus klahvistik tööle saada ja nüüd saaksime seda rakendustes kasutada, kasutades klahvivajutusväärtusi mõnel muul viisil, selle asemel, et neid lihtsalt analüsaatori ekraanile väljastada, pole see väga täpne ja see on väga tüütu. Seetõttu arvan, et parim viis klaviatuuride ühendamiseks on lihtsalt kleepida iga väljund klaviatuurilt teise pessa ja otsustada, millist klahvi vajutades millistes pordides nähakse pinget. See on lihtne, väga kiire ja väga täpne.

Tegelikult on ainult kaks põhjust, miks tahaksime juhtida klahvistikku nii, nagu oleme siin teinud:

  1. See kasutab ainult kahte meie mikrokontrolleri tihvti 8 asemel.
  2. See on suurepärane projekt, et näidata mikrokontrolleri ADC erinevaid aspekte, mis erinevad tavapärastest asjadest, mida saate sealt leida, näiteks temperatuurinäidud, potentsiomeetrite pööramine jne. mitte lihtsalt vabalt töötav CPU-gabbling-režiim.

Igatahes, siin on teile paar viimast harjutust:

Harjutus 6: Kirjutage uuesti üles tabel, et kasutada ADC konversiooni täieliku katkestuse käitlejat. S.t. Nii et see testib analoogväärtust tabeli esimese elemendiga ja kui see on suurem, naaseb katkestusest, kui ei, siis suurendab see Z tabeli järgmise üksuse juurde ja hargneb uuesti testi juurde. See lühendab koodi ja puhastab katkestusrutiini ning muudab selle kenamaks. (Järgmise sammuna annan võimaliku lahenduse) Harjutus 7: Ühendage oma klaviatuur mikrokontrolleri 8 kontaktiga ja kirjutage selle jaoks lihtne draiver ning kogege, kui palju see on toredam. Kas saate mõelda mõnele viisile, kuidas meie meetod paremini toimida?

See on selle õpetuse jaoks kõik. Lisasin lõpliku versiooni koos näpunäidetega. Kui läheme oma lõppeesmärgile lähemale, kasutame õppetükis 9 veel kord klaviatuuri, et näidata, kuidas sellega seitsme segmendi kuva juhtida (ja luua midagi huvitavat, mis kasutab telefoni klahvistiku lisaklahve) ja seejärel lülitume asjade juhtimisele nupuvajutustega (kuna see meetod sobib paremini lõpptootega, mille poole me nende õpetuste abil ehitame), ja jätame klaviatuuri lihtsalt riiulile.

Näeme järgmine kord!

Soovitan: