Obsah:

AVR Assembler Tutorial 7: 12 krokov
AVR Assembler Tutorial 7: 12 krokov

Video: AVR Assembler Tutorial 7: 12 krokov

Video: AVR Assembler Tutorial 7: 12 krokov
Video: Лекция 4. Архитектура AVR. Ассемблер 2024, November
Anonim
Výučba montéra AVR 7
Výučba montéra AVR 7

Vitajte v návode 7!

Dnes si najskôr ukážeme, ako vyčistiť klávesnicu, a potom ukážeme, ako používať analógové vstupné porty na komunikáciu s klávesnicou. Urobíme to pomocou prerušení a jedného vodiča ako vstupu. Klávesnicu zapojíme tak, aby každé stlačenie klávesu odoslalo na analógový vstup jedinečné napätie, ktoré nám umožní rozlíšiť podľa napätia, ktoré bolo stlačené. Potom pošleme číslo stlačené do nášho analyzátora registrov, aby sme ukázali, že sa všetko deje tak, ako by malo. Existuje množstvo úskalí, na ktoré môžete naraziť pri použití analógovo -digitálneho prevodníka (ADC) v ATmega328p, a tak budeme vezmite si veci v niekoľkých fázach na ceste, aby ste sa pokúsili prísť na to, ako sa im vyhnúť. Uvidíme tiež, prečo používanie analógovo -digitálneho prevodníka nie je najlepším spôsobom ovládania klávesnice, aj keď používa menej portov na vašom mikrokontroléri. V tomto návode budete potrebovať:

  1. klávesnica. Môžete si kúpiť jeden alebo môžete urobiť to, čo som urobil ja, a jedného upratať.
  2. 2 ženské záhlavia na klávesnici (ak jednu odstraňujete)
  3. spojovacie vodiče
  4. chlebník
  5. 4 1 Kohmove odpory
  6. 1 15 Kohmov odpor
  7. 1 3,3 Kohmov odpor
  8. 1 180 ohmový odpor
  9. Rezistor 1 680 ohmov
  10. digitálny multimeter
  11. váš analyzátor z tutoriálu 5

Ak už máte klávesnicu a nepotrebujete ju vyčistiť, môžete prvých pár krokov vynechať.

Tu je odkaz na kompletnú zbierku mojich návodov k assembleru AVR:

Krok 1: Vyčistite klávesnicu 1

Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1
Vyčistite klávesnicu 1

Dávno, ešte keď boli vaši prarodičia iba deti, ľudia používali na komunikáciu medzi sebou tieto podivne vyzerajúce zariadenia s dlhými káblami zapojenými do steny. Hovorilo sa im „telefóny“a väčšinou išlo o lacné plastové veci, ktoré vydávali nepríjemný zvuk, keď vám niekto zavolal (nie že by dnešné vyzváňacie tóny „Justin Bieber“neboli rovnako otravné). V každom prípade tieto zariadenia mali na sebe klávesnice, ktoré boli veľmi jednoducho prepojené káblom, a tak sa dajú ľahko čistiť, a sú na nich 2 ďalšie kľúče („opakované vytáčanie“a „blesk“) z klávesníc, ktoré si môžete kúpiť a ktoré možno budete chcieť znova použiť. ako „klávesy so šípkami“, „klávesy ponuky“alebo niečo iné. Začneme teda tým, že vyčistíme klávesnicu od starého telefónu. Najprv vezmite telefón (používam telefón GE, ako je znázornené na obrázkoch) a rozoberte ho, aby ste odhalili zapojenie. Potom vezmite dláto a odlomte malé plastové gombíky, ktoré držia klávesnicu zapnutú, a vyberte klávesnicu.

Krok 2: Vyčistite klávesnicu 2

Vyčistite klávesnicu 2
Vyčistite klávesnicu 2
Vyčistite klávesnicu 2
Vyčistite klávesnicu 2
Vyčistite klávesnicu 2
Vyčistite klávesnicu 2

Teraz vezmite pílu na PVC, odstrihnite plast z kľúčových dierok a potom odrežte okraj, aby ste získali správnu hĺbku a zanechali tenkú klávesnicu.

Potom znova zapnite klávesnicu pomocou malých kolíkov, ktoré zostali po tom, ako ste z nich v poslednom kroku odrezali vrcholy, a pomocou spájkovačky jednoducho vpichnite horúcu žehličku do každého otvoru na kolíky, ktorý roztaví plast a rozloží ho na spodnej časti klávesnice tvoriace nové „gombíky“, ktoré držia klávesnicu na mieste ako predtým.

Rád vyčistím tri reproduktory a možno aj ďalšie veci, ako sú prepínače a čo nie, ktoré sú na doske. Tentoraz však nejdem zametať vypínače a podobne, pretože v tejto chvíli máme iné ciele. K dispozícii je tiež lineárny integrovaný obvod TA31002, ktorý je telefónnym zvonením. Technický list sa dá ľahko nájsť a stiahnuť online s údajmi o výstupoch a funkciách. Nechám to zatiaľ spájkované na doske a potom sa s tým neskôr pohrám. Chcel by som to pripojiť k osciloskopu a zistiť, aké skvelé signály z neho môžem dostať. Možno z toho dokonca urobíte zvonček. Kto vie.

Každopádne, keď skončíte s ničením telefónu a čistením dielov, dokončíme výrobu klávesnice.

Krok 3: Vyčistite klávesnicu 3

Vyčistite klávesnicu 3
Vyčistite klávesnicu 3
Vyčistite klávesnicu 3
Vyčistite klávesnicu 3
Vyčistite klávesnicu 3
Vyčistite klávesnicu 3

Odspájkovacím knôtom odstráňte páskové káble zo spodnej časti klávesnice a uistite sa, že otvory v doske plošných spojov sú čisté, a potom na dosku, kde sú otvory, pripevnite dve hlavičky. Pravdepodobne budete musieť skrátiť hlavičky tak, aby boli 4-kolíkovými hlavičkami.

Teraz, keď sú záhlavia pripevnené, môžete ich zapojiť na dosku, použiť multimetr a otestovať kľúče tak, že multimeter prilepíte na náhodné kolíky a zmeráte odpor. To vám umožní zmapovať si kľúče. Pri pohľade na obvod je ťažké pochopiť, ako sú klávesy zapojené do výstupov, ale ak používate multimetr, môžete ho zapojiť do ľubovoľných dvoch pinov a potom stláčať tlačidlá, kým sa na obrazovke namiesto otvoreného obvodu nezobrazí číslo.. Toto bude pinout pre tento kľúč.

Týmto spôsobom namapujte všetky kľúče na výstupné piny.

Krok 4: Pripojte klávesnicu

Pripojte klávesnicu
Pripojte klávesnicu
Pripojte klávesnicu
Pripojte klávesnicu

Teraz postupujte podľa schémy zapojenia a pripevnite klávesnicu k vášmu nepájivému panelu.

Ako to bude fungovať, dáme 5 V na ľavú stranu a pravá strana pôjde na GND. Prvý kolík vpravo na diagrame ide do prvého z našich analógových pinov na mikrokontroléri Atmega328p. Ak nie sú stlačené žiadne tlačidlá, signál bude 0 V a pri stlačení každého z rôznych tlačidiel bude vstup do analógového portu v rozsahu 0 V až 5 V s rôznym množstvom v závislosti od toho, ktoré tlačidlo bolo stlačené. Hodnoty odporu sme vybrali tak, aby každá cesta obsahovala odpor odlišný od ostatných. Analógový port na mikrokontroléri zachytáva analógový signál a rozdeľuje ho na 1024 rôznych kanálov medzi 0 V a 5 V. To znamená, že každý kanál má šírku 5V/1024 = 0,005 V/kanál = 5 mV/kanál. Analógový port teda dokáže rozlíšiť vstupné napätie, pokiaľ sa líši o viac ako 5 mV. V našom prípade sme vybrali hodnoty rezistora tak, aby akékoľvek dve stlačenia klávesov poslali napäťový signál, ktorý sa líši od toho viac, aby mikrokontrolér mohol ľahko rozhodnúť, ktoré tlačidlo bolo stlačené. Veľkým problémom je, že celý systém je veľmi hlučný, takže budeme musieť zvoliť rozsah napätí, ktoré chcete mapovať pri každom stlačení tlačidla - k tomu sa však dostaneme o niečo neskôr.

Všimnite si, že sme schopní ovládať 14 -tlačidlovú klávesnicu iba pomocou jedného vstupného riadka do ovládača. To je jeden z užitočných aspektov analógových vstupov.

Teraz naším prvým pokusom o ovládanie klávesnice bude stlačenie klávesu, ktoré spôsobí prerušenie, podprogram prerušenia načíta analógový vstupný port a rozhodne, ktoré tlačidlo bolo stlačené, a potom vydá toto číslo do podprogramu nášho analyzátora registrov, ktorý zobrazí kľúčová hodnota v binárnom formáte na našich 8 diódach LED, ktoré sme nastavili v návode 5.

Krok 5: Pripojte klávesnicu k analyzátoru

Pripojte klávesnicu k analyzátoru
Pripojte klávesnicu k analyzátoru
Pripojte klávesnicu k analyzátoru
Pripojte klávesnicu k analyzátoru

Obrázky ukazujú, ako chceme pripojiť klávesnicu k mikrokontroléru, aby sme na výstupe nášho analyzátora videli výstup. V podstate jednoducho prepojíme výstup z klávesnice na pin PortC 0, ktorý sa na ATmega328P nazýva aj ADC0.

Existuje však niekoľko ďalších vecí. Chystáme sa tiež prepojiť tlačidlo s PD2. Tj. vezmite drôt z vašej 5V lišty na tlačidlo a z druhej strany tlačidla do PD2 a nakoniec chceme odpojiť pin AREF od našej 5V lišty a namiesto toho ho nechať odpojený. Ak by sme chceli, mohli by sme vložiť oddeľovací kondenzátor 0,1 mikrofaradu. Jedná sa o keramický kondenzátor, na ktorom je napísaných 104. Prvé dve číslice sú číslo a posledná číslica je sila 10, ktorú vynásobíme, aby sme dostali odpoveď v pikofaradoch (pico znamená 10^-12), takže 104 znamená 10 x 10^4 pikofaradov, čo je rovnaké ako 100 nanofarád (nano znamená 10^-9), čo je to isté ako 0,1 mikrofarad (mikro znamená 10^-6). V každom prípade to všetko stabilizuje pin AREF, keď ho môžeme použiť ako referenčný pin.

Chceme tiež odpor 1 Mohm medzi PD2 a zemou. Nastavíme PD2 ako výstupný kolík na 0 V a na tomto kolíku budeme spúšťať na pozitívnej hrane. Chceme, aby hrana okamžite zmizla, keď uvoľníme tlačidlo, takže vložíme tento "sťahovací" odpor.

Dôvod, prečo chceme tlačidlo, je ten, že chceme spustiť náš analógovo-digitálny prevodník z kolíka INT0 na čipe, ktorý je tiež PD2. Nakoniec by sme chceli, aby stlačenie klávesov spustilo ADC a tiež poskytlo vstup, ktorý sa má previesť bez samostatného tlačidla, ale kvôli tomu, ako funguje načasovanie, začneme tým, že na spustenie ADC budeme mať samostatné tlačidlo a keď vyžehlíme všetky chyby a sme si istí, že všetko funguje správne, potom sa budeme zaoberať problémami s hlukom a načasovaním, ktoré prichádzajú so spustením z rovnakého stlačenia tlačidla, ktoré si chceme prečítať.

Takže zatiaľ to funguje tak, že podržíme kláves, potom stlačením tlačidla spustíme ADC a potom pustíme a dúfajme, že sa na analyzátore zobrazí binárna hodnota tlačidla, ktoré sme stlačili.

Poďme teda napísať nejaký kód, ktorý to splní.

Krok 6: Ktoré prepínače by sme mali nastaviť?

Ktoré prepínače by sme mali nastaviť?
Ktoré prepínače by sme mali nastaviť?

Poďme sa najskôr zamyslieť nad tým, ako to budeme kódovať, aby ovládač mohol prečítať vstup z klávesnice a zmeniť ho na číselnú hodnotu zodpovedajúcu stlačenému tlačidlu. Použijeme prevodník analógového na digitálny (ADC) ktorý je vstavaný do Atmega328p. Ako referenčné napätie použijeme AREF a výstup našej klávesnice bude pripojený k PortC0 alebo PC0. Všimnite si toho, že tento pin sa tiež nazýva ADC0 pre prevodník analógovo-digitálneho signálu 0. Predtým, ako sa dostaneme, môže byť vhodné prečítať si časť 12.4 o prerušení pre ATmega328P a tiež kapitolu 24 o prevodníku analógovo-digitálneho signálu. spustené alebo aspoň mať tieto sekcie pripravené na použitie. Aby bolo možné nastaviť mikrokontrolér tak, aby vedel, čo má robiť s analógovým vstupným signálom a ako interagovať s naším programom, musíme najskôr nastaviť niekoľko rôznych ADC. súvisiace registračné bity. Tieto sú v zásade ekvivalentné starým prepínačom na prvých počítačoch. Buď prepnete vypínač do polohy ON alebo OFF, alebo ešte viac dozadu zapojíte káble medzi jednu zásuvku a druhú, aby elektróny, ktoré sa dostanú na vidlicu na ceste, našli jednu bránu zatvorenú a druhú otvorenú a prinútili ju ísť inou cestou v bludisku obvodov a tým plní inú logickú úlohu. Pri kódovaní v montážnom jazyku máme blízky prístup k týmto funkciám mikrokontroléra, čo je v prvom rade jedna z atraktívnych vecí, ktoré je potrebné vykonať. Je to viac „na ruky“a oveľa menej sa toho deje akosi „v zákulisí“. Nemyslite si preto, že by ste tieto registre nastavovali ako únavnú úlohu. Vďaka tomu je montážny jazyk zaujímavý! Získavame veľmi osobný vzťah k vnútornému fungovaniu a logike čipu a nútime ho robiť presne to, čo chceme - nie viac a nie menej. Žiadne zbytočné hodinové cykly. Tu je zoznam prepínačov, ktoré musíme nastaviť:

  1. Vypnite bit ADC Power Reduction, PRADC, čo je bit 0 registra PRR, pretože ak je tento bit zapnutý, ADC sa vypne. Register zníženia výkonu je v podstate spôsob, ako vypnúť rôzne veci, ktoré používajú energiu, keď ich nepotrebujete. Pretože používame ADC, chceme sa uistiť, že nie je týmto spôsobom deaktivovaný. (Pozri PRADC na strane 46)
  2. Vyberte analógový vstupný kanál, ktorý má byť ADC0, vypnutím MUX3… 0 v registri ADMUX (ADMUX) (pozri tabuľku 24-4, strana 249), tieto sú už predvolene vypnuté, takže to skutočne nemusíme robiť. Zahrňujem to však, pretože ak niekedy použijete iný port ako ADC0, budete musieť tieto prepínače zodpovedajúcim spôsobom prepnúť. Rôzne kombinácie MUX3, MUX2, MUX1, MUX0 vám umožňujú použiť ktorýkoľvek z analógových portov ako vstup a tiež ich môžete zmeniť za chodu, ak sa chcete pozrieť na množstvo rôznych analógových signálov naraz.
  3. Vypnite bity REFS0 a REFS1 v registri ADMUX, aby sme ako referenčné napätie používali ako internú referenciu napätie AREF (pozri stranu 248).
  4. Zapnite bit ADLAR v ADMUX, aby bol výsledok „upravený doľava“, o tejto voľbe budeme diskutovať v nasledujúcom kroku.
  5. Nastavte bit ADC0D v registri zakázania digitálneho vstupu (DIDR0) na vypnutie digitálneho vstupu na PC0. Tento port používame na analógový vstup, takže by sme preň mohli deaktivovať aj digitálny vstup.
  6. Nastavte ISC0 a ISC1 v registri riadenia externého prerušenia A (EICRA) tak, aby naznačoval, že chceme spustiť na stúpajúcej hrane napäťového signálu na pin INT0 (PD2), viď strana 71.
  7. Vymažte bity INT0 a INT1 v registri masky externého prerušenia (EIMSK), čo znamená, že na tomto kolíku nepoužívame prerušenia. Ak by sme na tomto pine povolili prerušenia, potrebovali by sme obslužný program prerušenia na adrese 0x0002, ale namiesto toho ho nastavujeme tak, aby signál na tomto kolíku spustil konverziu ADC, ktorej dokončenie je riešené prerušením úplného prevodu ADC na adresa 0x002A. Pozrite si stranu 72.
  8. Nastavte bit ADC Enable (ADEN) (bit 7) v riadiacom a stavovom registri ADC (ADCSRA), aby ste povolili ADC. Pozrite si stranu 249.
  9. Mohli by sme začať jednu konverziu nastavením konverzného bitu ADC (ADSC) vždy, keď sme chceli prečítať analógový signál, zatiaľ by sme však radšej nechali čítať automaticky vždy, keď niekto stlačí tlačidlo, takže namiesto toho povolíme ADC Bit automatického spustenia (ADATE) v registri ADCSRA, aby sa spustenie vykonalo automaticky.
  10. Tiež sme nastavili ADPS2..0 bitov (AD Prescalar bity) na 111 tak, aby ADC hodiny boli hodiny CPU delené faktorom 128.
  11. Vyberieme zdroj spúšťania ADC, aby bol PD2, ktorý sa tiež nazýva INT0 (požiadavka na externé prerušenie 0). Robíme to prepínaním rôznych bitov v registri ADCSRB (pozri tabuľku 24-6 na strane 251). Podľa tabuľky vidíme, že chceme, aby boli ADTS0 vypnuté, ADTS1 zapnuté a ADTS2 vypnuté, aby ADC spustil tento kolík. Všimnite si toho, ak by sme chceli kontinuálne vzorkovať analógový port, ako keby sme čítali nejaký nepretržitý analógový signál (napríklad vzorkovanie zvuku alebo niečo), nastavili by sme tento režim na voľný beh. Metóda, ktorú používame na nastavenie spúšťania na PD2, spustí čítanie ADC analógového portu PC0 bez toho, aby došlo k prerušeniu. Prerušenie príde po dokončení prevodu.
  12. V registri ADCSRA povoľte bit ADC prerušenia (ADIE) ADC, aby po dokončení prevodu analógového signálu na digitálny generoval prerušenie, pre ktoré môžeme napísať obslužný program prerušenia a vložiť ho na.org 0x002A.
  13. Nastavte bit I v SREG, aby ste povolili prerušenia.

Cvičenie 1: Uistite sa, že ste si prečítali príslušné časti v údajovom hárku pre každé z vyššie uvedených nastavení, aby ste porozumeli tomu, čo sa deje a čo by sa stalo, keby sme ich zmenili na alternatívne nastavenia.

Krok 7: Napíšte obslužný program prerušenia

V poslednom kroku sme videli, že sme to nastavili tak, že stúpajúca hrana detekovaná na PD2 spustí analógovo -digitálny prevod na PC0 a keď je táto konverzia dokončená, vyvolá prerušenie ADC Konverzia dokončená. Teraz chceme s týmto prerušením niečo urobiť. Ak preskúmate tabuľku 12-6 na strane 65, zobrazí sa zoznam možných prerušení. V predchádzajúcich návodoch sme už videli prerušenie RESET na adrese 0x0000 a prerušenie pretečenia Timer/Counter0 na adrese 0x0020. Teraz sa chceme pozrieť na prerušenie ADC, ktoré podľa tabuľky vidíme na adrese 0x002A. Na začiatku nášho kódu montážneho jazyka budeme potrebovať riadok, ktorý znie:

.org 0x002Arjmp ADC_int

ktorý skočí na náš obslužný program prerušenia označený ADC_int vždy, keď ADC dokončí konverziu. Ako by sme teda mali napísať našu obslužnú rutinu prerušenia? ADC funguje tak, že vykonáte nasledujúci výpočet:

ADC = Vin x 1024 / Vref

Pozrime sa teda, čo sa stane, ak stlačím tlačidlo „opakovanej voľby“na klávesnici. V takom prípade sa napätie na PC0 zmení na nejakú hodnotu, povedzme 1,52 V, a pretože Vref je na 5 V, budeme mať:

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

a tak by sa to ukázalo ako 311. Ak by sme to chceli previesť späť na napätie, výpočet by sme obrátili. Nebudeme to však musieť urobiť, pretože nás nezaujíma skutočné napätie, iba jeho rozlíšenie. Keď je konverzia dokončená, výsledok je uložený v 10-bitovom čísle umiestnenom v registroch ADCH a ADCL a spôsobili sme, že bude „vľavo upravený“, čo znamená, že 10-bitové súbory začínajú na bite 7 ADCH a idú nadol na bit 6 ADCL (v týchto dvoch registroch je celkom 16 bitov a používame iba 10 z nich, tj 1024 kanálov). Mohli by sme nechať výsledok „vpravo upravený“, ak by sme chceli, vymazaním bitu ADLAR v registri ADMUX. Dôvod, prečo sme vybrali úpravu vľavo, je ten, že naše signály sú od seba dostatočne ďaleko, takže posledné dve číslice čísla kanála nie sú relevantné a sú pravdepodobne iba hluk, takže stlačenie klávesov budeme rozlišovať iba pomocou horných 8 číslic, inými slovami, budeme sa musieť pozrieť iba na ADCH, aby sme zistili, ktoré tlačidlo bolo stlačené. Náš obslužný program prerušenia by preto mal číslo jednoducho prečítať z ADCH zaregistrujte sa, konvertujte toto číslo na hodnotu na klávesnici a potom odošlite túto hodnotu do diód LED nášho analyzátora registrov, aby sme si mohli overiť, že stlačenie „9“povedie k rozsvieteniu diód zodpovedajúcich „00001001“. Predtým než pôjdeme aj keď musíme najskôr vidieť, čo sa zobrazuje v ADCH, keď stlačíme rôzne tlačidlá. Poďme teda napísať jednoduchú obsluhu prerušenia, ktorá len odošle obsah ADCH na displej analyzátora. Takže tu je to, čo potrebujeme:

ADC_int: lds analyzátor, ADCH; načítajte hodnotu ADCH do našich analyzátorovbi EIFR, 0; Vymažte príznak externého prerušenia, aby bol pripravený ísť znova

Teraz by ste mali byť schopní skopírovať kód z nášho analyzátora v tutoriále 5 a pridať toto prerušenie a prepínacie nastavenia a spustiť ho. Cvičenie 2: Napíšte kód a spustite ho. Uistite sa, že sa na displeji analyzátora zobrazí ADCH. Skúste stlačiť rovnaké stlačenie klávesu viackrát. Dostávate v ADCH vždy rovnakú hodnotu?

Krok 8: Mapujte hodnoty stlačenia klávesov

Mapujte hodnoty stlačenia klávesov
Mapujte hodnoty stlačenia klávesov

Teraz musíme previesť hodnoty v ADCH na čísla zodpovedajúce stlačenému klávesu. Vykonáme to tak, že pri každom stlačení klávesu napíšeme obsah ADCH a potom ho skonvertujeme na desatinné číslo, ako som to urobil na obrázku. V našej rutine spracovania prerušenia budeme považovať celý rad hodnôt za zodpovedajúci každému stlačeniu klávesu, takže ADC namapuje čokoľvek v tomto rozsahu na dané stlačenie klávesu.

Cvičenie 3: Vykonajte toto mapovanie a potom znova napíšte svoju rutinu prerušenia ADC.

Tu je to, čo som dostal za svoje (vaše bude veľmi pravdepodobne iné). Všimnite si, že som nastavil rozsah hodnôt pre každé stlačenie klávesu.

ADC_int:; Externý analyzátor obsluhy prerušenia obsluhy; pripraviť sa na nové číselné tlačidláH, ADCH; ADC sa aktualizuje, keď sa číta ADCH, tlačidlo clccpiH, 240brlo PC+3; ak je ADCH väčší, potom je to analyzátor 1ldi, 1; zaťažte analyzátor s návratom 1rjmp; a vráťte tlačidlo clccpiH, 230; ak je ADCH väčší, potom 2brlo PC+3ldi analyzátor, 2rjmp spätné clccpi tlačidlo H, 217brlo PC+3ldi analyzátor, 3rjmp spiatočné clccpi tlačidloH, 203brlo PC+3ldi analyzátor, 4rjmp spiatočné clccpi tlačidloH, 187brlo PC+3ldi analyzátor, 5rjmp návratové clcpi 155brlo PC+3ldi analyzátor, 6rjmp spiatočný clccpi tlačidloH, 127brlo PC+3ldi analyzátor, 255; nastavíme blesk ako všetky onrjmp spätné clccpi tlačidloH, 115brlo PC+3ldi analyzátor, 7rjmp návratové clccpi tlačidloH, 94brlo PC+3ldi analyzátor, 8rjmp návratové clccpi tlačidloH, 62brlo PC+3ldi analyzátor, 9rjmp návratové clccpi tlačidloH, 37brlo PC+3ldi analyzátor 0b11110000; hviezdička je horná polovica onrjmp spiatočky clccpi tlačidloH, 28brlo PC+3ldi analyzátor, 0rjmp návrat clccpiHH, 17brlo PC+3ldi analyzátor, 0b00001111; znak hash je dolná polovica tlačidla onrjmp návratu clccpiH, analyzátor 5brlo PC+3ldi, 0b11000011; opakovaná voľba je horný 2 dolný 2rjmp spätný analyzátor ldi, 0b11011011; inak nastala chyba návrat: reti

Krok 9: Kód a video pre verziu 1

Priložil som svoj kód pre túto prvú verziu ovládača klávesnice. V tomto musíte stlačiť kláves a potom tlačidlo, aby ADC prečítal vstup z klávesnice. To, čo by sme radšej mali, nie je žiadne tlačidlo, ale signál na vykonanie konverzie pochádza zo samotného stlačenia klávesu. Cvičenie 3: Zostavte a nahrajte tento kód a vyskúšajte ho. Možno budete musieť zmeniť rôzne prahy konverzie, aby zodpovedali vašim napätiam pri stlačení klávesov, pretože sa pravdepodobne líšia od mojich. Čo sa stane, ak sa pokúsite použiť vstup z klávesnice pre ADC0 aj pre externý prerušovací kolík namiesto pomocou tlačidla? Pripojím aj video z fungovania tejto prvej verzie nášho ovládača stlačenia klávesu. Všimnete si toho v mojom kóde je sekcia inicializujúca ukazovateľ zásobníka. Existujú rôzne registre, ktoré môžeme chcieť tlačiť a vysúvať zo zásobníka, keď manipulujeme s premennými a čo nie, a existujú aj registre, ktoré možno budeme chcieť neskôr uložiť a obnoviť. Napríklad SREG je register, ktorý nie je zachovaný cez prerušenia, takže rôzne príznaky, ktoré sú nastavené a vymazané v dôsledku operácií, sa môžu zmeniť, ak dôjde k prerušeniu uprostred niečoho. Je preto najlepšie, ak zatlačíte SREG na zásobník na začiatku obsluhy prerušenia a potom ho znova vysuniete na konci obsluhy prerušenia. Vložil som to do kódu, aby som ukázal, ako sa inicializuje, a aby som predvídal, ako to budeme neskôr potrebovať, ale pretože nás nezaujíma, čo sa stane so SREG počas prerušenia nášho kódu, na to som zásobník nepoužil. Tiež si všimnite že som použil operáciu posunu na nastavenie rôznych bitov v registroch pri inicializácii. Napríklad v riadku:

ldi teplota, (1 <> sv. EICRA, tepl

Príkaz „<<“v prvom riadku kódu vyššie je operácia na smeny. V zásade vezme binárne číslo 1, ktoré je 0b00000001, a posunie ho doľava o hodnotu čísla ISC01. Toto je pozícia bitu s názvom ISC01 v registri EICRA. Pretože ISC01 je bit 1, číslo 1 sa posunie na ľavú 1 pozíciu, aby sa stalo 0b00000010. Podobne druhý, ISC00, je bit 0 EICRA, a preto je posunutie čísla 1 o nulové polohy vľavo. Ak sa pozriete ešte raz, pozrite sa na súbor m328Pdef.inc, ktorý ste stiahli v prvom návode a odvtedy používate príkaz evrr, uvidíte, že je to len dlhý zoznam príkazov „.equ“. Zistíte, že ISC01 sa rovná 1. Zostavovateľ nahradí všetky jeho inštancie číslom 1, než začne čokoľvek zostavovať. Sú to iba názvy registrových bitov, ktoré nám ľuďom pomáhajú čítať a písať kód. Teraz je zvislá čiara medzi dvoma vyššie uvedenými operáciami posunu logickou operáciou „alebo“. Tu je rovnica:

0b00000010 | 0b00000001 = 0b00000011

a práve to načítavame (pomocou „ldi“) do temp. Dôvod, prečo ľudia používajú túto metódu na načítanie hodnôt do registra, je ten, že umožňuje používať názov bitu namiesto iba čísla, a preto je kód oveľa ľahšie čitateľný. Existujú aj ďalšie dve techniky, ktoré sme použili. Používame pokyny „ori“a „andi“. Tieto nám umožňujú NASTAVIŤ a VYMAZAŤ bity v uvedenom poradí bez zmeny akýchkoľvek ďalších bitov v registri. Napríklad keď som použil

ori temp, (1

táto "alebo" teplota s 0b00000001, ktorá dá 1 do nulového bitu a zvyšok ponechá nezmenený. Tiež keď sme písali

andi temp, 0b11111110

toto zmení nulový bit teploty na 0 a zvyšok zostane nezmenený.

Cvičenie 4: Mali by ste prejsť kódom a uistiť sa, že rozumiete každému riadku. Možno vás bude zaujímať nájsť lepšie metódy na prácu a napísať lepší program. Existuje sto spôsobov, ako veci kódovať, a som si celkom istý, že nájdete oveľa lepší spôsob ako ten môj. Môžete tiež nájsť (nedajbože!) Chyby a opomenutia. V takom prípade by som o nich určite chcel počuť, aby ich bolo možné opraviť.

Dobre, teraz sa pozrime, či sa toho nadbytočného tlačidla dokážeme zbaviť …

Krok 10: Kód pre verziu 2

Najjednoduchším spôsobom, ako sa zbaviť tlačidla, je úplne ho odstrániť, zabudnúť vstup na PB2 a prepnúť ADC na „režim voľného chodu“.

Inými slovami, jednoducho zmeňte register ADCSRB tak, aby všetky ADTS2, ADTS1 a ADTS0 boli nulové.

Potom nastavte bit ADSC v ADCSRA na 1, čím sa spustí prvá konverzia.

Teraz ho nahrajte do svojho mikrokontroléra a zistíte, že správne číslo sa zobrazí na displeji počas stlačenia tlačidla a iba počas stlačenia tlačidla. Dôvodom je, že ADC nepretržite vzorkuje port ADC0 a zobrazuje hodnotu. Keď zložíte prst z tlačidla, „odrazenie tlačidla“spôsobí, že sa niekoľko náhodných hodnôt vyskytne veľmi rýchlo a potom sa vráti na vstup 0V. V našom kóde sa tento 0V javí ako 0b11011011 (pretože stlačenie klávesu „0“už používa zobrazenú hodnotu 0b00000000)

Toto nie je riešenie, ktoré by sme chceli, a to z dvoch dôvodov. Najprv nechceme držať tlačidlo. Chceme to stlačiť raz a nechať zobraziť číslo (alebo použiť ho v nejakom novom kóde v neskoršom návode). Za druhé, nechceme priebežne vzorkovať ADC0. Chceme, aby to trvalo jedno čítanie, skonvertovalo to a potom spalo, kým nové stlačenie klávesu nespustí novú konverziu. Voľne spustený režim je najvhodnejší, ak jediné, čo chcete, aby mikrokontrolér robil, je neustále čítanie nejakého analógového vstupu - ako keby ste chceli zobrazovať teploty v reálnom čase alebo niečo také.

Poďme teda nájsť ďalšie riešenie …

Krok 11: Ako sa zbavíme tlačidla? Verzia 3

Ako sa zbavíme tlačidla? Verzia 3
Ako sa zbavíme tlačidla? Verzia 3

Môžeme postupovať mnohými spôsobmi. Najprv by sme mohli pridať hardvér, aby sme sa zbavili tlačidla. Môžeme sa napríklad pokúsiť vložiť tranzistor do obvodu na výstupnom riadku stlačenia klávesu, aby odoberal malý pramienok prúdu z výstupu a poslal 5V impulz na prerušovací kolík PD2.

To by však bolo prinajmenšom príliš hlučné a v najhoršom prípade by to neposkytlo dostatok času na presné prečítanie stlačenia klávesu, pretože výstup napätia z klávesnice by nemal čas stabilizovať sa pred zachytením čítania ADC.

Radšej teda prídeme so softvérovým riešením. Čo by sme chceli urobiť, je pridať prerušenie na pin PD2 a napísať preň obslužný program prerušenia, ktorý volá jedno prečítanie pinu klávesnice. Inými slovami, zbavíme sa prerušenia automatického spúšťača z ADC a pridáme doň externé prerušenie, ktoré zavolá ADC. Signál na čítanie ADC tak príde potom, čo už dôjde k signálu PD2, čo môže veciam poskytnúť dostatok času na stabilizáciu na presné napätie pred načítaním a prevádzaním kolíka PC0. Stále by sme mali prerušenie dokončenia ADC, ktoré na konci odošle výsledok na displej analyzátora.

Dáva zmysel? Tak poďme na to…

Pozrite sa na nový priložený kód.

Uvidíte nasledujúce zmeny:

  1. Na adresu.org 0x0002 sme pridali rjmp, aby zvládol externé prerušenie INT0
  2. Zmenili sme register EIMSK, aby naznačoval, že chceme prerušiť na pine INT0
  3. Zmenili sme kolík ADATE v registri ADCSRA, aby sme deaktivovali automatické spúšťanie
  4. Zbavili sme sa nastavení ADCSRB, pretože sú irelevantné, keď je ADATE vypnuté
  5. Už nemusíme resetovať príznak externého spúšťača, pretože rutina prerušenia INT0 to robí automaticky, keď sa dokončí - predtým sme nemali rutinu prerušenia, iba sme spustili ADC zo signálu na tomto pine, takže sme museli vyčistite vlajku ručne.

Teraz v obsluhe prerušenia jednoducho nazývame jednu konverziu z ADC.

Cvičenie 5: Spustite túto verziu a uvidíte, čo sa stane.

Krok 12: Kód a video pre pracovnú verziu

Ako sme videli v minulej verzii, prerušenie tlačidla nefunguje veľmi dobre, pretože prerušenie sa spustí na stúpajúcej hrane na pin PD2 a potom obsluha prerušenia zavolá konverziu ADC. ADC však potom odčíta napätie skôr, ako sa stabilizuje, a tak číta nezmysly.

Čo potrebujeme, je zaviesť oneskorenie medzi prerušením na PD2 a čítaním ADC na PC0. Urobíme to pridaním časovača/počítadla, prerušenia pretečenia počítadla a rutiny oneskorenia. Našťastie už vieme, ako to urobiť z tutoriálu 3! Odtiaľ iba skopírujeme a prilepíme príslušný kód.

Dal som výsledný kód a video, ktoré ho ukazuje v prevádzke.

Všimnete si, že hodnoty nie sú také presné, ako by ste dúfali. Je to pravdepodobne kvôli viacerým zdrojom:

  1. klepneme z napäťového výstupu klávesnice na spustenie na PD2, čo ovplyvňuje čítanie v PC0.
  2. vlastne nevieme, ako dlho treba odkladať po spúšťači, aby sme dosiahli najlepšie čítanie.
  3. Dokončenie prevodu ADC trvá niekoľko cyklov, čo znamená, že nemôžeme na klávesnici rýchlo spustiť oheň.
  4. pravdepodobne je v samotnej klávesnici hluk.
  5. atď…

Aj keď sa nám podarilo klávesnicu uviesť do prevádzky a teraz by sme ju mohli používať v aplikáciách tak, že hodnoty klávesových skratiek použijeme iným spôsobom, ako ich len prenesieme na displej analyzátora, nie je to veľmi presné a je to veľmi nepríjemné. Preto si myslím, že najlepší spôsob prepojenia klávesníc je jednoducho zapojiť každý výstup z klávesnice do iného portu a rozhodnúť, ktorá klávesa je stlačená, v ktorých portoch je uvedené napätie. Je to jednoduché, veľmi rýchle a veľmi presné.

V skutočnosti existujú iba dva dôvody, prečo by ste chceli ovládať klávesnicu tak, ako sme to urobili tu:

  1. Používa iba 2 piny na našom mikrokontroléri namiesto 8.
  2. Je to skvelý projekt ukázať rôzne aspekty ADC na mikrokontroléri, ktoré sa líšia od štandardných vecí, ktoré tam môžete nájsť, napríklad odčítanie teploty, otáčanie potenciometrov atď. Chcel by som uviesť príklad spustených jednotlivých meraní a automatické spustenie externého kolíka než len voľne spustený režim hltania procesora.

V každom prípade je tu pre vás pár posledných cvičení:

Cvičenie 6: Opíšte obslužný program prerušenia dokončenia konverzie ADC, aby ste použili vyhľadávaciu tabuľku. Tj. Aby testoval analógovú hodnotu s prvou položkou v tabuľke a ak je väčšia, vráti sa z prerušenia, ak nie je, zvýši Z na ďalšiu položku v tabuľke a vetví sa znova do testu. To skráti kód a vyčistí rutinu prerušenia a bude vyzerať krajšie. (Ako ďalší krok uvediem možné riešenie) Cvičenie 7: Pripojte klávesnicu k 8 kolíkom na mikrokontroléri a napíšte k nemu jednoduchý ovládač a vyskúšajte si, aké je to krajšie. Napadá vás niekoľko spôsobov, ako zaistiť lepšie fungovanie našej metódy?

To je k tomuto tutoriálu všetko. Pripojil som konečnú verziu s ukazovateľmi. Keď sa priblížime k nášmu konečnému cieľu, v Tutoriáli 9 ešte raz použijeme klávesnicu, aby sme vám ukázali, ako pomocou nej ovládať sedem segmentových displejov (a vybudovali sme niečo zaujímavé, čo používa ďalšie klávesy na klávesnici telefónu) a potom budeme namiesto toho prepnite na ovládanie vecí stláčaním tlačidiel (pretože táto metóda lepšie vyhovuje konečnému produktu, ku ktorému sa pomocou týchto návodov staviame) a klávesnicu odložíme.

Uvidíme sa nabudúce!

Odporúča: