Orodha ya maudhui:
- Hatua ya 1: Scavenge Keypad 1
- Hatua ya 2: Scavenge Keypad 2
- Hatua ya 3: Scavenge keypad 3
- Hatua ya 4: Funga keypad
- Hatua ya 5: Funga keypad kwa Analyzer yako
- Hatua ya 6: Je! Tunapaswa Kuweka Swichi zipi?
- Hatua ya 7: Andika Mshughulikiaji wa Usumbufu
- Hatua ya 8: Ramani Ramani za Kitufe
- Hatua ya 9: Nambari na Video ya Toleo 1
- Hatua ya 10: Nambari ya Toleo la 2
- Hatua ya 11: Je! Tunaondoaje Kitufe? Toleo la 3
- Hatua ya 12: Nambari na Video ya Toleo la Kufanya Kazi
Video: Mafunzo ya Mkusanyiko wa AVR 7: 12 Hatua
2024 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2024-01-30 12:48
Karibu kwenye Mafunzo ya 7!
Leo tutaonyesha kwanza jinsi ya kutumia keypad, na kisha kuonyesha jinsi ya kutumia bandari za kuingiza Analog kuwasiliana na keypad. Tutafanya hivyo kwa kutumia usumbufu na waya moja kama pembejeo. Tutakata keypad kwa waya ili kila kitufe kitumie voltage ya kipekee kwa pembejeo ya analog ambayo itatuwezesha kutofautisha na voltage ambayo kitufe kilibanwa. Kisha tutatoa nambari iliyoshinikizwa kwa mchambuzi wetu wa sajili kuonyesha kuwa kila kitu kinatendeka kama inavyopaswa. Kuna mitego kadhaa ambayo unaweza kukimbia wakati unatumia Analog to Digital Converter (ADC) katika ATmega328p na kwa hivyo tutafanya hivyo. chukua vitu kwa hatua kadhaa njiani kujaribu na ujue jinsi ya kuziepuka. Tutaona pia kwanini kutumia analog kwa kibadilishaji cha dijiti sio njia bora ya kudhibiti keypad ingawa haitumii bandari chache kwenye microcontroller yako.
- kitufe. Unaweza kununua moja au unaweza kufanya kile nilichofanya na kuibua moja.
- Vichwa 2 vya kike kwa keypad (ikiwa unatafuta moja)
- kuunganisha waya
- ubao wa mkate
- Vipinga vya 4 1 Kohm
- 1 15 Kohm kupinga
- 1 3.3 Kohm kupinga
- Kontena 1 180 ohm
- 1 680 ohm kupinga
- multimeter ya dijiti
- analyzer yako kutoka Mafunzo 5
Unaweza kutaka kuruka hatua chache za kwanza ikiwa tayari una kitufe na hauitaji kuibadilisha.
Hapa kuna kiunga cha mkusanyiko kamili wa mafunzo yangu ya kukusanyika ya AVR:
Hatua ya 1: Scavenge Keypad 1
Zamani sana, wakati hata babu na nyanya yako walikuwa watoto tu, watu walikuwa wakitumia vifaa hivi vya kushangaza, ambavyo vilikuwa na nyaya ndefu zilizowekwa kwenye ukuta, kuwasiliana. Waliitwa "simu" na kwa kawaida walikuwa vitu vya bei rahisi vya plastiki ambavyo vilitoa sauti ya kukasirisha wakati mtu alikuita (sio kwamba sauti za "Justin Bieber" za leo hazina kero sawa). Kwa vyovyote vile, vifaa hivi vilikuwa na keypad juu yao ambazo zilikuwa na waya sana na kwa hivyo ni rahisi kutafuna na wana funguo 2 za ziada juu yao ("redial" na "flash") kutoka kwa vitufe unavyoweza kununua ambavyo unaweza kutaka kurudia tena kama "funguo za mshale", "funguo za menyu", au kitu kingine chochote. Kwa hivyo tutaanza kwa kutafuta keypad kutoka kwa simu ya zamani. Kwanza chukua simu (ninatumia GE moja kama inavyoonyeshwa kwenye picha) na uichanganue kufunua wiring. Kisha chukua patasi na uvute vifungo vidogo vya plastiki ambavyo vimeshikilia kitufe na uondoe kitufe.
Hatua ya 2: Scavenge Keypad 2
Sasa chukua msumeno wa PVC na ukate plastiki kutoka kuzunguka vitufe na kisha ukate pembeni ili kupata kina kulia ukiacha keypad nyembamba.
Kisha rudisha kitufe nyuma kwa kutumia kigingi kidogo ambacho kinabaki baada ya kukikata kilele kwenye hatua ya mwisho na tumia chuma cha kutengenezea ili kushika chuma moto kwenye kila shimo la kigingi ambalo litayeyuka plastiki na kueneza juu ya chini ya kitufe kinachounda "vifungo" vipya ambavyo vitashikilia kitufe mahali hapo awali.
Ninapenda kuwatafuta spika tatu na labda vitu vingine kama swichi na nini sio zile zilizo kwenye ubao. Walakini, wakati huu sitatumia swichi na vitu kwa sababu tuna malengo mengine kwa sasa. Pia, kuna TA31002 linear IC ndani ambayo ni kinyaji simu. Jedwali linapatikana kwa urahisi na kupakuliwa mkondoni kutoa pinout na huduma. Kwa hivyo nitaiacha ikiuzwa kwa bodi kwa sasa na kisha icheze nayo baadaye. Ningependa kuiunganisha kwenye oscilloscope na kuona ni ishara gani nzuri ambazo ninaweza kutoka ndani yake. Labda hata tengeneza kengele ya mlango kutoka kwake. Nani anajua.
Vyovyote utakapomaliza kuharibu simu na kuteketeza sehemu tutamaliza kumaliza kutengeneza keypad yetu.
Hatua ya 3: Scavenge keypad 3
Tumia utambi unaofunguka na ondoa nyaya za utepe kutoka chini ya kitufe kuhakikisha kuwa mashimo kwenye ubao wa mzunguko ni wazi na kisha unganisha vichwa viwili vya kike kwenye ubao uliko mashimo. Labda itabidi ubonyeze vichwa vyako ili viwe vichwa vya pini 4.
Sasa kwa kuwa vichwa vimeambatanishwa unaweza kuiweka waya kwenye ubao wa mkate, chukua multimeter, na ujaribu funguo kwa kushikamana na multimeter kwenye pini za nasibu na kupima upinzani. Hii itakuruhusu kuweka ramani kwenye funguo. Ni ngumu kuona jinsi funguo zimefungwa kwa matokeo kwa kuangalia mzunguko lakini ukitumia multimeter unaweza kuziba kwa pini mbili zozote kisha bonyeza kitufe mpaka uone nambari kwenye skrini badala ya mzunguko wazi. Hii itakuwa pinout kwa ufunguo huo.
Ramani funguo zote za pini za pato kwa njia hii.
Hatua ya 4: Funga keypad
Sasa fuata mchoro wa wiring na waya keypad kwenye ubao wako wa mkate.
Jinsi hii itafanya kazi ni kwamba tutaweka 5V upande wa kushoto na upande wa kulia uende kwa GND. Pini ya kwanza kulia kwenye mchoro huenda kwenye kwanza ya pini zetu za Analog kwenye microcontroller ya Atmega328p. Wakati hakuna vitufe vilivyobanwa ishara itakuwa 0V, na kila kitufe tofauti kinapobanwa pembejeo kwenye bandari ya analogi itakuwa kati ya 0V na 5V na kiwango tofauti kulingana na ufunguo gani ulibonyezwa. Tulichagua maadili ya kupinga ili kila njia iwe na upinzani ambao ulikuwa tofauti na zingine. Bandari ya Analog kwenye microcontroller inachukua ishara ya analog na kuigawanya katika njia 1024 tofauti kati ya 0V na 5V. Hii inamaanisha kuwa kila kituo kina upana 5V / 1024 = 0.005 V / kituo = 5 mV / kituo. Kwa hivyo bandari ya Analog inaweza kutofautisha voltages za kuingiza ikiwa tu zinatofautiana na zaidi ya 5 mV. Kwa upande wetu tumechagua maadili ya kupinga ili vitufe vyovyote viwili vitumie ishara ya voltage ambayo inatofautiana na zaidi ya hii ili mdhibiti mdogo aweze kuamua ni ufunguo gani uliobanwa. Shida kubwa ni kwamba mfumo mzima ni kelele sana kwa hivyo tutahitaji kuchagua anuwai ya ramani kwa kila kitufe cha kifungo - lakini tutaingia hapo baadaye.
Kumbuka kuwa tunaweza kudhibiti kitufe cha vitufe 14 kwa kutumia laini moja tu ya kuingiza kwa mdhibiti. Hiyo ni moja ya mambo muhimu ya pembejeo za analog.
Sasa jaribio letu la kwanza la kudhibiti kitufe kitakuwa na kitufe cha kusababisha kukatiza, subroutine ya kukatiza itasoma bandari ya kuingiza analog na kuamua ni ufunguo gani uliobanwa, na kisha itatoa idadi hiyo kwa rejista yetu ya analyzer subroutine ambayo itaonyesha thamani muhimu katika binary kwenye LED zetu 8 ambazo tumeanzisha katika Mafunzo ya 5.
Hatua ya 5: Funga keypad kwa Analyzer yako
Picha zinaonyesha jinsi tunataka kuweka keypad kwa microcontroller ili tuweze kuona pato kwenye onyesho letu la analyzer. Kwa kweli tunatia waya pato kutoka kwa keypad hadi PortC pin 0, ambayo pia inaitwa ADC0 kwenye ATmega328P.
Walakini, kuna mambo kadhaa ya ziada. Tutaenda pia kufunga kifungo kwa PD2. Yaani. chukua waya kutoka kwa reli yako ya 5V hadi kitufe na kutoka upande wa pili wa kitufe hadi PD2, na mwishowe, tunataka kukata pini ya AREF kutoka kwa reli yetu ya 5V na badala yake tuiache ikikatwa. Tunaweza kuingiza capacitor 0.1 ya microfarad decoupling ikiwa tunataka. Hii ni capacitor ya kauri na 104 imeandikwa juu yake. Nambari mbili za kwanza ni nambari na nambari ya mwisho ni nguvu ya 10 tunazidisha kwa kupata jibu katika picofarads (pico inamaanisha 10 ^ -12), Kwa hivyo 104 inamaanisha 10 x 10 ^ 4 picofarads, ambayo ni sawa na Nanofaradi 100 (nano inamaanisha 10 ^ -9), ambayo ni sawa na microfarads 0.1 (njia ndogo 10 ^ -6). Kwa hivyo, yote haya hufanya utulivu wa siri ya AREF wakati tunaweza kuitumia kama pini yetu ya kumbukumbu.
Tunataka pia kipinzani 1 cha Mohm kati ya PD2 na ardhi. Tutaweka PD2 kama pini ya pato kwa 0V na tutakuwa tukisababisha makali mazuri kwenye pini hiyo. Tunataka ukingo upotee mara tu tunapotoa kitufe ili tuingize kipinga hiki cha "kuvuta".
Sababu ambayo tunataka kitufe ni kwa sababu tunataka kuchochea kibadilishaji chetu cha Analog-to-Digital kutoka kwa pini INT0 kwenye chip, ambayo pia ni PD2. Hatimaye tungependa kitufe cha kubonyeza ADC na pia kutoa pembejeo ibadilishwe bila kuwa na kitufe tofauti, lakini kwa sababu ya jinsi muda unavyofanya kazi tutaanza kwa kuwa na kitufe tofauti cha kuchochea ADC na mara tu tutakapopiga pasi zote mende nje na tuna hakika kwamba kila kitu kinafanya kazi vizuri, basi tutashughulikia maswala ya kelele na wakati unaokuja na kuchochea kutoka kwa kitufe hicho hicho ambacho tunataka kusoma.
Kwa hivyo, kwa sasa, jinsi inavyofanya kazi ni kwamba tutashikilia kitufe, kisha bonyeza kitufe ili kuchochea ADC, na kisha tuachilie na tunatumai kuwa thamani ya kibinadamu ya kitufe tulichosukuma itaonekana kwenye mchambuzi.
Basi wacha tuandike nambari ambayo itatimiza hilo.
Hatua ya 6: Je! Tunapaswa Kuweka Swichi zipi?
Wacha kwanza tufikirie juu ya jinsi tutakavyoorodhesha hii ili mtawala aweze kusoma maoni kutoka kwa kitufe na kuibadilisha kuwa nambari inayolingana na kitufe ambacho kilibanwa. Tutatumia Analog to Digital Converter (ADC) ambayo imejengwa kwa Atmega328p. Tutatumia AREF kama voltage yetu ya kumbukumbu na pato letu la keypad litaunganishwa na PortC0 au PC0. Kumbuka kuwa pini hii pia inaitwa ADC0 kwa Analog-to-Digital Converter 0. Inaweza kuwa wazo nzuri kwako kusoma kupitia Sehemu ya 12.4 juu ya vipingamizi vya ATmega328P na pia sura ya 24 kwenye Analog-to-Digital Converter kabla hatujapata ilianza au angalau kuwa na sehemu hizo tayari kwa marejeo Ili kusanidi mdhibiti mdogo ili ijue nini cha kufanya na ishara ya kuingiza analog, na jinsi ya kuingiliana na programu yetu, lazima kwanza tuweke chache za ADC anuwai. rejista zinazohusiana. Hizi kimsingi ni sawa na swichi za zamani za kugeuza kwenye kompyuta za kwanza. Unaweza kubofya ZIMA au ZIMA, au hata nyuma zaidi ungeziba nyaya kati ya duka moja na nyingine ili elektroni zinazofikia uma kwenye barabara zitakuta lango moja limefungwa na lingine wazi kulilazimisha kupitia njia tofauti kwenye maze ya mzunguko na kwa hivyo kufanya kazi tofauti ya kimantiki. Wakati wa kuweka alama kwa lugha ya mkusanyiko tuna ufikiaji wa karibu wa kazi hizi za mdhibiti mdogo ambaye ni moja ya mambo ya kupendeza juu ya kuifanya hapo kwanza. Ni zaidi "mikono juu" na mbali kidogo inaendelea "nyuma ya pazia" kama ilivyokuwa. Kwa hivyo usifikirie kuweka madaftari haya kama kazi ya kuchosha. Hii ndio inafanya lugha ya kusanyiko ipendeze! Tunapata uhusiano wa kibinafsi sana na utendaji wa ndani na mantiki ya chip na kuifanya ifanye kile tunachotaka - si zaidi na sio chini. Hakuna mizunguko ya saa iliyopotea. Kwa hivyo hapa kuna orodha ya swichi ambazo tunahitaji kuweka:
- Zima kipunguzo cha Kupunguza Umeme ADC, PRADC, ambayo ni kidogo 0 ya sajili ya PRR, kwani ikiwa kidogo iko juu itazima ADC. Rejista ya kupunguza nguvu kimsingi ni njia ya kufunga vitu anuwai ambavyo hutumia nguvu wakati hauitaji. Kwa kuwa tunatumia ADC tunataka kuhakikisha kuwa haijalemazwa kwa njia hii. (Tazama PRADC kwenye ukurasa wa 46)
- Chagua kituo cha kuingiza analojia kuwa ADC0 kwa kuzima MUX3… 0 katika rejista ya ADC Multiplexer Selection (ADMUX) (Tazama jedwali 24-4 ukurasa 249) hizi tayari zimezimwa kwa msingi kwa hivyo hatuhitaji kufanya hivi. Walakini, ninaijumuisha kwani ikiwa utatumia bandari tofauti na ADC0 utahitaji kubadilisha swichi hizi ipasavyo. Mchanganyiko anuwai wa MUX3, MUX2, MUX1, MUX0 hukuruhusu kutumia bandari yoyote ya analog kama pembejeo yako na unaweza pia kuibadilisha wakati wa kuruka ikiwa unataka kutazama rundo la ishara tofauti za analog mara moja.
- Zima bits za REFS0 na REFS1 kwenye rejista ya ADMUX ili tutumie AREF kama voltage yetu ya rejea badala ya kumbukumbu ya ndani (Tazama ukurasa 248).
- Washa kipengee cha ADLAR katika ADMUX kwa hivyo matokeo ni "kushoto kurekebishwa" tutajadili chaguo hili katika hatua inayofuata.
- Weka kipengee cha ADC0D katika Daftari la Kuingiza Uingizaji wa Dijiti (DIDR0) kuzima uingizaji wa dijiti kwa PC0. Tunatumia bandari hiyo kwa pembejeo ya analog ili tuweze kuzima uingizaji wa dijiti kwa hiyo.
- Weka ISC0 na ISC1 katika Rejista ya Udhibiti wa Usumbufu wa Nje A (EICRA) kuonyesha kwamba tunataka kuchochea kwenye ukingo unaoongezeka wa ishara ya voltage kwa pini ya INT0 (PD2), angalia ukurasa wa 71.
- Futa bits INT0 na INT1 katika Usajili wa Vinyago vya Nje (EIMSK) kuonyesha kwamba hatutumii usumbufu kwenye pini hii. Ikiwa tungewezesha kukatizwa kwa pini hii tungehitaji kichochezi cha kusumbua kwenye anwani 0x0002 lakini badala yake tunaiweka ili ishara kwenye pini hii inachochea ubadilishaji wa ADC, ambao kukamilika kwake kunashughulikiwa na ubadilishaji wa ADC kukatiza kabisa kwa anwani 0x002A. Tazama ukurasa wa 72.
- Weka ADC Wezesha (ADEN) kidogo (bit 7) katika udhibiti wa ADC na sajili ya hadhi A (ADCSRA) kuwezesha ADC. Tazama ukurasa 249.
- Tunaweza kuanza ubadilishaji mmoja kwa kuweka ADC kuanza uongofu kidogo (ADSC) kila wakati tunataka kusoma ishara ya Analog, hata hivyo, kwa sasa tungependa iisome kiotomatiki wakati wowote mtu anasukuma kitufe, kwa hivyo badala yake tutaiwezesha ADC Wezesha Autotrigger (ADATE) kidogo kwenye rejista ya ADCSRA ili kuchochea kufanywa moja kwa moja.
- Pia tunaweka ADPS2..0 bits (bits AD Prescalar) hadi 111 ili saa ya ADC iwe saa ya CPU iliyogawanywa na sababu ya 128.
- Tutachagua chanzo cha ADC inayosababisha kuwa PD2 ambayo pia inaitwa INT0 (Ombi la Kukatizwa kwa nje 0). Tunafanya hivyo kwa kugeuza bits anuwai kwenye rejista ya ADCSRB (Tazama Jedwali 24-6 kwenye ukurasa 251). Tunaona kwa meza kwamba tunataka ADTS0 itolewe, ADTS1 imewashwa, na ADTS2 itolewe ili ADC ichukue pini hiyo. Kumbuka ikiwa tunataka kuendelea kuionea bandari ya Analog kama kama tunasoma ishara inayoendelea ya analog (kama sampuli ya sauti au kitu) tungeiweka hii kuwa Njia ya Mbio ya Bure. Njia tunayotumia kuweka kuchochea kwa PD2 inasababisha usomaji wa ADC wa bandari ya Analog PC0 bila kusababisha usumbufu.
- Washa kitita cha ADCSRA kuwezesha Usumbufu wa ADC (ADIE) kwenye sajili ya ADCSRA ili Analog hadi ubadilishaji wa dijiti imekamilika italeta usumbufu ambao tunaweza kuandika kichochezi cha kukatiza na kuweka kwenye.org 0x002A.
- Weka I bit katika SREG kuwezesha usumbufu.
Zoezi la 1: Hakikisha unasoma sehemu zinazohusika kwenye lahajedwali kwa kila moja ya mipangilio iliyo hapo juu ili uweze kuelewa kinachoendelea na nini kitatokea ikiwa tutazibadilisha na kubadilisha mipangilio.
Hatua ya 7: Andika Mshughulikiaji wa Usumbufu
Katika hatua ya mwisho tuliona kuwa tumeiweka ili makali inayoonekana kwenye PD2 itasababisha analojia kwa ubadilishaji wa dijiti kwenye PC0 na ubadilishaji huu ukikamilika itatupa ubadilishaji kamili wa ADC. Sasa tunataka kufanya kitu na usumbufu huu. Ukichunguza Jedwali 12-6 kwenye ukurasa wa 65 utaona orodha ya usumbufu unaowezekana. Tayari tumeona RESET ikikatiza kwenye anwani 0x0000 na Timer / Counter0 Kufurika kukatiza kwa anwani 0x0020 katika Mafunzo ya awali. Sasa tunataka kuangalia kukatiza kwa ADC ambayo tunaona kwa meza iko kwenye anwani 0x002A. Kwa hivyo mwanzoni mwa nambari yetu ya lugha ya Mkutano tutahitaji laini inayosoma:
.org 0x002Arjmp ADC_int
ambayo itaruka kwa mshughulikiaji wetu wa kukatiza aliyeitwa ADC_int wakati wowote ADC imekamilisha ubadilishaji. Kwa hivyo tunapaswa kuandika vishikaji vyetu vya kusumbua? Njia ambayo ADC inafanya kazi ni kwa kufanya hesabu ifuatayo:
ADC = Vin x 1024 / Vref
Kwa hivyo wacha tuone kinachotokea ikiwa nitasukuma kitufe cha "redial" kwenye kitufe. Katika kesi hiyo voltage kwenye PC0 itabadilika kuwa thamani fulani, sema 1.52V, na kwa kuwa Vref iko 5V tutakuwa na:
ADC = (1.52V) x 1024 / 5V = 311.296
na kwa hivyo itaonekana kama 311. Ikiwa tunataka kubadilisha hii kuwa voltage tungegeuza hesabu tu. Hatutahitaji kufanya hivyo hata hivyo kwani hatuna hamu ya voltages halisi tu katika kutofautisha kati yao. Uongofu ukikamilika, matokeo huhifadhiwa kwa nambari 10-bit iliyowekwa kwenye rejista za ADCH na ADCL na tumesababisha "ibadilishwe kushoto" ambayo inamaanisha kuwa bits-10 huanza saa 7 ya ADCH na kwenda chini kidogo 6 ya ADCL (kuna jumla ya bits 16 katika rejista hizi mbili na tunatumia 10 tu, yaani njia 1024). Tungeweza kupata matokeo "kulia kurekebishwa" ikiwa tunataka kwa kusafisha kidogo ADLAR kwenye rejista ya ADMUX. Sababu tunayochagua kushoto kurekebishwa ni kwa sababu ishara zetu zinatosha mbali kwamba tarakimu mbili za mwisho za nambari ya kituo hazina maana na labda ni kelele tu kwa hivyo tutatofautisha vitufe kwa kutumia tu tarakimu 8 za juu, kwa maneno mengine, tutahitaji tu kuangalia ADCH ili kugundua ni kitufe gani kilichobanwa. sajili, badilisha nambari hiyo kuwa dhamana ya keypad, na kisha utume hiyo nambari kwa LED yetu ya uchambuzi wa sajili ili tuweze kuthibitisha kuwa kushinikiza "9" kusema, itasababisha mwangaza wa LED na "00001001" kuwasha. mbali ingawa tunahitaji kwanza kuona kile kinachoonekana katika ADCH wakati tunasukuma vifungo anuwai. Kwa hivyo wacha tu tuandike kidhibiti rahisi cha kusumbua ambacho kinatuma tu yaliyomo kwenye ADCH kwa onyesho la analyzer. Kwa hivyo hii ndio tunayohitaji:
ADC_int: lds analyzer, ADCH; pakia thamani ya ADCH katika analyzersbi yetu EIFR, 0; futa bendera ya usumbufu ya nje ili iwe tayari kwenda tena
Kufikia sasa, unapaswa kuweza nakala tu nambari kutoka kwa analyzer yetu katika mafunzo 5 na ongeza usumbufu huu na mipangilio ya kugeuza na kuiendesha. Zoezi la 2: Andika nambari na uiendeshe. Angalia kuwa unapata onyesho la ADCH kwenye onyesho lako la mchambuzi. Jaribu kubonyeza kitufe kimoja mara kadhaa. Je! Unapata thamani sawa katika ADCH?
Hatua ya 8: Ramani Ramani za Kitufe
Tunachohitaji kufanya sasa ni kubadilisha maadili katika ADCH kuwa nambari zinazolingana na ufunguo ambao ulibonyezwa. Tunafanya hivyo kwa kuandika yaliyomo kwenye ADCH kwa kila kitufe na kisha kuibadilisha kuwa nambari ya decimal kama nilivyofanya kwenye picha. Katika utaratibu wetu wa kushughulikia usumbufu tutazingatia anuwai ya maadili sawa na kila kitufe ili ADC itoe ramani ya kitu chochote katika anuwai hiyo kwa kitufe kilichopewa.
Zoezi la 3: Fanya hii ramani na kisha andika tena utaratibu wako wa kukatiza ADC.
Hivi ndivyo nilivyopata kwa yangu (yako inaweza kuwa tofauti). Angalia kuwa nimeiweka na anuwai ya maadili kwa kila kitufe.
ADC_int:; Kuzuia nje handlerclr analyzer; jiandae kwa kifungo kipya cha nambari H, ADCH; Sasisho za ADC wakati ADCH inasomwa kitufe cha clccpiH, 240brlo PC + 3; ikiwa ADCH ni kubwa basi ni 1ldi analyzer, 1; hivyo analyzer mzigo na kurudi 1rjmp; na kurudisha kitufe cha clccpiH, 230; ikiwa ADCH ni kubwa basi 2brlo PC + 3ldi analyzer, 2rjmp return clccpi buttonH, 217brlo PC + 3ldi analyzer, 3rjmp return clccpi buttonH, 203brlo PC + 3ldi analyzer, 4rjmp return clccpi buttonH, 187brlo PC + 3ldi analyzer, 5rjmp return clccpi button, 155brlo PC + 3ldi analyzer, 6rjmp kurudi clccpi kifungoH, 127brlo PC + 3ldi analyzer, 255; tutaweka taa kama kitufe cha kurudi kwa onrjmp HC, 115brlo PC + 3ldi analyzer, 7rjmp kurudi clccpi kifungoH, 94brlo PC + 3ldi analyzer, 8rjmp return clccpi buttonH, 62brlo PC + 3ldi analyzer, 9rjmp return clccpi buttonH, 37brlo PC + 3ldi analyzer, 0b11110000; kinyota ni nusu ya juu onrjmp kurudi clccpi buttonH, 28brlo PC + 3ldi analyzer, 0rjmp return clccpi buttonH, 17brlo PC + 3ldi analyzer, 0b00001111; ishara ya hash ni chini ya nusu onrjmp kurudi clccpi kifungoH, 5brlo PC + 3ldi analyzer, 0b11000011; redial ni juu 2 chini 2rjmp kurudi ldi analyzer, 0b11011011; vinginevyo hitilafu ilitokea kurudi: reti
Hatua ya 9: Nambari na Video ya Toleo 1
Nimeambatanisha nambari yangu ya toleo hili la kwanza la dereva wa keypad. Katika hii unahitaji kushinikiza kitufe na kisha bonyeza kitufe ili kusababisha ADC isome maoni kutoka kwa kitufe. Kile ambacho tungependa tu kuwa nacho hakuna kitufe lakini badala yake ishara ya kufanya uongofu hutoka kwa kitufe chenyewe Zoezi la 3: Kusanyika na kupakia nambari hii na ujaribu. Itabidi ubadilishe vizingiti anuwai vya uongofu ili uendane na voltages zako za vitufe kwani zinaweza kutofautiana na yangu. Ni nini kinachotokea ikiwa unajaribu kutumia pembejeo kutoka kwa keypad zote kwa ADC0 na kwa pini ya kukatiza nje badala ya kupitia kitufe? katika nambari yangu kuna sehemu inayoanzisha Kiashiria cha Stack. Kuna rejista anuwai ambazo tunaweza kutaka kushinikiza na pop kutoka kwa stack wakati tunatumia vigeuzi na nini-sio na pia kuna rejista ambazo tunaweza kutaka kuhifadhi na kurudisha baadaye. Kwa mfano, SREG ni rejista ambayo haihifadhiwi kwa vipingamizi, kwa hivyo bendera anuwai ambazo zimewekwa na kusafishwa kama matokeo ya shughuli zinaweza kubadilishwa ikiwa usumbufu unatokea katikati ya kitu. Kwa hivyo ni bora ikiwa unasukuma SREG kwenye ghala mwanzoni mwa kishikizi cha kukatiza na kisha ukizunguke tena mwishoni mwa kitunzaji cha usumbufu. Nimeiweka katika nambari kuonyesha jinsi imeanzishwa na kutarajia jinsi tutakavyohitaji baadaye lakini kwa kuwa hatujali kinachotokea kwa SREG wakati wa kukatizwa kwa nambari yetu sikutumia mpororo kwa hili. kwamba nimetumia operesheni ya kuhama kuweka bits anuwai kwenye rejista wakati wa kuanzisha. Kwa mfano kwenye mstari:
ldi temp, (1 <
Amri ya "<<" katika mstari wa kwanza wa nambari hapo juu ni operesheni ya kuhama. Kwa kweli inachukua nambari ya kwanza ya 1, ambayo ni 0b00000001 na kuibadilisha iliyoachwa na idadi ya nambari ISC01. Huu ndio msimamo wa kidogo inayoitwa ISC01 katika rejista ya EICRA. Kwa kuwa ISC01 ni kidogo 1, nambari 1 inahamishiwa nafasi ya kushoto 1 kuwa 0b00000010. Vivyo hivyo ya pili, ISC00, ni kidogo 0 ya EICRA na kwa hivyo kuhama kwa nambari 1 ni nafasi sifuri kushoto. Ikiwa angalia angalia tena faili ya m328Pdef.inc ambayo umepakua kwenye mafunzo ya kwanza na umekuwa ukitumia evrr tangu, utaona kuwa ni orodha ndefu tu ya taarifa za ".equ". Utapata kuwa ISC01 ni sawa na 1. Mkusanyaji hubadilisha kila mfano wake na 1 kabla hata ya kuanza kukusanyika chochote. Ni majina tu ya bits za kujiandikisha ili kutusaidia wanadamu kusoma na kuandika nambari. Sasa, mstari wa wima kati ya shughuli mbili za kuhama hapo juu ni operesheni ya kimantiki "au". Hapa kuna usawa:
0b00000010 | 0b00000001 = 0b00000011
na hii ndio tunapakia (kutumia "ldi") kwenye temp. Sababu ya watu kutumia njia hii kupakia maadili kwenye rejista ni kwamba inaruhusu mtu kutumia jina la kidogo badala ya nambari tu na hii inafanya nambari iwe rahisi kusoma. Pia kuna mbinu zingine mbili ambazo tumetumia. Tunatumia maagizo "ori" na "andi". Hizi zinaturuhusu kuweka SIT na WAZI bits mtawaliwa bila kubadilisha yoyote ya bits zingine kwenye rejista. Kwa mfano, wakati nilitumia
mwelekeo wa muda, (1
hii "au" na 0b00000001 ambayo inaweka 1 kwenye zeroth na inaacha zingine zote zikibadilika. Pia wakati tuliandika
andi temp, 0b11111110
hii inabadilisha zeroth kidogo ya temp kuwa 0 na inaacha zingine zote zikibadilika.
Zoezi la 4: Unapaswa kupitia nambari hiyo na uhakikishe unaelewa kila mstari. Unaweza kupata kupendeza kupata njia bora za kufanya vitu na kuandika programu bora. Kuna njia mia za kuweka alama kwa vitu na nina hakika unaweza kupata njia bora zaidi kuliko yangu. Unaweza pia kupata (mbinguni ikataze!) Makosa na upungufu. Kwa hali hiyo ningependa kusikia juu yao ili waweze kurekebishwa.
Sawa, sasa wacha tuone ikiwa tunaweza kuondoa kitufe kisichozidi…
Hatua ya 10: Nambari ya Toleo la 2
Njia rahisi ya kuondoa kitufe ni kuiondoa tu, sahau pembejeo kwa PB2, na ubadilishe ADC iwe "Njia Mbio ya Kuendesha".
Kwa maneno mengine badilisha daftari la ADCSRB ili ADTS2, ADTS1, na ADTS0 zote ziwe sifuri.
Kisha weka kidogo ADSC katika ADCSRA hadi 1 ambayo itaanza uongofu wa kwanza.
Sasa pakia kwa mdhibiti wako mdogo na utapata kwamba nambari sahihi inakuja kwenye onyesho wakati unabonyeza kitufe na tu wakati unabonyeza kitufe. Hii ni kwa sababu ADC inaendelea kuchukua sampuli bandari ya ADC0 na kuonyesha dhamana. Unapoondoa kidole chako kwenye kitufe, "kitufe cha kitufe" kitasababisha maadili kadhaa ya bahati nasibu kutokea haraka sana na kisha itakaa kwenye pembejeo la 0V. Katika nambari yetu tuna hii 0V inayoonekana kama 0b11011011 (kwa sababu kitufe cha kubonyeza `0 'tayari kinatumia nambari ya kuonyesha 0b00000000)
Hili sio suluhisho tunalotaka ingawa kwa sababu mbili. Kwanza hatutaki kushikilia kitufe. Tunataka kubonyeza mara moja na nambari ionyeshwe (au itumike katika nambari mpya mpya katika mafunzo ya baadaye). Pili, hatutaki kuendelea kupakua ADC0. Tunataka ichukue usomaji mmoja, ibadilishe, na kisha lala mpaka kitufe kipya kinasababisha ubadilishaji mpya. Njia ya kukimbia bure ni bora ikiwa kitu pekee unachotaka mdhibiti mdogo afanye ni kusoma kila wakati pembejeo za analog - kama ikiwa unataka kuonyesha joto la wakati halisi au kitu.
Basi wacha tutafute suluhisho lingine…
Hatua ya 11: Je! Tunaondoaje Kitufe? Toleo la 3
Kuna njia nyingi tunaweza kuendelea. Kwanza tunaweza kuongeza vifaa ili kuondoa kitufe. Kwa mfano tunaweza kujaribu kuweka transistor kwenye mzunguko kwenye mstari wa pato la kitufe ili ichukue mkondo mdogo wa sasa kutoka kwa pato na tuma mapigo ya 5V kwa pini ya kukatiza PD2.
Walakini, hiyo inaweza kuwa na kelele sana angalau na mbaya kabisa haitaruhusu wakati wa kutosha kwa usomaji wa vitufe sahihi kwani pato la keypad halingekuwa na wakati wa kutuliza kabla usomaji wa ADC haujakamatwa.
Kwa hivyo tungependa kupata suluhisho la programu. Tunachopenda kufanya ni kuongeza kukatiza kwenye pini ya PD2 na kuandika kichocheo cha kukatiza kwa hiyo kinachoita usomaji mmoja wa pini ya keypad. Kwa maneno mengine, tunaondoa usumbufu wa kiotomatiki kutoka kwa ADC, na kuongeza usumbufu wa nje ambao huita ADC ndani yake. Kwa njia hiyo ishara ya kusoma ADC inakuja baada ya ishara ya PD2 tayari kutokea na hii inaweza kutoa vitu wakati wa kutosha kutosheleza kwa voltage sahihi kabla ya pini ya PC0 kusomwa na kugeuzwa. Bado tutakuwa na usumbufu wa kukamilisha ADC ambao hutoa matokeo kwa onyesho la analyzer mwishoni.
Kuwa na maana? Vizuri tufanye hivyo…
Angalia nambari mpya iliyoambatanishwa.
Unaona mabadiliko yafuatayo:
- Tuliongeza rjmp kwenye anwani.org 0x0002 kushughulikia usumbufu wa nje wa INT0
- Tulibadilisha rejista ya EIMSK kuonyesha tunataka kusumbua kwenye pini ya INT0
- Tulibadilisha pini ya ADATE katika rejista ya ADCSRA ili kuzima utaftaji wa mwili
- Tumeondoa mipangilio ya ADCSRB kwa kuwa haina maana wakati ADATE imezimwa
- Hatupaswi tena kuweka upya bendera ya kichocheo cha nje kwani utaratibu wa kukatiza wa INT0 hufanya hivyo kiatomati ukikamilisha - hapo awali hatukuwa na utaratibu wa kusumbua, tulichochea tu ADC kutoka kwa ishara kwenye pini hiyo, kwa hivyo ilibidi wazi bendera hiyo kwa mkono.
Sasa katika kidhibiti cha kusumbua tunaita tu ubadilishaji mmoja kutoka kwa ADC.
Zoezi la 5: Endesha toleo hili na uone kinachotokea.
Hatua ya 12: Nambari na Video ya Toleo la Kufanya Kazi
Kama tulivyoona na toleo la mwisho, kitufe cha kukatiza hakifanyi kazi vizuri kwa sababu usumbufu umesababishwa kwenye makali inayoinuka ili kubana PD2 na kisha mshughulikiaji wa usumbufu anaita ubadilishaji wa ADC. Walakini, ADC basi hupata usomaji wa voltage kabla haijatulia na kwa hivyo inasoma upuuzi.
Tunachohitaji ni kuanzisha ucheleweshaji kati ya usumbufu wa PD2 na usomaji wa ADC kwenye PC0. Tutafanya hivyo kwa kuongeza kipima muda / kaunta, usumbufu wa kukomesha kaunta, na utaratibu wa kuchelewesha. Kwa bahati nzuri tayari tunajua jinsi ya kufanya hivyo kutoka kwa Mafunzo ya 3! Kwa hivyo tutanakili na kubandika nambari inayofaa kutoka hapo.
Nimetoa nambari inayosababishwa na video inayoonyesha inafanya kazi.
Utagundua kuwa masomo sio sahihi kama vile mtu anavyotarajia. Hii inawezekana kwa sababu ya vyanzo kadhaa:
- tunagonga kutoka kwa pato la voltage ya keypad ili kuchochea PD2 ambayo inathiri usomaji katika PC0.
- hatujui ni muda gani kuchelewesha baada ya kichocheo kupata usomaji bora.
- inachukua mizunguko michache kwa ubadilishaji wa ADC kukamilisha ambayo inamaanisha kuwa hatuwezi kuwasha moto haraka kwenye kitufe.
- labda kuna kelele kwenye kitufe yenyewe.
- na kadhalika…
Kwa hivyo, ingawa tuliweza kupata kibodi kufanya kazi, na sasa tunaweza kuitumia katika matumizi kwa kutumia nambari za kubonyeza kwa njia nyingine badala ya kuzitoa kwenye onyesho la analyzer, sio sahihi sana na inakera sana. Ndio sababu nadhani kuwa njia bora ya keypads za waya ni kuweka tu kila pato kutoka kwa kitufe kwenye bandari tofauti na kuamua ni kitufe gani kinachosisitizwa na bandari gani zinaona voltage. Hiyo ni rahisi, haraka sana, na sahihi sana.
Kwa kweli, kuna sababu mbili tu kwa nini mtu angetaka kuendesha keypad kwa njia ambayo tumefanya hapa:
- Inatumia tu pini 2 kwenye microcontroller yetu badala ya 8.
- Ni mradi mzuri kuonyesha sehemu tofauti za ADC kwenye microcontroller ambayo ni tofauti na vitu vya kawaida unavyoweza kupata huko kama usomaji wa joto, kugeuza nguvu, nk. badala ya hali ya bure ya kuendesha-CPU.
Kwa hivyo, hapa kuna mazoezi kadhaa ya mwisho kwako:
Zoezi la 6: Andika tena ubadilishaji kamili wa ubadilishaji wa ADC kutumia Jedwali la Kutazama. Yaani. Ili iweze kujaribu thamani ya analojia na kipengee cha kwanza kwenye jedwali na ikiwa ni kubwa inarudi kutoka kwa usumbufu, ikiwa sio basi inaongeza Z kwa bidhaa inayofuata kwenye meza na matawi kurudi kwenye jaribio tena. Hii itafupisha nambari na kusafisha kawaida ya usumbufu na kuifanya iwe nzuri. (Nitatoa suluhisho linalowezekana kama hatua inayofuata) Zoezi la 7: Bonyeza kitufe chako kwa pini 8 kwenye mdhibiti mdogo na andika dereva rahisi na ujione ni nzuri kiasi gani. Je! Unaweza kufikiria njia kadhaa za kufanya njia yetu ifanye kazi vizuri?
Hiyo ni yote kwa mafunzo haya. Nimeambatanisha toleo la mwisho na viashiria. Tunapoelekea karibu na lengo letu la mwisho, tutatumia kibodi tena katika Mafunzo ya 9 kuonyesha jinsi ya kudhibiti maonyesho saba ya sehemu nayo (na kujenga kitu cha kupendeza ambacho hutumia vitufe vya ziada kwenye kitufe cha simu) na kisha tutafanya hivyo. badilisha kudhibiti vitu na vitufe-badala badala yake (kwa kuwa njia hiyo inafaa zaidi na bidhaa ya mwisho tunayoijenga na mafunzo haya) na tutaweka tu keypad.
Tutaonana wakati mwingine!
Ilipendekeza:
Mafunzo ya Mkusanyiko wa AVR 2: 4 Hatua
Mafunzo ya AVR Assembler 2: Mafunzo haya ni mwendelezo wa " Mafunzo ya Mkusanyiko wa AVR 1 " Ikiwa haujapitia Mafunzo ya 1 unapaswa kuacha sasa na ufanye hiyo ya kwanza.Katika mafunzo haya tutaendelea na masomo yetu ya programu ya lugha ya mkutano wa atmega328p u
Mafunzo ya Mkusanyiko wa AVR 1: Hatua 5
ASR Assembler Mafunzo 1: Nimeamua kuandika safu kadhaa za mafunzo juu ya jinsi ya kuandika programu za kusanyiko za Atmega328p ambayo ni mdhibiti mdogo anayetumiwa katika Arduino. Ikiwa watu watabaki na hamu nitaendelea kuweka moja kwa wiki au hivyo hadi nitakapomaliza
Mafunzo ya Mkusanyiko wa AVR 6: 3 Hatua
Mafunzo ya AVR Assembler 6: Karibu kwenye Mafunzo ya 6! Mafunzo ya leo yatakuwa mafupi ambapo tutatengeneza njia rahisi ya kuwasiliana na data kati ya atmega328p moja na nyingine kwa kutumia bandari mbili zinazowaunganisha. Kisha tutachukua roller ya kete kutoka kwenye Mafunzo ya 4 na Sajili
Mafunzo ya Mkusanyiko wa AVR 8: 4 Hatua
Mafunzo ya AVR Assembler 8: Karibu kwenye Mafunzo ya 8! Katika mafunzo haya mafupi tutachukua tofauti kutoka kwa kuanzisha vipengee vipya vya programu ya lugha ya mkutano ili kuonyesha jinsi ya kuhamisha vifaa vyetu vya kuiga kwa " iliyochapishwa " bodi ya mzunguko.
Mafunzo ya Mkusanyiko wa AVR 9: 7 Hatua
Mafunzo ya AVR Assembler 9: Karibu kwenye Mafunzo 9. Leo tutakuwa tukionyesha jinsi ya kudhibiti onyesho la sehemu 7 na onyesho la tarakimu nne kwa kutumia nambari yetu ya lugha ya mkutano ya ATmega328P na AVR. Wakati wa kufanya hivyo itabidi tuchukue mabadiliko katika jinsi ya kutumia stack