Satura rādītājs:

AVR montētāja apmācība 7: 12 soļi
AVR montētāja apmācība 7: 12 soļi

Video: AVR montētāja apmācība 7: 12 soļi

Video: AVR montētāja apmācība 7: 12 soļi
Video: 30 Days Natural Body Transformation 🔥🔥🔥 #fitness #transformation #gym #75hardchallenge 2024, Jūlijs
Anonim
AVR montētāja apmācība 7
AVR montētāja apmācība 7

Laipni lūdzam 7. apmācībā!

Šodien mēs vispirms parādīsim, kā noņemt tastatūru, un pēc tam parādīsim, kā izmantot analogās ievades portus, lai sazinātos ar tastatūru. Mēs to darīsim, izmantojot ievadi ar pārtraukumiem un vienu vadu. Mēs savienosim tastatūru tā, lai katrs taustiņu nospiešana nosūtītu unikālu spriegumu uz analogo ieeju, kas ļaus mums atšķirt pēc sprieguma, kas tika nospiests. Tad mēs izdosim numuru, kas nospiests mūsu reģistra analizatoram, lai parādītu, ka viss notiek tā, kā tam vajadzētu notikt. Ir vairāki trūkumi, kurus varat izmantot, izmantojot ATmega328p analogo ciparu pārveidotāju (ADC), un tāpēc mēs to darīsim veiciet lietas dažos posmos, lai mēģinātu izdomāt, kā no tām izvairīties. Mēs arī redzēsim, kāpēc analogā digitālā pārveidotāja izmantošana nav labākais veids, kā kontrolēt tastatūru, lai gan tā izmanto mazāk mikrokontrollera portu. Šajā apmācībā jums būs nepieciešams:

  1. tastatūru. Jūs varat iegādāties vienu vai arī jūs varat darīt to, ko es darīju, un iztīrīt vienu.
  2. 2 sieviešu galvenes tastatūrai (ja to noņemat)
  3. savienojošie vadi
  4. maizes dēlis
  5. 4 1 Kohm rezistori
  6. 1 15 Kohm rezistors
  7. 1 3.3 Kohm rezistors
  8. 1 180 omu rezistors
  9. 1680 omu rezistors
  10. digitālais multimetrs
  11. jūsu analizators no 5. apmācības

Iespējams, vēlēsities izlaist dažus pirmos soļus, ja jums jau ir tastatūra un tā nav jātīra.

Šeit ir saite uz visu manu AVR montāžas apmācību kolekciju:

1. darbība. Tastatūras noņemšana 1

Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1
Tastatūras tīrīšana 1

Sen, kad pat jūsu vecvecāki bija tikai bērni, cilvēki mēdza sazināties savā starpā ar šīm dīvaina izskata ierīcēm, kurām sienā bija pievienoti gari kabeļi. Tos sauca par "telefoniem" un parasti tās bija lētas plastmasas lietas, kas radīja kaitinošu skaņu, kad kāds jums piezvanīja (nevis, ka mūsdienu "Justin Bieber" zvana signāli nav vienādi kaitinoši). Jebkurā gadījumā šajās ierīcēs bija tastatūras, kuras bija ļoti vienkārši savienotas ar vadu, tāpēc tās ir viegli noņemt, un tajās ir 2 papildu taustiņi ("atkārtota izsaukšana" un "zibspuldze") no iegādātajām tastatūrām, kuras, iespējams, vēlēsities izmantot kā "bulttaustiņus", "izvēlnes taustiņus" vai kaut ko citu. Tātad, mēs sāksim ar vecā tālruņa tastatūras noņemšanu. Vispirms paņemiet tālruni (es izmantoju GE, kā parādīts attēlos) un atdaliet to, lai atklātu vadu. Tad paņemiet kaltu un noņemiet mazās plastmasas pogas, kas tur tastatūru, un noņemiet tastatūru.

2. darbība: noņemiet tastatūru 2

Tastatūras tīrīšana 2
Tastatūras tīrīšana 2
Tastatūras tīrīšana 2
Tastatūras tīrīšana 2
Tastatūras tīrīšana 2
Tastatūras tīrīšana 2

Tagad paņemiet PVC zāģi un izgrieziet plastmasu no ap atslēgas caurumiem un pēc tam nogrieziet ap malu, lai iegūtu pareizo dziļumu, atstājot plānu tastatūru.

Pēc tam atkal ieslēdziet tastatūru, izmantojot mazās tapas, kas palikušas pēc tam, kad pēdējā posmā noņēmāt to galotnes, un izmantojiet lodāmuru, lai vienkārši iebāztu karsto gludekli katrā tapas atverē, kas izkausēs plastmasu un izkliedēs to virs tastatūras apakšā, veidojot jaunas "pogas", kas turēs tastatūru vietā tāpat kā iepriekš.

Man patīk iztīrīt trīs skaļruņus un varbūt citas lietas, piemēram, slēdžus un to, kas ir uz tāfeles. Tomēr šoreiz es netaisos izmētāt slēdžus un citas lietas, jo mums šobrīd ir citi mērķi. Tur ir arī TA31002 lineāra IC, kas ir tālruņa zvana signāls. Datu lapa ir viegli atrodama un lejupielādējama tiešsaistē, sniedzot informāciju un funkcijas. Tāpēc es pagaidām atstāšu to pielodētu pie tāfeles un vēlāk spēlēšos ar to. Es gribētu to savienot ar osciloskopu un redzēt, kādus foršus signālus es varu no tā iegūt. Varbūt pat no tā uztaisīt durvju zvanu. Kas zina.

Jebkurā gadījumā, kad esat pabeidzis tālruņa iznīcināšanu un detaļu tīrīšanu, mēs pabeigsim tastatūras izveidi.

3. darbība: noņemiet tastatūru 3

Tastatūras tīrīšana 3
Tastatūras tīrīšana 3
Tastatūras tīrīšana 3
Tastatūras tīrīšana 3
Tastatūras tīrīšana 3
Tastatūras tīrīšana 3

Izmantojiet atkausēšanas daktis un noņemiet lentes kabeļus no tastatūras apakšdaļas, pārliecinoties, ka shēmas plates caurumi ir brīvi, un pēc tam piestipriniet divas sieviešu galviņas uz plāksnes, kur atrodas caurumi. Jums, iespējams, būs jāapgriež galvenes tā, lai tās būtu 4 kontaktu galvenes.

Tagad, kad galvenes ir pievienotas, varat to savienot ar maizes dēli, paņemt multimetru un pārbaudīt taustiņus, pielīmējot multimetru ar nejaušām tapām un izmērot pretestību. Tas ļaus jums kartēt atslēgas. Skatoties uz ķēdi, ir grūti redzēt, kā taustiņi ir savienoti ar izejām, bet, ja izmantojat multimetru, varat to pievienot jebkurai divām tapām un pēc tam nospiest pogas, līdz ekrānā redzat numuru, nevis atvērtu ķēdi. Šī būs šīs atslēgas kontaktinformācija.

Šādā veidā kartējiet visas atslēgas, lai izvadītu tapas.

4. darbība: pievienojiet tastatūru

Pieslēdziet tastatūru
Pieslēdziet tastatūru
Pieslēdziet tastatūru
Pieslēdziet tastatūru

Tagad sekojiet elektroinstalācijas shēmai un pievienojiet tastatūru pie maizes dēļa.

Kā tas darbosies, mēs ievietosim 5V kreisajā pusē, bet labā puse - uz GND. Diagrammas pirmā tapa labajā pusē nonāk pirmajā mūsu analogā tapā uz mikrokontrollera Atmega328p. Ja netiek nospiesta neviena poga, signāls būs 0V, un, nospiežot katru no dažādām pogām, analogā porta ievade būs robežās no 0V līdz 5V ar atšķirīgu daudzumu atkarībā no tā, kurš taustiņš tika nospiests. Mēs izvēlējāmies rezistora vērtības, lai katrā ceļā būtu pretestība, kas atšķiras no pārējām. Mikrokontrollera analogā pieslēgvieta uztver analogo signālu un sadala to 1024 dažādos kanālos starp 0V un 5V. Tas nozīmē, ka katram kanālam ir platums 5V/1024 = 0,005 V/kanāls = 5 mV/kanāls. Tātad analogais ports var atšķirt ieejas spriegumus, ja vien tie atšķiras par vairāk nekā 5 mV. Mūsu gadījumā mēs esam izvēlējušies rezistoru vērtības tā, lai jebkurš divi taustiņu nospiešanas gadījumi nosūtītu sprieguma signālu, kas atšķiras vairāk par šo, tāpēc mikrokontrolleram vajadzētu viegli noteikt, kurš taustiņš tika nospiests. Lielā problēma ir tā, ka visa sistēma ir ļoti trokšņaina, tāpēc mums būs jāizvēlas spriegumu diapazons, kas tiks pieskaņots katrai pogas nospiešanai, bet mēs pie tā nonāksim nedaudz vēlāk.

Ņemiet vērā, ka mēs varam kontrolēt 14 taustiņu tastatūru, izmantojot tikai vienu ievades līniju kontrolierim. Tas ir viens no noderīgajiem analogo ieeju aspektiem.

Tagad mūsu pirmais mēģinājums kontrolēt tastatūru būs taustiņu nospiešana, kas izraisīs pārtraukumu, pārtraukuma apakšprogramma nolasīs analogo ieejas portu un izlems, kurš taustiņš tika nospiests, un pēc tam izvadīs šo numuru mūsu reģistra analizatora apakšprogrammā, kas parādīs galvenā vērtība binārā mūsu 8 gaismas diodēs, kuras mēs iestatījām 5. apmācībā.

5. darbība: pievienojiet tastatūru savam analizatoram

Pievienojiet tastatūru savam analizatoram
Pievienojiet tastatūru savam analizatoram
Pievienojiet tastatūru savam analizatoram
Pievienojiet tastatūru savam analizatoram

Attēli parāda, kā mēs vēlamies pieslēgt tastatūru pie mikrokontrollera, lai mēs varētu redzēt izvadi mūsu analizatora displejā. Būtībā mēs vienkārši vadām izeju no tastatūras uz PortC tapu 0, ko ATmega328P sauc arī par ADC0.

Tomēr ir pāris papildu lietas. Mēs arī pievienosim pogu PD2. T.i. novietojiet vadu no sava 5V sliedes uz pogu un no pogas otras puses uz PD2, un visbeidzot, mēs vēlamies atvienot AREF tapu no mūsu 5V sliedes un tā vietā atstāt to atvienotu. Mēs varētu ievietot 0,1 mikrofaradas atvienošanas kondensatoru, ja mēs to vēlētos. Tas ir keramikas kondensators, uz kura rakstīts 104. Pirmie divi cipari ir skaitlis, bet pēdējais cipars ir 10 jauda, ar kuru mēs reizinām to, lai iegūtu atbildi pikofarādēs (pico nozīmē 10^-12), tātad 104 nozīmē 10 x 10^4 pikofaradus, kas ir tāds pats kā 100 nanofaradu (nano nozīmē 10^-9), kas ir tas pats, kas 0,1 mikrofarads (mikro nozīmē 10^-6). Jebkurā gadījumā tas viss stabilizē AREF tapu, kad varam to izmantot kā atsauces tapu.

Mēs arī vēlamies 1 Mohm rezistoru starp PD2 un zemi. Mēs iestatīsim PD2 kā izejas tapu pie 0 V, un mēs aktivizēsim pozitīvo malu pie šīs tapas. Mēs vēlamies, lai, atlaižot pogu, mala nekavējoties pazustu, lai mēs ievietotu šo "nolaižamo" rezistoru.

Iemesls, kāpēc mēs vēlamies pogu, ir tāpēc, ka mēs vēlamies aktivizēt mūsu analogo ciparu pārveidotāju no mikroshēmas INT0 tapas, kas ir arī PD2. Galu galā mēs vēlētos, lai taustiņu nospiešana gan iedarbinātu ADC, gan arī nodrošinātu ievades konvertēšanu bez atsevišķas pogas, bet laika noteikšanas veida dēļ mēs vispirms sāksim ar atsevišķu pogu, lai iedarbinātu ADC, un, kad mēs visu izgludinām kļūdas un esat pārliecināti, ka viss darbojas pareizi, tad mēs risināsim trokšņa un laika problēmas, kas rodas, aktivizējot to pašu pogas nospiešanu, kuru mēs vēlamies lasīt.

Tātad pagaidām tas darbojas tā, ka mēs turēsim nospiestu taustiņu, pēc tam nospiedīsim pogu, lai iedarbinātu ADC, un tad atlaidīsim, un cerams, ka nospiestās pogas binārā vērtība parādīsies analizatorā.

Tātad, uzrakstīsim kodu, kas to veiks.

6. darbība. Kādus slēdžus mums vajadzētu iestatīt?

Kādus slēdžus mums vajadzētu iestatīt?
Kādus slēdžus mums vajadzētu iestatīt?

Vispirms padomāsim par to, kā mēs to kodēsim, lai kontrolieris varētu nolasīt ievadi no tastatūras un pārvērst to skaitliskā vērtībā, kas atbilst nospiestajai pogai. Mēs izmantosim analogo ciparu pārveidotāju (ADC) kas ir iebūvēts Atmega328p. Mēs izmantosim AREF kā atsauces spriegumu, un mūsu tastatūras izeja tiks savienota ar PortC0 vai PC0. Ņemiet vērā, ka šo tapu sauc arī par ADC0, lai pārveidotu analogo ciparu pārveidotāju 0. Jums varētu būt noderīgi izlasīt 12.4. Sadaļu par ATmega328P pārtraukumiem, kā arī 24. nodaļu par analogo ciparu pārveidotāju. vai vismaz šīs sadaļas ir gatavas atsaucei. Lai iestatītu mikrokontrolleru tā, lai tas zinātu, ko darīt ar analogo ieejas signālu un kā mijiedarboties ar mūsu programmu, vispirms ir jāiestata daži no dažādiem ADC saistītie reģistra biti. Tie būtībā ir līdzvērtīgi vecajiem pārslēgšanas slēdžiem pirmajos datoros. Jūs vai nu ieslēdzat vai izslēdzat slēdzi, vai pat vēl tālāk pievienojat kabeļus starp vienu un otru kontaktligzdu, lai elektroni, kas sasniegs šo ceļa dakšiņu, atrastu vienu vārtu aizvērtu, bet otru atvērtu, piespiežot citu ceļu labirintā shēmu un tādējādi veicot citu loģisku uzdevumu. Kodējot montāžas valodā, mums ir cieša piekļuve šīm mikrokontrollera funkcijām, kas, pirmkārt, ir viena no pievilcīgākajām lietām. Tas ir vairāk "rokās" un daudz mazāk notiek "aizkulisēs". Tāpēc nedomājiet par šo reģistru iestatīšanu kā garlaicīgu uzdevumu. Tas padara montāžas valodu interesantu! Mēs iegūstam ļoti personiskas attiecības ar mikroshēmas iekšējo darbību un loģiku un liekam tai darīt tieši to, ko mēs vēlamies - ne vairāk un ne mazāk. Nav izšķērdētu pulksteņa ciklu. Tātad šeit ir saraksts ar slēdžiem, kas mums jāiestata:

  1. Izslēdziet jaudas samazināšanas ADC bitu PRADC, kas ir PRR reģistra 0. bits, jo, ja šis bits ir ieslēgts, tas izslēgs ADC. Jaudas samazināšanas reģistrs būtībā ir veids, kā izslēgt dažādas lietas, kas patērē enerģiju, kad tās nav vajadzīgas. Tā kā mēs izmantojam ADC, mēs vēlamies pārliecināties, ka tas nav atspējots šādā veidā. (Skatīt PRADC 46. lpp.)
  2. Izvēlieties analogo ieejas kanālu kā ADC0, izslēdzot MUX3… 0 ADC Multiplexer Selection (ADMUX) reģistrā (skat. 24-4. Tabulu, 249. lpp.), Tie pēc noklusējuma jau ir izslēgti, tāpēc mums tas nav jādara. Tomēr es to iekļauju, jo, ja jūs kādreiz izmantojat citu portu, nevis ADC0, šie slēdži būs attiecīgi jāpārslēdz. Dažādas MUX3, MUX2, MUX1, MUX0 kombinācijas ļauj jums izmantot jebkuru no analogiem portiem kā ieeju, un jūs varat tos mainīt arī lidojuma laikā, ja vēlaties vienlaikus apskatīt virkni dažādu analogo signālu.
  3. Izslēdziet REFS0 un REFS1 bitus ADMUX reģistrā, lai mēs izmantotu AREF kā atsauces spriegumu, nevis iekšēju atskaiti (sk. 248. lpp.).
  4. Ieslēdziet ADLAR bitu ADMUX, lai rezultāts tiktu “noregulēts pa kreisi”, mēs apspriedīsim šo izvēli nākamajā solī.
  5. Digitālās ievades atspējošanas reģistrā (DIDR0) iestatiet ADC0D bitu, lai izslēgtu PC0 digitālo ievadi. Mēs izmantojam šo portu analogai ieejai, lai mēs varētu arī atspējot tā digitālo ievadi.
  6. Iestatiet ISC0 un ISC1 ārējā pārtraukuma kontroles reģistrā A (EICRA), lai norādītu, ka mēs vēlamies aktivizēt sprieguma signāla pieaugošo malu līdz INT0 tapai (PD2), sk. 71. lpp.
  7. Notīriet bitus INT0 un INT1 ārējā pārtraukuma masku reģistrā (EIMSK), lai norādītu, ka šajā tapā neizmantojam pārtraukumus. Ja šajā taustiņā varētu iespējot pārtraukumus, mums būtu nepieciešams pārtraukuma apstrādātājs pēc adreses 0x0002, bet tā vietā mēs to iestatām tā, lai signāls uz šīs tapas izraisītu ADC konversiju, kuras pabeigšanu apstrādā ADC konversijas pilnīgā pārtraukšana plkst. adrese 0x002A. Skatīt 72. lpp.
  8. Iestatiet ADC iespējošanas (ADEN) bitu (7. bits) ADC vadības un statusa reģistrā A (ADCSRA), lai iespējotu ADC. Skatīt 249. lpp.
  9. Mēs varētu sākt vienu reklāmguvumu, iestatot ADC sākuma konversijas bitu (ADSC) katru reizi, kad vēlējāmies nolasīt analogo signālu, tomēr pagaidām mēs labprātāk lasām to automātiski, kad kāds nospiež pogu, tāpēc tā vietā iespējosim ADC Autotrigger Enable (ADATE) bits ADCSRA reģistrā, lai aktivizēšana tiktu veikta automātiski.
  10. Mēs arī iestatījām ADPS2..0 bitus (AD Prescalar biti) uz 111, lai ADC pulkstenis būtu CPU pulkstenis dalīts ar koeficientu 128.
  11. Mēs izvēlēsimies ADC aktivizēšanas avotu PD2, ko sauc arī par INT0 (ārējā pārtraukuma pieprasījums 0). Mēs to darām, pārslēdzot dažādus bitus ADCSRB reģistrā (sk. 24.-6. Tabulu, 251. lpp.). Pēc tabulas mēs redzam, ka vēlamies izslēgt ADTS0, ieslēgt ADTS1 un izslēgt ADTS2, lai ADC aktivizētu šo tapu. Ņemiet vērā, ja mēs vēlētos nepārtraukti izlasīt analogo portu, piemēram, ja mēs lasītu kādu nepārtrauktu analogo signālu (piemēram, skaņas paraugu ņemšanu vai kaut ko citu), mēs to iestatītu brīvā skriešanas režīmā. Metode, ko mēs izmantojam, lai iestatītu aktivizēšanu PD2, izraisa analogā porta PC0 ADC lasījumu, neizraisot pārtraukumu. Pārtraukums notiks, kad konversija būs pabeigta.
  12. Iespējojiet ADC pārtraukšanas iespējošanas (ADIE) bitu ADCSRA reģistrā, lai tad, kad analogo pārvēršana ciparu formātā būtu pabeigta, tas radītu pārtraukumu, kuram mēs varētu uzrakstīt pārtraukuma apstrādātāju un ievietot.org 0x002A.
  13. Iestatiet I bitu SREG, lai iespējotu pārtraukumus.

1. uzdevums: noteikti izlasiet attiecīgās sadaļas datu lapā par katru no iepriekš minētajiem iestatījumiem, lai jūs saprastu, kas notiek un kas notiktu, ja mēs tos mainītu uz alternatīviem iestatījumiem.

7. solis: uzrakstiet pārtraukuma apstrādātāju

Pēdējā solī mēs redzējām, ka esam to iestatījuši tā, lai PD2 konstatētā augšupejošā mala PC0 izraisītu analogo un digitālo konversiju, un, kad šī konversija būs pabeigta, tā pārtrauks ADC pārveidošanas pabeigšanu. Tagad mēs vēlamies kaut ko darīt ar šo pārtraukumu. Izpētot 12-6. Tabulu 65. lpp., Jūs redzēsit iespējamo pārtraukumu sarakstu. Iepriekšējās apmācībās mēs jau esam redzējuši RESET pārtraukumu adresē 0x0000 un taimera/skaitītāja0 pārplūdes pārtraukumu adresē 0x0020. Tagad mēs vēlamies aplūkot ADC pārtraukumu, ko tabulā redzam adresē 0x002A. Tātad mūsu montāžas valodas koda sākumā mums būs nepieciešama rinda:

.org 0x002Arjmp ADC_int

kas pāriet uz mūsu pārtraukumu apstrādātāju ar nosaukumu ADC_int ikreiz, kad ADC ir pabeidzis reklāmguvumu. Tātad, kā mums vajadzētu rakstīt mūsu pārtraukuma apstrādātāju? ADC darbojas šādi, veicot šādu aprēķinu:

ADC = Vin x 1024 / Vref

Ļaujiet mums redzēt, kas notiek, ja es nospiežu tastatūras pogu "atkārtot zvanīšanu". Tādā gadījumā PC0 spriegums mainīsies uz kādu vērtību, teiksim, 1,52 V, un, tā kā Vref ir pie 5 V, mums būs:

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

un tā tas parādītos kā 311. Ja mēs gribētu to pārveidot par spriegumu, mēs vienkārši mainītu aprēķinu. Tomēr mums tas nebūs jādara, jo mūs neinteresē faktiskais spriegums tikai to atšķiršanā. Kad konvertēšana ir pabeigta, rezultāts tiek saglabāts 10 bitu skaitlī, kas ievietots ADCH un ADCL reģistros, un mēs esam izraisījuši tā “kreiso pielāgošanu”, kas nozīmē, ka 10 biti sākas ar ADCH 7. bitu un iet uz leju līdz ADCL 6. bits (šajos divos reģistros kopā ir 16 biti, un mēs izmantojam tikai 10 no tiem, ti, 1024 kanālus). Ja mēs to vēlētos, mēs varētu labot rezultātu, notīrot ADLAR bitu ADMUX reģistrā. Iemesls, kāpēc mēs izvēlamies pa kreisi koriģētu, ir tāpēc, ka mūsu signāli atrodas pietiekami tālu viens no otra, ka kanāla numura pēdējie divi cipari nav būtiski un iespējams, ir tikai troksnis, tāpēc mēs atšķirsim taustiņu nospiešanu, izmantojot tikai augšējos 8 ciparus, citiem vārdiem sakot, mums būs jāskatās tikai uz ADCH, lai noskaidrotu, kura poga tika nospiesta. Tātad mūsu pārtraukšanas apstrādātājam vienkārši jāizlasa numurs no ADCH reģistrēties, pārvērst šo numuru par tastatūras vērtību un pēc tam nosūtīt šo vērtību mūsu reģistra analizatora gaismas diodēm, lai mēs varētu pārbaudīt, vai, nospiežot “9”, iedegsies “00001001” atbilstošās gaismas diodes. Lai gan mums vispirms ir jāredz, kas parādās ADCH, nospiežot dažādas pogas. Tātad, vienkārši uzrakstīsim vienkāršu pārtraukšanas apstrādātāju, kas tikai nosūta ADCH saturu uz analizatora displeju. Tātad, šeit ir tas, kas mums nepieciešams:

ADC_int: lds analizators, ADCH, ielādējiet ADCH vērtību mūsu analizatorosbi EIFR, 0; notīriet ārējo pārtraukuma karodziņu, lai tas būtu gatavs lietošanai vēlreiz

Līdz šim jums vajadzētu būt iespējai vienkārši nokopēt kodu no mūsu analizatora 5. apmācībā, pievienot šo pārtraukumu un pārslēgšanas iestatījumus un palaist to. 2. uzdevums: uzrakstiet kodu un palaidiet to. Pārliecinieties, ka jūsu analizatora displejā tiek parādīts ADCH. Mēģiniet vairākas reizes nospiest vienu un to pašu taustiņu. Vai ADCH vienmēr iegūstat vienu un to pašu vērtību?

8. solis: kartējiet taustiņu nospiešanas vērtības

Kartējiet taustiņu nospiešanas vērtības
Kartējiet taustiņu nospiešanas vērtības

Tagad mums ir jāpārvērš ADCH vērtības skaitļos, kas atbilst nospiestajai taustiņai. Mēs to darām, katram taustiņa nospiešanai izrakstot ADCH saturu un pēc tam pārvēršot to decimālā skaitlī, kā es to darīju attēlā. Pārtraucot apstrādi, mēs uzskatīsim, ka viss vērtību diapazons atbilst katrai taustiņa nospiešanai, lai ADC kartētu jebko šajā diapazonā uz noteiktu taustiņu nospiešanu.

3. uzdevums: veiciet šo kartēšanu un pēc tam pārrakstiet savu ADC pārtraukšanas rutīnu.

Lūk, ko es saņēmu par savu (tavējais, visticamāk, būs savādāks). Ievērojiet, ka esmu iestatījis to ar vērtību diapazonu katram taustiņa nospiešanai.

ADC_int:; Ārējais pārtraukuma apstrādātājs, analizators; sagatavoties jauniem numuriem pogaH, ADCH; ADC tiek atjaunināts, kad tiek nolasīts ADCH clccpi buttonH, 240brlo PC+3; ja ADCH ir lielāks, tad tas ir 1ldi analizators, 1; tāpēc slodzes analizators ar 1rjmp atdevi; un atgriezt clccpi poguH, 230; ja ADCH ir lielāks, tad 2brlo PC+3ldi analizators, 2rjmp atgriešanās clccpi pogaH, 217brlo PC+3ldi analizators, 3rjmp atgriešanās clccpi pogaH, 203brlo PC+3ldi analizators, 4rjmp atgriešanās clccpi pogaH, 187brlo PC+3ldi analizators, 5rjmp atgriešanās clccpiH 155brlo PC+3ldi analizators, 6rjmp atgriešanās clccpi pogaH, 127brlo PC+3ldi analizators, 255; mēs iestatīsim zibspuldzi kā visu onrjmp atgriešanās clccpi poguH, 115brlo PC+3ldi analizatoru, 7rjmp atgriešanās clccpi poguH, 94brlo PC+3ldi analizatoru, 8rjmp atgriešanās clccpi poguH, 62brlo PC+3ldi analizatoru, 9rjmp atgriešanās clccpi poguH, 37brlo PC+3ldi analizatoru, 0b11110000; zvaigznīte ir augšējā puse onrjmp atgriešanās clccpi pogaH, 28brlo PC+3ldi analizators, 0rjmp atgriešanās clccpi pogaH, 17brlo PC+3ldi analizators, 0b00001111; hash zīme ir apakšējā puse onrjmp atgriešanās clccpi pogaH, 5brlo PC+3ldi analizators, 0b11000011; atkārtots numurs ir augšējā 2 apakšējā 2rjmp atgriešanās ldi analizators, 0b11011011; pretējā gadījumā radās kļūda atgriešanās: pensionēties

9. darbība: 1. versijas kods un video

Esmu pievienojis savu kodu šai tastatūras draivera pirmajai versijai. Šajā gadījumā jums ir jānospiež taustiņš un pēc tam jānospiež poga, lai ADC nolasītu ievadi no tastatūras. Tas, ko mēs labprātāk vēlētos, nav poga, bet signāls, lai veiktu konvertēšanu, nāk no paša taustiņa nospiešanas. 3. uzdevums: apkopojiet un augšupielādējiet šo kodu un izmēģiniet to. Iespējams, jums būs jāmaina dažādi reklāmguvumu sliekšņi, lai tie atbilstu jūsu taustiņu nospiešanas spriegumam, jo tie, iespējams, atšķiras no manējā. Kas notiek, ja jūs mēģināt izmantot ievadi no tastatūras gan ADC0, gan ārējai pārtraukšanas tapai, nevis caur pogu? Es pievienošu arī video par šīs mūsu taustiņu nospiešanas draivera pirmās versijas darbību. Jūs pamanīsit, ka manā kodā ir sadaļa, kas inicializē kaudzes rādītāju. Ir dažādi reģistri, kurus, iespējams, vēlēsimies izvilkt un izvilkt no kaudzes, kad mēs manipulēsim ar mainīgajiem lielumiem un kas nav, un ir arī reģistri, kurus, iespējams, vēlēsimies saglabāt un atjaunot vēlāk. Piemēram, SREG ir reģistrs, kas netiek saglabāts starp pārtraukumiem, tāpēc dažādi karodziņi, kas tiek iestatīti un notīrīti darbību rezultātā, var tikt mainīti, ja kaut kas tiek pārtraukts. Tāpēc vislabāk ir, ja pārtraukšanas apstrādātāja sākumā piespiežat SREG uz kaudzīti un pēc tam pārtraukšanas apstrādātāja beigās to atkal izspiežat. Es to ievietoju kodā, lai parādītu, kā tas tiek inicializēts, un paredzēt, kā tas mums būs vajadzīgs vēlāk, bet, tā kā mums nav vienalga, kas notiek ar SREG mūsu koda pārtraukumu laikā, es šim nolūkam neizmantoju kaudzīti. ka esmu izmantojis maiņas darbību, lai inicializējot iestatītu dažādus bitus reģistros. Piemēram, rindā:

ldi temp, (1 <> sts EICRA, temp

Komanda "<<" pirmajā koda pirmajā rindā ir maiņas darbība. Tas būtībā ņem bināro skaitli 1, kas ir 0b00000001, un pārvieto to pa kreisi par skaitļa ISC01 summu. Šī ir bitu ar nosaukumu ISC01 atrašanās vieta EICRA reģistrā. Tā kā ISC01 ir bits 1, skaitlis 1 tiek pārvietots uz kreiso pozīciju 1, lai kļūtu par 0b00000010. Tāpat otrais, ISC00, ir EICRA bits 0, tāpēc skaitļa 1 nobīde ir nulle pozīciju pa kreisi. Ja paskatās, vēlreiz apskatiet failu m328Pdef.inc, kuru lejupielādējāt pirmajā apmācībā un kopš tā laika izmantojat evrr, jūs redzēsit, ka tas ir tikai garš ".equ" paziņojumu saraksts. Jūs atklāsit, ka ISC01 ir vienāds ar 1. Montētājs visu tā gadījumu aizstāj ar 1, pirms pat sāk kaut ko salikt. Tie ir tikai reģistra bitu nosaukumi, lai palīdzētu mums cilvēkiem lasīt un rakstīt kodu. Tagad vertikālā līnija starp abām iepriekš minētajām maiņas darbībām ir loģiska "vai" darbība. Šeit ir vienādojums:

0b00000010 | 0b00000001 = 0b00000011

un tas ir tas, ko mēs ielādējam (izmantojot "ldi") temp. Iemesls, kāpēc cilvēki izmanto šo metodi, lai ielādētu vērtības reģistrā, ir tas, ka tas ļauj izmantot bita nosaukumu, nevis tikai skaitli, un tas padara kodu daudz vieglāk lasāmu. Ir arī divas citas metodes, kuras esam izmantojuši. Mēs izmantojam instrukcijas "ori" un "andi". Tie ļauj mums attiecīgi iestatīt un notīrīt bitus, nemainot nevienu citu reģistra bitu. Piemēram, kad es izmantoju

vai temp, (1

šī "vai" temperatūra ar 0b00000001, kas nulles bitā ievieto 1 un visu pārējo atstāj nemainīgu. Arī tad, kad rakstījām

andi temp, 0b11111110

tas maina nulles temperatūras bitu uz 0 un atstāj visu pārējo nemainīgu.

4. uzdevums: jums jāiziet kods un jāpārliecinās, ka saprotat katru rindiņu. Jums var šķist interesanti atrast labākas metodes, kā rīkoties, un uzrakstīt labāku programmu. Ir simts veidu, kā kodēt lietas, un es esmu diezgan pārliecināts, ka jūs varat atrast daudz labāku veidu nekā mans. Jūs varat arī atrast (nedod debesis!) Kļūdas un izlaidumus. Tādā gadījumā es noteikti vēlētos dzirdēt par tiem, lai tos varētu labot.

Labi, tagad redzēsim, vai mēs varam atbrīvoties no šīs liekās pogas …

10. darbība: 2. versijas kods

Vienkāršākais veids, kā atbrīvoties no pogas, ir tikai to vispār noņemt, aizmirst PB2 ievadi un vienkārši pārslēgt ADC uz "Brīvā skriešanas režīmu".

Citiem vārdiem sakot, vienkārši mainiet ADCSRB reģistru tā, lai ADTS2, ADTS1 un ADTS0 būtu nulles skaitļi.

Pēc tam ADCSRA iestatiet ADSC bitu uz 1, kas sāks pirmo konvertēšanu.

Tagad augšupielādējiet to savā mikrokontrollerī, un jūs atradīsit, ka, nospiežot pogu un tikai nospiežot pogu, displejā parādās pareizais numurs. Tas ir tāpēc, ka ADC nepārtraukti ņem paraugus no ADC0 porta un parāda vērtību. Noņemot pirkstu no pogas, "pogas atlēciens" radīs dažas nejaušas vērtības ļoti ātri un pēc tam atgriezīsies pie 0V ievades. Mūsu kodā šis 0V tiek parādīts kā 0b11011011 (jo, nospiežot taustiņu "0", jau tiek izmantota displeja vērtība 0b00000000)

Tomēr tas nav risinājums, kuru mēs vēlamies divu iemeslu dēļ. Pirmkārt, mēs nevēlamies turēt pogu nospiestu. Mēs vēlamies to nospiest vienu reizi un parādīt numuru (vai izmantot kādā jaunā kodā vēlākā apmācībā). Otrkārt, mēs nevēlamies nepārtraukti izlasīt ADC0 paraugus. Mēs vēlamies, lai tas tiktu nolasīts vienu reizi, pārvērstu un pēc tam gulētu, līdz jauna taustiņa nospiešana izraisīs jaunu reklāmguvumu. Bezmaksas darbības režīms ir labākais, ja vienīgais, ko vēlaties, lai mikrokontrolleris darītu, ir nepārtraukti lasīt kādu analogo ieeju, piemēram, ja vēlaties parādīt reāllaika temperatūru vai kaut ko citu.

Tāpēc meklēsim vēl vienu risinājumu…

11. darbība. Kā atbrīvoties no pogas? 3. versija

Kā atbrīvoties no pogas? 3. versija
Kā atbrīvoties no pogas? 3. versija

Ir daudz veidu, kā mēs varētu turpināt. Vispirms mēs varētu pievienot aparatūru, lai atbrīvotos no pogas. Piemēram, mēs varam mēģināt ievietot tranzistoru ķēdē pie taustiņa nospiešanas izejas līnijas, lai tas no strāvas izvadītu nelielu strūklu un nosūtītu 5 V impulsu uz pārtraukuma tapu PD2.

Tomēr tas, iespējams, būtu vismaz pārāk trokšņains, un sliktākajā gadījumā tas neļautu pietiekami daudz laika precīzai taustiņu nospiešanai, jo tastatūras sprieguma izejai nebūtu laika stabilizēties pirms ADC nolasīšanas.

Tāpēc mēs drīzāk nākam klajā ar programmatūras risinājumu. Tas, ko mēs vēlētos darīt, ir pievienot pārtraukumu PD2 tapai un uzrakstīt tam pārtraukuma apstrādātāju, kas izsauc vienu tastatūras tapas nolasījumu. Citiem vārdiem sakot, mēs atbrīvojamies no automātiskās palaišanas pārtraukuma no ADC un pievienojam ārēju pārtraukumu, kas izsauc ADC tajā. Tādā veidā signāls ADC lasīšanai nāk pēc tam, kad PD2 signāls jau ir noticis, un tas var dot pietiekami daudz laika, lai stabilizētos līdz precīzam spriegumam, pirms tiek nolasīts un pārveidots PC0 tapa. Mums joprojām būs ADC pabeigšanas pārtraukums, kas beigās izvadīs rezultātu analizatora displejā.

Vai ir jēga? Nu darīsim tā…

Apskatiet pievienoto jauno kodu.

Jūs redzat šādas izmaiņas:

  1. Mēs pievienojām rjmp adresē.org 0x0002, lai apstrādātu INT0 ārējo pārtraukumu
  2. Mēs mainījām EIMSK reģistru, lai norādītu, ka vēlamies pārtraukt INT0 tapu
  3. Mēs mainījām ADATE tapu ADCSRA reģistrā, lai atspējotu automātisko aktivizēšanu
  4. Mēs atbrīvojāmies no ADCSRB iestatījumiem, jo tiem nav nozīmes, kad ADATE ir izslēgts
  5. Mums vairs nav jāatiestata ārējā sprūda karogs, jo INT0 pārtraukšanas rutīna to dara automātiski, kad tas ir pabeigts - iepriekš mums nebija pārtraukuma rutīnas, mēs vienkārši aktivizējām ADC signālu no šīs tapas, tāpēc mums bija notīriet karogu ar rokām.

Tagad pārtraukumu apstrādātājā mēs vienkārši izsaucam vienu reklāmguvumu no ADC.

5. uzdevums: palaidiet šo versiju un redziet, kas notiek.

12. darbība. Darba versijas kods un video

Kā redzējām iepriekšējā versijā, pogas pārtraukšana nedarbojas ļoti labi, jo pārtraukums tiek aktivizēts uz augšu esošās malas, lai piespraustu PD2, un pēc tam pārtraukuma apstrādātājs izsauc ADC konversiju. Tomēr ADC iegūst sprieguma rādījumu, pirms tas ir stabilizējies, un tāpēc tas nolasa muļķības.

Mums ir jāievieš aizkavēšanās starp PD2 pārtraukumu un PC0 ADC lasījumu. Mēs to darīsim, pievienojot taimeri/skaitītāju, skaitītāja pārplūdes pārtraukumu un aiztures kārtību. Par laimi, mēs jau zinām, kā to izdarīt no 3. apmācības! Tāpēc mēs vienkārši nokopēsim un ielīmēsim attiecīgo kodu no turienes.

Es esmu devis iegūto kodu un video, kurā parādīta tā darbība.

Jūs pamanīsit, ka rādījumi nav tik precīzi, kā varētu cerēt. Tas, iespējams, ir saistīts ar vairākiem avotiem:

  1. mēs pieskaramies no tastatūras sprieguma izejas, lai aktivizētu PD2, kas ietekmē nolasījumu PC0.
  2. mēs īsti nezinām, cik ilgi atlikt pēc sprūda, lai iegūtu vislabāko lasījumu.
  3. ADC konversijas pabeigšanai ir vajadzīgi daži cikli, kas nozīmē, ka mēs nevaram ātri aktivizēt tastatūru.
  4. iespējams, ir troksnis pašā tastatūrā.
  5. utt…

Tātad, lai gan mums izdevās panākt, lai tastatūra darbotos, un tagad mēs varētu to izmantot lietojumprogrammās, izmantojot taustiņu nospiešanas vērtības citā veidā, nevis tikai izvadot tās analizatora displejā, tā nav ļoti precīza un ir ļoti kaitinoša. Tāpēc es domāju, ka labākais veids, kā pieslēgt tastatūru, ir vienkārši ielīmēt katru izeju no tastatūras citā portā un izlemt, kuru taustiņu nospiež, kuri porti redz spriegumu. Tas ir viegli, ļoti ātri un ļoti precīzi.

Patiesībā ir tikai divi iemesli, kāpēc gribētos vadīt tastatūru tā, kā mēs to esam darījuši šeit:

  1. Tas izmanto tikai 2 no mūsu mikrokontrollera tapām, nevis 8.
  2. Tas ir lielisks projekts, lai parādītu dažādus ADC aspektus mikrokontrollerī, kas atšķiras no standarta lietām, kuras jūs varat uzzināt, piemēram, temperatūras rādījumi, potenciometri, pagriezieni utt. nevis tikai brīvi darbojas CPU-gobbling režīms.

Jebkurā gadījumā, šeit ir pēdējie pāris vingrinājumi jums:

6. uzdevums: pārrakstiet ADC pārveides pabeigšanas pārtraukšanas apstrādātāju, lai izmantotu uzmeklēšanas tabulu. T.i. Lai tā pārbaudītu analogo vērtību ar pirmo tabulas vienumu un, ja tā ir lielāka, tā atgrieztos no pārtraukuma, ja tā nav, tā palielina Z līdz nākamajam tabulas vienumam un atkal atzaro uz testu. Tas saīsinās kodu un iztīrīs pārtraukuma režīmu un padarīs to izskatīgāku. (Kā nākamo soli es sniegšu iespējamo risinājumu) 7. uzdevums: savienojiet tastatūru ar 8 tapām mikrokontrollerī un uzrakstiet tās vienkāršo draiveri un izbaudiet, cik tā ir jaukāka. Vai varat iedomāties dažus veidus, kā uzlabot mūsu metodes darbību?

Tas ir viss šai apmācībai. Es pievienoju galīgo versiju ar norādēm. Tuvojoties savam galīgajam mērķim, 9. apmācībā vēlreiz izmantosim tastatūru, lai parādītu, kā ar to vadīt septiņu segmentu displejus (un izveidot kaut ko interesantu, izmantojot tālruņa tastatūras papildu taustiņus), un tad tā vietā pārejiet uz lietu kontroli, nospiežot pogas (jo šī metode labāk atbilst galaproduktam, uz kuru mēs veidojamies, izmantojot šīs apmācības), un mēs vienkārši atstāsim tastatūru.

Tiksimies nākamreiz!

Ieteicams: