Turinys:

AVR surinkėjo pamoka 7: 12 žingsnių
AVR surinkėjo pamoka 7: 12 žingsnių

Video: AVR surinkėjo pamoka 7: 12 žingsnių

Video: AVR surinkėjo pamoka 7: 12 žingsnių
Video: Benzininio vejos aeratoriaus nuoma / Sodo įrankių nuoma E-nuomok.lt 2024, Liepa
Anonim
AVR surinkėjo pamoka 7
AVR surinkėjo pamoka 7

Sveiki atvykę į 7 mokymo programą!

Šiandien mes pirmiausia parodysime, kaip išvalyti klaviatūrą, o tada parodysime, kaip naudoti analoginius įvesties prievadus, norint bendrauti su klaviatūra. Tai padarysime naudodami pertraukas ir vieną laidą kaip įvestį. Mes prijungsime klaviatūrą taip, kad kiekvienas klavišo paspaudimas siunčia unikalią įtampą į analoginę įvestį, kuri leis mums atskirti pagal įtampą, kuri buvo paspausta. Tada mes išvesime numerį, nuspaustą mūsų registro analizatoriui, kad parodytume, jog viskas vyksta taip, kaip turėtų. Yra keletas spąstų, į kuriuos galite patekti naudodami ATmega328p naudodami analoginį skaitmeninį keitiklį (ADC), todėl mes keletu etapų pakeliui pabandykite išsiaiškinti, kaip jų išvengti. Taip pat pamatysime, kodėl analoginio skaitmeninio keitiklio naudojimas nėra geriausias būdas valdyti klaviatūrą, nors ji naudoja mažiau jūsų mikrovaldiklio prievadų. Šioje pamokoje jums reikės:

  1. klaviatūra. Galite nusipirkti vieną arba padaryti tai, ką aš padariau, ir išmesti vieną.
  2. 2 moteriškos klaviatūros antraštės (jei naudojate vieną)
  3. jungiamieji laidai
  4. duonos lenta
  5. 4 1 Kohm rezistoriai
  6. 1 15 Kohm rezistorius
  7. 1 3.3 Kohm rezistorius
  8. 1 180 omų rezistorius
  9. 1 680 omų rezistorius
  10. skaitmeninis multimetras
  11. jūsų analizatorius iš 5 mokymo programos

Galbūt norėsite praleisti pirmuosius kelis veiksmus, jei jau turite klaviatūrą ir nereikia jos šalinti.

Čia yra nuoroda į visą mano AVR surinkėjo vadovėlių kolekciją:

1 veiksmas: išvalykite klaviatūrą 1

Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1
Išjunkite klaviatūrą 1

Seniai, kai net jūsų seneliai buvo tik vaikai, žmonės bendraudami tarpusavyje naudodavosi šiais keistai atrodančiais prietaisais, kurių sienoje buvo prijungti ilgi kabeliai. Jie buvo vadinami „telefonais“ir dažniausiai būdavo pigūs plastikiniai daiktai, kurie skambindavo erzinančiu garsu, kai kas nors jums paskambindavo (ne tai, kad šių dienų „Justin Bieber“melodijos nėra vienodai erzinančios). Bet kokiu atveju, šiuose įrenginiuose buvo klaviatūros, kurios buvo labai paprastai prijungtos, todėl jas lengva išvalyti, be to, jose yra 2 papildomi klavišai („perrinkimas“ir „blykstė“) iš klaviatūrų, kurias galite nusipirkti ir kurias galbūt norėsite pakeisti kaip „rodyklių klavišus“, „meniu klavišus“ar dar ką nors. Taigi mes pradėsime nuo seno telefono klaviatūros. Pirmiausia paimkite telefoną (aš naudoju GE, kaip parodyta paveikslėliuose) ir išskleiskite jį, kad atskleistumėte laidus. Tada paimkite kaltą ir nuimkite mažas plastikines rankenėles, laikančias klaviatūrą, ir nuimkite klaviatūrą.

2 veiksmas: išvalykite klaviatūrą 2

Išjunkite klaviatūrą 2
Išjunkite klaviatūrą 2
Išjunkite klaviatūrą 2
Išjunkite klaviatūrą 2
Išjunkite klaviatūrą 2
Išjunkite klaviatūrą 2

Dabar paimkite PVC pjūklą ir nupjaukite plastiką iš aplink rakto skylutes, tada supjaustykite aplink kraštą, kad gylis būtų tinkamas, paliekant ploną klaviatūrą.

Tada vėl įjunkite klaviatūrą naudodami mažus kaiščius, kurie liko po to, kai paskutiniame žingsnyje nukirpėte jų viršūnes, ir lituokliu tiesiog įkiškite karštą lygintuvą į kiekvieną kaiščio skylę, kuri ištirps plastiką ir paskleis jį ant klaviatūros apačioje suformuojant naujas „rankenėles“, kurios laikys klaviatūrą, kaip ir anksčiau.

Man patinka išnaikinti tris garsiakalbius ir galbūt kitus dalykus, tokius kaip jungikliai ir kas kita, kurie yra lentoje. Tačiau šį kartą aš nesiruošiu švaistyti jungiklių ir kitų dalykų, nes šiuo metu turime kitų tikslų. Taip pat yra TA31002 linijinis IC, kuris yra telefono skambutis. Duomenų lapą lengva rasti ir atsisiųsti internete, nurodant informaciją ir funkcijas. Taigi kol kas paliksiu jį prilituotą prie lentos, o vėliau žaisiu su ja. Norėčiau jį prijungti prie osciloskopo ir pamatyti, kokius šaunius signalus galiu iš jo gauti. Gal net paskambinti iš durų. Kas žino.

Bet kokiu atveju, kai baigsite sunaikinti telefoną ir išvalyti dalis, baigsime kurti klaviatūrą.

3 žingsnis: išvalykite klaviatūrą 3

Išjunkite klaviatūrą 3
Išjunkite klaviatūrą 3
Išjunkite klaviatūrą 3
Išjunkite klaviatūrą 3
Išjunkite klaviatūrą 3
Išjunkite klaviatūrą 3

Naudokite išlydymo dagtį ir nuimkite juostinius kabelius nuo klaviatūros apačios, įsitikindami, kad grandinės plokštės angos yra laisvos, ir tada pritvirtinkite dvi antraštes ant plokštės, kurioje yra skylės. Tikriausiai turėsite nukirpti antraštes, kad jos būtų 4 kontaktų antraštės.

Dabar, kai antraštės yra prijungtos, galite prijungti jį prie duonos lentos, paimti multimetrą ir išbandyti raktus, priklijuodami multimetrą prie atsitiktinių kaiščių ir išmatuodami varžą. Tai leis jums suplanuoti raktus. Žvelgiant į grandinę sunku pamatyti, kaip klavišai prijungti prie išėjimų, bet jei naudojate multimetrą, galite jį prijungti prie bet kurio dviejų kaiščių ir tada paspausti mygtukus, kol ekrane pamatysite skaičių, o ne atvirą grandinę. Tai bus raktas.

Tokiu būdu susieti visus raktus su išvesties kaiščiais.

4 žingsnis: prijunkite klaviatūrą

Prijunkite klaviatūrą
Prijunkite klaviatūrą
Prijunkite klaviatūrą
Prijunkite klaviatūrą

Dabar sekite prijungimo schemą ir prijunkite klaviatūrą prie savo duonos lentos.

Kaip tai veiks, mes įdėsime 5 V į kairę pusę, o dešinė - į GND. Pirmasis kaištis dešinėje diagramoje eina į pirmąjį mūsų analoginį „Atmega328p“mikrovaldiklio kaištį. Kai nėra paspaustų mygtukų, signalas bus 0V, o kai paspausite kiekvieną iš skirtingų mygtukų, įvestis į analoginį prievadą svyruos tarp 0V ir 5V, priklausomai nuo to, koks mygtukas buvo paspaustas. Mes pasirinkome rezistorių vertes, kad kiekviename kelyje būtų pasipriešinimas, kuris skiriasi nuo kitų. Mikrovaldiklio analoginis prievadas priima analoginį signalą ir padalija jį į 1024 skirtingus kanalus tarp 0V ir 5V. Tai reiškia, kad kiekvieno kanalo plotis yra 5V/1024 = 0,005 V/kanalas = 5 mV/kanalas. Taigi analoginis prievadas gali atskirti įvesties įtampas, jei jos skiriasi daugiau nei 5 mV. Mūsų atveju mes pasirinkome rezistorių reikšmes, kad bet kokie du klavišų paspaudimai siunčia įtampos signalą, kuris skiriasi daugiau nei šis, todėl mikrovaldiklis turėtų lengvai nuspręsti, kuris klavišas buvo paspaustas. Didelė problema yra ta, kad visa sistema yra labai triukšminga, todėl turėsime pasirinkti įtampos diapazoną, kurį susiesime su kiekvienu mygtuko paspaudimu, tačiau prie to prisijungsime šiek tiek vėliau.

Atkreipkite dėmesį, kad mes galime valdyti 14 mygtukų klaviatūrą naudodami tik vieną valdiklio įvesties liniją. Tai yra vienas iš naudingų analoginių įėjimų aspektų.

Dabar pirmasis mūsų bandymas valdyti klaviatūrą bus toks, kad klavišas paspaudžiamas, todėl pertraukos paprogramė perskaitys analoginį įvesties prievadą ir nuspręs, kuris klavišas buvo paspaustas, ir tada išves tą numerį į mūsų registro analizatoriaus paprogramę, kuri parodys pagrindinę reikšmę dvejetainėje formoje mūsų 8 šviesos dioduose, kuriuos nustatėme 5 pamokoje.

5 veiksmas: prijunkite klaviatūrą prie analizatoriaus

Prijunkite klaviatūrą prie analizatoriaus
Prijunkite klaviatūrą prie analizatoriaus
Prijunkite klaviatūrą prie analizatoriaus
Prijunkite klaviatūrą prie analizatoriaus

Nuotraukose parodyta, kaip mes norime prijungti klaviatūrą prie mikrovaldiklio, kad galėtume matyti išvestį mūsų analizatoriaus ekrane. Iš esmės tiesiog išvedame iš klaviatūros į PortC kaištį 0, kuris ATmega328P taip pat vadinamas ADC0.

Tačiau yra pora papildomų dalykų. Mes taip pat ketiname prijungti mygtuką prie PD2. T.y. prijunkite laidą nuo 5 V bėgio prie mygtuko ir iš kitos mygtuko pusės į PD2, galiausiai norime atjungti AREF kaištį nuo 5 V bėgio ir palikti jį atjungtą. Jei norėtume, galėtume įdėti 0,1 mikrofarado atsiejimo kondensatorių. Tai keraminis kondensatorius, ant kurio parašyta 104. Pirmieji du skaitmenys yra skaičius, o paskutinis skaitmuo yra 10 galia, kurią padauginame iš to, kad gautume atsakymą pikofarais (pico reiškia 10^-12), taigi 104 reiškia 10 x 10^4 pikofaradų, tai yra tas pats 100 nanofaradų (nano reiškia 10^-9), tai yra tas pats kaip 0,1 mikrofaradų (mikro reiškia 10^-6). Bet kokiu atveju visa tai stabdo AREF kaištį, kai galime jį naudoti kaip atskaitos kaištį.

Mes taip pat norime 1 Mohm rezistoriaus tarp PD2 ir žemės. Mes nustatysime PD2 kaip išvesties kaištį esant 0 V įtampai ir mes sukursime teigiamą kraštą ties šiuo kaiščiu. Mes norime, kad kraštas išnyktų iškart, kai atleisime mygtuką, todėl įdėsime šį „nuleidžiamą“rezistorių.

Priežastis, kodėl norime mygtuko, yra ta, kad norime išjungti analoginį skaitmeninį keitiklį iš lusto INT0 kaiščio, kuris taip pat yra PD2. Galų gale norėtume, kad klavišų paspaudimas suaktyvintų ADC ir taip pat suteiktų įvestį, kuri būtų konvertuojama neturint atskiro mygtuko, tačiau dėl to, kaip veikia laikas, pradėsime turėdami atskirą mygtuką, kuris suaktyvins ADC, ir kai viską išlyginsime klaidų ir įsitikinę, kad viskas veikia tinkamai, tada spręsime triukšmo ir laiko problemas, kylančias iš to paties mygtuko paspaudimo, kurį norime perskaityti.

Taigi kol kas tai veikia taip, kad laikysime nuspaudę klavišą, tada paspausime mygtuką, kad suaktyvintumėte ADC, tada paleiskite ir, tikėkimės, dvejetainė mygtuko, kurį paspaudėme, vertė bus rodoma analizatoriuje.

Taigi parašykime kodą, kuris tai padarys.

6 veiksmas: kokius perjungimo jungiklius turėtume nustatyti?

Kokius perjungimo jungiklius turėtume nustatyti?
Kokius perjungimo jungiklius turėtume nustatyti?

Pirmiausia pagalvokime, kaip tai koduoti, kad valdiklis galėtų skaityti įvestį iš klaviatūros ir paversti ją skaitmenine verte, atitinkančia paspaustą mygtuką. Mes naudosime analoginį skaitmeninį keitiklį (ADC) kuris yra integruotas į „Atmega328p“. Mes naudosime AREF kaip atskaitos įtampą, o mūsų klaviatūros išvestis bus prijungta prie PortC0 arba PC0. Atkreipkite dėmesį, kad šis kaištis taip pat vadinamas ADC0, skirtas analoginiam skaitmeninio keitiklio 0. Gali būti gera idėja perskaityti 12.4 skirsnį apie ATmega328P pertraukas ir 24 skyrių apie analoginį skaitmeninį keitiklį, kol paleisti arba bent jau paruošti tuos skyrius. Norėdami nustatyti mikrovaldiklį, kad jis žinotų, ką daryti su analoginiu įvesties signalu ir kaip sąveikauti su mūsų programa, pirmiausia turime nustatyti keletą įvairių ADC susiję registro bitai. Tai iš esmės prilygsta seniesiems perjungimo jungikliams pirmuosiuose kompiuteriuose. Jūs įjungiate arba išjungiate jungiklį arba dar labiau įjungiate laidus tarp vieno ir kito lizdo, kad elektronai, pasiekę tą kelio šaką, nustatytų, kad vieni vartai yra uždaryti, o kiti - atviri, o tai verčia juos eiti kitu keliu. grandinę ir taip atlikti kitokią loginę užduotį. Koduojant surinkimo kalba, mes turime artimą prieigą prie šių mikrovaldiklio funkcijų, o tai yra vienas iš patraukliausių dalykų. Tai daugiau „rankos“ir kur kas mažiau vyksta „užkulisiuose“. Taigi negalvokite apie šių registrų nustatymą kaip nuobodžią užduotį. Būtent tai daro surinkimo kalbą įdomią! Mes įgyjame labai asmeninį santykį su vidine mikroschemos veikla ir logika ir priverčiame ją daryti būtent tai, ko norime - ne daugiau ir ne mažiau. Nėra švaistomų laikrodžio ciklų. Taigi čia yra jungiklių, kuriuos turime nustatyti, sąrašas:

  1. Išjunkite galios mažinimo ADC bitą PRADC, kuris yra PRR registro 0 bitas, nes jei šis bitas įjungtas, jis išjungs ADC. Galios mažinimo registras iš esmės yra būdas išjungti įvairius dalykus, kurie naudoja energiją, kai jų nereikia. Kadangi naudojame ADC, norime įsitikinti, kad jis nėra išjungtas tokiu būdu. (Žr. PRADC 46 puslapyje)
  2. Pasirinkite analoginį įvesties kanalą, kuris bus ADC0, išjungdami MUX3… 0 ADC Multiplexer Selection (ADMUX) registre (žr. 24-4 lentelę, 249 psl.), Jie jau yra išjungti pagal numatytuosius nustatymus, todėl mums to daryti tikrai nereikia. Tačiau aš jį įtraukiu, nes jei kada nors naudosite kitą prievadą nei ADC0, turėsite atitinkamai perjungti šiuos jungiklius. Įvairūs MUX3, MUX2, MUX1, MUX0 deriniai leidžia kaip įvestį naudoti bet kurį iš analoginių prievadų, taip pat galite juos pakeisti kelyje, jei norite vienu metu pažvelgti į daugybę skirtingų analoginių signalų.
  3. Išjunkite REFS0 ir REFS1 bitus ADMUX registre, kad AREF kaip atskaitos įtampą naudosime ne vidinę atskaitą (žr. 248 psl.).
  4. Įjunkite ADLAR bitą ADMUX, kad rezultatas būtų „sureguliuotas kairėje“, mes aptarsime šį pasirinkimą kitame žingsnyje.
  5. Nustatykite ADC0D bitą skaitmeninio įvesties išjungimo registre (DIDR0), kad išjungtumėte skaitmeninį įvestį į PC0. Mes naudojame tą prievadą analoginiam įėjimui, todėl taip pat galime išjungti skaitmeninį įvestį.
  6. Išorinio pertraukimo valdymo registre A (EICRA) nustatykite ISC0 ir ISC1, kad nurodytumėte, jog norime suaktyvinti kylantį įtampos signalo kraštą į INT0 kaištį (PD2), žr. 71 psl.
  7. Išvalykite bitus INT0 ir INT1 išorinio pertraukimo kaukių registre (EIMSK), kad nurodytumėte, jog šiame kaištyje nenaudojame pertraukų. Jei šiame kaištyje įjungtume pertraukas, mums reikia pertraukimo tvarkytojo adresu 0x0002, bet mes jį nustatome taip, kad signalas ant šio kaiščio suaktyvintų ADC konversiją, kurios užbaigimą tvarko ADC konversijos visiškas pertraukimas adresas 0x002A. Žr. 72 puslapį.
  8. Norėdami įjungti ADC, nustatykite ADC įjungimo (ADEN) bitą (7 bitas) ADC valdymo ir būsenos registre A (ADCSRA). Žr. 249 puslapį.
  9. Galėtume pradėti vieną konversiją, kiekvieną kartą norėdami nuskaityti analoginį signalą, nustatydami ADC pradžios konversijos bitą (ADSC), tačiau kol kas verčiau jį nuskaitytume automatiškai, kai kas nors paspaudžia mygtuką, todėl vietoj to įgalinsime ADC Autotrigger Enable (ADATE) bitas ADCSRA registre, kad paleidimas būtų atliekamas automatiškai.
  10. Mes taip pat nustatėme ADPS2..0 bitus (AD Prescalar bitus) į 111, kad ADC laikrodis būtų CPU laikrodis, padalytas iš koeficiento 128.
  11. Mes pasirinksime ADC suveikimo šaltinį PD2, kuris taip pat vadinamas INT0 (išorinio pertraukimo užklausa 0). Tai darome perjungdami įvairius bitus ADCSRB registre (žr. 24-6 lentelę 251 puslapyje). Iš lentelės matome, kad norime išjungti ADTS0, įjungti ADTS1 ir išjungti ADTS2, kad ADC suaktyvintų tą kaištį. Atkreipkite dėmesį, jei norėtume nuolat imti analoginio prievado mėginius, pvz., Skaitydami nuolatinį analoginį signalą (pvz., Garso mėginių ėmimą ar kažką panašaus), nustatytume laisvo veikimo režimą. Metodas, kurį naudojame nustatydami PD2 paleidimą, suaktyvina analoginio prievado PC0 ADC nuskaitymą, nesukeldamas pertraukos. Nutraukimas įvyks, kai konversija bus baigta.
  12. Įjunkite ADC pertraukimo įjungimo (ADIE) bitą ADCSRA registre, kad, kai analoginis konvertavimas į skaitmeninį bus baigtas, jis sukurs pertrauką, kuriai galime parašyti pertraukimo tvarkyklę ir įdėti į.org 0x002A.
  13. Nustatykite I bitą SREG, kad įjungtumėte pertraukas.

1 pratimas: būtinai perskaitykite atitinkamus kiekvieno aukščiau pateikto nustatymo duomenų lapo skyrius, kad suprastumėte, kas vyksta ir kas nutiktų, jei juos pakeistume į alternatyvius nustatymus.

7 žingsnis: parašykite pertraukimo tvarkyklę

Paskutiniame žingsnyje pamatėme, kad mes jį nustatėme taip, kad PD2 aptiktas pakilęs kraštas PC0 suaktyvintų analoginį ir skaitmeninį konvertavimą, o kai ši konversija bus baigta, bus nutrauktas ADC konversijos užbaigimas. Dabar norime ką nors padaryti su šiuo pertraukimu. Jei išnagrinėsite 12-6 lentelę 65 puslapyje, pamatysite galimų pertraukimų sąrašą. Ankstesniuose vadovuose jau matėme, kad RESET nutraukiamas adresu 0x0000, o laikmačio/skaitiklio0 perpildymas - 0x0020. Dabar norime pažvelgti į ADC pertraukimą, kurį matome lentelėje adresu 0x002A. Taigi surinkimo kalbos kodo pradžioje mums reikės šios eilutės:

.org 0x002Arjmp ADC_int

kuris pereis prie mūsų pertraukimo tvarkytojo, pažymėto ADC_int, kai ADC užbaigs konversiją. Taigi, kaip turėtume parašyti savo pertraukimo tvarkytoją? ADC veikia taip, kaip apskaičiuojama:

ADC = Vin x 1024 / Vref

Taigi pažiūrėkime, kas atsitiks, jei paspausiu klaviatūros mygtuką „perrinkti“. Tokiu atveju PC0 įtampa pasikeis iki tam tikros vertės, tarkime, 1,52 V, o kadangi Vref yra 5 V, turėsime:

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

ir taip jis būtų rodomas kaip 311. Jei norėtume tai paversti atgal į įtampą, mes tiesiog pakeistume skaičiavimą. Tačiau mums to daryti nereikės, nes nesame suinteresuoti tikra įtampa, tik atskirti juos. Kai konvertavimas bus baigtas, rezultatas bus išsaugotas 10 bitų skaičiuje, esančiame ADCH ir ADCL registruose, ir mes sukėlėme, kad jis būtų „sureguliuotas kairėje“, o tai reiškia, kad 10 bitų prasideda nuo 7 ADCH bitų ir sumažėja iki 6 bitą ADCL (iš viso šiuose dviejuose registruose yra 16 bitų ir mes naudojame tik 10 iš jų, ty 1024 kanalus). Jei norėtume, rezultatas būtų „sureguliuotas teisingai“, išvalydami ADLAR bitą ADMUX registre. Priežastis, dėl kurios pasirenkame kairįjį koregavimą, yra ta, kad mūsų signalai yra pakankamai toli vienas nuo kito, todėl paskutiniai du kanalo numerio skaitmenys nėra svarbūs ir tikriausiai yra tik triukšmas, todėl mes atspausime klavišų paspaudimus naudodami tik viršutinius 8 skaitmenis, kitaip tariant, mums reikės tik pažvelgti į ADCH, kad išsiaiškintume, kuris mygtukas buvo paspaustas. Taigi mūsų pertraukimo tvarkytojas turėtų tiesiog nuskaityti numerį iš ADCH užregistruokite, konvertuokite šį skaičių į klaviatūros vertę ir nusiųskite šią vertę į mūsų registro analizatoriaus šviesos diodus, kad galėtume patikrinti, ar paspaudus „9“sakys, kad užsidegs „00001001“atitinkantys šviesos diodai. Prieš eidami nors pirmiausia turime pamatyti, kas rodoma ADCH, kai spaudžiame įvairius mygtukus. Taigi tiesiog parašykime paprastą pertraukimo tvarkyklę, kuri tiesiog siunčia ADCH turinį į analizatoriaus ekraną. Taigi štai ko mums reikia:

ADC_int: lds analizatorius, ADCH; įkelkite ADCH vertę į mūsų analizatoriųbi EIFR, 0; išvalykite išorinę pertraukimo vėliavą, kad ji būtų vėl paruošta

Iki šiol turėtumėte sugebėti tiesiog nukopijuoti kodą iš mūsų analizatoriaus 5 pamokoje ir pridėti šį pertraukimą bei perjungimo nustatymus ir jį paleisti. 2 pratimas: parašykite kodą ir paleiskite jį. Įsitikinkite, kad jūsų analizatoriaus ekrane rodomas ADCH. Pabandykite kelis kartus paspausti tą patį klavišą. Ar visada gaunate tą pačią vertę ADCH?

8 žingsnis: suplanuokite klavišų paspaudimo vertes

Suplanuokite klavišų paspaudimo vertes
Suplanuokite klavišų paspaudimo vertes

Dabar turime konvertuoti ADCH reikšmes į skaičius, atitinkančius paspaustą klavišą. Mes tai darome užrašydami kiekvieno klavišo paspaudimo ADCH turinį ir konvertuodami jį į dešimtainį skaičių, kaip aš padariau paveikslėlyje. Vykdydami pertraukimo tvarkymo procedūrą, mes laikysime visą reikšmių diapazoną, atitinkantį kiekvieną klavišo paspaudimą, kad ADC susietų bet ką tame diapazone su tam tikru klavišo paspaudimu.

3 pratimas: atlikite šį žemėlapį ir perrašykite savo ADC pertraukos tvarką.

Štai ką aš gavau už savo (jūsų greičiausiai bus kitaip). Atkreipkite dėmesį, kad aš jį nustatiau su kiekvieno klavišo paspaudimo verčių diapazonu.

ADC_int:; Išorinis pertraukimo tvarkyklių analizatorius; pasiruošti naujiems numeriams mygtukasH, ADCH; ADC atnaujinamas, kai skaitomas ADCH clccpi buttonH, 240brlo PC+3; jei ADCH yra didesnis, tai 1ldi analizatorius, 1; taigi apkrovos analizatorius su 1rmp grąžinimu; ir grąžinti clccpi mygtukąH, 230; jei ADCH yra didesnis, tada 2brlo PC+3ldi analizatorius, 2rjmp grąžinimo clccpi mygtukasH, 217brlo PC+3ldi analizatorius, 3rjmp grąžinimo clccpi mygtukasH, 203brlo PC+3ldi analizatorius, 4rjmp grąžinimo clccpi mygtukasH, 187brlo PC+3ldi analizatorius, 5rjmp grąžinimo clccpi mygtukas, 155brlo PC+3ldi analizatorius, 6rjmp grąžinimo clccpi mygtukasH, 127brlo PC+3ldi analizatorius, 255; mes nustatysime blykstę kaip visus onrjmp grąžinimo clccpi mygtukusH, 115brlo PC+3ldi analizatorius, 7rjmp grąžinimo clccpi mygtukasH, 94brlo PC+3ldi analizatorius, 8rjmp grąžinimo clccpi mygtukasH, 62brlo PC+3ldi analizatorius, 9rjmp grąžinimo clccpi mygtukasH, 37brlo PC+3ldi analizatorius, 0b11110000; žvaigždutė yra viršutinė pusė onrjmp grąžinimo clccpi mygtukasH, 28brlo PC+3ldi analizatorius, 0rjmp return clccpi buttonH, 17brlo PC+3ldi analizatorius, 0b00001111; maišos ženklas yra apatinė pusės onrjmp grąžinimo clccpi mygtukasH, 5brlo PC+3ldi analizatorius, 0b11000011; pakartotinis rinkimas yra viršutinis 2 apatinis 2rjmp grąžinimo ldi analizatorius, 0b11011011; kitaip įvyko klaida grįžti: reti

9 veiksmas: 1 versijos kodas ir vaizdo įrašas

Pridėjau šios pirmosios klaviatūros tvarkyklės versijos kodą. Šiuo atveju turite paspausti klavišą ir paspausti mygtuką, kad ADC nuskaitytų įvestį iš klaviatūros. Tai, ko norėtume, yra ne mygtukas, o signalas konvertuoti ateina iš paties klavišo paspaudimo. 3 pratimas: surinkite ir įkelkite šį kodą ir pabandykite. Jums gali tekti pakeisti įvairias konversijų slenksčius, kad jie atitiktų jūsų klavišų paspaudimo įtampą, nes jie greičiausiai skiriasi nuo mano. Kas atsitiks, jei bandysite naudoti įvestį iš klaviatūros tiek ADC0, tiek išoriniam pertraukimo kaiščiui, o ne per mygtuką? Taip pat pridėsiu vaizdo įrašą apie šios pirmosios mūsų klavišų paspaudimo tvarkyklės versijos veikimą. Jūs pastebėsite, kad mano kode yra skyrius, inicijuojantis kamino žymeklį. Yra įvairių registrų, kuriuos galbūt norėsime išstumti iš kamino, kai manipuliuosime kintamaisiais ir kas ne, taip pat yra registrų, kuriuos galbūt norėsime išsaugoti ir atkurti vėliau. Pavyzdžiui, SREG yra registras, kuris nėra išsaugomas pertraukų metu, todėl įvairios vėliavos, kurios nustatomos ir pašalinamos dėl operacijų, gali būti pakeistos, jei kažkas nutrūksta viduryje. Taigi geriausia, jei pertraukimo tvarkyklės pradžioje stumiate SREG ant kamino, o nutraukimo tvarkytojo pabaigoje vėl išmesite. Įdėjau jį į kodą, norėdamas parodyti, kaip jis inicijuojamas, ir numatyti, kaip mums to prireiks vėliau, tačiau kadangi mums nerūpi, kas atsitiks su SREG mūsų kodo pertraukų metu, aš tam nenaudojau kamino. Taip pat atkreipkite dėmesį kad naudodamas „shift“operaciją inicijuodamas registruose nustatiau įvairius bitus. Pavyzdžiui, eilutėje:

ldi temp, (1 <> sts EICRA, temp

Komanda "<<" pirmoje kodo eilutėje yra pamainos operacija. Jis iš esmės paima dvejetainį skaičių 1, kuris yra 0b00000001, ir perkelia jį į kairę skaičiaus ISC01 suma. Tai bitų, pavadintų ISC01, padėtis EICRA registre. Kadangi ISC01 yra 1 bitas, skaičius 1 perkeliamas į kairę 1, kad taptų 0b00000010. Panašiai antrasis, ISC00, yra EICRA bitas 0, todėl skaičiaus 1 poslinkis yra lygus nuliui į kairę. Jei pažvelgsite dar kartą į failą m328Pdef.inc, kurį atsisiuntėte pirmoje pamokoje ir nuo tada naudojate evrr, pamatysite, kad tai tik ilgas „.equ“teiginių sąrašas. Pamatysite, kad ISC01 yra lygus 1. Surinkėjas kiekvieną jo egzempliorių pakeičia 1, prieš pradėdamas ką nors surinkti. Tai tik registro bitų pavadinimai, padedantys mums žmonėms skaityti ir rašyti kodą. Dabar vertikali linija tarp dviejų aukščiau esančių pamainų operacijų yra logiška „arba“operacija. Čia yra lygtis:

0b00000010 | 0b00000001 = 0b00000011

ir tai mes įkeliame (naudodami „ldi“) į temp. Priežastis, kodėl žmonės naudoja šį metodą, norėdami įkelti vertes į registrą, yra tai, kad tai leidžia naudoti bitų pavadinimą, o ne tik skaičių, todėl kodą lengviau skaityti. Taip pat yra du kiti metodai, kuriuos naudojome. Mes naudojame instrukcijas „ori“ir „andi“. Tai leidžia atitinkamai nustatyti ir išvalyti bitus, nekeičiant jokių kitų bitų registre. Pavyzdžiui, kai naudojau

ori temp, (1

tai "" arba "temp" su 0b00000001, kuris į nulinį bitą įtraukia 1, o visa kita lieka nepakitusi. Taip pat, kai rašėme

andi temp, 0b11111110

tai nulio tempą pakeičia į 0, o visa kita lieka nepakitusi.

4 pratimas: turėtumėte pereiti kodą ir įsitikinti, kad suprantate kiekvieną eilutę. Jums gali būti įdomu rasti geresnių metodų, kaip atlikti darbus, ir parašyti geresnę programą. Yra šimtas būdų, kaip koduoti dalykus, ir aš esu įsitikinęs, kad galite rasti daug geresnį būdą nei mano. Taip pat galite rasti (neduok Dieve!) Klaidų ir praleidimų. Tokiu atveju tikrai norėčiau išgirsti apie juos, kad juos būtų galima ištaisyti.

Gerai, dabar pažiūrėkime, ar galime atsikratyti to nereikalingo mygtuko …

10 veiksmas: 2 versijos kodas

Paprasčiausias būdas atsikratyti mygtuko yra visiškai jį pašalinti, pamiršti PB2 įvestį ir tiesiog perjungti ADC į „Laisvo veikimo režimą“.

Kitaip tariant, tiesiog pakeiskite ADCSRB registrą taip, kad visi ADTS2, ADTS1 ir ADTS0 būtų nuliniai.

Tada ADCSRA nustatykite ADSC bitą į 1, kuris pradės pirmąją konversiją.

Dabar įkelkite jį į savo mikrovaldiklį ir pamatysite, kad teisingas numeris pasirodo ekrane, kol spaudžiate mygtuką ir tik tada, kai spaudžiate mygtuką. Taip yra todėl, kad ADC nuolat ima ADC0 prievado mėginius ir rodo vertę. Kai nuimsite pirštą nuo mygtuko, „mygtuko atšokimas“sukels keletą atsitiktinių verčių labai greitai ir tada vėl grįš prie 0 V įvesties. Mūsų kode šis 0V rodomas kaip 0b11011011 (nes paspaudus „0“jau naudojama 0b00000000 rodymo vertė)

Tačiau tai nėra sprendimas, kurio norime dėl dviejų priežasčių. Pirmiausia nenorime laikyti mygtuko. Mes norime vieną kartą jį paspausti ir parodyti numerį (arba panaudoti tam tikrame naujame mokyme). Antra, mes nenorime nuolat imti ADC0 mėginių. Mes norime, kad jis perskaitytų vieną kartą, konvertuotų ir miegotų, kol naujas klavišo paspaudimas paskatins naują konversiją. Laisvo veikimo režimas yra geriausias, jei vienintelis dalykas, kurį norite, kad mikrovaldiklis darytų, yra nuolat skaityti kokią nors analoginę įvestį, pvz., Jei norėtumėte rodyti realaus laiko temperatūrą ar pan.

Taigi suraskime dar vieną sprendimą …

11 žingsnis: Kaip atsikratyti mygtuko? 3 versija

Kaip atsikratyti mygtuko? 3 versija
Kaip atsikratyti mygtuko? 3 versija

Yra daug būdų, kaip galėtume tęsti. Pirmiausia galėtume pridėti aparatūros, kad atsikratytume mygtuko. Pavyzdžiui, mes galime pabandyti įjungti tranzistorių į grandinę klavišų paspaudimo išvesties linijoje, kad ji paimtų nedidelį srovės srautą iš išvesties ir nusiųstų 5 V impulsą į pertraukimo kaištį PD2.

Tačiau tai tikriausiai būtų per daug triukšminga, o blogiausiu atveju neužtektų laiko tiksliai nuskaityti klavišus, nes klaviatūros išėjimo įtampa nespėtų stabilizuotis prieš užfiksuojant ADC rodmenis.

Taigi verčiau sugalvosime programinį sprendimą. Mes norėtume padaryti PD2 kaiščio pertraukimą ir parašyti jam pertraukimo tvarkyklę, kuri reikalauja vieno klaviatūros kaiščio nuskaitymo. Kitaip tariant, mes atsikratome autotriggerio pertraukimo iš ADC ir pridedame išorinį pertraukimą, kuris iškviečia ADC viduje. Tokiu būdu signalas skaityti ADC ateina po to, kai PD2 signalas jau įvyko, ir tai gali suteikti pakankamai laiko stabilizuotis iki tikslios įtampos prieš skaitant ir konvertuojant PC0 kaištį. Mes vis tiek turėsime ADC užbaigimo pertrauką, kurio rezultatas bus pateiktas analizatoriaus ekrane pabaigoje.

Logiška? Na, padarykime…

Pažvelkite į pridėtą naują kodą.

Matote šiuos pakeitimus:

  1. Mes pridėjome rjmp adresu.org 0x0002, kad galėtume tvarkyti INT0 išorinį pertraukimą
  2. Mes pakeitėme EIMSK registrą, norėdami nurodyti, kad norime nutraukti INT0 kaištį
  3. Mes pakeitėme ADATE kaištį ADCSRA registre, kad išjungtume automatinį paleidimą
  4. Atsikratėme ADCSRB nustatymų, nes jie nesvarbūs, kai ADATE išjungtas
  5. Mums nebereikia iš naujo nustatyti išorinio trigerio vėliavos, nes INT0 pertraukimo rutina tai daro automatiškai, kai ji baigiasi - anksčiau mes neturėjome pertraukos rutinos, mes tiesiog išjungėme ADC signalą toje kaištyje, todėl turėjome nuvalykite tą vėliavą ranka.

Dabar pertraukimo tvarkyklėje mes tiesiog iškviečiame vieną konversiją iš ADC.

5 pratimas: paleiskite šią versiją ir pažiūrėkite, kas atsitiks.

12 veiksmas: darbo versijos kodas ir vaizdo įrašas

Kaip matėme paskutinėje versijoje, mygtuko pertraukimas neveikia labai gerai, nes pertraukimas suaktyvinamas kylančiame krašte, kad prisegtumėte PD2, o tada pertraukimo tvarkytojas iškviečia ADC konversiją. Tačiau tada ADC gauna įtampos rodmenis, kol jis stabilizuojasi, ir taip skaito nesąmones.

Mums reikia įvesti vėlavimą tarp pertraukos PD2 ir ADC skaitymo PC0. Tai padarysime pridėję laikmatį/skaitiklį, skaitiklio perpildymo pertrauką ir uždelsimo procedūrą. Laimei, mes jau žinome, kaip tai padaryti iš 3 mokymo programos! Taigi mes tiesiog nukopijuosime ir įklijuosime atitinkamą kodą iš ten.

Pateikiau gautą kodą ir vaizdo įrašą, rodantį, kaip jis veikia.

Pastebėsite, kad rodmenys nėra tokie tikslūs, kaip būtų galima tikėtis. Tikėtina, kad taip yra dėl daugelio šaltinių:

  1. mes paspaudžiame iš klaviatūros išvesties, kad suaktyvintume PD2, o tai daro įtaką PC0 rodmeniui.
  2. mes tikrai nežinome, kiek laiko atidėti po trigerio, kad gautume geriausią skaitymą.
  3. ADC konvertavimas užtrunka keletą ciklų, o tai reiškia, kad negalime greitai suaktyvinti klaviatūros.
  4. tikriausiai yra triukšmo pačioje klaviatūroje.
  5. ir tt…

Taigi, nors mums pavyko priversti klaviatūrą veikti, ir dabar galėtume ją naudoti programose, naudodami klavišų paspaudimo vertes kokiu nors kitu būdu, o ne tik išvesdami jas į analizatoriaus ekraną, ji nėra labai tiksli ir labai erzina. Todėl manau, kad geriausias būdas prijungti klaviatūrą yra tiesiog įkišti kiekvieną klaviatūros išvestį į kitą prievadą ir nuspręsti, kurį klavišą paspaudžia, kurie uostai mato įtampą. Tai lengva, labai greita ir labai tikslu.

Tiesą sakant, yra tik dvi priežastys, kodėl norėtųsi valdyti klaviatūrą taip, kaip tai darėme čia:

  1. Jis naudoja tik 2 mūsų mikrovaldiklio kaiščius, o ne 8.
  2. Tai puikus projektas, parodantis įvairius mikrovaldiklio ADC aspektus, kurie skiriasi nuo standartinių dalykų, kuriuos galite sužinoti, pvz., Temperatūros rodmenys, posūkio potenciometrai ir pan. Norėjau suaktyvintų pavienių rodmenų ir išorinio kaiščio automatinio paleidimo pavyzdžio o ne tik laisvai veikiantis procesoriaus gurkšnojimo režimas.

Bet kokiu atveju, čia yra paskutinė pora pratimų jums:

6 pratimas: perrašykite ADC konversijos užbaigimo pertraukimo tvarkyklę, kad galėtumėte naudoti paieškos lentelę. T.y. Taigi, kad ji patikrintų analoginę vertę su pirmuoju lentelės elementu ir, jei ji yra didesnė, ji grįžtų iš pertraukos, jei ne, tada padidina Z iki kito lentelės elemento ir vėl grįžta prie bandymo. Tai sutrumpins kodą, išvalys pertraukimo rutiną ir atrodys gražiau. (Kitame žingsnyje pateiksiu galimą sprendimą) 7 pratimas: Prijunkite klaviatūrą prie 8 mikrovaldiklio kaiščių ir parašykite paprastą tvarkyklę ir pajuskite, kaip ji yra gražesnė. Ar galite sugalvoti keletą būdų, kaip pagerinti mūsų metodą?

Tai viskas šiai pamokai. Pridėjau galutinę versiją su nuorodomis. Artėjant prie galutinio tikslo, 9 pamokoje dar kartą naudosime klaviatūrą, kad parodytume, kaip su ja valdyti septynių segmentų ekranus (ir sukurti ką nors įdomaus, naudojant papildomus telefono klaviatūros klavišus), o tada Vietoj to pereikite prie dalykų valdymo mygtuko paspaudimais (nes šis metodas geriau dera su galutiniu produktu, kurį mes kuriame su šiomis pamokomis) ir mes tiesiog paliksime klaviatūrą.

Pasimatysim kitą kartą!

Rekomenduojamas: