Orodha ya maudhui:

Kusoma Swichi na ATTiny2313: 9 Hatua
Kusoma Swichi na ATTiny2313: 9 Hatua

Video: Kusoma Swichi na ATTiny2313: 9 Hatua

Video: Kusoma Swichi na ATTiny2313: 9 Hatua
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Julai
Anonim
Kusoma Swichi na ATTiny2313
Kusoma Swichi na ATTiny2313

Kumekuwa na Maagizo kadhaa yanayoshughulika na matokeo kutoka kwa ATtiny2313 na vifaa sawa vya AVR. Kwa mfano, Pikipiki-na-AVR-Microprocessor /. Kufanya kazi ya hivi karibuni kutoka kwa The Real Elliot, ambayo ilionyesha jinsi ya kudhibiti motors za stepper, niligundua kuwa itakuwa muhimu sana kuweza kuendesha sehemu mbadala za nambari katika mpango huo kwa hivyo sikuhitaji kupanga tena ATTiny2313 kila moja wakati nilitaka kujaribu kutofautisha nambari kidogo (kama vile kukanyaga nusu au kukimbia stepper kwa kurudi nyuma). Ingawa ni rahisi kuandika nambari kwa kutumia taarifa ya kubadili / kesi kuruhusu uteuzi wa tofauti mbadala, njia fulani ya kuchagua kesi inahitajika. Hiyo inamaanisha aina fulani ya kifaa cha kuingiza lazima isomwe kudhibiti kesi hiyo. Kwa bahati nzuri, ATtiny2313 ina pini nyingi za I / O na imeundwa vizuri kwa kusoma pembejeo kutoka kwa swichi. Agizo hili litaonyesha jinsi ya kusoma pembejeo na kufanya maamuzi kulingana na hali yao. Kwa kuwa hiyo peke yake ingeweza kufundisha vizuri, nitaelezea njia rahisi ya kutumia uwezo wa saa / kaunta ya ATtiny2313 kuendesha spika ndogo kama beeper. Pia kutakuwa na upungufu mdogo juu ya mbinu rahisi za utatuzi.

Hatua ya 1: Kifaa cha Ingizo

Kifaa cha Kuingiza
Kifaa cha Kuingiza
Kifaa cha Kuingiza
Kifaa cha Kuingiza

Agizo hili linajengwa juu ya kazi bora ya The Real Elliot na hutumia mfumo wa ukuzaji wa Ghetto wa ATtiny2313 anaelezea. Karatasi ya data ya ATtiny2313 kutoka Atmel ndio kumbukumbu kuu kwa kazi zote, lakini sio rahisi kusoma. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Kiungo kina karatasi zote za data za AVR, tafuta 2313.) Takwimu inaonyesha seti rahisi ya swichi za kuingiza. Hii ni kifurushi cha swichi nne za kuzima / kuzima; pia inajulikana kama nguzo moja, swichi za kutupa moja (SPST). Kwa kawaida, unganisho moja, au nguzo, ya kila swichi imefungwa ardhini wakati unganisho lingine vunjwa juu kupitia kipingamizi cha sasa cha kizuizi (10K au hivyo). Uingizaji wa microcontroller umeunganishwa kwenye pole na kontena. Ikiwa swichi iko wazi, mdhibiti mdogo atasoma uingizaji kama HI. Ikiwa swichi imefungwa, mdhibiti mdogo atasoma uingizaji LO. Rejelea mpango kwa maelezo. ATTiny2313 hurahisisha mambo kwa kutoa vipinga-vuta vinavyoweza kupangiliwa kwenye pini za I / O wakati zimesanidiwa kama pembejeo. Hii inamaanisha kuwa swichi zinaweza kuwa na fimbo moja iliyofungwa ardhini (LO) na nguzo nyingine imeunganishwa na pembejeo ya processor. Mfano wa kwanza unaonyesha swichi mbili tu. Swichi zinasomwa na kusanidiwa na nambari ifuatayo. Sanidi swichi kama pembejeo: (Hakuna nambari inahitajika, hii ndio chaguomsingi.) Washa vipingaji vya kuvuta: PORTB = _BV (PB0) | _BV (PB1); Soma pembejeo: but1 = ~ PINB & 0x03; Kumbuka matumizi ya inversion na masking kupata thamani sahihi.

Hatua ya 2: Taa za blink kwa Ishara

Tutatumia swichi hizi mbili kupepesa LED idadi ya nyakati zinazoweza kupangwa. Taa za LED tutakazotumia zitakuwa taa za kupepesa ambazo The Real Elliot ilifanya maarufu. Swichi 1 na 2 zitachukuliwa kama nambari mbili za kibinadamu, kwa hivyo mchanganyiko unaweza kuwakilisha nambari 0, 1, 2, na 3. Programu yetu itasoma swichi mbili na kupepesa LED idadi inayofaa ya nyakati, lakini ikiwa tu swichi mipangilio imebadilika. Swichi zinashushwa kwa milisekunde 500 (haijaboreshwa). Algorithm ya kujiondoa ni rahisi sana. Swichi zinasomwa na kusoma kunabainishwa. Ikiwa ni tofauti na thamani ya zamaniBut (thamani ya mwisho iliyohifadhiwa), basi mpango umecheleweshwa kwa milisekunde 500 na swichi zinasomwa tena. Ikiwa thamani ni sawa na ile iliyosomwa hapo awali, thamani ya zamaniLakini itasasishwa na LED itapepesa idadi ya nyakati zilizodhibitishwa na dhamana ya ununuzi wa swichi mbili. Kumbuka ubadilishaji wa thamani tangu swichi ambayo iko "kwenye" inasoma LO. Swichi zitachunguzwa kila wakati kwa mabadiliko zaidi. Tafadhali rejelea Maagizo ya mapema na The Real Elliot ili ujifunze zaidi juu ya taa za blinken. Angalia hii https://www.ganssle.com/debouncing.pdf ili ujifunze zaidi juu ya kuondoa swichi. Hapa kuna nambari ya ATtiny2313 ya mfano huu. Inafanya kazi, programu hii itapepesa LED kwenye PB4 (pini ya mwili 8) mara mbili kuonyesha imeanzishwa. Kisha itasoma swichi moja na mbili, na kuangaza mara moja hadi tatu kulingana na mpangilio wa kubadili wakati wowote inabadilishwa. Wakati swichi hazibadiliki, LED itaangaza polepole. Kuendesha nambari hii, tengeneza saraka mpya (iite "Msingi" ukipenda) na pakua faili ifuatayo ya C na uifanye faili. Badili jina la Makefile1.txt kuwa Makefile tu. Kutumia WinAVR, kukusanya programu na kuipakia kwenye ATtiny2313 yako.

Hatua ya 3: Uchimbaji mdogo juu ya Utatuaji

Ikiwa wewe ni kama mimi (na kila programu nyingine ulimwenguni) labda umepata nyakati ambazo nambari "isiyo na hitilafu" uliyoandika kwa uangalifu na kuandaa haifanyi kile unachotarajia ifanye. Labda haifanyi chochote! Kwa hivyo shida ni nini? Je! Utajuaje? Kwa bahati nzuri, kuna njia kadhaa za kupata vitu vya kufanya kazi. (Pata kitabu hiki kwa matibabu bora juu ya mada ya utatuzi. unayojua. Ikiwa umepata mwangaza wa kufanya kazi mara moja, kisha utumie tena kuona uko wapi katika programu yako. Ninapenda kuwa na mwangaza wa LED mara mbili kuashiria kuanza kwa programu. Unaweza kuweka nambari ili ufanye hivi mwanzoni mwa programu yako. Mara tu unapojua kuwa hakuna kitu kibaya na vifaa vyako, tengeneza kazi ya kufanya kupepesa. Hapa kuna kazi ninayotumia. ---------------------- ** ------------------------------------------------ --------------------- * / batili blinkEm (hesabu ya uint8_t) {wakati (hesabu> 0) {PORTD = _BV (PD4); kuchelewa_ms (1000); PORTD = ~ _BV (PD4); kuchelewa_ms (1000); hesabu -; }} Sasa inawezekana kutumia kazi hii katika sehemu anuwai katika nambari yako kama ishara kwamba nambari imetekeleza hadi sasa. Kujua nambari inaendesha inamaanisha unaweza kuchunguza kwa uangalifu kila sehemu ambayo imeendesha, lakini haikufanya kile ulichotarajia, kupata makosa. Kubadilisha jambo moja kwa wakati ni mbinu muhimu ya utatuaji pia (ilivyoelezewa katika kumbukumbu hapo juu). Njia hii ya kawaida inafanya kazi pamoja na "kugawanya na kushinda": kuchukua hatua za watoto ili kuongeza utendaji zaidi. Hii inaweza kuonekana kama njia polepole, lakini sio polepole sana kujaribu kujaribu kuondoa sehemu kubwa ya nambari isiyofanya kazi mara moja.

Hatua ya 4: Utatuaji zaidi

Kuna nyakati nyingi wakati tunataka kuangalia sehemu ya nambari kwa kuruka mistari mingi ndani yake, kisha kuiwezesha moja kwa wakati tunapohakikisha kila moja inafanya kazi. Kwa kawaida, tunafanya hivyo kwa "kutoa maoni" kwa mistari tunayotaka kuruka. Ugani wa mbinu hii ni kukata na kubandika kificho cha nambari, kutoa maoni ya asili (kwa hivyo hatupotezi), na kudukua nakala. C ina njia nne rahisi za kutoa maoni kwa mistari. Kuweka "//" mbele ya mstari kutoa maoni nje ya mstari huo. Kuweka mstari mmoja au zaidi katika "/ *" na "* /" kutatoa maoni ya sehemu nzima. Ili njia hii ifanye kazi kwa ufanisi, lazima kusiwe na "* /" nyingine kwenye kificho cha nambari (zaidi ya ile inayoishia). Kwa hivyo nidhamu inayofaa ni kutumia // kwa maoni ndani ya vizuizi vya nambari, na kuhifadhi / * * / kujenga kwa vizuizi vya maoni na kutoa maoni kwa sehemu za nambari. Kuweka "#if 0" mwanzoni mwa kizuizi kutoa maoni nje na kumaliza sehemu na "# endif". Udhibiti zaidi wa kuchagua inawezekana kutumia "#ifdef (kitambulisho)" mwanzoni mwa kizuizi na "# endif" mwishoni. Ikiwa unataka kizuizi kiandaliwe, tumia "#fafanua (kitambulisho)" mapema katika programu. Kumbuka alama za nukuu ni za msisitizo tu na sio lazima zijumuishwe. Kuchanganya mbinu hizi zinapaswa kutoa njia inayofaa ya utatuaji wa programu zako za ATtiny2313. Unaweza kupata zana hizi kuwa muhimu tunapoendelea kupitia hii inayoweza kufundishwa.

Hatua ya 5: Kutumia Timer / Counter 0 kwa Beeps

Kutumia Timer / Counter 0 kwa Beeps
Kutumia Timer / Counter 0 kwa Beeps

ATtiny2313 ina rasilimali mbili za nguvu za muda / kaunta: moja 8-bit na moja 16-bit. Hizi zinaweza kusanidiwa kama jenereta za masafa, vidhibiti vya upanaji wa mpigo wa mpigo, na pato kulinganisha rejista. Utendaji kamili wa hizi umeelezewa katika kurasa 49 za karatasi ya data. Walakini, tutatumia kesi rahisi. Timer / Counter 0 tu (the 8-bit one) itatumika na itatumika tu kama jenereta ya masafa. Mzunguko utapelekwa kwa spika ndogo ili kutoa beep. Timer / Counter 0 imeelezewa kabisa katika ukurasa wa 66 hadi 83 wa karatasi ya data ya ATtiny2313. Usomaji wa karibu wa nyenzo hii utampa mtu uelewa kamili wa Wakati / Kaunta 0. Kwa furaha, hali rahisi, Futa Timer kwenye Linganisha (CTC), ndio yote inahitajika kutoa sauti ya beep tunayotaka.

Kwa hali tutakayotumia, operesheni ya Timer / Counter ni sawa mbele. Wakati ishara ya saa imechaguliwa, kaunta huanza saa sifuri na huongeza kila saa ya saa. Thamani ya kaunta inapofikia thamani katika Rejista ya Linganisha Pato (TOP), kaunta inarejelea sifuri na hesabu inaanza tena. Pato lililohusishwa na Timer / Counter limebadilishwa ili kutoa pato la wimbi la mraba. Hii moja kwa moja huendesha transducer ya sauti ili kutoa sauti ya beep. Transducer ndogo ya Sauti ya TDK hutoa beep. Kitengo kinachofaa ni Digikey 445-2530-ND, TDK SD1209T3-A1 (nilitumia toleo la mapema la hii). Hii ni toleo la volt 3; toleo la volt 5 pia litafanya kazi natarajia. Ninaendesha hii moja kwa moja kutoka bandari ya pato ya Attiny2313 na inaonekana inafanya kazi vizuri. Sparkfun ina kifaa kama hicho.

Hatua ya 6: Kusanidi Timer / Counter 0

Njia ya CTC inaweza kutumiwa kugeuza pato OC0A kwenye Pin 2, Port B (pin ya mwili 14). Ili kuwezesha pato kwenye pini hii, DDRB lazima iwekwe ipasavyo. Nambari ya C ya hii ni kama kuweka pato la mwangaza. DDRB = _BV (PB2); // Port B2 ni pato. Hatua inayofuata ni kusambaza ishara ya saa na kupakia rejista kulinganisha pato ili kutoa muundo wa wimbi kama masafa. Mlingano wa masafa yanayosababishwa umetolewa kwenye karatasi ya data (ukurasa 72). Masharti katika equation yataelezewa hapo chini. Hapa kuna equation: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) Ambapo fOC0A: = frequency ya pato fclk_I / O: = mzunguko wa chanzo cha saa N: = sababu ya saa OCR0A: = thamani katika pato linganisha rejista ya Timer / Kaunta 0A Mzunguko wa Chanzo cha Saa, fclk_I / OHuu ndio mzunguko wa saa ya mfumo. Thamani chaguo-msingi ni 1MHz. Bits CS00, CS01, na CS02 ya TCCR0B hudhibiti uteuzi huu. Kwa kuwa bits hizi pia huchagua thamani ya N, inaelezewa ijayo. Prescaler Value, NN ni thamani inayotumiwa kugawanya, au kusisitiza, saa ya mfumo. Bits CS00, CS01, na CS02 ya TCCR0B hudhibiti uteuzi huu. Jedwali 41 kwenye ukurasa wa 81 wa karatasi ya data ya ATtiny2313 inaelezea mchanganyiko huo. Kwa kuwa mzunguko karibu 1kHz unahitajika, bits CS00 na CS01 ya TCCR0B zitawekwa. Kumbuka kuwa kuweka vipande vyote vitatu kwa 0, na hivyo kuchagua hakuna chanzo cha saa, inasimamisha matokeo. Hii ndio njia ambayo itatumika kuanza na kusimamisha beep. Top Thamani, OCR0 Thamani hii ni thamani ya TOP kwa kaunta ambayo imeingizwa kwenye Rejista ya Linganisha Pato ya Timer / Counter 0A. Thamani hii itakapofikiwa, kaunta itawekwa tena sifuri na hesabu itaanza tena hadi TOP itakapofikiwa na mzunguko urudie. TOP hubadilishwa kwa urahisi, kwa hivyo mzunguko wa beeper ni rahisi kubadilika. Kwa kuwa frequency karibu na 1kHz inahitajika, TOP imewekwa hadi 7. (Kumbuka daktari anaweza kuwa amewekwa 8, na TOP imewekwa kwa 63. Matokeo sawa - chaguo lako.) Frequency ya Pato, fOC0A Kutumia hesabu kuhesabu matokeo ya masafa ya pato kwa: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977Hz Funga vya kutosha! Hapa kuna nambari ya kupakia Rejista ya Kulinganisha Pato na Sajili ya Kudhibiti Timer 0B. Tafadhali angalia nambari halisi ya programu kuelewa jinsi hizi zinatumiwa. OCR0A = 7; // Thamani ya Wakati TCCR0B = _BV (CS01) | _BV (CS00); // Chagua saa ya ndani & prescale = 8 TCCR0B = 0; // hakuna chanzo cha saa kinachozima sauti Kuweka Saa / Njia ya KukabilianaKama kama maelezo ya mwisho, tutabainisha hali ya Timer / Counter tunayotamani kwa kuweka bits zinazofaa katika Sajili ya Kudhibiti Timer / Counter 0A. Njia ya CTC imechaguliwa kwa kuweka kidogo WGM01 kama ilivyoelezewa kwenye Jedwali 40, ukurasa wa 79 wa karatasi ya data. Kwa kuwa tunataka pato libadilishe kila mzunguko, kidogo COM0A0 pia inahitaji kuweka kama ilivyoelezewa kwenye Jedwali 34 kwenye ukurasa wa 77. Hapa kuna nambari: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Njia ya Kubadili CTC

Hatua ya 7: Kutumia Swichi Nne

Tunapotekeleza beeper, wacha tuongeze vifaa vyetu na programu kushughulikia swichi nne. Kwa kuwa pato la Timer Counter 0A iko kwenye Bandari B, pini 2, hatuwezi kuunganisha tu swichi zaidi mtawaliwa kwa Port B. Suluhisho rahisi itakuwa kutumia Port D, lakini wacha tuiweke bandari hiyo ipatikane kwa kazi zingine (labda motor ya kukanyaga). Kwa hivyo wacha tuunganishe swichi za ziada kwa PB3 na PB4. Kusoma swichi hazijabadilika. Thamani ya kinyago inabadilishwa kuwa 0x1B (00011011 binary) ili kuficha kidogo 2 pamoja na 5, 6, na 7. Ujanja mmoja zaidi unatumiwa kuunda nambari ya 4-bit. Shift bits 3 na 4 kulia moja kidogo na unganishe na bits 0 na 1 kwa nambari 4 ya binary. Huu ni syntax ya kawaida ya C ya kuhamisha na kuchanganya bits, lakini inaweza kuwa haijulikani kwa novice. but1a = (lakini1 & 0x03) | ((lakini1 & 0x18) >> 1); // but1 imebadilisha kusomaKatika operesheni, programu hiyo itaangaza mara mbili na kulia mara mbili kuashiria uanzishaji. Wakati wowote swichi zinabadilishwa, nambari inayowakilisha itapigwa. Wakati swichi hazibadiliki, LED itaangaza. Ili kuendesha nambari hii, tengeneza saraka mpya (iite Beep ukipenda) na pakua faili ifuatayo ya C na ufanye faili ndani yake. Badili jina la Makefile2.txt kuwa Makefile tu. Kutumia WinAVR, kukusanya programu na kuipakia kwenye Attiny2313 yako.

Hatua ya 8: Kutumia Kubadilisha / kesi Kuunda

Hatua ya mwisho ni "programu tu": Kama ilivyoahidiwa, tutatumia ubadilishaji / ujenzi wa kesi. Ingawa mfano huu unaonyesha tu vitendo viwili mbadala, inapaswa kuwa wazi kabisa jinsi ya kutumia muundo huu kuchagua moja ya sehemu kadhaa za msimbo mbadala. Inafanya kazi, mpango huu unafuatilia swichi na ikiwa kuna mabadiliko, itapiga nambari inayofaa ikiwa ni ya kushangaza; itapepesa ikiwa nambari ni sawa. Haifanyi chochote isipokuwa kubadili kunabadilika.

Ili kuendesha nambari hii, tengeneza saraka mpya (iite Badilisha ikiwa ungependa) na pakua faili ifuatayo ya C na uifanye faili. Badili jina la Makefile3.txt kuwa Makefile tu. Kutumia WinAVR, kukusanya programu na kuipakia kwenye Attiny2313 yako.

Hatua ya 9: Hitimisho

Hitimisho
Hitimisho

Kwa hivyo ndivyo ilivyo! Sasa unajua jinsi ya kutumia swichi kudhibiti utekelezaji wa programu yako kwa kuzisoma na kuchagua kitendo kulingana na mpangilio wa ubadilishaji. Unajua pia jinsi ya kuunda sauti ya beep na umejifunza mkakati wa utatuzi pia.

Ikiwa ungependa kujaribu uelewa wako, jaribu kurekebisha programu ya mwisho ili kulia kwa sauti ya juu ikiwa hata, beep noti ya chini ikiwa isiyo ya kawaida, na uangaze LED kila wakati ikiwa hakuna mabadiliko kwenye swichi. kurudi kwenye sehemu ya utatuzi wa msaada.

Ilipendekeza: