Sadržaj:

AVR asemblerski vodič 7: 12 koraka
AVR asemblerski vodič 7: 12 koraka

Video: AVR asemblerski vodič 7: 12 koraka

Video: AVR asemblerski vodič 7: 12 koraka
Video: Автомобильный генератор для генератора с самовозбуждением с использованием ДИОДА 2024, Srpanj
Anonim
Vodič za sastavljač AVR -a 7
Vodič za sastavljač AVR -a 7

Dobro došli u Tutorial 7!

Danas ćemo prvo pokazati kako očistiti tipkovnicu, a zatim ćemo pokazati kako koristiti analogne ulazne portove za komunikaciju s tipkovnicom. To ćemo učiniti koristeći prekide i jednu žicu kao ulaz. Ožičit ćemo tipkovnicu tako da svaki pritisak tipke šalje jedinstveni napon na analogni ulaz koji će nam omogućiti razlikovanje po naponu koja je tipka pritisnuta. Zatim ćemo ispisati broj pritisnut na naš analizator registra kako bismo pokazali da se sve događa kako treba. Postoje brojne zamke na koje možete naići kada koristite analogno -digitalni pretvarač (ADC) u ATmega328p, pa ćemo usput poduzmite stvari u nekoliko faza kako biste pokušali smisliti kako ih izbjeći. Također ćemo vidjeti zašto korištenje analogno -digitalnog pretvarača nije najbolji način za upravljanje tipkovnicom iako koristi manje portova na vašem mikrokontroleru. U ovom vodiču trebat će vam:

  1. tipkovnica. Možete kupiti jedan ili možete učiniti ono što sam ja napravio i očistiti ga.
  2. 2 ženska zaglavlja za tipkovnicu (ako jednu čistite)
  3. spojne žice
  4. krušna ploča
  5. 4 1 Kohm otpornici
  6. 1 15 Kohm otpornik
  7. 1 3.3 Kohm otpornik
  8. 1 180 ohmski otpornik
  9. Otpornik od 1 680 ohma
  10. digitalni multimetar
  11. vaš analizator iz vodiča 5

Možda ćete htjeti preskočiti prvih nekoliko koraka ako već imate tipkovnicu i ne morate je čistiti.

Evo veze do cijele zbirke mojih vodiča za AVR asembler:

Korak 1: Očistite tipkovnicu 1

Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1
Očistite tipkovnicu 1

Davno, kad su čak i vaši djedovi i bake bili samo djeca, ljudi su koristili ove uređaje čudnog izgleda, koji su imali dugačke kabele priključene u zid, kako bi međusobno komunicirali. Zvali su se "telefoni" i obično su bili jeftine plastične stvari koje su stvarale neugodan zvuk kad bi vas netko nazvao (nije da današnje melodije zvona "Justin Bieber" nisu jednako dosadne). U svakom slučaju, ti su uređaji imali tipkovnice koje su bile vrlo jednostavno ožičene, pa ih je lako ukloniti, a na sebi imaju 2 dodatne tipke ("ponovno biranje" i "bljeskanje") s tipkovnica koje možete kupiti i koje želite prenamijeniti kao "tipke sa strelicama", "tipke izbornika" ili nešto drugo. Dakle, počet ćemo s uklanjanjem tipkovnice sa starog telefona. Najprije uzmite telefon (koristim GE kao što je prikazano na slikama) i odvojite ga da otkrijete ožičenje. Zatim uzmite dlijeto i odvojite male plastične gumbiće koji drže tipkovnicu i uklonite tipkovnicu.

Korak 2: Očistite tipkovnicu 2

Očistite tipkovnicu 2
Očistite tipkovnicu 2
Očistite tipkovnicu 2
Očistite tipkovnicu 2
Očistite tipkovnicu 2
Očistite tipkovnicu 2

Sada uzmite PVC pilu i izrežite plastiku oko ključanica, a zatim izrežite oko ruba kako biste postigli pravu dubinu ostavljajući tanku tipkovnicu.

Zatim ponovno uključite tipkovnicu pomoću malih klinova koji su ostali nakon što ste im u posljednjem koraku odrezali vrhove i pomoću lemilice jednostavno gurnite vruće željezo u svaku rupu koja će otopiti plastiku i raširiti je po pri dnu tipkovnice tvoreći nove "gumbe" koji će držati tipkovnicu na mjestu kao i prije.

Volim očistiti tri zvučnika, a možda su i druge stvari poput prekidača i onoga što ne na ploči. Međutim, ovaj put neću tražiti prekidače i ostalo jer trenutno imamo druge ciljeve. Također, tu je i linearni IC TA31002 koji je zvono za telefon. Tehnički list lako se može pronaći i preuzeti na mreži pružajući ispis i značajke. Zato ću ga za sada ostaviti lemljenog na ploči, a kasnije ću se poigrati s njim. Htio bih ga spojiti na osciloskop i vidjeti koje cool signale mogu iz njega izvući. Možda čak i napraviti zvono na vratima. Tko zna.

U svakom slučaju, kad završite s uništavanjem telefona i uklanjanjem dijelova, dovršit ćemo izradu naše tipkovnice.

Korak 3: Očistite tipkovnicu 3

Očistite tipkovnicu 3
Očistite tipkovnicu 3
Očistite tipkovnicu 3
Očistite tipkovnicu 3
Očistite tipkovnicu 3
Očistite tipkovnicu 3

Upotrijebite fitilj za odmrzavanje i uklonite vrpčane kabele s dna tipkovnice pazeći da rupe na ploči budu čiste, a zatim pričvrstite dva ženska zaglavlja na ploču gdje se nalaze rupe. Vjerojatno ćete morati izrezati zaglavlja tako da budu 4-pinska zaglavlja.

Sad kad su zaglavlja pričvršćena, možete ih spojiti na matičnu ploču, uzeti multimetar i testirati ključeve lijepljenjem multimetra preko slučajnih pinova i mjerenjem otpora. To će vam omogućiti mapiranje ključeva. Teško je vidjeti kako su tipke spojene na izlaze gledajući krug, ali ako koristite multimetar, možete ga priključiti na bilo koja dva pina, a zatim pritisnuti gumbe dok ne vidite broj na ekranu umjesto otvorenog kruga. Ovo će biti pinout za taj ključ.

Na ovaj način preslikajte sve tipke za izlazne pinove.

Korak 4: Povežite tipkovnicu

Ožičite tipkovnicu
Ožičite tipkovnicu
Ožičite tipkovnicu
Ožičite tipkovnicu

Sada slijedite dijagram ožičenja i povežite tipkovnicu s matičnom pločom.

Kako će ovo funkcionirati je da ćemo staviti 5V na lijevu stranu, a desna strana ide na GND. Prvi pin desno na dijagramu ide u prvi od naših analognih pinova na mikrokontroleru Atmega328p. Kada nema pritisnutih gumba signal će biti 0V, a kada se pritisne svaka od različitih tipki ulaz na analogni priključak bit će u rasponu od 0V do 5V s različitom količinom ovisno o tome koja je tipka pritisnuta. Odabrali smo vrijednosti otpornika tako da svaki put sadrži otpor koji se razlikuje od ostalih. Analogni priključak na mikrokontroleru uzima analogni signal i dijeli ga na 1024 različita kanala između 0V i 5V. To znači da svaki kanal ima širinu 5V/1024 = 0,005 V/kanal = 5 mV/kanal. Dakle, analogni priključak može razlikovati ulazne napone sve dok se razlikuju za više od 5 mV. U našem slučaju odabrali smo vrijednosti otpornika tako da bilo koja dva pritiska tipke šalju signal napona koji se razlikuje više od ovoga pa bi mikrokontroler mogao lako odlučiti koja je tipka pritisnuta. Veliki je problem što je cijeli sustav vrlo bučan pa ćemo morati odabrati raspon napona za preslikavanje na svaki pritisak na gumb - ali u to ćemo ući kasnije.

Uočite da možemo upravljati tipkovnicom s 14 tipki koristeći samo jedan ulazni redak do kontrolera. To je jedan od korisnih aspekata analognih ulaza.

Sada će naš prvi pokušaj kontrole tipkovnice biti da pritisak na tipku izazove prekid, potprogram prekida će pročitati analogni ulazni port i odlučiti koja je tipka pritisnuta, a zatim će taj broj ispisati u našu podrutinu analizatora registra koja će prikazati ključna vrijednost u binarnom obliku na naših 8 LED dioda koje smo postavili u vodiču 5.

Korak 5: Priključite tipkovnicu na svoj analizator

Priključite tipkovnicu na svoj analizator
Priključite tipkovnicu na svoj analizator
Priključite tipkovnicu na svoj analizator
Priključite tipkovnicu na svoj analizator

Slike prikazuju kako želimo spojiti tipkovnicu na mikrokontroler tako da možemo vidjeti izlaz na ekranu analizatora. U suštini jednostavno povezujemo izlaz s tipkovnice na PortC pin 0, koji se također naziva ADC0 na ATmega328P.

Međutim, postoji nekoliko dodatnih stvari. Također ćemo spojiti gumb na PD2. Tj. povežite žicu sa svoje 5V šine do gumba, a s druge strane gumba do PD2, i na kraju, želimo odspojiti AREF pin sa naše 5V tračnice i umjesto toga ostaviti ga isključenim. Mogli bismo umetnuti kondenzator za odvajanje od 0,1 mikrofarad ako želimo. Ovo je keramički kondenzator na kojem je napisano 104. Prve dvije znamenke su broj, a posljednja znamenka je broj 10, množimo je s da bismo dobili odgovor u pikofaradima (piko znači 10^-12), pa 104 znači 10 x 10^4 pikofarada, što je isto kao 100 nanofarada (nano znači 10^-9), što je isto što i 0,1 mikrofarada (mikro znači 10^-6). U svakom slučaju, sve ovo čini stabiliziranje AREF pina kada ga možemo koristiti kao referentni pin.

Također želimo 1 Mohm otpornik između PD2 i mase. PD2 ćemo postaviti kao izlazni pin na 0V i aktivirat ćemo na pozitivnom rubu tog pina. Želimo da rub odmah nestane kad otpustimo gumb pa ćemo umetnuti ovaj otpornik za povlačenje.

Razlog zašto želimo gumb je taj što želimo pokrenuti naš analogno-digitalni pretvarač s pina INT0 na čipu, koji je također PD2. Na kraju bismo htjeli da pritisak na tipku istovremeno pokrene ADC i također omogući pretvaranje ulaza bez zasebnog gumba, ali zbog načina na koji radi vrijeme počet ćemo s posebnim gumbom za aktiviranje ADC -a i nakon što ispeglamo sve uklonili smo greške i sigurni smo da sve radi ispravno, tada ćemo se pozabaviti problemima s bukom i vremenom koji dolaze s pokretanjem istog pritiska na gumb koji želimo pročitati.

Dakle, za sada, način na koji funkcionira je da ćemo držati pritisnutu tipku, zatim pritisnuti gumb za aktiviranje ADC -a, a zatim pustiti i nadamo se da će se binarna vrijednost gumba koju smo pritisnuli pojaviti na analizatoru.

Pa napišimo neki kod koji će to postići.

Korak 6: Koje prekidače trebamo postaviti?

Koje prekidače trebamo postaviti?
Koje prekidače trebamo postaviti?

Prvo razmislimo kako ćemo to kodirati kako bi kontroler mogao pročitati ulaz s tipkovnice i pretvoriti ga u brojčanu vrijednost koja odgovara gumbu koji je pritisnut. Koristit ćemo analogno -digitalni pretvarač (ADC) koji je ugrađen u Atmega328p. Kao referentni napon koristit ćemo AREF, a izlaz tipkovnice bit će spojen na PortC0 ili PC0. Imajte na umu da se ovaj pin također naziva ADC0 za analogno-digitalni pretvarač 0. Bilo bi dobro da pročitate Odjeljak 12.4 o prekidima za ATmega328P i također poglavlje 24 o Analogno-digitalnom pretvaraču prije nego što dobijemo pokrenuli ili barem pripremili te odjeljke za referencu. Kako bismo postavili mikrokontroler tako da zna što učiniti s analognim ulaznim signalom i kako komunicirati s našim programom, prvo moramo postaviti nekoliko različitih ADC -a povezane bitove registra. Oni su u biti ekvivalentni starim prekidačima na prvim računalima. Uključite ili isključite prekidač ili još dalje uključite kabele između jedne i druge utičnice kako bi elektroni koji dopiru do račvanja na cesti našli jedna vrata zatvorena, a druga otvorena, tjerajući ih na drugu stazu u labirintu sklopova i na taj način izvršava drugačiji logički zadatak. Prilikom kodiranja na asemblerskom jeziku imamo blizak pristup tim funkcijama mikrokontrolera, što je jedna od atraktivnih stvari kada se radi o tome. To je više "na rukama", a daleko manje se događa "iza kulisa". Zato nemojte misliti postavljati ove registre kao dosadan zadatak. To je ono što čini asemblerski jezik zanimljivim! Stječemo vrlo osobni odnos s unutarnjim funkcioniranjem i logikom čipa i tjeramo ga da radi upravo ono što želimo - ni više ni manje. Nema izgubljenih ciklusa takta. Dakle, ovdje je popis prekidača koje moramo postaviti:

  1. Isključite ADC bit za smanjenje snage, PRADC, koji je bit 0 registra PRR, jer ako je ovaj bit uključen, isključit će ADC. Registar za smanjenje snage u biti je način isključivanja raznih stvari koje troše energiju kad vam ne trebaju. Budući da koristimo ADC, želimo biti sigurni da nije onemogućen na ovaj način. (Pogledajte PRADC na stranici 46)
  2. Odaberite analogni ulazni kanal koji će biti ADC0 isključivanjem MUX3 … 0 u registru za odabir ADC multipleksera (ADMUX) (vidi tablicu 24-4 na stranici 249), oni su već isključeni prema zadanim postavkama pa to zapravo ne moramo činiti. Međutim, ja ga uvrštavam jer ako ikada koristite drugi port osim ADC0, morat ćete prema tome prebaciti ove prekidače. Različite kombinacije MUX3, MUX2, MUX1, MUX0 omogućuju vam da koristite bilo koji od analognih priključaka kao ulaz, a također ih možete promijeniti u hodu ako želite gledati hrpu različitih analognih signala odjednom.
  3. Isključite bitove REFS0 i REFS1 u registru ADMUX tako da ćemo koristiti AREF kao referentni napon, a ne internu referencu (vidi stranicu 248).
  4. Uključite ADLAR bit u ADMUX -u tako da se rezultat "prilagodi lijevo", o ovom ćemo izboru govoriti u sljedećem koraku.
  5. Postavite bit ADC0D u registru za onemogućavanje digitalnih ulaza (DIDR0) kako biste isključili digitalni ulaz na PC0. Taj priključak koristimo za analogni ulaz pa bismo mogli i onemogućiti digitalni ulaz za njega.
  6. Postavite ISC0 i ISC1 u registru vanjskog upravljanja prekidima A (EICRA) da označite da želimo aktivirati na rastućem rubu naponskog signala na INT0 pin (PD2), pogledajte stranicu 71.
  7. Očistite bitove INT0 i INT1 u Registru vanjskih maski prekida (EIMSK) kako biste naznačili da ne koristimo prekide na ovom pinu. Ako bismo omogućili prekide na ovom pinu, trebat će nam rukovatelj prekidima na adresi 0x0002, ali umjesto toga postavljamo ga tako da signal na ovom pinu aktivira ADC konverziju, čije se dovršenje obrađuje prekidom potpunog prekida ADC na adresa 0x002A. Pogledajte stranicu 72.
  8. Postavite bit za omogućavanje ADC -a (ADEN) (bit 7) u ADC kontrolnom registru statusa A (ADCSRA) kako biste omogućili ADC. Pogledajte stranicu 249.
  9. Mogli bismo započeti jednu pretvorbu postavljanjem ADC početnog pretvaračkog bita (ADSC) svaki put kad bismo htjeli očitati analogni signal, međutim, za sada bismo radije dali da se automatski čita kad god netko pritisne gumb, pa ćemo umjesto toga omogućiti ADC Autotrigger Enable (ADATE) bit u registru ADCSRA tako da se aktiviranje vrši automatski.
  10. Također smo postavili ADPS2..0 bita (AD Prescalar bitovi) na 111 tako da je ADC sat CPU sat podijeljen sa faktorom 128.
  11. Odabrat ćemo izvor okidača ADC -a PD2 koji se također naziva INT0 (zahtjev za vanjskim prekidom 0). To činimo promjenom različitih bitova u registru ADCSRB (vidi tablicu 24-6 na stranici 251). Po tablici vidimo da želimo isključiti ADTS0, uključiti ADTS1 i isključiti ADTS2 tako da će ADC aktivirati taj pin. Imajte na umu da ako želimo kontinuirano uzorkovati analogni port, kao da čitamo neki kontinuirani analogni signal (poput uzorkovanja zvuka ili slično), ovo bismo postavili na način rada slobodnog trčanja. Metoda koju koristimo za postavljanje okidanja na PD2 pokreće čitanje ADC -a analognog porta PC0 bez uzrokovanja prekida. Prekid će doći kada konverzija bude dovršena.
  12. Omogućite bit za omogućavanje prekida ADC (ADIE) u registru ADCSRA tako da će, kada je analogno -digitalna konverzija dovršena, generirati prekid za koji možemo napisati rukovatelj prekida i staviti ga na.org 0x002A.
  13. Postavite bit I u SREG -u kako biste omogućili prekide.

Vježba 1: Svakako pročitajte relevantne odjeljke u podatkovnom listu za svaku od gornjih postavki kako biste razumjeli što se događa i što bi se dogodilo ako ih promijenimo na zamjenske postavke.

Korak 7: Napišite rukovatelj prekida

U posljednjem koraku vidjeli smo da smo ga postavili tako da će rastući rub detektiran na PD2 pokrenuti analogno -digitalnu konverziju na PC0, a kad je ta konverzija dovršena, bacit će prekid ADC Conversion Complete. Sada želimo učiniti nešto s ovim prekidom. Ako pregledate tablicu 12-6 na stranici 65, vidjet ćete popis mogućih prekida. Već smo vidjeli prekid RESET -a na adresi 0x0000 i prekid Timer/Counter0 Overflow na adresi 0x0020 u prethodnim vodičima. Sada želimo pogledati ADC prekid koji vidimo po tablici na adresi 0x002A. Dakle, na početku koda asemblerskog jezika trebat će nam redak koji glasi:

.org 0x002Arjmp ADC_int

koji će prijeći na naš rukovatelj prekida s oznakom ADC_int kad god je ADC završio konverziju. Kako bismo trebali napisati naš rukovatelj prekida? Način na koji ADC radi je slijedeći izračun:

ADC = Vin x 1024 / Vref

Pa da vidimo što će se dogoditi ako pritisnem tipku "ponovno biranje" na tipkovnici. U tom slučaju napon na PC0 će se promijeniti na neku vrijednost, recimo 1,52 V, a budući da je Vref na 5 V imat ćemo:

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

i tako bi se prikazao kao 311. Da želimo ovo pretvoriti natrag u napon, jednostavno bismo obrnuli izračun. To ipak nećemo morati učiniti jer nas ne zanimaju stvarni naponi samo da bismo ih razlikovali. Kada je konverzija dovršena, rezultat se pohranjuje u 10-bitni broj smješten u ADCH i ADCL registre i mi smo uzrokovali njegovo "lijevo podešavanje" što znači da 10-bitovi počinju od bita 7 ADCH i idu dolje do bit 6 ADCL -a (ukupno ima 16 bita u ova dva registra i koristimo ih samo 10, tj. 1024 kanala). Mogli bismo imati rezultat "desno prilagođen" da želimo brisanjem ADLAR bita u ADMUX registru. Razlog zašto odabiremo lijevo prilagođen je zato što su naši signali dovoljno udaljeni da posljednje dvije znamenke broja kanala nisu relevantne i vjerojatno su samo buka pa ćemo razlikovati pritisnute tipke koristeći samo gornjih 8 znamenki, drugim riječima, samo ćemo morati pogledati ADCH da bismo shvatili koja je tipka pritisnuta. Dakle, naš rukovatelj prekida trebao bi jednostavno pročitati broj iz ADCH -a registrirajte, pretvorite taj broj u vrijednost tipkovnice, a zatim pošaljite tu vrijednost našim LED -ima za analizu registra kako bismo mogli provjeriti hoće li pritiskom na "9", svijetliti LED diode koje odgovaraju "00001001". Prije nego što krenemo daleko moramo prvo vidjeti što se prikazuje u ADCH -u kada pritisnemo različite gumbe. Zato napišimo jednostavan rukovatelj prekida koji samo šalje sadržaj ADCH -a na zaslon analizatora. Evo što nam je potrebno:

ADC_int: lds analizator, ADCH; učitajte vrijednost ADCH u naš analizatorbi EIFR, 0; poništite vanjsku zastavicu prekida tako da bude spremna za ponovni povratak

Do sada biste trebali moći samo kopirati kôd iz našeg analizatora u vodiču 5 te dodati ovaj prekid i postavke prebacivanja i pokrenuti ga. Vježba 2: Napišite kôd i pokrenite ga. Provjerite prikazuje li se ADCH na ekranu vašeg analizatora. Pokušajte pritisnuti istu tipku više puta. Dobivate li uvijek istu vrijednost u ADCH -u?

Korak 8: Iscrtajte vrijednosti pritiska na tipku

Mapirajte vrijednosti pritiska na tipku
Mapirajte vrijednosti pritiska na tipku

Ono što sada moramo učiniti je pretvoriti vrijednosti u ADCH -u u brojeve koji odgovaraju tipki koja je pritisnuta. To činimo tako da zapisujemo sadržaj ADCH -a za svaki pritisak na tipku, a zatim to pretvaramo u decimalni broj kao što sam učinio na slici. U našoj rutini rukovanja prekidima razmotrit ćemo cijeli niz vrijednosti koje odgovaraju svakom pritisku tipke, tako da će ADC preslikati sve u tom rasponu na zadani pritisak tipke.

Vježba 3: Učinite ovo mapiranje, a zatim ponovno napišite svoju rutinu prekida ADC-a.

Evo što sam dobio za svoje (vaše će vrlo vjerojatno biti drugačije). Primijetite da sam ga postavio s rasponom vrijednosti za svaki pritisak tipke.

ADC_int:; Vanjski analizator rukovatelja prekidima CLR; pripremiti se za nove brojeve brojevaH, ADCH; ADC se ažurira kada se čita ADCH clccpi gumbH, 240brlo PC+3; ako je ADCH veći onda je to 1ldi analizator, 1; dakle analizator opterećenja s povratkom od 1 rjmp; i gumb za povratak clccpiH, 230; ako je ADCH veći, tada je 2brlo PC+3ldi analizator, 2rjmp povratna clccpi tipkaH, 217brlo PC+3ldi analizator, 3rjmp povratna clccpi tipkaH, 203brlo PC+3ldi analizator, 4rjmp povratna clccpi tipkaH, 187brlo PC+3ldi analizator, 5rjmp povratna clc, 155brlo PC+3ldi analizator, 6rjmp povratna clccpi tipkaH, 127brlo PC+3ldi analizator, 255; postavit ćemo bljeskalicu kao sve onrjmp povratne clccpi tipkeH, 115brlo PC+3ldi analizator, 7rjmp povratne clccpi tipkeH, 94brlo PC+3ldi analizator, 8rjmp povratne clccpi tipkeH, 62brlo PC+3ldi analizator, 9rjmp povratne clccpi tipkeH, 37brlo PC+3ldi analizator, 0b11110000; zvjezdica je gornja polovica onrjmp povratne clccpi tipke H, 28brlo PC+3ldi analizator, 0rjmp povratna clccpi tipkaH, 17brlo PC+3ldi analizator, 0b00001111; hash znak je donja polovica onrjmp return clccpi gumbH, 5brlo PC+3ldi analizator, 0b11000011; ponovno biranje je gornja 2 donja 2rjmp povratni ldi analizator, 0b11011011; u protivnom je došlo do greške return: reti

Korak 9: Kôd i video za verziju 1

Priložio sam svoj kôd za ovu prvu verziju upravljačkog programa tipkovnice. U ovom morate pritisnuti tipku, a zatim pritisnuti tipku kako bi ADC pročitao ulaz s tipkovnice. Ono što bismo radije imali je gumb, već umjesto toga signal za pretvorbu dolazi iz samog pritiska tipke. Vježba 3: Sastavite i prenesite ovaj kôd i isprobajte ga. Možda ćete morati promijeniti različite pragove pretvorbe koji odgovaraju vašim naponima pritiska na tipku jer se vjerojatno razlikuju od mojih. Što će se dogoditi ako pokušate koristiti ulaz s tipkovnice i za ADC0 i za vanjski pin za prekid umjesto putem gumba? Priložit ću i video zapis ove prve verzije našeg upravljačkog programa za pritiskanje tipke. Primijetit ćete da u mom kodu postoji odjeljak koji inicijalizira Stack Pointer. Postoje različiti registri koje želimo gurnuti i iskočiti iz hrpe kada manipuliramo varijablama i što sve ne, a postoje i registri koje bismo kasnije mogli spremiti i vratiti. Na primjer, SREG je registar koji se ne čuva tijekom prekida, pa se različite zastavice koje su postavljene i izbrisane kao rezultat operacija mogu promijeniti ako se prekid dogodi usred nečega. Zato je najbolje ako pritisnete SREG na hrpu na početku rukovatelja prekidom, a zatim ga ponovno iskočite na kraju rukovatelja prekidima. Postavio sam ga u kôd kako bih pokazao kako je inicijaliziran i predvidio kako će nam kasnije trebati, ali budući da nas nije briga što će se dogoditi sa SREG -om tijekom prekida u našem kodu, za to nisam koristio hrpu. Također primijetite da sam koristio operaciju pomaka za postavljanje različitih bitova u registre prilikom inicijalizacije. Na primjer u retku:

ldi temp, (1 <> st EICRA, temp

Naredba "<<" u prvom retku koda iznad je operacija pomaka. U biti uzima binarni broj 1, koji je 0b00000001 i pomiče ga ulijevo za iznos broja ISC01. Ovo je položaj bita pod imenom ISC01 u EICRA registru. Budući da je ISC01 bit 1, broj 1 se pomiče u lijevi 1 položaj i postaje 0b00000010. Slično, drugi, ISC00, bit je 0 EICRA -e, pa je pomak broja 1 nulti položaj ulijevo. Ako još jednom pogledate datoteku m328Pdef.inc koju ste preuzeli u prvom vodiču i od tada koristite evrr, vidjet ćete da je to samo dugačak popis ".equ" izraza. Vidjet ćete da je ISC01 jednak 1. Asembler zamjenjuje svaku njegovu instancu s 1 prije nego što uopće počne sastavljati bilo što. Oni su samo nazivi za registrske bitove koji nama ljudima pomažu čitati i pisati kôd. Sada je okomita linija između dviju gore navedenih operacija pomaka logička operacija "ili". Evo jednadžbe:

0b00000010 | 0b00000001 = 0b00000011

i to je ono što učitavamo (koristeći "ldi") u temp. Razlog zašto ljudi koriste ovu metodu za učitavanje vrijednosti u registar je taj što omogućuje korištenje imena bita umjesto samo broja, što kôd čini znatno lakšim za čitanje. Postoje i dvije druge tehnike koje smo koristili. Koristimo upute "ori" i "andi". Oni nam omogućuju postavljanje i brisanje bitova bez mijenjanja bilo kojeg drugog bita u registru. Na primjer, kada sam koristio

ori temp, (1

ova "ili" temp s 0b00000001 koja stavlja 1 u nulti bit i ostavlja sve ostale nepromijenjene. Također kad smo pisali

andi temp, 0b11111110

ovo mijenja nulti bit temp na 0 i ostavlja sve ostale nepromijenjene.

Vježba 4: Trebali biste proći kroz kôd i pobrinuti se da razumijete svaki redak. Možda će vam biti zanimljivo pronaći bolje metode za rad i napisati bolji program. Postoji stotinu načina kodiranja stvari i prilično sam uvjeren da možete pronaći puno bolji način od mog. Također možete pronaći (ne daj Bože!) Pogreške i propuste. U tom bih slučaju želio čuti o njima kako bi se mogli popraviti.

U redu, sad da vidimo možemo li se riješiti tog suvišnog gumba …

Korak 10: Kôd za verziju 2

Najjednostavniji način da se riješite gumba je da ga potpuno uklonite, zaboravite ulaz na PB2 i samo prebacite ADC na "Free Running Mode".

Drugim riječima, jednostavno promijenite ADCSRB registar tako da su sve ADTS2, ADTS1 i ADTS0 nule.

Zatim postavite ADSC bit u ADCSRA -i na 1 koji će započeti prvu pretvorbu.

Sada ga prenesite na svoj mikrokontroler i vidjet ćete da se na zaslonu pojavljuje točan broj dok pritisnete gumb i samo dok pritisnete gumb. To je zato što ADC kontinuirano uzorkuje port ADC0 i prikazuje vrijednost. Kad maknete prst s gumba, "odbijanje gumba" uzrokovat će vrlo brzo nekoliko slučajnih vrijednosti, a zatim će se vratiti na 0V ulaz. U našem kodu imamo da se ovaj 0V pojavljuje kao 0b11011011 (jer pritiskanje tipke `0 'već koristi vrijednost prikaza 0b00000000)

Ovo nije rješenje koje želimo iz dva razloga. Prvo ne želimo držati gumb. Želimo ga jednom pritisnuti i prikazati broj (ili upotrijebiti u nekom novom kodu u kasnijem vodiču). Drugo, ne želimo kontinuirano uzorkovati ADC0. Želimo da uzme jedno očitanje, pretvori ga, a zatim zaspi sve dok novi pritisak na tipku ne pokrene novu pretvorbu. Način rada u slobodnom načinu rada najbolji je ako jedino što želite da mikrokontroler radi jest da stalno čita neki analogni ulaz - na primjer, ako želite prikazati temperature u stvarnom vremenu ili nešto slično.

Pa hajde da nađemo još jedno rješenje …

Korak 11: Kako se riješiti gumba? Verzija 3

Kako se riješiti gumba? Verzija 3
Kako se riješiti gumba? Verzija 3

Postoje brojni načini na koje bismo mogli nastaviti. Prvo bismo mogli dodati hardver kako bismo se riješili gumba. Na primjer, možemo pokušati staviti tranzistor u krug na izlaznoj liniji pritiska tipke kako bi uzeo mali kap struje s izlaza i poslao impuls od 5 V na prekidač prekida PD2.

Međutim, to bi u najmanju ruku bilo previše bučno, au najgorem slučaju ne bi dalo dovoljno vremena za točno očitavanje pritiska na tipku jer naponski izlaz tipkovnice ne bi imao vremena za stabilizaciju prije nego što se uhvati očitanje ADC -a.

Stoga bismo radije smislili softversko rješenje. Ono što bismo htjeli učiniti je dodati prekid na pin PD2 i za njega napisati rukovatelj prekida koji poziva jedno čitanje pina tipkovnice. Drugim riječima, rješavamo se prekida autotriggera iz ADC -a i dodajemo vanjski prekid koji poziva ADC unutar njega. Na taj način signal za očitavanje ADC -a dolazi nakon što se već pojavio signal PD2, a to bi moglo dati stvarima dovoljno vremena da se stabilizuju na točan napon prije nego se očita i konvertira pin PC0. I dalje bismo imali prekid završetka ADC -a koji rezultat šalje na prikaz analizatora na kraju.

Ima smisla? Pa učinimo to…

Pogledajte novi priloženi kôd.

Vidite sljedeće promjene:

  1. Dodali smo rjmp na adresi.org 0x0002 za rukovanje vanjskim prekidom INT0
  2. Promijenili smo EIMSK registar kako bismo naznačili da želimo prekinuti na INT0 pinu
  3. Promijenili smo pin ADATE u registru ADCSRA kako bismo onemogućili automatsko pokretanje
  4. Riješili smo se postavki ADCSRB -a jer su nevažne kada je ADATE isključen
  5. Ne moramo više poništavati zastavicu vanjskog okidača jer rutina prekida INT0 to radi automatski kad se završi - prethodno nismo imali rutinu prekida, samo smo aktivirali ADC signala na tom pinu, pa smo morali očisti tu zastavu ručno.

Sada u rukovatelju prekida jednostavno zovemo jednu konverziju iz ADC -a.

Vježba 5: Pokrenite ovu verziju i pogledajte što će se dogoditi.

Korak 12: Kôd i video za radnu verziju

Kao što smo vidjeli u posljednjoj verziji, prekid gumba ne radi baš najbolje jer se prekid pokreće na rastućem rubu da bi se prikvačio PD2, a zatim rukovatelj prekida poziva ADC konverziju. Međutim, ADC tada dobiva očitanje napona prije nego što se stabilizirao, pa čita besmislice.

Ono što nam je potrebno je uvesti kašnjenje između prekida na PD2 i očitanja ADC -a na PC0. To ćemo učiniti dodavanjem timera/brojača, prekida prelijevanja brojača i rutine odgode. Srećom, već znamo kako to učiniti iz vodiča 3! Stoga ćemo samo kopirati i zalijepiti relevantni kod od tamo.

Dao sam rezultirajući kôd i video zapis koji ga prikazuje u radu.

Primijetit ćete da očitanja nisu tako točna kao što bi se neko nadao. To je vjerojatno zbog nekoliko izvora:

  1. tapkamo s izlaznog napona tipkovnice za okidanje na PD2 što utječe na očitanje u PC0.
  2. zapravo ne znamo koliko dugo trebamo odgoditi nakon okidača da bismo dobili najbolje očitanje.
  3. potrebno je nekoliko ciklusa za dovršetak ADC konverzije što znači da ne možemo brzo aktivirati tipkovnicu.
  4. vjerojatno postoji šum u samoj tipkovnici.
  5. itd…

Dakle, iako smo uspjeli natjerati tipkovnicu da radi, a sada smo je mogli koristiti u aplikacijama korištenjem vrijednosti pritiska na neki drugi način umjesto da ih samo ispišemo na zaslon analizatora, nije baš točna i vrlo je neugodna. Zato mislim da je najbolji način povezivanja tipkovnica jednostavno staviti svaki izlaz s tipkovnice u drugi priključak i odlučiti koju tipku pritisnuti koji portovi vide napon. To je jednostavno, vrlo brzo i vrlo točno.

Zapravo, postoje samo dva razloga zašto biste htjeli upravljati tipkovnicom na način na koji smo to učinili ovdje:

  1. Koristi samo 2 pina na našem mikrokontroleru umjesto 8.
  2. Sjajan je projekt prikazati različite aspekte ADC-a na mikrokontroleru koji se razlikuju od standardnih stvari koje možete pronaći ondje, poput očitanja temperature, okretanja potenciometara itd. Želio sam primjer aktiviranih pojedinačnih očitanja i vanjskog automatskog okidanja pinova nego samo slobodan rad u načinu na koji CPU guta.

U svakom slučaju, evo posljednjih par vježbi za vas:

Vježba 6: Ponovno upišite rukovatelj prekida prekida ADC konverzije za korištenje Tablice traženja. Tj. Tako da testira analognu vrijednost s prvom stavkom u tablici, a ako je veća, vraća se iz prekida, ako nije tada povećava Z do sljedeće stavke u tablici i ponovno se vraća na test. To će skratiti kôd i očistiti rutinu prekida te će izgledati ljepše. (Navest ću moguće rješenje kao sljedeći korak) Vježba 7: Priključite tipkovnicu na 8 pinova na mikrokontroler i napišite jednostavan upravljački program za nju i iskusite koliko je ljepša. Možete li se sjetiti nekoliko načina da poboljšamo našu metodu?

To je sve za ovaj vodič. Konačnu verziju priložio sam pokazivačima. Dok se približavamo našem konačnom cilju, u Tutorijalu 9 ćemo još jednom koristiti tipkovnicu kako bismo pokazali kako njome upravljati sa sedam segmentnih zaslona (i izgraditi nešto zanimljivo što koristi dodatne tipke na tipkovnici telefona), a zatim ćemo umjesto toga prebacite se na upravljanje stvarima pritiskom na tipke (budući da se ta metoda bolje uklapa u krajnji proizvod prema kojem gradimo s ovim vodičima), a tipkovnicu ćemo jednostavno odložiti.

Vidimo se sljedeći put!

Preporučeni: