Kazalo:

AVR Assembler Tutorial 7: 12 Koraki
AVR Assembler Tutorial 7: 12 Koraki

Video: AVR Assembler Tutorial 7: 12 Koraki

Video: AVR Assembler Tutorial 7: 12 Koraki
Video: AVR 12# Внешние прерывания 2024, Julij
Anonim
Vadnica za sestavljalec AVR 7
Vadnica za sestavljalec AVR 7

Dobrodošli v vadnici 7!

Danes bomo najprej pokazali, kako očistiti tipkovnico, nato pa pokazali, kako uporabiti analogna vhodna vrata za komunikacijo s tipkovnico. To bomo storili z uporabo prekinitev in ene žice kot vhoda. Tipkovnico bomo povezali tako, da vsak pritisk tipke na analogni vhod pošlje edinstveno napetost, ki nam bo omogočila razlikovanje po napetosti, na katero tipko smo pritisnili. Nato bomo izpisali številko, pritisnjeno na naš analizator registra, da pokažemo, da se vse dogaja, kot bi moralo. Obstajajo številne pasti, na katere lahko naletite pri uporabi analogno -digitalnega pretvornika (ADC) v ATmega328p, zato bomo na poti vzemite stvari v nekaj fazah in poskusite ugotoviti, kako se jim izogniti. Ugotovili bomo tudi, zakaj uporaba analogno -digitalnega pretvornika ni najboljši način za nadzor tipkovnice, čeprav uporablja manj vrat na vašem mikrokrmilniku. V tej vadnici boste potrebovali:

  1. tipkovnico. Lahko ga kupite ali pa naredite to, kar sem jaz naredil, in enega poiščem.
  2. 2 ženski glavi za tipkovnico (če jo iščete)
  3. povezovalne žice
  4. mizo
  5. 4 1 Kohmski upori
  6. 1 15 Kohm upor
  7. 1 3,3 Kohm upor
  8. 1 180 ohmski upor
  9. 1 680 ohmski upor
  10. digitalni multimeter
  11. vaš analizator iz vadnice 5

Prvih nekaj korakov boste morda preskočili, če že imate tipkovnico in je ne potrebujete.

Tukaj je povezava do celotne zbirke mojih vadnic za zbiranje AVR:

1. korak: Poiščite tipkovnico 1

Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1
Odstranite tipkovnico 1

Že dolgo nazaj, ko so bili celo vaši stari starši še otroci, so ljudje za medsebojno komunikacijo uporabljali te čudne naprave, ki so imele dolge kable priklopljene v steno. Imenovali so se "telefoni" in so bili običajno poceni plastične stvari, ki so oddajale neprijeten zvok, ko vas je nekdo poklical (ne da današnje melodije zvonjenja "Justin Bieber" niso enako moteče). Vsekakor so imele te naprave tipkovnice, ki so bile zelo preprosto ožičene, zato jih je enostavno pobrati in na njih sta 2 dodatni tipki ("ponovno klicanje" in "bliskavica") s tipkovnic, ki jih lahko kupite, ki jih boste morda želeli zamenjati kot "puščične tipke", "tipke menija" ali kaj drugega. Zato bomo začeli z odstranjevanjem tipkovnice iz starega telefona. Najprej vzemite telefon (uporabljam GE, kot je prikazano na slikah) in ga raztrgajte, da razkrijete ožičenje. Nato vzemite dleto in odtrgajte majhne plastične gumbe, ki držijo tipkovnico, in odstranite tipkovnico.

2. korak: Poiščite tipkovnico 2

Odstranite tipkovnico 2
Odstranite tipkovnico 2
Odstranite tipkovnico 2
Odstranite tipkovnico 2
Odstranite tipkovnico 2
Odstranite tipkovnico 2

Sedaj vzemite PVC žago in izrežite plastiko okoli ključavnic, nato pa prerežite po robu, da dosežete globino in pustite tanko tipkovnico.

Nato znova vnesite tipkovnico z uporabo majhnih kljukic, ki so ostale, potem ko ste jim v zadnjem koraku odrezali vrhove, in s spajkalnikom preprosto vstavite vroče železo v vsako luknjo, ki bo stopila plastiko in jo razlila po spodnji del tipkovnice, ki tvori nove "gumbe", ki bodo držali tipkovnico na mestu kot prej.

Rad počistim tri zvočnike in morda druge stvari, kot so stikala in kaj drugega, so na plošči. Vendar tokrat ne bom odstranil stikal in podobnih stvari, ker imamo trenutno druge cilje. Tam je tudi linearni IC TA31002, ki je zvonjenje telefona. Podatkovni list je mogoče zlahka najti in prenesti na spletu, kar vsebuje izpis in funkcije. Zato ga bom za zdaj pustil spajkanega na ploščo in se pozneje poigral z njim. Rad bi ga priklopil na osciloskop in videl, kakšne kul signale lahko dobim iz njega. Morda celo naredite zvonec na vratih. Kdo ve.

Kakorkoli že, ko končate z uničenjem telefona in odstranjevanjem delov, bomo dokončali izdelavo tipkovnice.

3. korak: Poiščite tipkovnico 3

Odstranite tipkovnico 3
Odstranite tipkovnico 3
Odstranite tipkovnico 3
Odstranite tipkovnico 3
Odstranite tipkovnico 3
Odstranite tipkovnico 3

S pomočjo stenja za odpakiranje odstranite tračne kable z dna tipkovnice in se prepričajte, da so luknje na vezju čiste, nato pa pritrdite dve ženski glavi na ploščo, kjer so luknje. Verjetno boste morali glave zarezati tako, da bodo 4-polni.

Zdaj, ko so glave pritrjene, jih lahko priključite na mizo, vzamete multimeter in preizkusite ključe, tako da multimeter prilepite na naključne zatiče in izmerite upor. To vam bo omogočilo preslikavo ključev. Težko je videti, kako so ključi povezani z izhodi, če pogledate vezje, če pa uporabljate multimeter, ga lahko priključite na katera koli dva zatiča in nato pritiskate gumbe, dokler ne vidite številke na zaslonu namesto odprtega tokokroga. To bo izpis ključa.

Na ta način preslikajte vse tipke za izhodne zatiče.

4. korak: Priključite tipkovnico

Povežite tipkovnico
Povežite tipkovnico
Povežite tipkovnico
Povežite tipkovnico

Sledite diagramu ožičenja in priključite tipkovnico na ploščo.

Kako bo to delovalo, bomo na levo stran vklopili 5V, desna pa gre na GND. Prvi zatič na desni na diagramu gre za prvega od naših analognih zatičev na mikrokrmilniku Atmega328p. Ko ni pritisnjenih nobenih gumbov, bo signal 0V, in ko pritisnete vsako od različnih tipk, se bo vhod na analogna vrata gibal med 0V in 5V z različno količino, odvisno od tega, katera tipka je bila pritisnjena. Vrednosti upora smo izbrali tako, da bo vsaka pot vsebovala upor, ki se razlikuje od ostalih. Analogna vrata na mikrokrmilniku sprejmejo analogni signal in ga razdelijo na 1024 različnih kanalov med 0V in 5V. To pomeni, da ima vsak kanal širino 5V/1024 = 0,005 V/kanal = 5 mV/kanal. Tako lahko analogna vrata ločijo vhodne napetosti, če se razlikujejo za več kot 5 mV. V našem primeru smo izbrali vrednosti upora, tako da bosta katera koli dva pritiska na tipko poslala napetostni signal, ki se razlikujeta za več od tega, tako da bi se mikrokrmilnik zlahka odločil, katera tipka je bila pritisnjena. Velika težava je v tem, da je celoten sistem zelo hrupen, zato bomo morali izbrati razpon napetosti za preslikavo na vsak pritisk na gumb - vendar se bomo tega lotili nekoliko kasneje.

Upoštevajte, da lahko upravljamo tipkovnico s 14 gumbi z uporabo samo ene vhodne vrstice do krmilnika. To je eden od uporabnih vidikov analognih vhodov.

Zdaj bo naš prvi poskus krmiljenja tipkovnice pritisniti tipko, ki bo povzročila prekinitev, podprogram prekinitve bo prebral analogna vhodna vrata in se odločil, katera tipka je bila pritisnjena, nato pa bo to številko poslala v našo podprogramo analizatorja registra, ki bo prikazala ključna vrednost v binarnem načinu na naših 8 LED, ki smo jih nastavili v vadnici 5.

5. korak: Priključite tipkovnico na analizator

Priključite tipkovnico na analizator
Priključite tipkovnico na analizator
Priključite tipkovnico na analizator
Priključite tipkovnico na analizator

Slike prikazujejo, kako želimo tipkovnico priključiti na mikrokrmilnik, tako da lahko vidimo izhod na zaslonu analizatorja. V bistvu preprosto povežemo izhod s tipkovnice na PortC pin 0, ki se na ATmega328P imenuje tudi ADC0.

Obstaja pa še nekaj dodatnih stvari. Na PD2 bomo namestili tudi gumb. Tj. vzemite žico iz vašega 5V vodila do gumba in z druge strani gumba do PD2, nazadnje pa želimo odklopiti pin AREF iz naše 5V tirnice in ga namesto tega pustiti odklopljenega. Če želimo, lahko vstavimo 0,1 mikrofarad ločilni kondenzator. To je keramični kondenzator, na katerem je napisano 104. Prvi dve števki sta številka in zadnja številka je število 10, ki ga pomnožimo, da dobimo odgovor v pikofaradih (pico pomeni 10^-12), torej 104 pomeni 10 x 10^4 picofarad, kar je enako 100 nanofaradov (nano pomeni 10^-9), kar je enako 0,1 mikrofarad (mikro pomeni 10^-6). Kakorkoli že, vse to stabilizira pin AREF, ko ga lahko uporabimo kot referenčni zatič.

Prav tako želimo 1 Mohm upor med PD2 in maso. PD2 bomo nastavili kot izhodni zatič pri 0V in sprožili bomo na pozitivnem robu tega zatiča. Želimo, da rob izgine takoj, ko spustimo gumb, zato bomo vstavili ta "pull down" upor.

Razlog, da želimo gumb, je, ker želimo sprožiti naš analogno-digitalni pretvornik s pina INT0 na čipu, ki je tudi PD2. Sčasoma bi želeli, da pritisk tipke sproži ADC in tudi zagotovi pretvorbo vhoda brez ločenega gumba, vendar bomo zaradi načina delovanja časovnika začeli z ločenim gumbom za sprožitev ADC -ja in ko bomo vse skupaj zlikali odpravili smo napake in smo prepričani, da vse deluje pravilno, nato pa se bomo lotili težav s hrupom in časom, ki nastanejo pri sprožitvi z istim pritiskom gumba, ki ga želimo prebrati.

Zaenkrat deluje tako, da držimo tipko, nato pritisnemo gumb, da sprožimo ADC, nato pa spustimo in upajmo, da se bo binarna vrednost gumba, ki smo ga pritisnili, prikazala na analizatorju.

Napišemo torej kodo, ki bo to dosegla.

6. korak: Katera preklopna stikala naj nastavimo?

Katera stikala za preklop naj nastavimo?
Katera stikala za preklop naj nastavimo?

Najprej pomislimo, kako bomo to kodirali, da bo lahko krmilnik prebral vnos s tipkovnice in ga spremenil v številčno vrednost, ki ustreza pritisnjenemu gumbu. Uporabili bomo analogno -digitalni pretvornik (ADC) ki je vgrajen v Atmega328p. Kot referenčno napetost bomo uporabljali AREF, izhod tipkovnice pa bo priključen na PortC0 ali PC0. Upoštevajte, da se ta pin imenuje tudi ADC0 za analogno-digitalni pretvornik 0. Morda bi bilo dobro, da preberete poglavje 12.4 o prekinitvah za ATmega328P in tudi poglavje 24 o analogno-digitalnem pretvorniku, preden dobimo Če želite mikrokontroler nastaviti tako, da bo vedel, kaj storiti z analognim vhodnim signalom, in kako komunicirati z našim programom, moramo najprej nastaviti nekaj različnih ADC -jev. povezane registrske bite. Ti so v bistvu enaki starim preklopnim stikalom na prvih računalnikih. Stikalo vklopite ali izklopite ali pa še dlje priključite kable med eno in drugo vtičnico, tako da bodo elektroni, ki segajo do razcepa na cesti, našli ena vrata zaprta, druga pa odprta, kar jih bo v labirintu potisnilo po drugi poti vezja in tako opravlja drugačno logično nalogo. Pri kodiranju v zbirnem jeziku imamo tesen dostop do teh funkcij mikrokrmilnika, kar je ena izmed privlačnih stvari pri tem. Je bolj "v rokah" in veliko manj se dogaja "v ozadju". Zato ne razmišljajte, da bi te registre postavili kot dolgočasno nalogo. Zaradi tega je montažni jezik zanimiv! Pridobivamo zelo oseben odnos z notranjim delovanjem in logiko čipa ter ga naredimo točno tisto, kar si želimo - nič več in nič manj. Brez zapravljenih ciklov ure. Torej, tukaj je seznam stikal, ki jih moramo nastaviti:

  1. Izklopite ADC bit za zmanjšanje porabe energije, PRADC, ki je bit 0 v registru PRR, saj bo, če je ta bit vključen, izklopil ADC. Register zmanjšanja moči je v bistvu način za izklop različnih stvari, ki porabijo energijo, ko jih ne potrebujete. Ker uporabljamo ADC, se želimo prepričati, da na ta način ni onemogočen. (Glejte PRADC na strani 46)
  2. Izberite analogni vhodni kanal, ki naj bo ADC0, tako da izklopite MUX3… 0 v registru za izbiro multipleksorja ADC (ADMUX) (glejte tabelo 24-4 na strani 249), ki so že privzeto izklopljeni, zato nam tega ni treba storiti. Vključujem pa ga, saj boste morali, če boste kdaj uporabljali vrata, ki niso ADC0, ustrezno preklopiti ta stikala. Različne kombinacije MUX3, MUX2, MUX1, MUX0 vam omogočajo, da kot vhod uporabite katero koli od analognih vrat, te pa lahko tudi spremenite na letenje, če želite naenkrat pogledati kopico različnih analognih signalov.
  3. Izklopite bita REFS0 in REFS1 v registru ADMUX, da bomo uporabili AREF kot referenčno napetost in ne kot notranjo referenco (glejte stran 248).
  4. Vklopite bit ADLAR v ADMUX -u, tako da bo rezultat "nastavljen na levo", o tej izbiri bomo razpravljali v naslednjem koraku.
  5. Nastavite bit ADC0D v registru za onemogočanje digitalnega vhoda (DIDR0), da izklopite digitalni vhod na PC0. Ta vrata uporabljamo za analogni vhod, zato lahko tudi onemogočimo digitalni vhod.
  6. Nastavite ISC0 in ISC1 v registru zunanjih krmilnikov prekinitev A (EICRA), da označite, da želimo sprožiti na naraščajočem robu napetostnega signala na vhod INT0 (PD2), glejte stran 71.
  7. Počistite bita INT0 in INT1 v registru zunanje maske prekinitev (EIMSK), da označite, da na tem zatiču ne uporabljamo prekinitev. Če bi morali omogočiti prekinitve na tem zatiču, bi potrebovali upravljalnik prekinitev na naslovu 0x0002, namesto tega pa ga nastavimo tako, da signal na tem zatiču sproži pretvorbo ADC, katere dokončanje obravnava popolna prekinitev pretvorbe ADC na naslov 0x002A. Glej stran 72.
  8. Nastavite bit za omogočanje ADC (ADEN) (bit 7) v krmilniku ADC in registru stanja A (ADCSRA), da omogočite ADC. Glej stran 249.
  9. Enkratno pretvorbo bi lahko začeli tako, da bi vsakič, ko želimo prebrati analogni signal, nastavili začetni pretvorniški bit ADC (ADSC), vendar bi za zdaj raje samodejno prebrali, ko nekdo pritisne gumb, zato bomo omogočili ADC Autotrigger Enable (ADATE) bit v registru ADCSRA, tako da se sprožitev izvede samodejno.
  10. Prav tako smo nastavili ADPS2..0 bitov (AD Prescalar bitov) na 111, tako da je ura ADC ura CPU, deljena s faktorjem 128.
  11. Vir sprožilca ADC bomo izbrali za PD2, ki se imenuje tudi INT0 (Zahteva za zunanji prekinitev 0). To naredimo s preklapljanjem različnih bitov v registru ADCSRB (glej tabelo 24-6 na strani 251). Po tabeli vidimo, da želimo izklopiti ADTS0, vklopiti ADTS1 in izklopiti ADTS2, tako da bo ADC sprožil ta pin. Upoštevajte, da če bi radi analizirali analogna vrata neprekinjeno, na primer, če beremo kakšen neprekinjen analogni signal (na primer vzorčenje zvoka ali kaj podobnega), bi to nastavili na način prostega teka. Metoda, ki jo uporabljamo za nastavitev sprožitve na PD2, sproži odčitavanje ADC analognih vrat PC0, ne da bi povzročilo prekinitev. Prekinitev bo prišla, ko bo pretvorba končana.
  12. Omogočite bit za omogočanje prekinitve ADC (ADIE) v registru ADCSRA, tako da bo po zaključku analogno -digitalne pretvorbe ustvaril prekinitev, za katero lahko zapišemo upravljalnik prekinitev in jo postavimo na.org 0x002A.
  13. Nastavite bit I v SREG, da omogočite prekinitve.

Vaja 1: Preberite ustrezne razdelke v podatkovnem listu za vsako od zgornjih nastavitev, da boste razumeli, kaj se dogaja in kaj bi se zgodilo, če bi jih spremenili v nadomestne nastavitve.

7. korak: Napišite upravljalnik prekinitev

V zadnjem koraku smo videli, da smo ga nastavili tako, da bo naraščajoči rob, zaznan na PD2, sprožil analogno -digitalno pretvorbo na PC0 in ko bo ta pretvorba končana, bo vrgel prekinitev ADC Conversion Complete. Zdaj želimo s tem prekinitvijo nekaj narediti. Če pregledate tabelo 12-6 na strani 65, boste videli seznam možnih prekinitev. V prejšnjih vadnicah smo že videli prekinitev RESET na naslovu 0x0000 in prekinitev Timer/Counter0 Overflow na naslovu 0x0020. Zdaj si želimo ogledati prekinitev ADC, ki jo vidimo pri tabeli na naslovu 0x002A. Tako bomo na začetku kode jezika za montažo potrebovali vrstico, ki se glasi:

.org 0x002Arjmp ADC_int

ki bo skočil na naš upravljavec prekinitev z oznako ADC_int vsakič, ko bo ADC zaključil pretvorbo. Kako naj torej zapišemo naš upravljalnik prekinitev? Način delovanja ADC -ja je naslednji izračun:

ADC = Vin x 1024 / Vref

Pa poglejmo, kaj se zgodi, če pritisnem gumb za "ponovno izbiranje" na tipkovnici. V tem primeru se bo napetost na PC0 spremenila na neko vrednost, recimo 1,52 V, in ker je Vref na 5 V, bomo imeli:

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

in tako bi se prikazal kot 311. Če bi želeli to pretvoriti nazaj v napetost, bi izračun obrnili. Tega pa nam ne bo treba storiti, saj nas dejanske napetosti ne zanimajo le za razlikovanje med njimi. Ko je pretvorba končana, se rezultat shrani v 10-bitno številko, ki je vpisana v registre ADCH in ADCL, mi pa smo povzročili, da se "levo prilagodi", kar pomeni, da se 10-bitni začnejo pri bitu 7 ADCH in segajo do bit 6 ADCL (v teh dveh registrih je skupaj 16 bitov in uporabljamo jih le 10, torej 1024 kanalov). Če želimo, bi lahko dobili rezultat "desno nastavljeno", tako da počistimo bit ADLAR v registru ADMUX. Razlog, da se odločimo za levo prilagoditev, je, ker so naši signali dovolj oddaljeni, da zadnji dve števki številke kanala nista pomembni in so verjetno samo hrup, zato bomo razlikovali pritiske tipk le z zgornjimi 8 števkami, z drugimi besedami, morali bomo pogledati le ADCH, da ugotovimo, kateri gumb je bil pritisnjen. Zato bi moral naš upravljavec prekinitev preprosto prebrati številko iz ADCH register, pretvorite to številko v vrednost tipkovnice in nato to vrednost pošljite našim LED -diodam analizatorja registra, da bomo lahko preverili, da bo s pritiskom na "9" zasvetila LED -dioda, ki ustreza "00001001". čeprav moramo najprej videti, kaj se prikaže v ADCH -u, ko pritisnemo različne gumbe. Napišemo torej preprost upravljavec prekinitev, ki samo pošlje vsebino ADCH na zaslon analizatorja.

ADC_int: lds analizator, ADCH; naložite vrednost ADCH v naše analizatorje EIFR, 0; počistite zunanjo zastavico prekinitve, tako da je pripravljena za ponovni zagon

Doslej bi morali biti sposobni samo kopirati kodo iz našega analizatorja v vadnici 5 ter dodati to prekinitev in nastavitve preklopa ter jo zagnati. 2. vaja: Napišite kodo in jo zaženite. Preverite, ali se na zaslonu analizatorja prikaže ADCH. Poskusite večkrat pritisniti isto tipko. Ali v ADCH -u vedno dobite isto vrednost?

8. korak: Preslikajte vrednosti pritiskov tipk

Kartirajte vrednosti pritiska na tipko
Kartirajte vrednosti pritiska na tipko

Zdaj moramo pretvoriti vrednosti v ADCH v številke, ki ustrezajo pritisnjeni tipki. To naredimo tako, da za vsak pritisk tipke izpišemo vsebino ADCH in jo nato pretvorimo v decimalno število, kot sem naredil na sliki. V naši rutinski obdelavi prekinitev bomo upoštevali celo vrsto vrednosti, ki ustrezajo vsakemu pritisku tipke, tako da bo ADC preslikal kar koli v tem območju v dani pritisk tipke.

Vaja 3: Naredite to preslikavo in nato znova napišite svojo rutino prekinitve ADC.

Tukaj je tisto, kar sem dobil za svojega (verjetno bo vaš drugačen). Upoštevajte, da sem ga nastavil z obsegom vrednosti za vsak pritisk tipke.

ADC_int:; Zunanji analizator rutinskih prekinitev CLR; pripravi na nove številke gumb H, ADCH; ADC se posodobi, ko se prebere ADCH clccpi gumbH, 240brlo PC+3; če je ADCH večji, je to 1ldi analizator, 1; zato naložite analizator z povratkom 1 rjmp; in gumb za vrnitev clccpiH, 230; če je ADCH večji, potem 2brlo PC+3ldi analizator, 2rjmp povratni gumb clccpiH, 217brlo PC+3ldi analizator, 3rjmp povratni clccpi gumbH, 203brlo PC+3ldi analizator, 4rjmp povratni clccpi gumb H, 187brlo PC+3ldi analizator, 5rjmp povratni clc, 155brlo PC+3ldi analizator, 6rjmp povratni gumb clccpiH, 127brlo PC+3ldi analizator, 255; nastavili bomo bliskavico kot vse tipke onrjmp return clccpiH, 115brlo PC+3ldi analyser, 7rjmp return clccpi buttonH, 94brlo PC+3ldi analyzer, 8rjmp return clccpi buttonH, 62brlo PC+3ldi analyzer, 9rjmp return clccpi buttonH, 37brlo PC+3ldi analizator, 0b11110000; zvezdica je zgornja polovica gumba za vrnitev clccpi za vrnitev narjmpH, računalnik 28brlo+3ldi, gumb za vrnitev clccpi 0rjmpH, gumb 17brlo za računalnik+3ldi, 0b00001111; oznaka razpršitve je spodnja polovica gumba za vrnitev clccpi za vrnitev, H, 5brlo PC+3ldi analizator, 0b11000011; ponovni klic je zgornji 2 spodaj 2rjmp povratni ldi analizator, 0b11011011; v nasprotnem primeru je prišlo do napake return: reti

9. korak: Koda in video za različico 1

Priložil sem svojo kodo za to prvo različico gonilnika tipkovnice. V tem morate pritisniti tipko in nato pritisniti gumb, da bi ADC prebral vnos s tipkovnice. Raje bi imeli gumb, ampak signal za izvedbo pretvorbe prihaja iz samega pritiska tipke. 3. vaja: Sestavite in naložite to kodo in jo preizkusite. Morda boste morali spremeniti različne pragove pretvorbe, da bodo ustrezali vašim napetostim pritiska na tipko, saj se verjetno razlikujejo od mojih. Kaj se zgodi, če poskusite uporabiti vnos s tipkovnice tako za ADC0 kot za zunanji prekinitveni zatič namesto prek gumba? Priložil bom tudi videoposnetek delovanja te prve različice našega gonilnika za pritiskanje tipk. Opazili boste, da v moji kodi je razdelek, ki inicializira kazalec sklada. Obstajajo različni registri, ki jih bomo morda želeli potisniti in spustiti iz sklada, ko manipuliramo s spremenljivkami in kaj drugega, obstajajo pa tudi registri, ki jih bomo morda želeli shraniti in obnoviti pozneje. Na primer, SREG je register, ki ni ohranjen med prekinitvami, zato se lahko različne zastavice, ki so nastavljene in izbrisane zaradi operacij, spremenijo, če pride do prekinitve sredi nečesa. Zato je najbolje, če pritisnete SREG na sklad na začetku upravljalnika prekinitev in ga nato znova izklopite na koncu upravljavca prekinitev. Postavil sem ga v kodo, da pokaže, kako je inicializiran in predvideva, kako ga bomo pozneje potrebovali, a ker nam ni vseeno, kaj se zgodi s SREG med prekinitvami v naši kodi, za to nisem uporabil sklada. da sem pri operaciji shift uporabil različne bite v registrih pri inicializaciji. Na primer v vrstici:

ldi temp, (1 <> sts EICRA, temp

Ukaz "<<" v prvi vrstici zgornje kode je premik. V bistvu vzame binarno število 1, ki je 0b00000001, in ga premakne levo za količino številke ISC01. To je položaj bita z imenom ISC01 v registru EICRA. Ker je ISC01 bit 1, se številka 1 premakne v levi položaj 1 in postane 0b00000010. Podobno je drugi, ISC00, bit 0 EICRA, zato je premik številke 1 ničelnih položajev v levo. Če si še enkrat ogledate datoteko m328Pdef.inc, ki ste jo prenesli v prvi vadnici in od takrat uporabljate evrr, boste videli, da je to le dolg seznam stavkov ».equ«. Ugotovili boste, da je ISC01 enak 1. Asembler zamenja vsak njegov primerek z 1, še preden sploh začne sestavljati karkoli. To so samo imena registrskih bitov, ki nam pomagajo pri branju in pisanju kode. Zdaj je navpična črta med dvema premikoma zgoraj logična operacija "ali". Tu je enačba:

0b00000010 | 0b00000001 = 0b00000011

in to je tisto, kar naložimo (z uporabo "ldi") v temp. Ljudje uporabljajo to metodo za nalaganje vrednosti v register, ker omogoča uporabo imena bita namesto samo številke, zato je koda veliko lažje berljiva. Uporabili smo tudi dve drugi tehniki. Uporabljamo navodila "ori" in "andi". Ti nam omogočajo nastavitev bitov SET in CLEAR brez spreminjanja drugih bitov v registru. Na primer, ko sem uporabil

ori temp, (1

ta "ali" temp z 0b00000001, ki postavi 1 v ničelni bit in pusti vse ostale nespremenjene. Tudi ko smo pisali

andi temp, 0b11111110

to spremeni ničelni bit temp na 0, vse ostalo pa ostane nespremenjeno.

Vaja 4: Preglejte kodo in se prepričajte, da razumete vsako vrstico. Morda se vam bo zdelo zanimivo poiskati boljše metode dela in napisati boljši program. Obstaja sto načinov kodiranja stvari in prepričan sem, da lahko najdete veliko boljši način od mojega. Morda boste našli (ne daj bog!) Napake in pomanjkljivosti. V tem primeru bi zagotovo rad slišal o njih, da jih lahko popravimo.

V redu, zdaj pa poglejmo, ali se lahko znebimo tega odvečnega gumba …

10. korak: Koda za različico 2

Najlažji način, da se znebite gumba, je, da ga popolnoma odstranite, pozabite na vnos v PB2 in preprosto preklopite ADC na "Free Running Mode".

Z drugimi besedami, preprosto spremenite register ADCSRB tako, da so vsi ADTS2, ADTS1 in ADTS0 nič.

Nato nastavite bit ADSC v ADCSRA na 1, kar bo začelo prvo pretvorbo.

Zdaj ga naložite na svoj mikrokrmilnik in ugotovili boste, da se na zaslonu prikaže pravilna številka, medtem ko pritisnete gumb in samo medtem, ko pritisnete gumb. To je zato, ker ADC neprekinjeno vzorči vrata ADC0 in prikazuje vrednost. Ko s prsta odstranite prst, bo "odbijanje gumba" povzročilo zelo hitro nekaj naključnih vrednosti, nato pa se bo ustalilo na vhod 0V. V naši kodi je to 0V prikazano kot 0b11011011 (ker pritisk na tipko "0" že uporablja prikazno vrednost 0b00000000)

Vendar to ni rešitev, ki jo želimo iz dveh razlogov. Najprej ne želimo držati gumba. Želimo ga pritisniti enkrat in prikazati številko (ali uporabiti v neki novi kodi v kasnejši vadnici). Drugič, ne želimo nenehno vzorčiti ADC0. Želimo, da izvede en sam odčitek, ga pretvori in nato zaspi, dokler nov pritisk tipke ne sproži nove pretvorbe. Način prostega teka je najboljši, če želite, da mikrokrmilnik nenehno bere nekaj analognih vhodov - na primer, če želite prikazati temperature v realnem času ali kaj podobnega.

Pa poiščimo še eno rešitev …

11. korak: Kako se znebiti gumba? Različica 3

Kako se znebimo gumba? Različica 3
Kako se znebimo gumba? Različica 3

Obstaja več načinov, kako bi lahko nadaljevali. Najprej bi lahko dodali strojno opremo, da se znebimo gumba. Na primer, lahko poskusimo vstaviti tranzistor v vezje na izhodni liniji pritiska na tipko, tako da bo z izhoda odvzel majhen tok toka in na prekinitveni zatič PD2 poslal 5V impulz.

Vendar bi bilo to verjetno vsaj preveč hrupno, v najslabšem primeru pa ne bi dopuščalo dovolj časa za natančno odčitavanje pritiska na tipko, saj se izhodna napetost tipkovnice ne bi imela časa stabilizirati, preden se zajame odčitavanje ADC.

Zato bi raje našli programsko rešitev. Kaj želimo narediti, je dodati prekinitev na pin PD2 in zanjo napisati upravljalnik prekinitev, ki pokliče eno samo branje nožice tipkovnice. Z drugimi besedami, znebimo se prekinitve samodejnega sprožilca iz ADC -ja in dodamo zunanji prekinitev, ki v njem pokliče ADC. Na ta način signal za branje ADC -ja pride po tem, ko je signal PD2 že prišel, kar bi lahko dalo dovolj časa, da se stabilizuje na natančno napetost, preden se odčita in pretvori pin PC0. Še vedno bi imeli prekinitev dokončanja ADC, ki na koncu prikaže rezultat na zaslonu analizatorja.

Smiselno? No naredimo to…

Oglejte si priloženo novo kodo.

Vidite naslednje spremembe:

  1. Dodali smo rjmp na naslovu.org 0x0002 za obravnavo zunanjega prekinitve INT0
  2. Register EIMSK smo spremenili, da označimo, da želimo prekiniti na zatiču INT0
  3. V registru ADCSRA smo spremenili pin ADATE, da onemogočimo samodejno sprožitev
  4. Znebili smo se nastavitev ADCSRB, ker niso pomembne, ko je ADATE izklopljen
  5. Zunanje sprožilne zastavice nam ni več treba ponastaviti, saj rutina prekinitve INT0 to naredi samodejno, ko se dokonča - prej nismo imeli rutine prekinitev, samo smo sprožili ADC signala na tem pinu, zato smo morali ročno počisti zastavo.

Zdaj v upravljalniku prekinitev preprosto pokličemo eno pretvorbo iz ADC -ja.

Vaja 5: Zaženite to različico in poglejte, kaj se zgodi.

12. korak: Koda in video za delovno različico

Kot smo videli v zadnji različici, prekinitev gumba ne deluje dobro, ker se prekinitev sproži na naraščajočem robu, da se pripne PD2, nato pa upravljavec prekinitev pokliče pretvorbo ADC. Vendar pa ADC nato odčita napetost, preden se stabilizira in tako bere nesmisel.

Kar potrebujemo, je uvesti zakasnitev med prekinitvijo na PD2 in odčitkom ADC na PC0. To bomo storili tako, da bomo dodali časovnik/števec, prekinitev prelivanja števca in rutino zamika. Na srečo to že vemo, kako to narediti v vadnici 3! Zato bomo od tam samo kopirali in prilepili ustrezno kodo.

Dal sem nastalo kodo in video, ki prikazuje njeno delovanje.

Opazili boste, da odčitki niso tako natančni, kot bi si upali. To je verjetno posledica številnih virov:

  1. uporabljamo napetostni izhod tipkovnice za sprožitev na PD2, kar vpliva na branje v PC0.
  2. v resnici ne vemo, kako dolgo bi morali odložiti po sprožilcu, da bi dobili najboljše branje.
  3. Za dokončanje pretvorbe ADC -ja je potrebnih nekaj ciklov, kar pomeni, da na tipkovnici ne moremo hitro streljati.
  4. verjetno je hrup v sami tipkovnici.
  5. itd…

Torej, čeprav nam je uspelo aktivirati tipkovnico in bi jo zdaj lahko uporabljali v aplikacijah z uporabo vrednosti pritiskov tipk na kakšen drug način, namesto da bi jih samo prikazali na zaslonu analizatorja, ni zelo natančna in zelo moteča. Zato menim, da je najboljši način za povezovanje tipkovnic tako, da vsak izhod s tipkovnice prilepite v druga vrata in se odločite, katero tipko pritisnete, katera vrata vidijo napetost. To je enostavno, zelo hitro in zelo natančno.

Pravzaprav obstajata samo dva razloga, zakaj bi želeli upravljati tipkovnico tako, kot smo to storili tukaj:

  1. Namesto 8 uporablja le 2 nožice na našem mikrokrmilniku.
  2. To je odličen projekt, ki prikazuje različne vidike ADC-ja na mikrokrmilniku, ki se razlikujejo od standardnih stvari, ki jih lahko odkrijete, kot so odčitki temperature, potenciometri obračanja itd. in ne samo prost način delovanja CPU-gobbling.

Kakorkoli že, tukaj je še zadnji vaji:

Vaja 6: Znova poiščite upravljalnik prekinitev pretvorbe ADC za uporabo tabele za iskanje. Tj. Tako, da preizkusi analogno vrednost s prvim elementom v tabeli, in če je večja, se vrne iz prekinitve, če ni, potem poveča Z do naslednjega elementa v tabeli in se spet vrne k preskusu. S tem boste skrajšali kodo in očistili rutino prekinitev ter jo naredili lepšo. (Kot naslednji korak bom navedel možno rešitev) Vaja 7: Priključite tipkovnico na 8 zatičev na mikrokrmilniku in napišite enostaven gonilnik zanjo in doživite, kako lepša je. Ali lahko pomislite na nekaj načinov, kako izboljšati našo metodo?

To je vse za to vadnico. Končno različico sem priložil s kazalci. Ko se približujemo končnemu cilju, bomo v vadnici 9 znova uporabili tipkovnico, da pokažemo, kako z njo upravljati sedem segmentnih zaslonov (in zgraditi nekaj zanimivega, kar uporablja dodatne tipke na tipkovnici telefona), nato pa bomo namesto tega preklopite na nadzor stvari s pritiskom na gumbe (ker se ta metoda bolje ujema s končnim izdelkom, ki ga gradimo s temi vadnicami), tipkovnico pa bomo le odložili.

Se vidimo naslednjič!

Priporočena: