Përmbajtje:

Tutoriali i AVR Assembler 7: 12 hapa
Tutoriali i AVR Assembler 7: 12 hapa

Video: Tutoriali i AVR Assembler 7: 12 hapa

Video: Tutoriali i AVR Assembler 7: 12 hapa
Video: FLOWCODE УРОК 7 прерывания 2024, Nëntor
Anonim
Tutoriali i AVR Assembler 7
Tutoriali i AVR Assembler 7

Mirësevini në Tutorial 7!

Sot ne do të tregojmë së pari se si të pastrojmë një tastierë, dhe më pas të tregojmë se si të përdorim portat analoge të hyrjes për të komunikuar me tastierën. Ne do ta bëjmë këtë duke përdorur ndërprerjet dhe një tel të vetëm si hyrje. Ne do ta lidhim tastierën në mënyrë që çdo shtypës të dërgojë një tension unik në hyrjen analoge e cila do të na lejojë të dallojmë nga tensioni se cili çelës është shtypur. Pastaj ne do të nxjerrim numrin e shtypur në analizuesin e regjistrit tonë për të treguar se gjithçka po ndodh ashtu siç duhet. Ka një numër kurthesh në të cilat mund të futeni kur përdorni konvertuesin analog në dixhital (ADC) në ATmega328p dhe kështu ne do të merrni gjërat në disa faza gjatë rrugës për t'u përpjekur dhe kuptuar se si t'i shmangni ato. Ne gjithashtu do të shohim pse përdorimi i konvertuesit analog në dixhital nuk është mënyra më e mirë për të kontrolluar një tastierë edhe pse përdor më pak porte në mikrokontrolluesin tuaj. Në këtë tutorial do t'ju duhet:

  1. një tastierë Mund të blini një ose mund të bëni atë që bëra unë dhe të pastroni një.
  2. 2 kokë femra për tastierën (nëse po pastroni një)
  3. telat lidhës
  4. një dërrasë buke
  5. 4 rezistente 1 Kohm
  6. Rezistencë 1 15 Kohm
  7. 1 rezistencë 3.3 Kohm
  8. 1 rezistencë 180 ohm
  9. Rezistencë 1 680 ohm
  10. një multimetër dixhital
  11. analizuesi juaj nga Tutorial 5

Ju mund të dëshironi të kaloni hapat e parë nëse keni tashmë një tastierë dhe nuk keni nevojë të pastroni një.

Këtu keni një lidhje me koleksionin e plotë të mësimeve të mia të montuesit AVR:

Hapi 1: Pastroni një tastierë 1

Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1
Zgjedhja e një tastiere 1

Shumë kohë më parë, kur edhe gjyshërit tuaj ishin fëmijë të thjeshtë, njerëzit i përdornin këto pajisje me pamje të çuditshme, që kishin kabllo të gjatë të lidhur në mur, për të komunikuar me njëri -tjetrin. Ata u quajtën "telefona" dhe zakonisht ishin gjëra të lira plastike që bënin një tingull të bezdisshëm kur dikush ju thërriste (jo se meloditë e sotme "Justin Bieber" nuk janë njësoj të bezdisshme). Në çdo rast, këto pajisje kishin tastiera të cilat ishin të lidhura shumë thjeshtë dhe janë të lehta për tu pastruar dhe kanë 2 çelësa shtesë mbi to ("redial" dhe "flash") nga tastierat që mund të blini dhe që mund të dëshironi t'i ripërdoroni si "çelësat e shigjetave", "çelësat e menysë" ose diçka tjetër. Pra, ne do të fillojmë duke pastruar një tastierë nga një telefon i vjetër. Merrni së pari telefonin (unë përdor një GE siç tregohet në fotografi) dhe ndani atë për të zbuluar instalimet elektrike. Pastaj merrni një daltë dhe hiqni çelësat e vegjël plastikë që mbajnë tastierën dhe hiqni tastierën.

Hapi 2: Zgjedhja e një tastiere 2

Zgjedhja e një tastiere 2
Zgjedhja e një tastiere 2
Zgjedhja e një tastiere 2
Zgjedhja e një tastiere 2
Zgjedhja e një tastiere 2
Zgjedhja e një tastiere 2

Tani merrni një sharrë PVC dhe prerë plastikën nga rreth vrimave të kyçit dhe më pas prerë në skaj për të marrë thellësinë e duhur duke lënë një tastierë të hollë.

Pastaj vendoseni tastierën përsëri duke përdorur kunjat e vegjël që mbeten pasi i keni prerë majat e tyre në hapin e fundit dhe përdorni një hekur bashkues për të futur hekurin e nxehtë në secilën vrimë të kunjit e cila do të shkrijë plastikën dhe do ta përhapë atë mbi në fund të tastierës duke formuar "çelësa" të rinj të cilët do ta mbajnë tastierën në vend si më parë.

Më pëlqen të pastroj tre altoparlantët dhe ndoshta gjërat e tjera si çelsat dhe çfarë-jo që janë në tabelë. Sidoqoftë, këtë herë nuk do të pastroj çelësat dhe gjërat sepse kemi synime të tjera për momentin. Gjithashtu, ekziston një IC linear TA31002, i cili është një zile telefonike. Fleta e të dhënave gjendet lehtësisht dhe shkarkohet në internet duke dhënë pikun dhe veçoritë. Kështu që unë do ta lë atë të ngjitur në tabelë tani dhe pastaj do të luaj me të më vonë. Do të doja ta lidhja me një oshiloskop dhe të shikoja se çfarë sinjalesh të lezetshëm mund të nxjerr prej tij. Ndoshta edhe bëni një zile derë prej saj. Kush e di.

Gjithsesi sapo të keni mbaruar shkatërrimin e telefonit dhe pastrimin e pjesëve, ne do të përfundojmë duke bërë tastierën tonë.

Hapi 3: Pastroni një tastierë 3

Zgjedhja e një tastiere 3
Zgjedhja e një tastiere 3
Zgjedhja e një tastiere 3
Zgjedhja e një tastiere 3
Zgjedhja e një tastiere 3
Zgjedhja e një tastiere 3

Përdorni një fitil të shkrirjes dhe hiqni kabllot e shiritit nga fundi i tastierës duke u siguruar që vrimat në tabelën e qarkut të jenë të qarta dhe pastaj ngjitni dy kokë femra në tabelë ku janë vrimat. Ju ndoshta do të duhet të shkurtoni titujt tuaj në mënyrë që ato të jenë kokë me 4 kunja.

Tani që titujt janë bashkangjitur, mund ta lidhni në një pjatë, të merrni një multimetër dhe të provoni çelësat duke ngjitur multimetrin në kunjat e rastit dhe duke matur rezistencën. Kjo do t'ju lejojë të hartoni çelësat. Difficultshtë e vështirë të shihet se si çelësat lidhen me daljet duke shikuar qarkun, por nëse përdorni një multimetër mund ta lidhni atë në çdo dy kunja dhe më pas shtypni butonat derisa të shihni një numër në ekran në vend të një qarku të hapur Me Ky do të jetë çelësi për atë çelës.

Hartoni të gjitha çelësat për të nxjerrë kunjat në këtë mënyrë.

Hapi 4: Teli i tastierës

Teli i tastierës
Teli i tastierës
Teli i tastierës
Teli i tastierës

Tani ndiqni diagramin e instalimeve elektrike dhe lidhni tastierën në tabelën tuaj të bukës.

Si do të funksionojë kjo do të vendosim 5V në anën e majtë dhe ana e djathtë shkon në GND. Kunja e parë në të djathtë në diagram futet në kunjat e para analoge në mikrokontrolluesin Atmega328p. Kur nuk ka asnjë buton të shtypur, sinjali do të jetë 0V, dhe kur secili nga butonat e ndryshëm të shtypet, hyrja në portën analoge do të shkojë midis 0V dhe 5V me një sasi të ndryshme në varësi të cilës buton është shtypur. Ne zgjodhëm vlerat e rezistencës në mënyrë që secila rrugë të përmbajë një rezistencë që ishte e ndryshme nga pjesa tjetër. Porta analoge në mikrokontrollues merr një sinjal analog dhe e ndan atë në 1024 kanale të ndryshme midis 0V dhe 5V. Kjo do të thotë se çdo kanal ka një gjerësi 5V/1024 = 0.005 V/kanal = 5 mV/kanal. Pra, porti analog mund të dallojë tensionet hyrëse për sa kohë që ato ndryshojnë me më shumë se 5 mV. Në rastin tonë, ne kemi zgjedhur vlerat e rezistencës në mënyrë që çdo dy shtypje të tastit të dërgojnë një sinjal tensioni që ndryshon më shumë se kaq, kështu që mikrokontrolluesi duhet të jetë lehtësisht në gjendje të vendosë se cili çelës është shtypur. Problemi i madh është se i gjithë sistemi është shumë i zhurmshëm, kështu që do të na duhet të zgjedhim një sërë tensionesh për të vendosur në secilën shtypje të butonave - por ne do të hyjmë në të pak më vonë.

Vini re se ne jemi në gjendje të kontrollojmë një tastierë me 14 butona duke përdorur vetëm një linjë të vetme hyrëse në kontrollues. Ky është një nga aspektet e dobishme të inputeve analoge.

Tani përpjekja jonë e parë për të kontrolluar tastierën do të jetë që shtypja e tastit të shkaktojë një ndërprerje, nënrutina e ndërprerjes do të lexojë portën analoge të hyrjes dhe do të vendosë se cili çelës është shtypur, dhe më pas do ta nxjerrë atë numër në nënrutinën tonë të analizuesit të regjistrit i cili do të shfaqë vlera kryesore në binar në 8 LED -et tona të cilat i vendosëm në Tutorial 5.

Hapi 5: Lidhni tastierën me analizuesin tuaj

Lidhni tastierën me analizuesin tuaj
Lidhni tastierën me analizuesin tuaj
Lidhni tastierën me analizuesin tuaj
Lidhni tastierën me analizuesin tuaj

Fotografitë tregojnë se si duam ta lidhim tastierën me mikrokontrollues në mënyrë që të shohim daljen në ekranin e analizuesit. Në thelb ne thjesht lidhim daljen nga tastiera në pin PortC 0, e cila quhet edhe ADC0 në ATmega328P.

Sidoqoftë, ka disa gjëra shtesë. Ne gjithashtu do të lidhim një buton në PD2. Dmth merrni një tel nga hekurudha juaj 5V në një buton dhe nga ana tjetër e butonit në PD2, dhe së fundi, ne duam të shkëputim kunjin AREF nga hekurudha jonë 5V dhe në vend të kësaj ta lëmë të shkëputur. Ne mund të fusim një kondensator shkëputjeje 0.1 mikrofarad nëse dëshirojmë. Ky është një kondensator qeramik me një 104 të shkruar në të. Dy shifrat e para janë numri dhe shifra e fundit është fuqia e 10 e shumëzojmë me të për të marrë një përgjigje në picofarads (pico do të thotë 10^-12), Pra 104 do të thotë 10 x 10^4 picofarads, që është e njëjtë me 100 nanofarada (nano do të thotë 10^-9), e cila është e njëjtë me 0.1 mikrofarada (mikro do të thotë 10^-6). Gjithsesi, e gjithë kjo bën është të stablize pin AREF kur ne mund ta përdorim atë si pin tonë referencë.

Ne gjithashtu duam një rezistencë 1 Mohm midis PD2 dhe tokës. Ne do të vendosim PD2 si një pin dalës në 0V dhe ne do të aktivizojmë në një avantazh pozitiv në atë kunj. Ne duam që buza të zhduket menjëherë kur lëshojmë butonin kështu që ne do të fusim këtë rezistencë "tërheq poshtë".

Arsyeja që ne duam butonin është sepse ne duam të aktivizojmë konvertuesin tonë Analog-në-Digital jashtë pinit INT0 në çip, i cili është gjithashtu PD2. Përfundimisht ne do të donim që shtypja e tastit të aktivizonte ADC dhe gjithashtu të siguronte që inputi të konvertohej pa pasur një buton të veçantë, por për shkak të mënyrës se si funksionon koha ne do të fillojmë duke pasur një buton të veçantë për të shkaktuar ADC dhe sapo të hekurosim të gjitha gabimet dalin dhe jemi të sigurt se gjithçka po funksionon si duhet, atëherë ne do të trajtojmë çështjet e zhurmës dhe kohës që vijnë me nxitjen nga e njëjta shtypje butoni që duam të lexojmë.

Pra, tani për tani, mënyra se si funksionon është që ne do të mbajmë të shtypur një çelës, pastaj do ta shtypim butonin për të shkaktuar ADC, dhe pastaj do ta lëmë të shkojë dhe me shpresë se vlera binare e butonit që kemi shtypur do të shfaqet në analizues.

Pra, le të shkruajmë një kod që do ta arrijë atë.

Hapi 6: Cilët ndërprerës të ndërrimit duhet të vendosim?

Cilët ndërprerës të ndërrimit duhet të vendosim?
Cilët ndërprerës të ndërrimit duhet të vendosim?

Le të mendojmë së pari se si do ta kodojmë këtë në mënyrë që kontrolluesi të mund të lexojë hyrjen nga tastiera dhe ta kthejë atë në një vlerë numerike që korrespondon me butonin e shtypur. Ne do të përdorim konvertuesin analog në dixhital (ADC) që është ndërtuar në Atmega328p. Ne do të përdorim AREF si tensionin tonë referues dhe dalja jonë e tastierës do të lidhet me PortC0 ose PC0. Vini re se kjo kunj quhet edhe ADC0 për Konvertues Analog-në-Dixhital 0. Mund të jetë një ide e mirë për ju që të lexoni Seksionin 12.4 mbi ndërprerjet për ATmega328P dhe gjithashtu kapitullin 24 mbi Konvertuesin Analog-në-Digital para se të marrim filloi ose të paktën t'i ketë ato seksione gati për referencë. Për të vendosur mikrokontrolluesin në mënyrë që të dijë se çfarë të bëjë me një sinjal analog hyrës dhe si të ndërveprojë me programin tonë, së pari duhet të vendosim disa nga ADC të ndryshme bitët e regjistrit të lidhur. Këto janë në thelb ekuivalente me çelsat e vjetër të ndërrimit në kompjuterët e parë. Ju ose rrokullisni një çelës ON ose OFF, ose edhe më mbrapa ju do të lidhni kabllot midis një prize dhe një tjetre në mënyrë që elektronet që arrijnë në atë pirun në rrugë të gjejnë një portë të mbyllur dhe një tjetër të hapur duke e detyruar atë në një rrugë të ndryshme në labirintin e qarkore dhe kështu kryerjen e një detyre logjike të ndryshme. Kur kodojmë në gjuhën e asamblesë ne kemi qasje të afërt në këto funksione të mikrokontrolluesit, e cila është një nga gjërat tërheqëse për ta bërë atë në radhë të parë. Moreshtë më shumë "në duar" dhe shumë më pak po ndodh "prapa skenave" si të thuash. Pra, mos mendoni për vendosjen e këtyre regjistrave si një detyrë të lodhshme. Kjo është ajo që e bën gjuhën e asamblesë interesante! Ne po fitojmë një marrëdhënie shumë personale me funksionimin e brendshëm dhe logjikën e çipit dhe e bëjmë atë të bëjë pikërisht atë që duam - as më shumë e as më pak. Asnjë cikël i orës së humbur. Pra, këtu është një listë e çelsave që duhet të vendosim:

  1. Fikni bitin ADC të Reduktimit të Fuqisë, PRADC, i cili është bit 0 i regjistrit PRR, pasi nëse ky bit është i ndezur ai do të mbyll ADC. Regjistri i reduktimit të energjisë është në thelb një mënyrë për të mbyllur gjëra të ndryshme që përdorin energji kur nuk keni nevojë për to. Meqenëse ne po përdorim ADC ne duam të sigurohemi që nuk është i çaktivizuar në këtë mënyrë. (Shih PRADC në faqen 46)
  2. Përzgjidhni kanalin analog të hyrjes që do të jetë ADC0 duke fikur MUX3… 0 në regjistrin ADC Multiplexer Selection (ADMUX) (Shih tabelën 24-4 faqe 249) këto janë tashmë të çaktivizuara si parazgjedhje, kështu që nuk kemi nevojë vërtet ta bëjmë këtë. Sidoqoftë, unë po e përfshij atë pasi nëse përdorni ndonjëherë një port tjetër përveç ADC0, do t'ju duhet t'i ndryshoni këto çelsin në përputhje me rrethanat. Kombinime të ndryshme të MUX3, MUX2, MUX1, MUX0 ju lejojnë të përdorni ndonjë nga portet analoge si hyrje tuaj dhe gjithashtu mund t'i ndryshoni ato në fluturim nëse doni të shikoni një mori sinjalesh analoge të ndryshme në të njëjtën kohë.
  3. Çaktivizoni bitët REFS0 dhe REFS1 në regjistrin ADMUX në mënyrë që ne të përdorim AREF si tensionin tonë të referencës dhe jo një referencë të brendshme (Shih faqen 248).
  4. Ndizni bitin ADLAR në ADMUX kështu që rezultati të "lihet i rregulluar" ne do ta diskutojmë këtë zgjedhje në hapin tjetër.
  5. Vendoseni bitin ADC0D në Regjistrin e Disaktivizimit të Inputit Dixhital (DIDR0) për të fikur hyrjen dixhitale në PC0. Ne po e përdorim atë port për hyrje analoge, kështu që mund të çaktivizojmë hyrjen dixhitale për të.
  6. Vendosni ISC0 dhe ISC1 në Regjistrin e Kontrollit të Jashtëm të Ndërprerjes A (EICRA) për të treguar që ne duam të aktivizojmë në skajin në rritje të një sinjali tensioni në pinin INT0 (PD2), shihni faqen 71.
  7. Bitet e qarta INT0 dhe INT1 në Regjistrin e Maskave të Ndërprerjeve të Jashtme (EIMSK) për të treguar që ne nuk po përdorim ndërprerje në këtë kunj. Nëse do të mundësonim ndërprerjet në këtë kunj, do të kishim nevojë për një mbajtës ndërprerjeje në adresën 0x0002, por në vend të kësaj ne po e vendosim atë në mënyrë që një sinjal në këtë pin të shkaktojë konvertimin ADC, përfundimi i të cilit trajtohet nga ndërprerja e plotë e konvertimit ADC në adresa 0x002A. Shih faqen 72.
  8. Vendosni bitin ADC Enable (ADEN) (bit 7) në regjistrin ADC të kontrollit dhe statusit A (ADCSRA) për të mundësuar ADC. Shih faqen 249.
  9. Ne mund të fillojmë një konvertim të vetëm duke vendosur bitin e konvertimit të fillimit ADC (ADSC) sa herë që donim të lexonim sinjalin analog, megjithatë, tani për tani do të preferonim që ai të lexohej automatikisht sa herë që dikush shtyp butonin, kështu që në vend të tij ne do të aktivizojmë ADC Bit autotrigger Enable (ADATE) në regjistrin ADCSRA në mënyrë që nxitja të bëhet automatikisht.
  10. Ne gjithashtu vendosëm ADPS2..0 bit (AD Prescalar bit) në 111 në mënyrë që ora ADC të jetë ora CPU e ndarë me një faktor 128.
  11. Ne do të zgjedhim burimin e ADC që shkakton të jetë PD2 i cili quhet edhe INT0 (Kërkesë e Jashtme për Ndërprerje 0). Ne e bëjmë këtë duke ndryshuar pjesët e ndryshme në regjistrin ADCSRB (Shih Tabelën 24-6 në faqen 251). Ne shohim nga tabela që ne dëshirojmë që ADTS0 të fikur, ADTS1 të aktivizuar dhe ADTS2 të fikur në mënyrë që ADC të çaktivizojë atë kunj. Vini re nëse duam të marrim mostra në mënyrë të vazhdueshme të portës analoge, sikur të lexonim ndonjë sinjal analog të vazhdueshëm (si marrja e mostrave të zërit ose diçka), ne do ta vendosnim atë në Modalitetin e Lirë të Drejtimit. Metoda që ne po përdorim për të vendosur nxitjen në PD2 shkakton një lexim ADC të portës analoge PC0 pa shkaktuar një ndërprerje. Ndërprerja do të vijë kur konvertimi të jetë i plotë.
  12. Aktivizoni bitin ADC Interrupt Enable (ADIE) në regjistrin ADCSRA në mënyrë që kur konvertimi analog në dixhital të përfundojë do të gjenerojë një ndërprerje për të cilën mund të shkruajmë një mbajtës ndërprerje dhe ta vendosim në.org 0x002A.
  13. Vendosni bitin I në SREG për të aktivizuar ndërprerjet.

Ushtrimi 1: Sigurohuni që i keni lexuar pjesët përkatëse në fletën e të dhënave për secilën prej cilësimeve të mësipërme, në mënyrë që të kuptoni se çfarë po ndodh dhe çfarë do të ndodhë nëse i ndryshojmë ato në cilësime alternative.

Hapi 7: Shkruani Trajtuesin e Ndërprerjeve

Në hapin e fundit ne pamë që ne e kemi vendosur atë në mënyrë që një avantazh në rritje i zbuluar në PD2 të shkaktojë një konvertim analog në dixhital në PC0 dhe kur ky konvertim të përfundojë do të hedhë një ndërprerje të plotë të Konvertimit ADC. Tani duam të bëjmë diçka me këtë ndërprerje. Nëse shqyrtoni Tabelën 12-6 në faqen 65 do të shihni një listë të ndërprerjeve të mundshme. Ne kemi parë ndërprerjen RESET në adresën 0x0000 dhe ndërprerjen Timer/Counter0 Overflow në adresën 0x0020 në Mësimet e mëparshme. Tani duam të shikojmë ndërprerjen ADC të cilën e shohim nga tabela është në adresën 0x002A. Pra, në fillim të kodit tonë të gjuhës së asamblesë do të na duhet një rresht që lexon:

.org 0x002Arjmp ADC_int

e cila do të kalojë te mbajtësi ynë i ndërprerjeve i etiketuar ADC_int sa herë që ADC ka përfunduar një konvertim. Pra, si duhet të shkruajmë mbajtësin tonë të ndërprerjes? Mënyra se si funksionon ADC është duke kryer llogaritjen e mëposhtme:

ADC = Vin x 1024 / Vref

Pra, le të shohim se çfarë ndodh nëse shtyp butonin "ri -thirrje" në tastierë. Në atë rast tensioni në PC0 do të ndryshojë në njëfarë vlere, të themi 1.52V, dhe meqenëse Vref është në 5V ne do të kemi:

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

dhe kështu do të shfaqet si një 311. Nëse do të donim ta kthenim këtë përsëri në një tension, ne thjesht do të ndryshonim llogaritjen. Ne nuk do të kemi nevojë ta bëjmë këtë meqenëse nuk jemi të interesuar për tensionet aktuale vetëm për të bërë dallimin midis tyre. Kur përfundon konvertimi, rezultati ruhet në një numër 10-bitësh të vendosur në regjistrat ADCH dhe ADCL dhe ne kemi bërë që ai të "lihet i rregulluar" që do të thotë se 10-bitët fillojnë në bitin 7 të ADCH dhe zbresin në bit 6 i ADCL (ka 16 bit gjithsej në këto dy regjistra dhe ne përdorim vetëm 10 prej tyre, pra 1024 kanale). Ne mund të kishim rezultatin "e rregulluar drejtë" nëse do të donim duke pastruar bitin ADLAR në regjistrin ADMUX. Arsyeja që ne zgjedhim të majtën e rregulluar është sepse sinjalet tona janë aq larg sa që dy shifrat e fundit të numrit të kanalit nuk janë relevante dhe janë ndoshta vetëm zhurmë, kështu që ne do t'i dallojmë shtypjet e tastit duke përdorur vetëm 8 shifrat e sipërme, me fjalë të tjera, do të na duhet vetëm të shikojmë ADCH për të kuptuar se cili buton është shtypur. Pra, mbajtësi ynë i ndërprerjes thjesht duhet të lexojë numrin jashtë ADCH regjistrohuni, shndërroni atë numër në një vlerë të tastierës dhe më pas dërgojeni atë vlerë tek LED -të e analizuesit tonë të regjistrit në mënyrë që të verifikojmë se shtyrja e një thënieje "9" do të bëjë që dritat LED që korrespondojnë me "00001001" të ndizen. Para se të shkojmë edhe pse ne së pari duhet të shohim se çfarë shfaqet në ADCH kur shtypim butonat e ndryshëm. Pra, le të shkruajmë vetëm një mbajtës të thjeshtë ndërprerjeje që vetëm dërgon përmbajtjen e ADCH në ekranin e analizuesit. Pra, këtu është ajo që na nevojitet:

ADC_int: lds analyzer, ADCH; ngarkoni vlerën e ADCH në analizuesit tanëbi EIFR, 0; pastroni flamurin e jashtëm të ndërprerjes në mënyrë që të jetë gati për të shkuar përsëri

Deri tani, ju duhet të jeni në gjendje të kopjoni kodin nga analizuesi ynë në tutorialin 5 dhe të shtoni këtë ndërprerje dhe cilësimet e kalimit dhe ta ekzekutoni atë. Ushtrimi 2: Shkruani kodin dhe drejtojeni atë. Shikoni që të shfaqet ADCH që shfaqet në ekranin tuaj të analizuesit. Provoni të shtypni të njëjtin shtypës të tastit disa herë. A merrni gjithmonë të njëjtën vlerë në ADCH?

Hapi 8: Hartoni vlerat e shtypjes së tastit

Hartoni vlerat e shtypjes së tastit
Hartoni vlerat e shtypjes së tastit

Ajo që duhet të bëjmë tani është konvertimi i vlerave në ADCH në numra që korrespondojnë me çelësin e shtypur. Ne e bëjmë këtë duke shkruar përmbajtjen e ADCH për secilën shtypje të tastit dhe pastaj duke e konvertuar atë në një numër dhjetor siç bëra në figurë. Në rutinën tonë të trajtimit të ndërprerjeve ne do të konsiderojmë një gamë të tërë vlerash që korrespondojnë me secilën shtypje të tastit, në mënyrë që ADC të hartojë çdo gjë në atë interval në një shtypje të caktuar të tastit.

Ushtrimi 3: Bëni këtë hartëzim dhe pastaj ri-shkruani rutinën tuaj të ndërprerjes ADC.

Këtu është ajo që kam marrë për timen (juaji ka shumë të ngjarë të jetë ndryshe). Vini re se e kam vendosur me një sërë vlerash për secilën shtypje të tastit.

ADC_int:; Analizues i jashtëm ndërprerës handlerclr; përgatituni për butonin e ri të numrave të numraveH, ADCH; ADC azhurnohet kur ADCH lexohet butoni clccpiH, 240brlo PC+3; nëse ADCH është më i madh atëherë është një analizues 1ldi, 1; pra analizues i ngarkesës me një kthim 1rjmp; dhe kthehu butonin clccpiH, 230; nëse ADCH është më i madh atëherë një analizues 2brlo PC+3ldi, 2rjmp butoni kthyes clccpiH, 217brlo PC+3ldi analizues, 3rjmp butoni kthimi clccpiH, 203brlo PC+3ldi analizues, 4rjmp kthimi clccpiHH, 187brlo PC+3ldi analizues, 5rjmp kthimi clccpi buton, 155brlo analizues PC+3ldi, 6rjmp butoni kthimi clccpiH, 127brlo PC+3ldi analizues, 255; ne do të vendosim blicin si të gjithë onrjmp butonin e kthimit clccpiH, 115brlo PC+3ldi analizues, 7rjmp butonin e kthimit clccpiH, 94brlo PC+3ldi analyzer, 8rjmp kthimin clccpi buttonH, 62brlo PC+3ldi analyzer, 9rjmp return clccpi buttonH, 37brlo PC+3ldi analyzer, 0b11110000; ylli është gjysma e parë e onrjmp butonit të kthimit clccpiH, 28brlo PC+3ldi analyzer, 0rjmp button clccpi returnH, 17brlo PC+3ldi analyzer, 0b00001111; shenja hash është gjysma e poshtme onrjmp butoni kthimi clccpiH, 5brlo PC+3ldi analyzer, 0b11000011; rikthimi është krye 2 në fund 2rjmp analyzer ldi return, 0b11011011; përndryshe ka ndodhur gabimi kthimi: reti

Hapi 9: Kodi dhe Video për Versionin 1

Unë kam bashkangjitur kodin tim për këtë version të parë të drejtuesit të tastierës. Në këtë ju duhet të shtypni butonin dhe pastaj shtypni butonin në mënyrë që të bëni që ADC të lexojë hyrjen nga tastiera. Ajo që ne preferojmë të kemi nuk është asnjë buton, por sinjali për të bërë konvertimin vjen nga vetë shtypja e tastit. Ushtrimi 3: Mblidhni dhe ngarkoni këtë kod dhe provojeni. Ju mund të keni nevojë të ndryshoni pragjet e ndryshme të konvertimit që të korrespondojnë me tensionet tuaja të shtypjes së tastit pasi ato ka të ngjarë të ndryshojnë nga imi. Çfarë ndodh nëse përpiqeni të përdorni një hyrje nga tastiera si për ADC0 ashtu edhe për pinin e jashtëm të ndërprerjes në vend të një butoni? Unë gjithashtu do të bashkëngjit një video të funksionimit të këtij versioni të parë të drejtuesit tonë të tastierës. Ju do ta vini re këtë në kodin tim ekziston një pjesë që inicon Stack Pointer. Ka regjistra të ndryshëm që ne mund të duam t'i shtyjmë dhe të dalin nga pirgu kur manipulojmë variablat dhe çfarë-jo dhe ka edhe regjistra që mund të duam t'i ruajmë dhe rivendosim më vonë. Për shembull, SREG është një regjistër që nuk ruhet nëpër ndërprerje, kështu që flamujt e ndryshëm që janë vendosur dhe pastruar si rezultat i operacioneve mund të ndryshohen nëse një ndërprerje ndodh në mes të diçkaje. Kështu që është mirë nëse e shtyni SREG në pirg në fillim të një mbajtësi të ndërprerjes dhe pastaj e fikni përsëri në fund të mbajtësit të ndërprerjes. Unë e kam vendosur atë në kod për të treguar se si është inicializuar dhe për të parashikuar se si do të na duhet më vonë, por meqenëse nuk na intereson se çfarë ndodh me SREG gjatë ndërprerjeve në kodin tonë, unë nuk e përdor stekun për këtë. Gjithashtu vëreni se kam përdorur operacionin shift për të vendosur bit të ndryshëm në regjistra gjatë inicimit. Për shembull në rresht:

ldi temp, (1 <> sts EICRA, temp

Komanda "<<" në rreshtin e parë të kodit më sipër është një operacion zhvendosjeje. Ai në thelb merr numrin binar 1, i cili është 0b00000001 dhe e zhvendos atë nga shuma e numrit ISC01. Ky është pozicioni i bitit të quajtur ISC01 në regjistrin EICRA. Meqenëse ISC01 është bit 1, numri 1 zhvendoset në pozicionin e majtë 1 për t'u bërë 0b00000010. Në mënyrë të ngjashme, e dyta, ISC00, është bit 0 e EICRA dhe kështu zhvendosja e numrit 1 është zero pozicione në të majtë. Nëse shikoni, hidhini një sy skedarit m328Pdef.inc që keni shkarkuar në mësimin e parë dhe keni përdorur evrr që atëherë, do të shihni se është vetëm një listë e gjatë e deklaratave ".equ". Ju do të gjeni se ISC01 është e barabartë me 1. Montuesi zëvendëson çdo shembull të tij me 1 para se të filloni të montoni ndonjë gjë. Ata janë vetëm emra për bit regjistrues për të na ndihmuar ne njerëzit të lexojmë dhe shkruajmë kod. Tani, vija vertikale midis dy operacioneve të ndërrimit më sipër është një operacion logjik "ose". Këtu është ekuacioni:

0b00000010 | 0b00000001 = 0b00000011

dhe kjo është ajo që ne po ngarkojmë (duke përdorur "ldi") në temp. Arsyeja që njerëzit përdorin këtë metodë për të ngarkuar vlerat në një regjistër është se ajo lejon që dikush të përdorë emrin e bitit në vend të vetëm një numri dhe kjo e bën kodin të lexohet shumë më lehtë. Ka edhe dy teknika të tjera që kemi përdorur. Ne përdorim udhëzimet "ori" dhe "andi". Këto na lejojnë të vendosim dhe pastrojmë bit respektivisht pa ndryshuar asnjë nga bitët e tjerë në një regjistër. Për shembull, kur kam përdorur

ori temp, (1

kjo temperaturë "ose" me 0b00000001 e cila vendos një 1 në bitin zero dhe i lë të gjitha të tjerat të pandryshuara. Gjithashtu kur kemi shkruar

andi temp, 0b11111110

kjo ndryshon bitin zero të temperaturës në 0 dhe i lë të tjerat të pandryshuara.

Ushtrimi 4: Ju duhet të kaloni përmes kodit dhe sigurohuni që të kuptoni secilën rresht. Ju mund të gjeni interesante të gjeni metoda më të mira për të bërë gjëra dhe të shkruani një program më të mirë. Ka njëqind mënyra për të koduar gjërat dhe unë jam shumë i bindur që ju mund të gjeni një mënyrë shumë më të mirë se e imja. Ju gjithashtu mund të gjeni (qielli na ruajt!) Gabime dhe lëshime. Në atë rast, me siguri do të doja të dëgjoja për to, në mënyrë që të rregulloheshin.

Mirë, tani le të shohim nëse mund ta heqim qafe atë buton të tepërt…

Hapi 10: Kodi për Versionin 2

Mënyra më e thjeshtë për të hequr qafe butonin është thjesht ta hiqni atë krejtësisht, të harroni hyrjen në PB2 dhe thjesht të kaloni ADC në "Free Running Mode".

Me fjalë të tjera, thjesht ndryshoni regjistrin ADCSRB në mënyrë që ADTS2, ADTS1 dhe ADTS0 të jenë zero.

Pastaj vendosni bitin ADSC në ADCSRA në 1 i cili do të fillojë konvertimin e parë.

Tani ngarkojeni atë në mikrokontrolluesin tuaj dhe do të zbuloni se numri i saktë del në ekran ndërsa shtypni butonin dhe vetëm kur shtypni butonin. Kjo ndodh sepse ADC po merr vazhdimisht mostra nga porta ADC0 dhe shfaq vlerën. Kur hiqni gishtin nga butoni, "kërcimi i butonit" do të bëjë që disa vlera të rastësishme të ndodhin shumë shpejt dhe pastaj do të vendoset përsëri në hyrjen 0V. Në kodin tonë kemi këtë 0V që shfaqet si 0b11011011 (sepse shtypja e tastit "0" tashmë po përdor vlerën e shfaqjes 0b00000000)

Kjo nuk është zgjidhja që duam edhe pse për dy arsye. Së pari ne nuk duam të mbajmë butonin. Ne duam ta shtypim atë një herë dhe të shfaqet numri (ose të përdoret në ndonjë kod të ri në një tutorial të mëvonshëm). Së dyti, ne nuk duam të marrim mostra të vazhdueshme të ADC0. Ne duam që ajo të marrë një lexim të vetëm, ta konvertojë atë dhe pastaj të flejë derisa një shtypje e re e tastit të shkaktojë një konvertim të ri. Mënyra e funksionimit falas është më e mira nëse e vetmja gjë që dëshironi të bëjë mikrokontrolluesi është të lexoni vazhdimisht disa hyrje analoge - si nëse dëshironi të shfaqni temperatura në kohë reale ose diçka tjetër.

Pra, le të gjejmë një zgjidhje tjetër …

Hapi 11: Si të shpëtojmë nga butoni? Versioni 3

Si të shpëtojmë nga butoni? Versioni 3
Si të shpëtojmë nga butoni? Versioni 3

Ka shumë mënyra se si mund të vazhdojmë. Së pari ne mund të shtojmë pajisje për të hequr qafe butonin. Për shembull, mund të provojmë të vendosim një tranzistor në qark në vijën dalëse të shtypësit të tastit në mënyrë që të marrë një rrjedhje të vogël të rrymës nga dalja dhe të dërgojë një impuls 5V në kunjin e ndërprerjes PD2.

Sidoqoftë, kjo ndoshta do të ishte shumë e zhurmshme të paktën dhe në rastin më të keq nuk do të lejonte kohë të mjaftueshme për një lexim të saktë të shtypjes së tastit pasi që dalja e tensionit të tastierës nuk do të kishte kohë të stabilizohej para se të kapet leximi ADC.

Kështu që ne preferojmë të dalim me një zgjidhje softuerike. Ajo që ne do të donim të bënim është të shtojmë një ndërprerje në kunjin PD2 dhe të shkruajmë një mbajtës ndërprerjeje për të i cili thërret një lexim të vetëm të kunjit të tastierës. Me fjalë të tjera, ne heqim qafe ndërprerjen autotrigger nga ADC dhe shtojmë një ndërprerje të jashtme që thërret ADC brenda saj. Në këtë mënyrë sinjali për të lexuar ADC vjen pasi sinjali PD2 tashmë ka ndodhur dhe kjo mund t'u japë gjërave kohë të mjaftueshme për të stabilizuar një tension të saktë para se të lexohet dhe konvertohet kunja PC0. Ne ende do të kishim një ndërprerje përfundimi ADC e cila nxjerr rezultatin në ekranin e analizuesit në fund.

Ka kuptim? Epo le ta bëjmë…

Hidhini një sy kodit të ri të bashkangjitur.

Ju shihni ndryshimet e mëposhtme:

  1. Ne shtuam një rjmp në adresën.org 0x0002 për të trajtuar ndërprerjen e jashtme INT0
  2. Ne ndryshuam regjistrin EIMSK për të treguar se duam të ndërpresim në kunjin INT0
  3. Ne ndryshuam pinin ADATE në regjistrin ADCSRA për të çaktivizuar autotriggering
  4. Ne hoqëm qafe cilësimet e ADCSRB pasi ato janë të parëndësishme kur ADATE është joaktive
  5. Ne nuk kemi pse të rivendosim flamurin e jashtëm të shkasit pasi rutina e ndërprerjes INT0 e bën këtë automatikisht kur të përfundojë - më parë nuk kishim një rutinë ndërprerjeje, ne vetëm aktivizuam ADC -në e një sinjali në atë pin, kështu që na u desh pastroni atë flamur me dorë.

Tani në mbajtësin e ndërprerjeve ne thjesht quajmë një konvertim të vetëm nga ADC.

Ushtrimi 5: Drejtoni këtë version dhe shikoni se çfarë ndodh.

Hapi 12: Kodi dhe Video për Versionin e Punës

Siç e pamë nga versioni i fundit, ndërprerja e butonit nuk funksionon shumë mirë sepse ndërprerja aktivizohet në një skaj në rritje për të fiksuar PD2 dhe më pas mbajtësi i ndërprerjes thërret shndërrimin ADC. Sidoqoftë, ADC pastaj merr leximin e tensionit para se të stabilizohet dhe kështu lexon marrëzi.

Ajo që na duhet është të prezantojmë një vonesë midis ndërprerjes në PD2 dhe leximit ADC në PC0. Ne do ta bëjmë këtë duke shtuar një kohëmatës/numërues, një ndërprerje të tejmbushjes së numëruesit dhe një rutinë vonesë. Për fat të mirë ne tashmë e dimë se si ta bëjmë këtë nga Tutorial 3! Pra, ne thjesht do të kopjojmë dhe ngjisim kodin përkatës nga atje.

Unë kam dhënë kodin që rezulton dhe një video që e tregon atë në punë.

Ju do të vini re se leximet nuk janë aq të sakta sa mund të shpresoni. Kjo ka të ngjarë për shkak të një numri burimesh:

  1. ne po trokasim nga dalja e tensionit të tastierës për të shkaktuar në PD2 e cila ndikon në leximin në PC0.
  2. ne me të vërtetë nuk e dimë sa kohë të vonojmë pas shkasit për të marrë leximin më të mirë.
  3. duhen disa cikle që konvertimi ADC të përfundojë, që do të thotë se ne nuk mund të ndezim shpejt në tastierë.
  4. ndoshta ka zhurmë në vetë tastierën.
  5. etj…

Pra, megjithëse arritëm që tastiera të funksionojë, dhe tani mund ta përdorim në aplikacione duke përdorur vlerat e shtypjes së tastit në një mënyrë tjetër në vend që t'i nxjerrim ato në ekranin e analizuesit, nuk është shumë e saktë dhe është shumë e bezdisshme. Kjo është arsyeja pse unë mendoj se mënyra më e mirë për të lidhur tastierat është thjesht të vendosni secilën dalje nga tastiera në një port tjetër dhe të vendosni se cili çelës shtypet nga cilat porte shohin një tension. Kjo është e lehtë, shumë e shpejtë dhe shumë e saktë.

Në fakt, ka vetëm dy arsye pse dikush do të donte të drejtonte një tastierë siç kemi bërë këtu:

  1. Ai përdor vetëm 2 kunja në mikrokontrolluesin tonë në vend të 8.
  2. Ashtë një projekt i shkëlqyeshëm për të treguar aspekte të ndryshme të ADC në mikrokontrollues i cili është i ndryshëm nga gjërat standarde që mund të gjeni atje si leximet e temperaturës, kthesat e potenciometrave, etj. Doja një shembull të leximeve të vetme të shkaktuara dhe auto-nxitjes së kunjave të jashtëm në vend që thjesht të ekzekutoni modalitetin e gëlltitjes së CPU-së.

Sidoqoftë, këtu keni disa ushtrime përfundimtare për ju:

Ushtrimi 6: Rishkruani mbajtësin e plotë të ndërprerjes së konvertimit ADC për të përdorur një Tabelë Kërkimi. Dmth Kështu që teston vlerën analoge me artikullin e parë në tabelë dhe nëse është më e madhe kthehet nga ndërprerja, nëse nuk është atëherë ajo rrit Z në artikullin tjetër në tabelë dhe degëzohet përsëri në test. Kjo do të shkurtojë kodin dhe do të pastrojë rutinën e ndërprerjes dhe do ta bëjë atë të duket më bukur. (Unë do të jap një zgjidhje të mundshme si hapi tjetër) Ushtrimi 7: Lidheni tastierën tuaj me 8 kunja në mikrokontrollues dhe shkruani drejtuesin e thjeshtë për të dhe përjetoni sa më i bukur është. A mund të mendoni për disa mënyra për ta bërë metodën tonë të funksionojë më mirë?

Kjo është e gjitha për këtë tutorial. Unë kam bashkangjitur versionin përfundimtar me tregues. Ndërsa i afrohemi qëllimit tonë përfundimtar, do të përdorim tastierën edhe një herë në Tutorial 9 për të treguar se si të kontrollojmë shtatë ekranet e segmenteve me të (dhe të ndërtojmë diçka interesante që përdor çelësat shtesë në tastierën e telefonit) dhe më pas ne kaloni në kontrollimin e gjërave me shtypje të butonave (pasi kjo metodë përshtatet më mirë me produktin përfundimtar që po ndërtojmë me këto mësime) dhe ne thjesht do të vendosim në raft tastierën.

Shihemi heren tjeter!

Recommended: