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, Juli
Anonim
Vodič za AVR asembler 7
Vodič za AVR asembler 7

Dobro došli u Vodič 7!

Danas ćemo prvo pokazati kako ukloniti tastaturu, a zatim ćemo pokazati kako koristiti analogne ulazne portove za komunikaciju s tastaturom. To ćemo učiniti koristeći prekide i jednu žicu kao ulaz. Oklopit ćemo tastaturu tako da svaki pritisak na taster šalje jedinstveni napon na analogni ulaz koji će nam omogućiti da razlikujemo po naponu koji je taster pritisnut. 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 i tako ćemo preduzmite stvari u nekoliko faza na putu 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. tastaturu. Možete kupiti jednu ili možete učiniti ono što sam ja uradio i očistiti jednu.
  2. 2 ženska zaglavlja za tastaturu (ako ih čistite)
  3. spojne žice
  4. matič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 tastaturu i ne morate je tražiti.

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

Korak 1: Očistite tastaturu 1

Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1
Očistite tastaturu 1

Davno, kada 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 dosadan zvuk kada vas je neko nazvao (nije da današnje melodije zvona "Justin Bieber" nisu jednako dosadne). U svakom slučaju, ovi uređaji su imali tastature na sebi koje su bile vrlo jednostavno ožičene, pa ih je lako ukloniti, a na sebi imaju 2 dodatna ključa ("ponovno biranje" i "blic") sa tastatura koje možete kupiti i koje ćete možda htjeti prenamijeniti kao "tipke sa strelicama", "tipke izbornika" ili nešto drugo. Dakle, počet ćemo sa uklanjanjem tastature sa starog telefona. Prvo uzmite telefon (ja koristim GE kao što je prikazano na slikama) i odvojite ga da otkrijete ožičenje. Zatim uzmite dlijeto i otkačite male plastične ručice koje drže tipkovnicu i uklonite tipkovnicu.

Korak 2: Očistite tastaturu 2

Očistite tastaturu 2
Očistite tastaturu 2
Očistite tastaturu 2
Očistite tastaturu 2
Očistite tastaturu 2
Očistite tastaturu 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 tastaturu.

Zatim ponovno uključite tipkovnicu pomoću malih klinova koji ostanu 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 tastature formira nove "dugmad" koja će držati tastaturu na mestu kao i do sada.

Volim pročistiti tri zvučnika, a možda i druge stvari poput prekidača i šta-ne koje su na ploči. Međutim, ovaj put neću tražiti prekidače i ostalo jer trenutno imamo druge ciljeve. Takođe, tu je i linearni IC TA31002 koji predstavlja zvono za telefon. Tehnički list se lako nalazi i preuzima na mreži pružajući pinout i mogućnosti. 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 od toga. Ko zna.

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

Korak 3: Očistite tastaturu 3

Očistite tastaturu 3
Očistite tastaturu 3
Očistite tastaturu 3
Očistite tastaturu 3
Očistite tastaturu 3
Očistite tastaturu 3

Upotrijebite fitilj za odpakivanje 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. Vjerovatno ćete morati zaglaviti zaglavlja tako da budu 4-pinska.

Sada kada 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. Ovo će vam omogućiti mapiranje ključeva. Teško je vidjeti kako su ključevi spojeni na izlaze gledajući krug, ali ako koristite multimetar, možete ga priključiti na bilo koja dva pina, a zatim pritisnuti tipke dok ne vidite broj na ekranu umjesto otvorenog kola. Ovo će biti pinout za taj ključ.

Na ovaj način mapirajte sve ključeve za izlazne pinove.

Korak 4: Povežite tastaturu

Ožičite tastaturu
Ožičite tastaturu
Ožičite tastaturu
Ožičite tastaturu

Sada slijedite dijagram ožičenja i povežite tastaturu sa 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 dugmadi signal će biti 0V, a kada se pritisne svaki od različitih tastera ulaz na analogni port će se kretati između 0V i 5V sa različitom količinom u zavisnosti od toga koji taster je pritisnut. Odabrali smo vrijednosti otpornika tako da svaki put sadrži otpor koji se razlikuje od ostalih. Analogni port 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 port 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, tako da bi mikrokontroler mogao lako odlučiti koji je taster pritisnut. Veliki problem je što je cijeli sustav vrlo bučan pa ćemo morati odabrati raspon napona za preslikavanje na svaki pritisak na gumb - ali na to ćemo ući kasnije.

Imajte na umu da možemo upravljati tipkovnicom sa 14 tipki koristeći samo jednu liniju ulaza u kontroler. 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 prenijeti u našu potprogramu 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 tastaturu na svoj analizator

Priključite tastaturu na svoj analizator
Priključite tastaturu na svoj analizator
Priključite tastaturu na svoj analizator
Priključite tastaturu na svoj analizator

Slike pokazuju kako želimo spojiti tastaturu na mikrokontroler tako da možemo vidjeti izlaz na ekranu našeg analizatora. U suštini jednostavno povezujemo izlaz sa tastature na PortC pin 0, koji se takođe naziva ADC0 na ATmega328P.

Međutim, postoji nekoliko dodatnih stvari. Takođe ćemo povezati dugme sa PD2. Tj. povežite žicu s vaše 5V šine do gumba, a s druge strane gumba do PD2, i na kraju, želimo odspojiti AREF pin sa naše 5V šine i umjesto toga ostaviti ga isključenim. Mogli bismo umetnuti kondenzator za odvajanje od 0,1 mikrofarad ako želimo. Ovo je keramički kondenzator sa 104 na njemu. 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. Postavit ćemo PD2 kao izlazni pin na 0V i aktivirat ćemo na pozitivnom rubu tog pina. Želimo da ivica nestane odmah kad otpustimo dugme pa ćemo umetnuti ovaj otpornik za povlačenje.

Razlog zašto želimo ovo dugme je taj što želimo pokrenuti naš analogno-digitalni pretvarač sa 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 posebnog gumba, ali zbog načina na koji vrijeme funkcionira 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 buke i vremena koji dolaze s pokretanjem istog pritiska na dugme koje želimo pročitati.

Dakle, za sada, način na koji funkcionira je da ćemo pritisnuti tipku, zatim pritisnuti dugme za aktiviranje ADC -a, a zatim pustiti i nadamo se da će se binarna vrijednost tipke 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 ovo 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. Koristit ćemo AREF kao referentni napon, a izlaz naše 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, kao i poglavlje 24 o Analogno-digitalnom pretvaraču prije nego što dobijemo započeli ili barem pripremili te odjeljke za referencu. Da bismo postavili mikrokontroler tako da zna što treba učiniti s analognim ulaznim signalom i kako komunicirati s našim programom, prvo moramo postaviti nekoliko različitih ADC -a povezane registrske bitove. Oni su u suštini ekvivalentni starim prekidačima na prvim računarima. Ili 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 zatvorena vrata, 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 ovim funkcijama mikrokontrolera, što je jedna od atraktivnih stvari u tome. To je više "na rukama", a daleko manje se dešava "iza scene". Zato nemojte misliti da postavljate ove registre kao dosadan zadatak. To je ono što čini asemblerski jezik zanimljivim! Stječemo vrlo lični odnos s unutrašnjim funkcioniranjem i logikom čipa i tjeramo ga da radi upravo ono što želimo - ni manje ni više. 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 je u suštini način isključivanja raznih stvari koje troše energiju kada vam nisu potrebne. 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, tako da to zaista ne moramo činiti. Međutim, ja ga dodajem jer ako ikada budete koristili port koji nije 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 portova kao ulaz, a možete ih promijeniti i 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 "podesi lijevo", o ovom izboru ćemo razgovarati u sljedećem koraku.
  5. Postavite bit ADC0D u registru za onemogućavanje digitalnih ulaza (DIDR0) da biste isključili digitalni ulaz na PC0. Taj port 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ćoj ivici naponskog signala na INT0 pin (PD2), pogledajte stranicu 71.
  7. Obrišite bitove INT0 i INT1 u Registru vanjske maske prekida (EIMSK) kako biste naznačili da ne koristimo prekide na ovom pinu. Ako bismo omogućili prekide na ovom pinu, trebao bi nam rukovatelj prekida na adresi 0x0002, ali umjesto toga postavljamo ga tako da signal na ovom pinu pokreće ADC konverziju, čije se dovršenje obrađuje prekidom potpunog pretvaranja ADC -a na adresa 0x002A. Pogledajte stranicu 72.
  8. Postavite bit za omogućavanje ADC -a (ADEN) (bit 7) u ADC kontrolnom registru statusa A (ADCSRA) da biste omogućili ADC. Pogledajte stranicu 249.
  9. Mogli bismo započeti jednu konverziju postavljanjem ADC početnog konverzijskog bita (ADSC) svaki put kada bismo htjeli očitati analogni signal, međutim, za sada bismo radije dali da se automatski čita kad god netko pritisne dugme, 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 koji je PD2 koji se također naziva INT0 (Vanjski zahtjev za prekid 0). To činimo prebacivanjem različitih bitova u ADCSRB registru (vidi Tabelu 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 nešto slično), postavili bismo ovo na način rada slobodnog trčanja. Metoda koju koristimo za postavljanje aktiviranja na PD2 pokreće čitanje ADC -a analognog porta PC0 bez izazivanja prekida. Prekid će doći kada se konverzija dovrši.
  12. Omogućite bit za omogućavanje prekida ADC (ADIE) u registru ADCSRA tako da će, kada se završi analogno -digitalna konverzija, generirati prekid za koji možemo zapisati rukovatelj prekida i staviti na.org 0x002A.
  13. Postavite bit I u SREG -u da biste omogućili prekide.

Vježba 1: Obavezno 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ća ivica otkrivena na PD2 pokrenuti analogno -digitalnu konverziju na PC0, a kada se ova konverzija završi, izbaciće prekid ADC Conversion Complete. Sada želimo nešto učiniti s ovim prekidom. Ako pogledate 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 funkcionira ADC je slijedeći izračun:

ADC = Vin x 1024 / Vref

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

ADC = (1.52V) x 1024 / 5V = 311.296

i tako bi se prikazao kao 311. Da želimo ovo pretvoriti natrag u napon, jednostavno bismo obrnuli proračun. To ipak nećemo morati učiniti jer nas ne zanimaju stvarni naponi samo da bismo ih razlikovali. Kada je konverzija završena, rezultat se pohranjuje u 10-bitni broj smješten u ADCH i ADCL registre i mi smo uzrokovali njegovo "lijevo prilagođavanje", što znači da 10-bitni počinju od bita 7 ADCH-a 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" ako ž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 su vjerojatno samo buka pa ćemo razlikovati pritisnute tipke koristeći samo gornjih 8 znamenki, drugim riječima, samo ćemo morati pogledati ADCH da bismo shvatili koje je dugme pritisnuto. 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 diodama analizatora registra kako bismo mogli provjeriti da li će pritiskanje "9" izazvati da LED diode koje odgovaraju "00001001" zasvijetle. Prije nego što krenemo iako moramo prvo vidjeti šta se prikazuje u ADCH -u kada pritisnemo različita dugmeta. Zato napišimo jednostavan rukovatelj prekida koji samo šalje sadržaj ADCH -a na ekran analizatora. Evo što nam je potrebno:

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

Do sada biste trebali moći samo kopirati kôd iz našeg analizatora u vodiču 5 i 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 isti taster više puta. Da li uvijek dobivate istu vrijednost u ADCH -u?

Korak 8: Mapirajte 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 što ispisujemo sadržaj ADCH -a za svaki pritisak na tipku, a zatim ga 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 ponovo napišite svoju rutinu prekida ADC-a.

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

ADC_int:; Eksterni analizator rukovatelja prekidima CLR; pripremite se za nove brojeve dugmetaH, ADCH; ADC se ažurira kada se čita ADCH clccpi dugmeH, 240brlo PC+3; ako je ADCH veći onda je to 1ldi analizator, 1; pa analizator opterećenja sa povratkom od 1 rjmp; i vratite clccpi dugmeH, 230; ako je ADCH veći od 2brlo PC+3ldi analizatora, 2rjmp povratnog clccpi dugmetaH, 217brlo PC+3ldi analizatora, 3rjmp povratnog clccpi dugmetaH, 203brlo PC+3ldi analizatora, 4rjmp povratnog clccpi dugmetaH, 187brlo PC+3ldi analizatora, 5rjmp povratnog clc, 155brlo PC+3ldi analizator, povratna clccpi tipka 6rjmpH, 127brlo PC+3ldi analizator, 255; postavićemo blic kao sve onrjmp povratno dugme clccpiH, 115brlo PC+3ldi analizator, 7rjmp povratno clccpi dugmeH, 94brlo PC+3ldi analizator, 8rjmp dugme povratka clccpiH, 62brlo PC+3ldi analizator, 9rjmp povratno clccpi dugmeH, 37brlo PC+3ldi analizator, 0b11110000; zvjezdica je gornja polovica onrjmp povratnog clccpi dugmeta H, 28brlo PC+3ldi analizatora, 0rjmp povratnog clccpi dugmetaH, 17brlo PC+3ldi analizatora, 0b00001111; hash znak je donja polovina onrjmp return clccpi dugmeH, PC 5brlo+3ldi analizator, 0b11000011; ponovno biranje je gornje 2 dolje 2rjmp return ldi analizator, 0b11011011; u suprotnom 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 tastature. U ovom slučaju morate pritisnuti tipku, a zatim pritisnuti dugme kako biste naveli ADC da pročita unos sa tastature. Ono što bismo radije imali je dugme, već umjesto toga signal za izvršenje konverzije dolazi iz samog pritiska tipke. Vježba 3: Sastavite i učitajte ovaj kôd i isprobajte ga. Možda ćete morati promijeniti različite pragove pretvorbe kako bi odgovarali vašim naponima pritiska na tipku jer se oni vjerojatno razlikuju od mojih. Što se događa 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 tipke. Primijetit ćete da u mom kodu postoji odjeljak koji inicijalizira Stack Pointer. Postoje različiti registri koje bismo htjeli gurnuti i iskočiti iz hrpe kada manipuliramo varijablama i šta sve ne, a postoje i registri koje bismo kasnije mogli spremiti i vratiti. Na primjer, SREG je registar koji se ne čuva u prekidima, pa se različite zastavice koje se postavljaju i brišu 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 ponovo iskočite na kraju rukovatelja prekida. 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 tokom prekida u našem kodu, nisam za to koristio stek. da sam koristio operaciju shift za postavljanje različitih bitova u registre prilikom inicijalizacije. Na primjer u redu:

ldi temp, (1 <> sts EICRA, temp

Naredba "<<" u prvom retku koda iznad je operacija pomaka. U suštini 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 lijevu 1 poziciju i postaje 0b00000010. Slično, drugi, ISC00, je bit 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 u čitanju i pisanju koda. Sada je okomita linija između dvije gore navedene operacije pomaka logička operacija "ili". Evo jednačine:

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 mnogo lakšim za čitanje. Postoje i dvije druge tehnike koje smo koristili. Koristimo upute "ori" i "andi". Oni nam omogućavaju 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đe kada 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 mnogo bolji način od mog. Također možete pronaći (ne daj Bože!) Greške i propuste. U tom slučaju bih volio čuti o njima kako bi se mogli popraviti.

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

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 na 1 koji će započeti prvu konverziju.

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

Ovo nije rješenje koje želimo iz dva razloga. Prvo ne želimo držati dugme. Želimo ga pritisnuti jednom i prikazati broj (ili koristiti u nekom novom kodu u kasnijem vodiču). Drugo, ne želimo stalno uzorkovati ADC0. Želimo da uzme jedno očitanje, konvertira ga, a zatim zaspi sve dok novi pritisak na tipku ne pokrene novu konverziju. Režim slobodnog rada je najbolji 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 dugmeta? Verzija 3

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

Postoje brojni načini na koje možemo 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, a u najgorem slučaju ne bi dalo dovoljno vremena za precizno očitavanje pritiska na tipku jer izlazni napon tipkovnice ne bi imao vremena za stabilizaciju prije nego što se uhvati očitanje ADC -a.

Zato 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 PD2 signal već dogodio i to bi moglo dati stvarima dovoljno vremena da se stabilizuju na tačan napon prije nego što se očita i konvertuje pin PC0. I dalje bismo imali prekid završetka ADC -a koji rezultat šalje na prikaz analizatora na kraju.

Ima smisla? Pa uradimo to…

Pogledajte priloženi novi 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 pinu INT0
  3. Promijenili smo ADATE pin u registru ADCSRA kako bismo onemogućili automatsko pokretanje
  4. Riješili smo se postavki ADCSRB -a jer su irelevantne kada je ADATE isključen
  5. Više ne moramo poništavati zastavicu vanjskog okidača jer rutina prekida INT0 to radi automatski kada se završi - prethodno nismo imali rutinu prekida, samo smo aktivirali ADC signala na tom pinu, pa smo morali očistite 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, prekidanje gumba ne radi baš najbolje jer se prekid pokreće na rastućoj ivici za pričvršćivanje 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 čitanja ADC -a na PC0. To ćemo učiniti dodavanjem mjerača vremena/brojača, prekida prelijevanja brojača i rutine odgode. Srećom, već znamo kako to učiniti iz vodiča 3! Zato ć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 brojnih izvora:

  1. prisluškujemo iz izlaznog napona tastature da se aktivira na PD2 što utiče na očitavanje u PC0.
  2. mi zapravo ne znamo koliko dugo trebamo odgoditi nakon okidača da bismo dobili najbolje očitanje.
  3. potrebno je nekoliko ciklusa da se ADC konverzija dovrši, što znači da ne možemo brzo aktivirati tastaturu.
  4. verovatno postoji šum u samoj tastaturi.
  5. itd…

Dakle, iako smo uspjeli natjerati tipkovnicu da radi i sada bismo je mogli koristiti u aplikacijama korištenjem vrijednosti pritiska na neki drugi način umjesto da ih samo ispišemo na prikaz analizatora, to nije baš točno i vrlo je neugodno. Zato mislim da je najbolji način povezivanja tastature jednostavno staviti svaki izlaz sa tastature u drugi port i odlučiti koja tipka je pritisnuta od kojih portova vidi napon. To je lako, vrlo brzo i vrlo precizno.

U stvari, 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. Odličan je projekt koji prikazuje različite aspekte ADC-a na mikrokontroleru koji se razlikuju od standardnih stvari koje možete pronaći tamo, poput očitanja temperature, okretanja potenciometra itd. Htio sam primjer aktiviranih pojedinačnih očitanja i automatskog aktiviranja vanjskog pina. radije nego samo besplatni način rada za prožimanje CPU-a.

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

Vježba 6: Ponovno upišite kompletan rukovalac prekidima ADC konverzije da biste koristili Tablicu 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, onda povećava Z do sljedeće stavke u tablici i vraća se natrag na test. Ovo će skratiti kôd i očistiti rutinu prekida i učiniti ga ljepšim. (Navešću moguće rešenje kao sledeći korak) Vežba 7: Povežite tastaturu na 8 pinova na mikrokontroleru i napišite jednostavan upravljački program za nju i iskusite koliko je lepš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 tastaturu da pokažemo kako se njome upravlja sa sedam segmentnih ekrana (i izgraditi nešto zanimljivo što koristi dodatne tastere na tastaturi telefona), a zatim ćemo umjesto toga pređite na upravljanje stvarima pritiskom na tipke (budući da se ta metoda bolje uklapa u krajnji proizvod prema kojem gradimo pomoću ovih vodiča) i jednostavno ćemo odložiti tastaturu.

Vidimo se sljedeći put!

Preporučuje se: