Obsah:
- Krok 1: Vyčistěte klávesnici 1
- Krok 2: Vyčistěte klávesnici 2
- Krok 3: Vyčistěte klávesnici 3
- Krok 4: Připojte klávesnici
- Krok 5: Připojte klávesnici k analyzátoru
- Krok 6: Které přepínače bychom měli nastavit?
- Krok 7: Napište obslužný program přerušení
- Krok 8: Mapujte hodnoty stisknutí kláves
- Krok 9: Kód a video pro verzi 1
- Krok 10: Kód pro verzi 2
- Krok 11: Jak se tlačítka zbavíme? Verze 3
- Krok 12: Kód a video pro pracovní verzi
Video: AVR Assembler Tutorial 7: 12 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:18
Vítejte v Tutoriálu 7!
Dnes si nejprve ukážeme, jak vyčistit klávesnici, a poté ukážeme, jak ke komunikaci s klávesnicí používat analogové vstupní porty. Uděláme to pomocí přerušení a jediného vodiče jako vstupu. Klávesnici připojíme tak, aby každé stisknutí klávesy poslalo na analogový vstup jedinečné napětí, které nám umožní rozlišit podle napětí, které tlačítko bylo stisknuto. Poté odešleme číslo vylisované do našeho analyzátoru registrů, abychom ukázali, že se vše děje tak, jak by mělo. Existuje řada úskalí, na která můžete narazit při použití převodníku analogového signálu na digitální (ADC) v ATmega328p, a tak budeme vezměte si věci v několika fázích na cestě a zkuste zjistit, jak se jim vyhnout. Uvidíme také, proč použití analogového převodníku na digitální není nejlepší způsob ovládání klávesnice, přestože používá méně portů na vašem mikrokontroléru. V tomto kurzu budete potřebovat:
- klávesnice. Můžete si koupit jeden, nebo můžete udělat to, co jsem udělal já, a jeden uklízet.
- 2 ženské záhlaví pro klávesnici (pokud ji uklízíte)
- spojovací vodiče
- prkénko
- 4 1 Kohm odpory
- 1 15 Kohmův odpor
- 1 3,3 Kohmův odpor
- 1 180 ohmový odpor
- Rezistor 1 680 ohmů
- digitální multimetr
- váš analyzátor z výukového programu 5
Pokud již máte klávesnici a nepotřebujete ji vyčistit, můžete prvních pár kroků přeskočit.
Zde je odkaz na kompletní sbírku mých návodů k assembleru AVR:
Krok 1: Vyčistěte klávesnici 1
Kdysi dávno, ještě když byli vaši prarodiče pouhými dětmi, lidé ke vzájemné komunikaci používali tato podivně vypadající zařízení, která měla dlouhé kabely zapojené do zdi. Říkalo se jim „telefony“a většinou šlo o levné plastové věci, které vydávaly nepříjemný zvuk, když vám někdo volal (ne že by dnešní vyzváněcí tóny „Justin Bieber“nebyly stejně otravné). V každém případě tato zařízení měla na sobě klávesnice, které byly velmi jednoduše propojeny kabelem, takže je lze snadno uklízet, a mají na nich 2 další klíče („opakované vytáčení“a „blesk“) z klávesnic, které si můžete koupit a které můžete chtít znovu použít. jako „klávesy se šipkami“, „klávesy nabídky“nebo něco jiného. Začneme tedy tím, že vyčistíme klávesnici ze starého telefonu. Nejprve vezměte telefon (používám GE, jak je znázorněno na obrázcích) a rozepněte ho, abyste odhalili kabeláž. Potom seberte dláto a odlomte malé plastové knoflíky, které drží klávesnici na, a vyjměte klávesnici.
Krok 2: Vyčistěte klávesnici 2
Nyní vezměte pilku na PVC a odřízněte plast z klíčových děr a poté řezte kolem okraje, abyste získali správnou hloubku a zanechali tenkou klávesnici.
Poté znovu zapněte klávesnici pomocí malých kolíků, které zůstaly poté, co jste v posledním kroku z nich odřízli vrcholy, a pomocí páječky jednoduše strčte horkou žehličku do každého otvoru pro kolík, který roztaví plast a roztáhne jej spodní část klávesnice tvořící nové „knoflíky“, které budou držet klávesnici na místě jako dříve.
Rád vyčistím tři reproduktory a možná i další věci, jako jsou přepínače a co ne, které jsou na desce. Tentokrát se však nechystám uklízet vypínače a tak, protože v tuto chvíli máme jiné cíle. Také tam je lineární integrovaný obvod TA31002, což je telefonní vyzvánění. Datový list lze snadno najít a stáhnout online s uvedením pinu a funkcí. Takže to zatím nechám připájené k desce a potom si s tím zahraji později. Chtěl bych to připojit k osciloskopu a zjistit, jaké skvělé signály z toho mohu dostat. Možná z toho dokonce udělat zvonek. Kdo ví.
Každopádně, jakmile skončíte se zničením telefonu a uklízením částí, dokončíme výrobu naší klávesnice.
Krok 3: Vyčistěte klávesnici 3
Použijte odpájecí knot a vyjměte páskové kabely ze spodní části klávesnice, ujistěte se, že jsou otvory v desce plošných spojů volné, a poté na desku, kde jsou otvory, připevněte dvě zásuvkové lišty. Pravděpodobně budete muset snížit záhlaví tak, aby to byly 4pinové záhlaví.
Nyní, když jsou připojeny záhlaví, můžete jej připojit k prkénku, vzít multimetr a vyzkoušet klíče přilepením multimetru přes náhodné kolíky a změřením odporu. To vám umožní zmapovat klíče. Je obtížné vidět, jak jsou klíče zapojeny do výstupů, když se podíváte na obvod, ale pokud používáte multimetr, můžete jej zapojit na libovolné dva piny a poté mačkat tlačítka, dokud se na obrazovce místo otevřeného obvodu nezobrazí číslo. Toto bude pinout pro tento klíč.
Tímto způsobem namapujte všechny klíče na výstupní piny.
Krok 4: Připojte klávesnici
Nyní postupujte podle schématu zapojení a připojte klávesnici k prkénku.
Jak to bude fungovat, dáme 5V na levou stranu a pravá strana přejde na GND. První kolík vpravo v diagramu jde do prvního z našich analogových pinů na mikrokontroléru Atmega328p. Pokud nejsou stisknuta žádná tlačítka, signál bude 0 V a při stisknutí každého z různých tlačítek se vstup na analogový port bude pohybovat mezi 0 V a 5 V s různým množstvím v závislosti na tom, která klávesa byla stisknuta. Hodnoty odporu jsme vybrali tak, aby každá cesta obsahovala odpor odlišný od ostatních. Analogový port na mikrokontroléru odebírá analogový signál a rozděluje jej na 1024 různých kanálů mezi 0V a 5V. To znamená, že každý kanál má šířku 5V/1024 = 0,005 V/kanál = 5 mV/kanál. Analogový port tedy dokáže rozlišit vstupní napětí, pokud se liší o více než 5 mV. V našem případě jsme zvolili hodnoty odporu, takže jakákoli dvě stisknutí kláves pošlou napěťový signál, který se liší více než toto, takže mikrokontrolér by měl snadno rozhodnout, která klávesa byla stisknuta. Velkým problémem je, že celý systém je velmi hlučný, takže budeme muset zvolit rozsah napětí, které budeme mapovat při každém stisknutí tlačítka - ale k tomu se dostaneme o něco později.
Všimněte si, že jsme schopni ovládat 14tlačítkovou klávesnici pouze pomocí jediného vstupního řádku do ovladače. To je jeden z užitečných aspektů analogových vstupů.
Nyní bude naším prvním pokusem o ovládání klávesnice stisknutí klávesy způsobující přerušení, podprogram přerušení načte analogový vstupní port a rozhodne, která klávesa byla stisknuta, a poté vydá toto číslo do podprogramu našeho analyzátoru registrů, který zobrazí klíčová hodnota v binárním formátu na našich 8 LED diodách, které jsme nastavili v kurzu 5.
Krok 5: Připojte klávesnici k analyzátoru
Obrázky ukazují, jak chceme připojit klávesnici k mikrokontroléru, abychom viděli výstup na displeji našeho analyzátoru. V zásadě jednoduše propojíme výstup z klávesnice na pin 0 PortC, kterému se na ATmega328P také říká ADC0.
Existuje však několik dalších věcí. Chystáme se také připojit tlačítko k PD2. Tj. vezměte vodič z vaší 5V lišty na tlačítko a z druhé strany tlačítka na PD2 a nakonec chceme odpojit pin AREF od naší 5V lišty a místo toho ji nechat odpojenou. Pokud bychom chtěli, mohli bychom vložit oddělovací kondenzátor 0,1 mikrofaradu. Jedná se o keramický kondenzátor, na kterém je napsáno 104. První dvě číslice jsou číslo a poslední číslice je síla 10, kterou vynásobíme, abychom dostali odpověď v pikofaradech (pico znamená 10^-12), takže 104 znamená 10 x 10^4 picofaradů, což je stejné jako 100 nanofarad (nano znamená 10^-9), což je stejné jako 0,1 mikrofarad (mikro znamená 10^-6). Každopádně to všechno stabilizuje pin AREF, když jej můžeme použít jako referenční pin.
Chceme také odpor 1 Mohm mezi PD2 a zemí. Nastavíme PD2 jako výstupní kolík na 0 V a na tomto pinu budeme spouštět na kladné hraně. Chceme, aby hrana okamžitě zmizela, když uvolníme tlačítko, takže vložíme tento „stahovací“odpor.
Důvod, proč chceme tlačítko, je ten, že chceme spustit náš analogově digitální převodník mimo pin INT0 na čipu, což je také PD2. Nakonec bychom chtěli, aby stisknutí klávesy spustilo ADC a také poskytlo vstup, který má být převeden bez samostatného tlačítka, ale kvůli způsobu, jakým funguje časování, začneme tím, že budeme mít samostatné tlačítko pro spuštění ADC a jakmile vyžehlíme všechny chyby a jsme si jisti, že vše funguje správně, pak se budeme zabývat problémy s hlukem a načasováním, které přicházejí se spuštěním ze stejného stisknutí tlačítka, které chceme číst.
Takže prozatím to funguje tak, že podržíme klávesu, potom stiskneme tlačítko pro spuštění ADC a pak pustíme a doufejme, že se binární hodnota tlačítka, které jsme stiskli, zobrazí na analyzátoru.
Pojďme tedy napsat nějaký kód, který toho dosáhne.
Krok 6: Které přepínače bychom měli nastavit?
Nejprve si promyslíme, jak to kódujeme, aby ovladač mohl přečíst vstup z klávesnice a převést jej na číselnou hodnotu odpovídající tlačítku, které bylo stisknuto. Použijeme převodník analogového signálu na digitální (ADC) který je integrován do Atmega328p. Jako referenční napětí použijeme AREF a výstup naší klávesnice bude připojen k PortC0 nebo PC0. Všimněte si, že tento pin se také nazývá ADC0 pro převodník analogového signálu na digitální 0. Může být vhodné, abyste si přečetli část 12.4 o přerušeních pro ATmega328P a také kapitolu 24 o převaděči analogových signálů, než se dostaneme nebo alespoň mít připravené tyto sekce jako referenci. Abychom mohli nastavit mikrokontrolér tak, aby věděl, co dělat s analogovým vstupním signálem a jak komunikovat s naším programem, musíme nejprve nastavit několik různých ADC související registrační bity. Ty jsou v podstatě ekvivalentní starým přepínačům na prvních počítačích. Buď přepnete vypínač do polohy ON nebo OFF, nebo ještě dále dozadu zapojíte kabely mezi jednu zásuvku a druhou, aby elektrony, které dosáhnou na vidlici na silnici, našly jednu bránu zavřenou a druhou otevřenou, což by ji přimělo jít jinou cestou v bludišti obvodů a tím provádět jiný logický úkol. Při kódování v jazyce sestavení máme blízký přístup k těmto funkcím mikrokontroléru, což je na prvním místě jedna z atraktivních věcí. Je to více „na ruce“a daleko méně se děje „v zákulisí“, jako by to bylo. Nemyslete proto na nastavení těchto registrů jako na nudný úkol. Díky tomu je montážní jazyk zajímavý! Získáváme velmi osobní vztah k vnitřnímu fungování a logice čipu a nutíme ho dělat přesně to, co chceme - ne více a ne méně. Žádné zbytečné cykly hodin, takže zde je seznam přepínačů, které musíme nastavit:
- Vypněte bit ADC Power Reduction, PRADC, což je bit 0 registru PRR, protože pokud je tento bit zapnutý, ADC se vypne. Registr snížení výkonu je v podstatě způsob, jak vypnout různé věci, které používají energii, když je nepotřebujete. Protože používáme ADC, chceme se ujistit, že není tímto způsobem deaktivován. (Viz PRADC na straně 46)
- Vyberte analogový vstupní kanál jako ADC0 vypnutím MUX3… 0 v registru ADC Multiplexer Selection (ADMUX) (viz tabulka 24-4 strana 249), tyto jsou již ve výchozím nastavení vypnuté, takže to opravdu nemusíme dělat. Zahrnuji to však, protože pokud někdy použijete jiný port než ADC0, budete muset tyto přepínače odpovídajícím způsobem přepnout. Různé kombinace MUX3, MUX2, MUX1, MUX0 vám umožňují použít jakýkoli analogový port jako váš vstup a můžete je také kdykoli změnit, pokud se chcete podívat na spoustu různých analogových signálů najednou.
- Vypněte bity REFS0 a REFS1 v registru ADMUX, abychom jako referenční napětí místo interní reference použili AREF (viz strana 248).
- Zapněte bit ADLAR v ADMUX, aby byl výsledek „upraven vlevo“, tuto volbu probereme v dalším kroku.
- Nastavením bitu ADC0D v registru deaktivace digitálního vstupu (DIDR0) vypnete digitální vstup na PC0. Tento port používáme pro analogový vstup, takže bychom pro něj mohli také deaktivovat digitální vstup.
- Nastavte ISC0 a ISC1 v externím kontrolním registru přerušení A (EICRA) tak, aby indikoval, že chceme spustit na stoupající hraně napěťového signálu na pin INT0 (PD2), viz strana 71.
- Vymažte bity INT0 a INT1 v registru EIMSK (External Interrupt Mask Register), což znamená, že na tomto pinu nepoužíváme přerušení. Pokud bychom na tomto pinu povolili přerušení, potřebovali bychom obslužný program přerušení na adrese 0x0002, ale místo toho jej nastavujeme tak, aby signál na tomto pinu spustil převod ADC, jehož dokončení je zpracováno úplným přerušením převodu ADC na adresa 0x002A. Viz strana 72.
- Chcete -li povolit ADC, nastavte bit ADC Enable (ADEN) (bit 7) v ovládacím a stavovém registru ADC (ADCSRA). Viz strana 249.
- Mohli bychom zahájit jednu konverzi nastavením bitů pro zahájení převodu ADC (ADSC) pokaždé, když jsme chtěli přečíst analogový signál, ale prozatím bychom raději nechali číst automaticky, kdykoli někdo stiskne tlačítko, takže místo toho povolíme ADC Bit Autotrigger Enable (ADATE) v registru ADCSRA, takže spouštění probíhá automaticky.
- Také jsme nastavili ADPS2..0 bitů (AD Prescalar bity) na 111, takže ADC hodiny jsou hodiny CPU dělené faktorem 128.
- Vybereme zdroj spouštění ADC jako PD2, který se také nazývá INT0 (požadavek na externí přerušení 0). Děláme to přepínáním různých bitů v registru ADCSRB (viz tabulka 24-6 na straně 251). U tabulky vidíme, že chceme vypnout ADTS0, zapnout ADTS1 a vypnout ADTS2, takže ADC spustí tento pin. Všimněte si, že pokud bychom chtěli nepřetržitě vzorkovat analogový port, jako kdybychom četli nějaký souvislý analogový signál (jako vzorkování zvuku nebo něco), nastavili bychom to na Free Running Mode. Metoda, kterou používáme pro nastavení spouštění na PD2, spustí čtení ADC analogového portu PC0, aniž by došlo k přerušení. Přerušení přijde po dokončení převodu.
- Povolte bit ADC Interrupt Enable (ADIE) v registru ADCSRA, aby po dokončení převodu analogového signálu na digitální generoval přerušení, pro které můžeme napsat obslužný program přerušení a umístit jej na.org 0x002A.
- Chcete -li povolit přerušení, nastavte bit I v SREG.
Cvičení 1: Ujistěte se, že jste si přečetli příslušné části v datovém listu pro každé z výše uvedených nastavení, abyste porozuměli tomu, co se děje a co by se stalo, kdybychom je změnili na alternativní nastavení.
Krok 7: Napište obslužný program přerušení
V posledním kroku jsme viděli, že jsme to nastavili tak, že stoupající hrana detekovaná na PD2 spustí analogově digitální převod na PC0 a když je tato konverze dokončena, vyvolá přerušení ADC Complete Complete. Nyní chceme s tímto přerušením něco udělat. Pokud prozkoumáte tabulku 12-6 na straně 65, zobrazí se seznam možných přerušení. V předchozích výukových programech jsme již viděli přerušení RESET na adrese 0x0000 a přetečení časovače/čítače0 na adrese 0x0020. Nyní se chceme podívat na přerušení ADC, které podle tabulky vidíme na adrese 0x002A. Takže na začátku našeho kódu montážního jazyka budeme potřebovat řádek, který zní:
.org 0x002Arjmp ADC_int
který přeskočí na náš obslužný program přerušení označený ADC_int, kdykoli ADC dokončí převod. Jak bychom tedy měli napsat náš obslužný program přerušení? ADC funguje tak, že provedeme následující výpočet:
ADC = Vin x 1024 / Vref
Podívejme se tedy, co se stane, když stisknu tlačítko „opakované vytáčení“na klávesnici. V takovém případě se napětí na PC0 změní na nějakou hodnotu, řekněme 1,52 V, a protože Vref je na 5 V, budeme mít:
ADC = (1,52 V) x 1024 /5 V = 311,296
a tak by to vypadalo jako 311. Pokud bychom to chtěli převést zpět na napětí, jednoduše bychom výpočet obrátili. Nebudeme to však muset dělat, protože nás nezajímá skutečná napětí, jen je rozlišovat. Když je převod dokončen, výsledek je uložen v 10bitovém čísle umístěném v registrech ADCH a ADCL a způsobili jsme, že bude „vlevo upraveno“, což znamená, že 10bitové počátky začínají bitem 7 ADCH a přejdou dolů na bit 6 ADCL (v těchto dvou registrech je celkem 16 bitů a používáme pouze 10 z nich, tj. 1024 kanálů). Mohli bychom mít výsledek „vpravo upravený“, pokud bychom chtěli vymazáním bitu ADLAR v registru ADMUX. Důvodem, proč zvolíme nastavení vlevo, je to, že naše signály jsou dostatečně daleko od sebe, takže poslední dvě číslice čísla kanálu nejsou relevantní a jsou pravděpodobně pouze hluk, takže budeme rozlišovat stisknutí kláves pouze pomocí horních 8 číslic, jinými slovy, budeme se muset podívat pouze na ADCH, abychom zjistili, které tlačítko bylo stisknuto. Takže náš obsluha přerušení by měla jednoduše přečíst číslo z ADCH zaregistrujte se, převeďte toto číslo na hodnotu na klávesnici a poté odešlete tuto hodnotu do LED diod našeho analyzátoru registrů, abychom mohli ověřit, že stisknutí „9“řekne, že se rozsvítí LED odpovídající „00001001“. i když musíme nejprve vidět, co se zobrazí v ADCH, když stiskneme různá tlačítka. Pojďme tedy napsat jednoduchý obslužný program přerušení, který pouze odešle obsah ADCH na displej analyzátoru. Takže tady je to, co potřebujeme:
ADC_int: lds analyzátor, ADCH; načtěte hodnotu ADCH do našich analyzátorůbi EIFR, 0; Vymažte příznak externího přerušení, aby byl připraven znovu vyrazit
Nyní byste měli být schopni zkopírovat kód z našeho analyzátoru v kurzu 5 a přidat toto přerušení a přepínací nastavení a spustit ho. Cvičení 2: Napište kód a spusťte jej. Zajistěte, aby se na displeji analyzátoru zobrazovalo ADCH. Zkuste několikrát stisknout stejné stisknutí klávesy. Dostáváte v ADCH vždy stejnou hodnotu?
Krok 8: Mapujte hodnoty stisknutí kláves
Nyní musíme převést hodnoty v ADCH na čísla odpovídající stisknutému klíči. Děláme to tak, že vypíšeme obsah ADCH pro každé stisknutí klávesy a poté je převedeme na desítkové číslo, jako jsem to udělal na obrázku. V naší rutině zpracování přerušení budeme považovat celou řadu hodnot za odpovídající každému stisknutí klávesy, takže ADC namapuje cokoli v tomto rozsahu na dané stisknutí klávesy.
Cvičení 3: Proveďte toto mapování a poté přepište rutinu přerušení ADC.
Tady je to, co jsem dostal za své (vaše bude velmi pravděpodobně jiné). Všimněte si, že jsem nastavil rozsah hodnot pro každé stisknutí klávesy.
ADC_int:; Externí analyzátor obsluhy přerušení přerušení; připravit se na nové číselné tlačítko H, ADCH; Aktualizace ADC při čtení ADCH clccpi tlačítko H, 240brlo PC+3; pokud je ADCH větší, pak je to analyzátor 1ldi, 1; načtěte analyzátor s návratem 1rjmp; a vraťte tlačítko clccpiH, 230; pokud je ADCH větší než 2brlo PC+3ldi analyzátor, 2rjmp návratový clccpi tlačítko H, 217brlo PC+3ldi analyzátor, 3rjmp návratový clccpi tlačítkoH, 203brlo PC+3ldi analyzátor, 4rjmp návratový clccpi tlačítkoH, 187brlo PC+3ldi analyzátor, 5rjmp návratový clcpi 155brlo PC+3ldi analyzátor, 6rjmp zpětné clccpi tlačítko H, 127brlo PC+3ldi analyzátor, 255; nastavíme blesk jako všechny onrjmp návratové clccpi tlačítkoH, 115brlo PC+3ldi analyzátor, 7rjmp návratové clccpi tlačítkoH, 94brlo PC+3ldi analyzátor, 8rjmp návratové clccpi tlačítkoH, 62brlo PC+3ldi analyzátor, 9rjmp návratové clccpi tlačítkoH, 37brlo PC+3ldi analyzátor 0b11110000; hvězdička je horní polovina onrjmp return clccpi buttonH, 28brlo PC+3ldi analyzátor, 0rjmp return clccpi buttonH, 17brlo PC+3ldi analyzátor, 0b00001111; znak hash je spodní polovina onrjmp návrat clccpi tlačítko H, 5brlo PC+3ldi analyzátor, 0b11000011; opakovaná volba je horní 2 spodní 2rjmp zpětný analyzátor ldi, 0b11011011; jinak došlo k chybě return: reti
Krok 9: Kód a video pro verzi 1
Připojil jsem svůj kód pro tuto první verzi ovladače klávesnice. V tomto musíte stisknout klávesu a poté tlačítko, aby ADC přečetl vstup z klávesnice. To, co bychom raději měli, není žádné tlačítko, ale místo toho signál k převodu pochází ze samotného stisknutí klávesy. Cvičení 3: Sestavte a nahrajte tento kód a zkuste to. Možná budete muset změnit různé prahové hodnoty převodu, aby odpovídaly vašim napětím při stisku klávesy, protože se pravděpodobně liší od mých. Co se stane, když se pokusíte použít vstup z klávesnice jak pro ADC0, tak pro externí přerušovací pin místo pomocí tlačítka? Připojím také video z provozu této první verze našeho ovladače pro stisknutí klávesy. Všimnete si toho v mém kódu je část inicializující ukazatel zásobníku. Existují různé registry, které můžeme chtít tlačit a vyskakovat ze zásobníku, když manipulujeme s proměnnými a co ne, a existují také registry, které můžeme chtít uložit a obnovit později. Například SREG je registr, který není zachován přes přerušení, takže různé příznaky, které jsou nastaveny a vymazány v důsledku operací, mohou být změněny, pokud dojde k přerušení uprostřed něčeho. Nejlepší je tedy, když na začátku obsluhy přerušení zatlačíte SREG do zásobníku a poté jej na konci obsluhy přerušení znovu vysunete. Umístil jsem to do kódu, abych ukázal, jak je inicializován, a předvídal, jak to budeme později potřebovat, ale protože nás nezajímá, co se stane se SREG během přerušení v našem kódu, nepoužil jsem k tomu zásobník. že jsem použil operaci posunu k nastavení různých bitů v registrech při inicializaci. Například v řádku:
ldi temp, (1 <
Příkaz "<<" v prvním řádku kódu výše je směnná operace. V podstatě vezme binární číslo 1, což je 0b00000001, a posune jej doleva o částku čísla ISC01. Toto je pozice bitu s názvem ISC01 v registru EICRA. Protože ISC01 je bit 1, číslo 1 je posunuto na pozici 1 vlevo, aby se stalo 0b00000010. Podobně druhý, ISC00, je bit 0 EICRA, takže posun čísla 1 je nulová pozice doleva. Pokud se podíváte, podívejte se ještě jednou na soubor m328Pdef.inc, který jste si stáhli v prvním tutoriálu a od té doby používáte evrr, uvidíte, že je to jen dlouhý seznam příkazů „.equ“. Zjistíte, že ISC01 se rovná 1. Sestavovač nahradí všechny jeho instance číslem 1, než začne cokoli sestavovat. Jsou to jen názvy registrových bitů, které nám lidem pomáhají číst a psát kód. Nyní je svislá čára mezi dvěma operacemi řazení výše logickou operací „nebo“. Zde je rovnice:
0b00000010 | 0b00000001 = 0b00000011
a právě to načítáme (pomocí "ldi") do temp. Důvod, proč lidé používají tuto metodu k načtení hodnot do registru, je ten, že umožňuje použít název bitu místo pouze čísla a díky tomu je kód mnohem snáze čitelný. Existují také dvě další techniky, které jsme použili. Používáme pokyny „ori“a „andi“. Ty nám umožňují NASTAVIT respektive VYMAZAT bity bez změny jakýchkoli ostatních bitů v registru. Například když jsem použil
ori temp, (1
tato "nebo" teplota s 0b00000001, která dá 1 do nulového bitu a zbytek nechá beze změny. Také když jsme psali
andi temp, 0b11111110
tím se změní nulový bit temp na 0 a zbytek zůstane beze změny.
Cvičení 4: Měli byste projít kód a ujistit se, že rozumíte každému řádku. Možná vás bude zajímat najít lepší metody pro dělání věcí a napsat lepší program. Existuje sto způsobů, jak věci kódovat, a jsem si docela jistý, že najdete mnohem lepší způsob než ten můj. Můžete také najít (zaplať pánbůh!) Chyby a opomenutí. V takovém případě bych o nich určitě rád slyšel, aby je bylo možné opravit.
Dobře, teď se podívejme, jestli se toho nadbytečného tlačítka můžeme zbavit …
Krok 10: Kód pro verzi 2
Nejjednodušší způsob, jak se tlačítka zbavit, je úplně ho odebrat, zapomenout na vstup do PB2 a přepnout ADC na „Free Running Mode“.
Jinými slovy jednoduše změňte registr ADCSRB tak, aby všechny ADTS2, ADTS1 a ADTS0 byly nuly.
Poté nastavte ADSC bit v ADCSRA na 1, čímž se spustí první převod.
Nyní jej nahrajte do svého mikrokontroléru a zjistíte, že správné číslo se objeví na displeji, zatímco stisknete tlačítko a pouze když stisknete tlačítko. Důvodem je, že ADC nepřetržitě vzorkuje port ADC0 a zobrazuje hodnotu. Když sundáte prst z tlačítka, „odskočení tlačítka“způsobí, že se několik náhodných hodnot vyskytne velmi rychle a poté se ustálí na vstupu 0V. V našem kódu se tento 0V objevuje jako 0b11011011 (protože stisk klávesy `0 'již používá zobrazenou hodnotu 0b00000000)
Toto však není řešení, které chceme, a to ze dvou důvodů. Nejprve nechceme tlačítko držet. Chceme to jednou zmáčknout a nechat zobrazit číslo (nebo použít v nějakém novém kódu v pozdějším tutoriálu). Za druhé, nechceme nepřetržitě vzorkovat ADC0. Chceme, aby to zabralo jediné čtení, převedlo to a pak spalo, dokud nové stisknutí klávesy nespustí novou konverzi. Volně běžící režim je nejlepší, pokud jedinou věcí, kterou chcete, aby mikrokontrolér dělal, je neustále číst nějaký analogový vstup - jako kdybyste chtěli zobrazit teploty v reálném čase nebo tak něco.
Pojďme tedy najít další řešení…
Krok 11: Jak se tlačítka zbavíme? Verze 3
Mohli bychom postupovat mnoha způsoby. Nejprve jsme mohli přidat hardware, abychom se tlačítka zbavili. Například se můžeme pokusit vložit tranzistor do obvodu na výstupním řádku stisknutí klávesy tak, aby odebíral malý pramínek proudu z výstupu a vyslal 5V impuls na přerušovací kolík PD2.
To by však bylo přinejmenším příliš hlučné a v nejhorším by to neposkytlo dostatek času na přesné čtení stisknutí klávesy, protože napěťový výstup klávesnice by neměl čas se stabilizovat, než bude zachycen údaj ADC.
Raději tedy vymyslíme softwarové řešení. Co bychom chtěli udělat, je přidat přerušení na pin PD2 a napsat pro něj obslužný program přerušení, který volá jediné načtení pinu klávesnice. Jinými slovy, zbavíme se přerušení automatického spouštění z ADC a přidáme externí přerušení, které do něj volá ADC. Signál pro čtení ADC tak přichází poté, co již došlo k signálu PD2, a to může dát věcem dostatek času na stabilizaci přesného napětí, než bude pin PC0 načten a převeden. Stále bychom měli přerušení dokončení ADC, které na konci zobrazí výsledek na displeji analyzátoru.
Dávat smysl? No jdeme na to…
Podívejte se na přiložený nový kód.
Zobrazí se následující změny:
- Přidali jsme rjmp na adrese.org 0x0002, abychom zvládli externí přerušení INT0
- Změnili jsme registr EIMSK, aby naznačil, že chceme přerušit na pinu INT0
- Změnili jsme pin ADATE v registru ADCSRA, abychom deaktivovali automatické spouštění
- Zbavili jsme se nastavení ADCSRB, protože jsou irelevantní, když je ADATE vypnuté
- Už nemusíme resetovat příznak externí spouště, protože rutina přerušení INT0 to dělá automaticky, když se dokončí - dříve jsme neměli rutinu přerušení, jen jsme spustili ADC ze signálu na tomto pinu, takže jsme museli vyčistěte vlajku ručně.
Nyní v obsluze přerušení jednoduše nazýváme jedinou konverzi z ADC.
Cvičení 5: Spusťte tuto verzi a uvidíte, co se stane.
Krok 12: Kód a video pro pracovní verzi
Jak jsme viděli v poslední verzi, přerušení tlačítka nefunguje příliš dobře, protože přerušení je spuštěno na náběžné hraně na pin PD2 a poté obsluha přerušení volá převod ADC. ADC však poté získá hodnotu napětí, než se stabilizuje, a tak čte nesmysly.
Potřebujeme zavést zpoždění mezi přerušením na PD2 a čtením ADC na PC0. To provedeme přidáním časovače/čítače, přetečení čítače a rutiny zpoždění. Naštěstí již víme, jak to udělat z výukového programu 3! Odtud tedy zkopírujeme a vložíme příslušný kód.
Výsledný kód a video ukazující jeho provoz jsem dal.
Všimnete si, že hodnoty nejsou tak přesné, jak by se dalo doufat. Důvodem je pravděpodobně řada zdrojů:
- klepáme z napěťového výstupu klávesnice na spouštění na PD2, což ovlivňuje čtení v PC0.
- vlastně nevíme, jak dlouho se má po spoušti zdržovat, aby se dosáhlo nejlepšího čtení.
- dokončení převodu ADC trvá několik cyklů, což znamená, že na klávesnici nemůžeme rychle střílet.
- pravděpodobně je v samotné klávesnici hluk.
- atd…
Přestože se nám podařilo uvést klávesnici do provozu a nyní ji můžeme používat v aplikacích tak, že hodnoty kláves stiskneme jiným způsobem, než abychom je pouze přenesli na displej analyzátoru, není to příliš přesné a je to velmi nepříjemné. Proto si myslím, že nejlepším způsobem, jak zapojit klávesnice, je jednoduše vložit každý výstup z klávesnice do jiného portu a rozhodnout, která klávesa je stisknuta, které porty vidí napětí. To je snadné, velmi rychlé a velmi přesné.
Ve skutečnosti existují pouze dva důvody, proč bychom chtěli ovládat klávesnici tak, jak jsme to udělali zde:
- Místo 8 používá pouze 2 piny na našem mikrokontroléru.
- Je to skvělý projekt, který ukazuje různé aspekty ADC na mikrokontroléru, které se liší od standardních věcí, které tam můžete najít, jako jsou odečty teploty, otočné potenciometry atd. Chtěl jsem příklad spuštěných jednotlivých měření a automatické spouštění pinů spíše než jen volně spuštěný režim hltání CPU.
Každopádně je tu pro vás pár posledních cvičení:
Cvičení 6: Přepište obslužnou rutinu přerušení úplného převodu ADC a použijte vyhledávací tabulku. Tj. Aby otestoval analogovou hodnotu s první položkou v tabulce a pokud je větší, vrátí se z přerušení, pokud není, zvýší Z na další položku v tabulce a znovu se větví zpět do testu. Tím se kód zkrátí a vyčistí rutina přerušení a bude vypadat hezčí. (Jako další krok uvedu možné řešení) Cvičení 7: Připojte klávesnici k 8 pinům na mikrokontroléru a napište k němu jednoduchý ovladač a vyzkoušejte si, jak je hezčí. Napadá vás několik způsobů, jak zajistit, aby naše metoda fungovala lépe?
To je pro tento tutoriál vše. Připojil jsem konečnou verzi s ukazateli. Když se dostaneme blíže k našemu konečnému cíli, použijeme klávesnici ještě jednou v kurzu 9, abychom ukázali, jak pomocí ní ovládat sedm segmentových displejů (a vytvořit něco zajímavého, co používá další klávesy na klávesnici telefonu) a poté budeme místo toho přepněte na ovládání věcí stiskem tlačítka (protože tato metoda se lépe hodí ke konečnému produktu, ke kterému se pomocí těchto výukových programů stavíme) a my jen odložíme klávesnici.
Uvidíme se příště!
Doporučuje:
AVR Assembler Tutorial 2: 4 Steps
AVR Assembler Tutorial 2: Tento tutoriál je pokračováním " AVR Assembler Tutorial 1 " Pokud jste neprošli výukovým programem 1, měli byste se hned zastavit a udělat to jako první. V tomto kurzu budeme pokračovat ve studiu programování v jazyce sestavení atmega328p u
AVR Assembler Tutorial 1: 5 Steps
AVR Assembler Tutorial 1: Rozhodl jsem se napsat sérii návodů, jak psát programy v assembleru pro Atmega328p, což je mikrokontrolér používaný v Arduinu. Pokud lidé zůstanou zájem, budu i nadále vydávat jeden týdně, dokud mi nedojde
AVR Assembler Tutorial 6: 3 Steps
AVR Assembler Tutorial 6: Welcome to Tutorial 6! Dnešní tutoriál bude krátký, kde vyvineme jednoduchou metodu pro komunikaci dat mezi jedním atmega328p a druhým pomocí dvou portů, které je spojují. Poté vezmeme hrací kostku z Tutoriálu 4 a Registrovat
AVR Assembler Tutorial 8: 4 Steps
AVR Assembler Tutorial 8: Welcome to Tutorial 8! V tomto krátkém tutoriálu se trochu odvrátíme od zavádění nových aspektů programování v jazyce assembleru, abychom ukázali, jak přesunout naše prototypovací komponenty do samostatného " tištěného " obvodová deska
AVR Assembler Tutorial 9: 7 Steps
AVR Assembler Tutorial 9: Welcome to Tutorial 9. Dnes si ukážeme, jak ovládat jak 7segmentový displej, tak 4místný displej pomocí našeho kódu montážního jazyka ATmega328P a AVR. V průběhu toho budeme muset udělat odbočku v tom, jak používat zásobník