Tartalomjegyzék:
- 1. lépés: A billentyűzet eltávolítása 1
- 2. lépés: A billentyűzet eltávolítása 2
- 3. lépés: A billentyűzet eltávolítása 3
- 4. lépés: Csatlakoztassa a billentyűzetet
- 5. lépés: Csatlakoztassa a billentyűzetet az analizátorhoz
- 6. lépés: Melyik kapcsolókat állítsuk be?
- 7. lépés: Írja meg a megszakításkezelőt
- 8. lépés: Térképezze fel a gombnyomási értékeket
- 9. lépés: Kód és videó az 1. verzióhoz
- 10. lépés: A 2. verzió kódja
- 11. lépés: Hogyan szabadulhatunk meg a gombtól? 3. verzió
- 12. lépés: A működő verzió kódja és videója
Videó: AVR összeszerelő bemutató 7: 12 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:39
Üdvözöljük a 7 -es oktatóanyagban!
Ma először megmutatjuk, hogyan kell eltávolítani a billentyűzetet, majd megmutatjuk, hogyan kell használni az analóg bemeneti portokat a billentyűzettel való kommunikációhoz. Ezt megszakításokkal és egyetlen vezetékkel használjuk bemenetként. A billentyűzetet úgy vezetjük be, hogy minden gombnyomás egyedi feszültséget küldjön az analóg bemenetre, amely lehetővé teszi számunkra, hogy megkülönböztessük a billentyű megnyomásának feszültségét. Ezután kiadjuk a regisztrációs elemzőnknek lenyomott számot, hogy megmutassuk, hogy minden úgy történik, ahogy kell. Számos buktató van, amibe belefuthat, ha az ATmega328p analóg -digitális átalakítóját (ADC) használja, és így az út során néhány lépésben próbálja meg kitalálni, hogyan kerülheti el őket. Azt is látni fogjuk, hogy az analóg -digitális átalakító használata miért nem a legjobb módja a billentyűzet vezérlésének, annak ellenére, hogy kevesebb portot használ a mikrokontrollerben. Ebben az oktatóanyagban szüksége lesz:
- egy billentyűzetet. Vásárolhat egyet, vagy megteheti azt, amit én tettem, és letöröl egyet.
- 2 női fejléc a billentyűzethez (ha egyet eltávolít)
- összekötő vezetékek
- egy kenyértábla
- 4 1 Kohm ellenállás
- 1 15 Kohm ellenállás
- 1 3.3 Kohm ellenállás
- 1 180 ohmos ellenállás
- 1 680 ohmos ellenállás
- digitális multiméter
- elemzője az 5. oktatóanyagból
Érdemes kihagyni az első lépéseket, ha már rendelkezik billentyűzettel, és nem kell letörölnie.
Itt egy link az AVR összeszerelő oktatóanyagaim teljes gyűjteményéhez:
1. lépés: A billentyűzet eltávolítása 1
Régen, amikor még a nagyszülei is csak gyerekek voltak, az emberek ezeket a furcsa megjelenésű eszközöket használták, amelyek hosszú kábeleket csatlakoztattak a falhoz, hogy kommunikáljanak egymással. "Telefonnak" hívták őket, és általában olcsó műanyag tárgyak voltak, amelyek bosszantó hangot adtak ki, amikor valaki felhívott (nem mintha a mai "Justin Bieber" csengőhangok nem egyformán bosszantóak). Mindenesetre ezeken az eszközökön billentyűzetek voltak, amelyek nagyon egyszerűen bekötve voltak, így könnyen eltávolíthatók, és 2 extra billentyű van rajtuk ("újratárcsázás" és "flash") a megvásárolható kezelőegységekből, amelyeket érdemes újra felhasználni "nyilakkal", "menügombokkal" vagy valami mással. Tehát kezdjük azzal, hogy eltávolítjuk a billentyűzetet egy régi telefonról. Először vegye fel a telefont (GE -t használok, ahogy a képeken látható), és széthúzza, hogy feltárja a vezetékeket. Ezután vegyen egy vésőt, és pattintsa le a billentyűzetet tartó műanyag gombokat, és távolítsa el a billentyűzetet.
2. lépés: A billentyűzet eltávolítása 2
Most vegyen egy PVC -fűrészt, és vágja le a műanyagot a kulcslyukak környékéről, majd vágja le a szélét, hogy megfelelő mélységet kapjon, vékony billentyűzetet hagyva.
Ezután tegye vissza a billentyűzetet azokkal a kis csapokkal, amelyek azután maradtak, hogy levágta a tetejüket az utolsó lépésben, és forrasztópáka segítségével egyszerűen piszkálja a forró vasat minden csaplyukba, ami felolvasztja a műanyagot és elteríti a A billentyűzet alján új "gombok" vannak, amelyek a billentyűzetet a helyén tartják.
Szeretek felpörgetni a három hangszórót, és talán a többi dolgot is, mint például a kapcsolókat és a nem fontos dolgokat, amelyek a táblán vannak. Ezúttal azonban nem fogom lekaparni a kapcsolókat és egyebeket, mert jelenleg más céljaink vannak. Ezenkívül van egy TA31002 lineáris IC, amely egy telefon csengőhangja. Az adatlap könnyen megtalálható és letölthető az internetről, megadva a pontos információkat és funkciókat. Tehát egyelőre a táblához forrasztva hagyom, majd később játszom vele. Szeretném csatlakoztatni egy oszcilloszkóphoz, és megnézni, milyen jó jeleket tudok kihozni belőle. Talán még csengőt is csinálni belőle. Ki tudja.
Mindenesetre, ha befejezte a telefon megsemmisítését és az alkatrészek lerakását, befejezzük a billentyűzet elkészítését.
3. lépés: A billentyűzet eltávolítása 3
Használjon forrasztó kanócot, és távolítsa el a szalagkábeleket a billentyűzet aljáról, ügyelve arra, hogy az áramköri lapon lévő lyukak tiszták legyenek, majd csatlakoztasson két női fejlécet a táblához, ahol a lyukak vannak. Valószínűleg le kell vágnia a fejléceket, hogy azok 4 tűs fejlécek legyenek.
Most, hogy a fejlécek csatlakoztatva vannak, csatlakoztathatja a kenyérsütő táblához, vehet egy multimétert, és tesztelheti a kulcsokat úgy, hogy a multimétert véletlenszerű csapokra helyezi, és megméri az ellenállást. Ez lehetővé teszi a kulcsok feltérképezését. Az áramkört nézve nehéz látni, hogy a billentyűk hogyan csatlakoznak a kimenetekhez, de ha multimétert használ, akkor bármelyik két érintkezőhöz csatlakoztathatja, majd nyomja meg a gombokat, amíg egy szám nem jelenik meg a képernyőn a nyitott áramkör helyett. Ez lesz a kulcs kijelölése.
Az összes kulcs hozzárendelése a kimeneti tüskékhez ilyen módon.
4. lépés: Csatlakoztassa a billentyűzetet
Most kövesse a bekötési rajzot, és kösse be a billentyűzetet a kenyértáblához.
Ez hogyan fog működni, ha az 5V -ot a bal oldalra tesszük, a jobb oldali pedig a GND -re. A diagram jobb oldalán az első tű az Atmega328p mikrokontroller analóg csapjaiba kerül. Ha nincs gomb megnyomva, akkor a jel 0V lesz, és a különböző gombok mindegyikének megnyomásakor az analóg port bemenete 0V és 5V között változik, eltérő mértékben, attól függően, hogy melyik gombot nyomták meg. Az ellenállás értékeit úgy választottuk meg, hogy minden útvonal olyan ellenállást tartalmazzon, amely eltér a többitől. A mikrokontroller analóg portja analóg jelet vesz, és 1024 különböző csatornára osztja fel 0V és 5V között. Ez azt jelenti, hogy minden csatorna szélessége 5V/1024 = 0,005 V/csatorna = 5 mV/csatorna. Tehát az analóg port képes megkülönböztetni a bemeneti feszültségeket, amennyiben azok több mint 5 mV eltérnek. Esetünkben az ellenállás értékeit úgy választottuk, hogy bármelyik két gombnyomás olyan feszültségjelet küldjön, amely ennél több eltérést mutat, így a mikrokontrollernek könnyen meg kell tudnia határozni, melyik gombot nyomta meg. A nagy probléma az, hogy az egész rendszer nagyon zajos, ezért ki kell választanunk egy feszültségtartományt, amelyet minden gombnyomáshoz hozzá kell rendelni - de erre egy kicsit később térünk ki.
Vegye figyelembe, hogy képesek vagyunk egy 14 gombos billentyűzetet vezérelni egyetlen vezérlő bemeneti vonallal. Ez az analóg bemenetek egyik hasznos aspektusa.
Most az első kísérletünk a billentyűzet vezérlésére az lesz, hogy a billentyű lenyomása megszakítást okoz, a megszakítás alprogram beolvassa az analóg bemeneti portot, és eldönti, melyik gombot nyomták meg, majd ezt a számot adja ki a regiszterelemző alprogramunknak, amely megjeleníti a kulcsérték binárisan a 8 LED -en, amelyeket az 5. oktatóanyagban állítottunk be.
5. lépés: Csatlakoztassa a billentyűzetet az analizátorhoz
A képek azt mutatják, hogyan szeretnénk a billentyűzetet a mikrokontrollerhez vezetni, hogy a kimenetet láthassuk az analizátor kijelzőjén. Lényegében egyszerűen vezetjük a kimenetet a billentyűzetről a PortC 0 érintkezőbe, amelyet ADC0 -nak is neveznek az ATmega328P -n.
Van azonban pár további dolog. Egy gombot is vezetünk a PD2 -hez. Azaz. vigyünk egy vezetéket az 5 V -os sínből egy gombhoz, a gomb másik oldaláról pedig a PD2 -hez, és végül szeretnénk lekapcsolni az AREF csapot az 5 V -os sínről, és ehelyett hagyjuk lekapcsolva. Ha szeretnénk, behelyezhetünk egy 0,1 mikrofarados leválasztó kondenzátort. Ez egy kerámia kondenzátor, amire 104 van írva. Az első két számjegy a szám, az utolsó számjegy pedig a 10 hatványa, amelyet megszorozunk, hogy picofaradokban kapjunk választ (a pico 10^-12), tehát 104 10 x 10^4 pikofaradot jelent, ami megegyezik 100 nanofarad (nano jelentése 10^-9), ami megegyezik a 0,1 mikrofaraddal (a mikro jelentése 10^-6). Mindenesetre mindez nem stabilizálja az AREF tűt, amikor referenciacsapként használhatjuk.
1 Mohm ellenállást is szeretnénk a PD2 és a föld közé. A PD2 -t 0V -os kimeneti tűként állítjuk be, és pozitív élre fogunk váltani ezen a tűn. Azt akarjuk, hogy a szél azonnal eltűnjön, amikor elengedjük a gombot, így behelyezzük ezt a "lehúzható" ellenállást.
Azért akarjuk a gombot, mert ki akarjuk váltani az analóg-digitális átalakítónkat a chip INT0 érintkezőjéről, amely szintén PD2. Végül azt szeretnénk, ha a billentyű lenyomása egyszerre kiváltaná az ADC -t, és biztosítaná a bemenet átalakítását anélkül, hogy külön gomb lenne, de az időzítés működése miatt kezdjük azzal, hogy külön gombbal indítjuk el az ADC -t, és miután mindent vasalunk a hibákat, és biztosak vagyunk benne, hogy minden megfelelően működik, akkor megoldjuk azokat a zaj- és időzítési problémákat, amelyek ugyanazzal a gombnyomással váltanak ki, mint amit olvasni szeretnénk.
Tehát egyelőre úgy működik, hogy lenyomunk egy gombot, majd megnyomjuk a gombot az ADC aktiválásához, majd elengedjük, és remélhetőleg a nyomott gomb bináris értéke megjelenik az elemzőn.
Írjunk tehát egy kódot, amely ezt megvalósítja.
6. lépés: Melyik kapcsolókat állítsuk be?
Először gondoljuk át, hogyan kódoljuk ezt, hogy a vezérlő le tudja olvasni a bemenetet a billentyűzetről, és a megnyomott gombnak megfelelő számértékké alakítsa át. Az analóg -digitális átalakítót (ADC) fogjuk használni amely beépítve van az Atmega328p -be. Az AREF -et fogjuk használni referenciafeszültségként, és a billentyűzet kimenete a PortC0 -hoz vagy a PC0 -hoz lesz csatlakoztatva. Ne feledje, hogy ezt a tűt ADC0-nak is hívják az analóg-digitális konverter 0-hoz. Jó ötlet lehet, ha elolvassa a 12.4. Fejezetet az ATmega328P megszakításairól, valamint az analóg-digitális konverter 24. fejezetét. el kell kezdeni, vagy legalább készen kell állni ezekre a szakaszokra. Ahhoz, hogy a mikrovezérlőt úgy állítsa be, hogy tudja, mit kell tennie egy analóg bemeneti jellel, és hogyan léphet kapcsolatba a programunkkal, először be kell állítanunk néhányat a különböző ADC -k közül. kapcsolódó regiszter bitek. Ezek lényegében megegyeznek az első számítógépek régi kapcsolóival. Vagy be- vagy kikapcsolja a kapcsolót, vagy még hátrébb dugja a kábeleket az egyik és a másik kimenet közé, hogy az útelágazást elérő elektronok az egyik kaput zárva, a másikat nyitva találják, és más útra kényszerítsék áramkört, és így más logikai feladatot hajt végre. Amikor összeszerelési nyelven kódolunk, közelről hozzáférünk a mikrovezérlő ezen funkcióihoz, ami az egyik vonzó dolog az első lépésben. Ez inkább "kéz a kézben", és sokkal kevesebb történik a "színfalak mögött". Tehát ne gondolja úgy, hogy ezeket a regisztereket unalmas feladatnak tekinti. Ez teszi érdekessé az assembly nyelvet! Nagyon személyes kapcsolatot alakítunk ki a chip belső működésével és logikájával, és arra késztetjük, hogy pontosan azt tegye, amit szeretnénk - nem többet és nem kevesebbet. Nincs pazarolt órajel. Tehát itt van a kapcsolók listája, amelyeket be kell állítanunk:
- Kapcsolja ki a PRADC teljesítménycsökkentő ADC bitet, amely a PRR regiszter 0. bitje, mivel ha ez a bit be van kapcsolva, akkor leállítja az ADC -t. A teljesítménycsökkentő regiszter lényegében egy módja annak, hogy kikapcsolja az energiát használó különféle dolgokat, amikor nincs rájuk szükség. Mivel az ADC -t használjuk, szeretnénk megbizonyosodni arról, hogy nincs ilyen módon letiltva. (Lásd PRADC a 46. oldalon)
- Válassza ki az ADC0 analóg bemeneti csatornát a MUX3… 0 kikapcsolásával az ADC Multiplexer Selection (ADMUX) regiszterben (lásd a 24-4. Táblázatot, 249. oldal), ezek alapértelmezés szerint ki vannak kapcsolva, így ezt nem kell igazán tennünk. Mindazonáltal belefoglalom, mivel ha valaha az ADC0 -n kívüli portot használja, akkor ezeket a kapcsolókat ennek megfelelően kell kapcsolnia. A MUX3, MUX2, MUX1, MUX0 különböző kombinációi lehetővé teszik bármely analóg port használatát bemenetként, és ezeket menet közben is megváltoztathatja, ha egyszerre több különböző analóg jelet szeretne nézni.
- Kapcsolja ki a REFS0 és REFS1 biteket az ADMUX regiszterben, hogy az AREF -et használjuk referenciafeszültségként, nem pedig belső referenciaként (lásd 248. oldal).
- Kapcsolja be az ADLAR bitet az ADMUX -ban, így az eredmény "balra igazítva" lesz, ezt a választ a következő lépésben tárgyaljuk.
- Állítsa be az ADC0D bitet a digitális bemenet letiltási regiszterében (DIDR0) a PC0 digitális bemenet kikapcsolásához. Ezt a portot analóg bemenetre használjuk, így akár letilthatjuk a digitális bemenetet is.
- Állítsa be az ISC0 -t és az ISC1 -et az A külső megszakításvezérlő regiszterben (EICRA), jelezve, hogy a feszültségjel emelkedő szélén az INT0 érintkezőre (PD2) szeretnénk kiváltani, lásd 71. oldal.
- Törölje az INT0 és INT1 biteket a külső megszakítási maszk regiszterben (EIMSK), jelezve, hogy nem használunk megszakításokat ezen a tűn. Ha engedélyeznénk a megszakításokat ezen a tűn, szükségünk lenne egy megszakításkezelőre a 0x0002 címen, de ehelyett úgy állítjuk be, hogy egy jel ezen a tüskén kiváltja az ADC konverziót, amelynek befejezését az ADC konverzió teljes megszakítása kezeli címe 0x002A. Lásd 72. oldal.
- Az ADC engedélyezéséhez állítsa be az ADC engedélyezési (ADEN) bitet (7. bit) az ADC vezérlő- és állapotregiszterben (ADCSRA). Lásd: 249. oldal.
- Egyetlen konverziót is elindíthatnánk, ha minden alkalommal, amikor az analóg jelet szeretnénk olvasni, beállítanánk az ADC indítási konverziós bitjét (ADSC), de most inkább azt szeretnénk, ha automatikusan leolvasnánk, amikor valaki megnyomja a gombot, ezért engedélyezzük az ADC -t Autotrigger Enable (ADATE) bit az ADCSRA regiszterben, így az aktiválás automatikusan történik.
- Az ADPS2..0 biteket (az AD Prescalar biteket) 111 -re állítottuk, így az ADC óra a CPU órajele, osztva 128 -szor.
- Kiválasztjuk az ADC aktiválásának forrását PD2 -nek, amelyet INT0 -nak (külső megszakítási kérés 0) is neveznek. Ezt az ADCSRB regiszter különböző bitjeinek átkapcsolásával tehetjük meg (lásd 24-6. Táblázat, 251. oldal). A táblázatból látjuk, hogy ki akarjuk kapcsolni az ADTS0 -t, az ADTS1 -et és az ADTS2 -t, hogy az ADC aktiválja a tűt. Ne feledje, ha folyamatosan szeretnénk mintát venni az analóg porton, például ha valamilyen folyamatos analóg jelet olvasnánk (például hangmintavételt vagy ilyesmit), akkor ezt szabad futás módba állítanánk. Az a módszer, amelyet a PD2 indításának beállítására használunk, megszakítás nélkül indítja el a PC0 analóg port ADC leolvasását. A megszakítás akkor következik be, amikor az átalakítás befejeződött.
- Engedélyezze az ADC megszakítás engedélyezése (ADIE) bitet az ADCSRA regiszterben, hogy amikor az analóg -digitális átalakítás befejeződik, megszakítást generáljon, amelyhez megszakításkezelőt írhatunk, és a.org 0x002A fájlba tehetjük.
- Állítsa be az I bitet az SREG -ben a megszakítások engedélyezéséhez.
1. gyakorlat: Feltétlenül olvassa el az adatlap vonatkozó szakaszát a fenti beállítások mindegyikéhez, hogy megértse, mi történik, és mi történne, ha alternatív beállításokra változtatnánk.
7. lépés: Írja meg a megszakításkezelőt
Az utolsó lépésben láttuk, hogy úgy állítottuk be, hogy a PD2 -n észlelt emelkedő szél analóg -digitális konverziót indítson el a PC0 -n, és amikor ez az átalakítás befejeződik, ADC Conversion Complete megszakítást eredményez. Most szeretnénk valamit kezdeni ezzel a megszakítással. Ha megvizsgálja a 12-6. Táblázatot a 65. oldalon, megjelenik a lehetséges megszakítások listája. Láttuk a RESET megszakítását a 0x0000 címen és az időzítő/számláló0 túlcsordulás megszakítást a 0x0020 címen az előző oktatóanyagokban. Most meg akarjuk nézni az ADC megszakítást, amelyet a táblázat szerint a 0x002A címen látunk. Tehát az összeszerelési nyelvi kódunk elején szükségünk lesz egy sorra, amely így szól:
.org 0x002Arjmp ADC_int
amely az ADC_int feliratú megszakításkezelőnkre ugrik, valahányszor az ADC befejezte a konverziót. Tehát hogyan írjuk meg megszakításkezelőnket? Az ADC működési módja a következő számítás:
ADC = Vin x 1024 / Vref
Lássuk tehát, mi történik, ha megnyomom az "újratárcsázás" gombot a billentyűzeten. Ebben az esetben a PC0 feszültsége valamilyen értékre, például 1,52 V -ra változik, és mivel a Vref 5 V -nál van, a következők lesznek:
ADC = (1,52V) x 1024 / 5V = 311,296
és így 311 -ként jelenik meg. Ha ezt vissza akarjuk alakítani feszültségre, akkor csak megfordítjuk a számítást. Ezt azonban nem kell megtennünk, mivel nem vagyunk kíváncsiak a tényleges feszültségekre, csak a megkülönböztetésükre. Amikor az átalakítás befejeződött, az eredményt egy 10 bites számban tároljuk az ADCH és az ADCL regiszterekben, és ezt "balra állítottuk", ami azt jelenti, hogy a 10 bit az ADCH 7. bitjén kezdődik és lemegy az ADCL 6. bitje (összesen 16 bit van ebben a két regiszterben, és csak 10 -et használunk, azaz 1024 csatornát). Ha az ADLAR bitet törölnénk az ADMUX regiszterből, akkor "jobbra állíthatjuk" az eredményt. Azért választjuk a balra igazítottat, mert jeleink elég távol vannak egymástól, ezért a csatorna utolsó két számjegye nem releváns, és Valószínűleg csak zaj, ezért csak a felső 8 számjegyből fogjuk megkülönböztetni a gombnyomásokat, más szóval csak az ADCH -t kell megnéznünk, hogy megtudjuk, melyik gombot nyomtuk meg. Tehát a megszakításkezelőnknek egyszerűen ki kell olvasnia a számot az ADCH -ból regisztrálja, konvertálja ezt a számot a billentyűzet értékére, majd küldje el ezt az értéket a regiszter -elemző LED -jeinkhez, hogy megbizonyosodhassunk arról, hogy a "9" mondat megnyomásával a "00001001" jelzésű LED -ek kigyulladnak -e. bár először meg kell néznünk, hogy mi jelenik meg az ADCH -ban, amikor megnyomjuk a különböző gombokat. Írjunk tehát egy egyszerű megszakításkezelőt, amely csak elküldi az ADCH tartalmát az analizátor kijelzőjére. Tehát itt van szükségünk:
ADC_int: lds analizátor, ADCH; töltse be az ADCH értékét az analizátorunkba EIFR, 0; törölje a külső megszakítási zászlót, hogy újra készen álljon
Mostanra képesnek kell lennie arra, hogy lemásolja a kódot az elemzőnkből az 5. oktatóanyagban, és hozzáadja ezt a megszakítást és a kapcsolási beállításokat, és futtassa. 2. gyakorlat: Írja be a kódot és futtassa. Ügyeljen arra, hogy az ADCH megjelenjen az elemző kijelzőjén. Próbálja többször megnyomni ugyanazt a gombot. Mindig ugyanazt az értéket kapja az ADCH -ban?
8. lépés: Térképezze fel a gombnyomási értékeket
Most az ADCH értékeit kell átalakítanunk a megnyomott billentyűnek megfelelő számokká. Ezt úgy tesszük meg, hogy minden gombnyomásra kiírjuk az ADCH tartalmát, majd tizedes számmá alakítjuk, mint ahogyan a képen. A megszakítási kezelési rutinunk során az értékek teljes tartományát fogjuk figyelembe venni minden egyes billentyűlenyomáshoz, így az ADC leképezi az adott tartományban bármit egy adott billentyűlenyomásra.
3. gyakorlat: Végezze el ezt a leképezést, majd írja újra az ADC megszakítási rutinját.
Íme, amit az enyémhez kaptam (a tied valószínűleg más lesz). Vegye figyelembe, hogy minden egyes billentyűlenyomáshoz értéktartományt állítottam be.
ADC_int:; Külső megszakításkezelő elemző; új számok előkészítése gombH, ADCH; Az ADC frissül, ha az ADCH olvasásra kerül clccpi gombH, 240brlo PC+3; ha az ADCH nagyobb, akkor 1ldi elemző, 1; tehát terhelésanalizátort 1 rjmp visszatéréssel; és vissza clccpi gombH, 230; ha az ADCH nagyobb, akkor 2brlo PC+3ldi elemző, 2rjmp visszatérő clccpi gombH, 217brlo PC+3ldi elemző, 3rjmp visszatérő clccpi gombH, 203brlo PC+3ldi elemző, 4rjmp visszatérő clccpi gombH, 187brlo PC+3ldi elemző, 5rjmp visszatérő clccpi gomb, 155brlo PC+3ldi elemző, 6rjmp visszatérő clccpi gombH, 127brlo PC+3ldi analizátor, 255; beállítjuk a vakut, mint minden onrjmp visszatérő clccpi gombotH, 115brlo PC+3ldi elemző, 7rjmp visszatérő clccpi gombH, 94brlo PC+3ldi elemző, 8rjmp visszatérő clccpi gombH, 62brlo PC+3ldi elemző, 9rjmp visszatérő clccpi gombH, 37brlo PC+3ldi elemző, 0b11110000; csillag a felső fele onrjmp visszatérő clccpi gombH, 28brlo PC+3ldi analizátor, 0rjmp return clccpi buttonH, 17brlo PC+3ldi elemző, 0b00001111; hash jel az alsó fele onrjmp visszatér clccpi gombH, 5brlo PC+3ldi elemző, 0b11000011; újrahívás a felső 2 alsó 2rjmp visszatérő ldi elemző, 0b11011011; különben hiba történt visszatérés: reti
9. lépés: Kód és videó az 1. verzióhoz
Csatoltam a kódot a billentyűzet -illesztőprogram első verziójához. Ebben az esetben nyomja meg a gombot, majd nyomja meg a gombot annak érdekében, hogy az ADC beolvassa a billentyűzetről érkező bemenetet. Inkább nincs gombunk, hanem a konvertáláshoz szükséges jel magától a billentyűleütéstől származik. 3. gyakorlat: Gyűjtse össze és töltse fel ezt a kódot, és próbálja ki. Lehet, hogy módosítania kell a különböző konverziós küszöbértékeket, hogy megfeleljenek a billentyűnyomás feszültségének, mivel ezek valószínűleg eltérnek az enyémtől. Mi történik, ha a billentyűzetről származó bemenetet próbálja használni mind az ADC0, mind a külső megszakítótű helyett gomb helyett? Csatolok egy videót is a billentyűzet -illesztőprogramunk első verziójának működéséről. Észre fogja venni, hogy a kódomban van egy szakasz, amely inicializálja a veremmutatót. Különböző regiszterek vannak, amelyeket esetleg ki akarunk tolni és kipattintani a veremből, amikor a változókat és a mit nem módosítunk, és vannak olyan regiszterek is, amelyeket később szeretnénk menteni és visszaállítani. Például az SREG olyan regiszter, amelyet nem tárolnak a megszakítások között, így a műveletek eredményeként beállított és törölt különböző zászlók megváltozhatnak, ha valami megszakítás történik. Tehát a legjobb, ha a megszakításkezelő elején a veremre tolja az SREG -t, majd a megszakításkezelő végén újra leveti. Azért helyeztem el a kódban, hogy megmutassam, hogyan inicializálják, és előre látom, hogyan lesz szükségünk rá később, de mivel nem érdekel, hogy mi történik az SREG -rel a kódunk megszakításai során, nem használtam erre a veremre. hogy a shift művelettel különböző biteket állítottam be a regiszterekbe inicializáláskor. Például a sorban:
ldi temp, (1 <
A "<<" parancs a fenti kód első sorában egy műveleti művelet. Lényegében felveszi az 1 bináris számot, amely 0b00000001, és eltolja azt az ISC01 szám összegével. Ez az ISC01 nevű bit helye az EICRA regiszterben. Mivel az ISC01 az 1. bit, az 1 -es számot balra 1 pozícióba tolva 0b00000010 lesz. Hasonlóképpen a második, ISC00, az EICRA 0. bitje, így az 1 -es szám eltolódása nulla pozíció balra. Ha megnézi, tekintse meg az első oktatóanyagban letöltött m328Pdef.inc fájlt, és azóta az evrr -t használja, látni fogja, hogy ez csak az ".equ" állítások hosszú listája. Megállapítja, hogy az ISC01 egyenlő 1. Az összeszerelő minden példányát lecseréli 1 -re, mielőtt még összeállítana valamit. Ezek csak a regisztrációs bitek nevei, amelyek segítenek nekünk, embereknek kódot olvasni és írni. Most a fenti két műszakművelet közötti függőleges vonal logikai "vagy" művelet. Itt az egyenlet:
0b00000010 | 0b00000001 = 0b00000011
és ezt töltjük be (az "ldi" segítségével) a temp. Az emberek ezért használják ezt a módszert az értékek regisztrációs rendszerbe történő betöltésére, mert lehetővé teszi, hogy a szám nevét helyett a bit nevét használják, és ezáltal a kód sokkal könnyebben olvasható. Két másik technikát is használtunk. Az "ori" és az "andi" utasításokat használjuk. Ezek lehetővé teszik számunkra a BEÁLLÍTÁS és a TISZTÍTÁS anélkül, hogy a regiszter többi bitjét módosítanánk. Például amikor használtam
ori temp, (1
ennek "vagy" hőmérséklete 0b00000001 -gyel, amely 1 -et tesz a nulla bitbe, és a többit változatlanul hagyja. Akkor is, amikor írtunk
andi temp, 0b11111110
ez a nulla hőmérsékletet 0 -ra változtatja, a többit pedig változatlanul hagyja.
4. gyakorlat: Nézze át a kódot, és győződjön meg arról, hogy megérti az egyes sorokat. Érdekes lehet, ha jobb módszereket talál a dolgokra, és jobb programot ír. Százféleképpen lehet kódolni a dolgokat, és bízom benne, hogy sokkal jobb módszert talál, mint az enyém. Találhat (az ég is!) Hibákat és mulasztásokat. Ebben az esetben mindenképpen szeretnék hallani róluk, hogy javítani lehessen.
Oké, most nézzük meg, hogy megszabadulhatunk -e ettől a felesleges gombról…
10. lépés: A 2. verzió kódja
A legegyszerűbb módja annak, hogy megszabaduljon a gombból, ha teljesen eltávolítja, elfelejti a PB2 bemenetet, és csak kapcsolja az ADC -t "Free Running Mode" -ra.
Más szóval egyszerűen módosítsa az ADCSRB regisztert, hogy az ADTS2, ADTS1 és ADTS0 mind nulla legyen.
Ezután állítsa az ADCSRA ADSC bitjét 1 -re, amely elindítja az első konverziót.
Most töltse fel a mikrokontrollerre, és látni fogja, hogy a megfelelő szám jelenik meg a kijelzőn, miközben megnyomja a gombot, és csak a gomb megnyomásakor. Ennek oka az, hogy az ADC folyamatosan mintavételezi az ADC0 portot, és megjeleníti az értéket. Amikor leveszi az ujját a gombról, a "gomb visszapattanása" néhány véletlenszerű értéket eredményez nagyon gyorsan, majd visszaáll a 0V bemenetre. A kódunkban ez a 0V 0b11011011 néven jelenik meg (mivel a "0" gombnyomás már a 0b00000000 kijelzőértéket használja)
Két okból azonban nem ezt a megoldást szeretnénk. Először is nem akarjuk nyomni a gombot. Szeretnénk egyszer megnyomni, és megjeleníteni a számot (vagy használni egy új kódban egy későbbi oktatóanyagban). Másodszor, nem akarjuk folyamatosan mintát venni az ADC0 -ból. Azt akarjuk, hogy egyetlen leolvasást végezzen, konvertálja, majd aludjon, amíg egy új gombnyomás új konverziót nem indít el. A szabad futás mód a legjobb, ha a mikrokontroller egyetlen dolga, hogy folyamatosan olvasson valamilyen analóg bemenetet - például, ha valós idejű hőmérsékletet szeretne megjeleníteni.
Tehát keressünk egy másik megoldást…
11. lépés: Hogyan szabadulhatunk meg a gombtól? 3. verzió
Számos módon folytathatjuk. Először hardvert adhattunk hozzá, hogy megszabaduljunk a gombból. Például megpróbálhatunk egy tranzisztor behelyezését az áramkörbe a billentyűnyomás kimeneti vonalánál, hogy az kis áramlást vegyen ki a kimenetből, és 5 V -os impulzust küldjön a megszakító PD2 tűre.
Ez azonban legalább túl zajos lenne, és legrosszabb esetben nem hagyna elegendő időt a pontos billentyűleolvasáshoz, mivel a billentyűzet kimeneti feszültségének nem lenne ideje stabilizálódni, mielőtt rögzíti az ADC -leolvasást.
Tehát inkább egy szoftvermegoldással állunk elő. Szeretnénk megszakítást hozzáadni a PD2 érintkezőhöz, és megszakításkezelőt írni hozzá, amely a billentyűzet gombjának egyetlen leolvasását hívja meg. Más szóval megszabadulunk az autotrigger megszakításától az ADC -ből, és hozzáadunk egy külső megszakítást, amely meghívja az ADC -t. Így az ADC olvasására szolgáló jel a PD2 jel már megtörténte után érkezik, és ez elegendő időt adhat a dolgoknak ahhoz, hogy pontos feszültségre stabilizálódjanak, mielőtt a PC0 érintkezőt kiolvassák és átalakítják. Még mindig van egy ADC befejezési megszakításunk, amely az eredményt az elemző kijelzőjén adja ki a végén.
Van értelme? Hát csináljuk…
Nézze meg a mellékelt új kódot.
A következő változásokat látja:
- Egy rjmp -t adtunk hozzá a.org 0x0002 címhez az INT0 külső megszakítás kezelésére
- Módosítottuk az EIMSK regisztert, jelezve, hogy meg akarjuk szakítani az INT0 érintkezőt
- Az ADCSRA regiszterben lévő ADATE pin -t megváltoztattuk az automatikus aktiválás letiltásához
- Megszabadultunk az ADCSRB beállításoktól, mivel azok nem relevánsak, ha az ADATE ki van kapcsolva
- Többé nem kell visszaállítanunk a külső trigger jelzőt, mivel az INT0 megszakítási rutin ezt automatikusan elvégzi, amikor befejeződik - korábban nem volt megszakítási rutinunk, csak kioldottuk az ADC -t egy jelről ezen a tűn, ezért muszáj volt törölje kézzel a zászlót.
Most a megszakításkezelőben egyszerűen egyetlen konverziót hívunk meg az ADC -ből.
5. gyakorlat: Futtassa ezt a verziót, és nézze meg, mi történik.
12. lépés: A működő verzió kódja és videója
Amint azt az utolsó verzióban láttuk, a gomb megszakítása nem működik nagyon jól, mert a megszakítást egy emelkedő szélén váltják ki a PD2 tűhöz, majd a megszakításkezelő felhívja az ADC konverziót. Az ADC azonban ekkor megkapja a feszültség leolvasását, mielőtt stabilizálódik, és így hülyeségeket olvas.
Szükségünk van egy késleltetés bevezetésére a PD2 megszakítása és a PC0 ADC leolvasása között. Ezt időzítő/számláló, számláló túlcsordulás megszakítás és késleltetési rutin hozzáadásával tehetjük meg. Szerencsére a 3. oktatóanyagból már tudjuk, hogyan kell ezt megtenni! Tehát csak lemásoljuk és beillesztjük a megfelelő kódot onnan.
Megadtam a kapott kódot és egy videót, amely bemutatja működését.
Észre fogja venni, hogy a leolvasott értékek nem olyan pontosak, mint az ember remélné. Ennek oka valószínűleg számos forrás:
- a billentyűzet kimeneti feszültségéről koppintunk a PD2 -re, ami befolyásolja a PC0 leolvasását.
- valójában nem tudjuk, mennyi ideig kell késleltetni a ravaszt, hogy a legjobb eredményt érjük el.
- néhány ciklusba telik, amíg az ADC konverzió befejeződik, ami azt jelenti, hogy nem tudunk gyors tüzet adni a billentyűzeten.
- valószínűleg zaj van a billentyűzetben.
- stb…
Tehát, bár sikerült a billentyűzetet működésre bírnunk, és most már használhatnánk az alkalmazásokban úgy, hogy a billentyűlenyomási értékeket valamilyen más módon használjuk, ahelyett, hogy csak az elemző kijelzőjére adnánk ki őket, ez nem túl pontos és nagyon bosszantó. Ezért úgy gondolom, hogy a billentyűzetek vezetékezésének legjobb módja egyszerűen az, ha a billentyűzet minden kimenetét egy másik portba illeszti, és eldönti, hogy melyik gombot nyomja meg, melyik port látja a feszültséget. Ez egyszerű, nagyon gyors és nagyon pontos.
Valójában csak két oka van annak, hogy valaki úgy akarja kezelni a billentyűzetet, ahogy itt tettük:
- A mikrokontrollerünk 8 tűje közül csak 2 -et használ.
- Nagyszerű projekt az ADC különböző aspektusainak bemutatása a mikrokontrollerben, amely eltér az ott megtalálható szokásos dolgoktól, például a hőmérséklet-leolvasástól, a potenciométerek elforgatásától, stb. nem pedig csak szabadon futó CPU-zabálási mód.
Mindenesetre itt van az utolsó pár gyakorlat az Ön számára:
6. gyakorlat: Írja át újra az ADC konverzió teljes megszakítás kezelőjét a keresési táblázat használatához. Azaz. Annak érdekében, hogy tesztelje az analóg értéket a táblázat első elemével, és ha nagyobb, visszatér a megszakításból, ha nem, akkor Z -vel növeli a táblázat következő elemét, és újra elágazik a teszthez. Ez lerövidíti a kódot, és megtisztítja a megszakítási rutint, és szebb lesz. (Következő lépésként egy lehetséges megoldást adok meg) 7. gyakorlat: Csatlakoztassa a billentyűzetet a 8 érintkezőhöz a mikrokontrollerben, és írja meg az egyszerű illesztőprogramot, és tapasztalja meg, mennyivel szebb. Gondolhat néhány módszerre, amellyel javíthatnánk a módszerünkön?
Ennyi ehhez az oktatóanyaghoz. A végleges változatot mutatókkal csatoltam. Ahogy közeledünk a végső célunkhoz, a billentyűzet segítségével ismét bemutatjuk a 9. oktatóanyagban, hogy megmutassuk, hogyan lehet vele hét szegmenses kijelzőt vezérelni (és valami érdekeset felépíteni, amely a telefon billentyűzetén található extra gombokat használja), majd térjen át a dolgok gombnyomással történő vezérlésére (mivel ez a módszer jobban illeszkedik a végtermékhez, amelyre ezekkel az oktatóanyagokkal készülünk), és csak a billentyűzetet helyezzük el.
Találkozunk legközelebb!
Ajánlott:
AVR összeszerelő bemutató 2: 4 lépés
AVR Assembler 2. bemutató: Ez az oktatóanyag az "AVR Assembler Tutorial 1" folytatása. Ha még nem ment át az 1. oktatóanyagon, akkor most hagyja abba, és először tegye meg ezt. Ebben az oktatóanyagban folytatjuk az atmega328p u összeszerelési nyelv programozásának tanulmányozását
AVR összeszerelő bemutató 1: 5 lépés
AVR Assembler Tutorial 1: Úgy döntöttem, hogy írok egy sor oktatóanyagot arról, hogyan kell összeállítani a Nyelv programokat az Atmega328p -hez, amely az Arduino -ban használt mikrokontroller. Ha az emberek továbbra is érdeklődnek, továbbra is hetente fogok egyet, amíg el nem fogy
AVR összeszerelő bemutató 8: 4 lépés
AVR Assembler Tutorial 8: Üdvözöljük a 8. tutorialban! Ebben a rövid bemutatóban egy kicsit eltérünk az összeszerelési nyelv programozásának új aspektusainak bevezetésétől, hogy megmutassuk, hogyan lehet prototípus -összetevőinket külön " nyomtatott " áramköri. Az
AVR összeszerelő bemutató 11: 5 lépés
AVR Assembler Tutorial 11: Üdvözöljük a 11. tutorialban! Ebben a rövid bemutatóban végre elkészítjük a végső projektünk első részét. Az első dolog, amit meg kell tennie, az oktatóanyag utolsó lépéséhez kell menni, és meg kell nézni a videót. Akkor gyere vissza ide. [szünet, amíg
AVR összeszerelő bemutató 3: 9 lépés
AVR Assembler Tutorial 3: Üdvözöljük a 3. oktatóanyagban! Mielőtt elkezdenénk, szeretnék egy filozófiai pontot tenni. Ne féljen kísérletezni az áramkörökkel és a kódokkal, amelyeket ezekben az oktatóanyagokban építünk fel. Cserélje ki a vezetékeket, adjon hozzá új alkatrészeket, vegye fel az alkatrészeket