Përmbajtje:

Çelësat e leximit me ATtiny2313: 9 hapa
Çelësat e leximit me ATtiny2313: 9 hapa

Video: Çelësat e leximit me ATtiny2313: 9 hapa

Video: Çelësat e leximit me ATtiny2313: 9 hapa
Video: ✅IMPRESIONANTE! 👀👉 ESTA ES LA GUIA TECNICA MAS COMPLETA DE COMO USAR EL OSCILOSCOPIO PASO A PASO 2024, Korrik
Anonim
Çelësat e leximit me ATtiny2313
Çelësat e leximit me ATtiny2313

Ka pasur disa udhëzues që merren me daljet nga ATtiny2313 dhe pajisje të ngjashme AVR. Për shembull, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-me-një-AVR-Mikroprocesor/. Duke punuar në atë të fundit nga The Real Elliot, i cili tregoi se si të kontrolloni motorët stepper, zbulova se do të ishte vërtet e dobishme të jesh në gjendje të drejtosh seksione alternative të kodit në të njëjtin program, kështu që nuk më duhej të riprogramoja ATtiny2313 secilin kohë doja të provoja një ndryshim të vogël të kodit (të tilla si gjysmë-hapi ose drejtimi i hapit në të kundërt). Ndërsa është e lehtë të shkruash kod duke përdorur një deklaratë switch/case për të lejuar përzgjedhjen e variacioneve alternative, nevojitet një mënyrë për të zgjedhur rastin. Kjo do të thotë që një lloj pajisjeje hyrëse duhet të lexohet për të kontrolluar rastin. Për fat të mirë, ATtiny2313 ka shumë kunja I/O dhe është projektuar mirë për të lexuar hyrje nga çelsat. Ky udhëzues do të tregojë se si të lexoni inputet dhe të merrni vendime bazuar në gjendjen e tyre. Meqenëse vetëm kjo do të bënte një Udhëzues mjaft të mërzitshëm, unë do të shpjegoj një mënyrë të thjeshtë të përdorimit të aftësisë së kohëmatësit/numëruesit të ATtiny2313 për të drejtuar një altoparlant të vogël si një bieper. Do të ketë gjithashtu një devijim të vogël mbi teknikat e thjeshta të korrigjimit.

Hapi 1: Pajisja hyrëse

Pajisja e hyrjes
Pajisja e hyrjes
Pajisja e hyrjes
Pajisja e hyrjes

Ky Instructable bazohet në punën e shkëlqyer të The Real Elliot dhe përdor sistemin e zhvillimit ATtoy2313 Ghetto që ai përshkruan. Fleta e të dhënave ATtiny2313 nga Atmel është referenca përfundimtare për të gjitha funksionet, por nuk është domosdoshmërisht e lehtë për t'u lexuar. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Lidhja ka të gjitha fletët e të dhënave AVR, gjeni 2313.) Figura tregon një grup të thjeshtë të çelsave hyrës. Kjo është thjesht një paketë prej katër çelësash ndezës/fikur; i njohur edhe si çelësa me një shtyllë të vetme, hedhje të vetme (SPST). Në mënyrë tipike, një lidhje, ose shtyllë, e secilit ndërprerës lidhet me tokën, ndërsa lidhja tjetër tërhiqet lart përmes një rezistence kufizuese të rrymës (10K ose më shumë). Një hyrje e mikrokontrolluesit është e lidhur me polin me rezistencën. Nëse çelësi është i hapur, mikrokontrolluesi do të lexojë hyrjen si HI. Nëse çelësi është i mbyllur, mikrokontrolluesi do të lexojë LO -në e hyrjes. Referojuni skemës për detaje. ATtiny2313 i thjeshton gjërat duke siguruar rezistencë tërheqëse të programueshme në kunjat I/O kur ato janë konfiguruar si hyrje. Kjo do të thotë që çelsat thjesht mund të kenë një pol të lidhur me tokën (LO) dhe polin tjetër të lidhur me një hyrje të procesorit. Shembulli i parë tregon vetëm dy ndërprerës. Çelsat lexohen dhe konfigurohen me kodin e mëposhtëm. Konfiguroni çelsat si hyrje: (Nuk kërkohet kod; ky është parazgjedhja.) Ndizni rezistencat tërheqëse: PORTB = _BV (PB0) | _BV (PB1); Lexoni inputet: but1 = ~ PINB & 0x03; Vini re përdorimin e përmbysjes dhe maskimit për të marrë vlerën e saktë.

Hapi 2: Dritat mbyllëse për një sinjal

Ne do t'i përdorim këto dy ndërprerës për të ndezur një LED një herë të programueshme. LED -të që do të përdorim do të jenë dritat blinken që The Real Elliot i bëri të famshëm. Çelësat 1 dhe 2 do të trajtohen si dy shifra binare, kështu që kombinimi mund të përfaqësojë numrat 0, 1, 2 dhe 3. Programi ynë do të lexojë dy çelsin dhe do të ndezë LED numrin e duhur të herëve, por vetëm nëse ndërroni cilësimet kanë ndryshuar. Ndërprerësit debonohen për 500 milisekonda (jo të optimizuara). Algoritmi i zbërthimit është mjaft i thjeshtë. Çelsat lexohen dhe leximi shënohet. Nëse është e ndryshme nga vlera e vjetërBut (vlera e fundit e ruajtur), atëherë programi vonohet për 500 milisekonda dhe çelsat lexohen përsëri. Nëse vlera është e njëjtë me atë të lexuar më parë, vlera e vjetërBut do të përditësohet dhe LED do të pulsojë numrin e herëve të nënkuptuara nga vlera binare e dy çelsave. Vini re përmbysjen e vlerës pasi që një çelës që është "aktiv" lexon LO. Ndërprerësit do të skanohen vazhdimisht për ndryshime të mëtejshme. Ju lutemi referojuni Instructables të mëparshëm nga The Real Elliot për të mësuar më shumë rreth dritave të mbyllura. Hidhini një sy këtij https://www.ganssle.com/debouncing.pdf për të mësuar më shumë rreth çrregullimit të çelsave. Këtu keni kodin ATtiny2313 për këtë shembull. Në funksion, ky program do të ndezë LED -in në PB4 (pin fizik 8) dy herë për të treguar se është i inicializuar. Pastaj do të lexojë çelsat një dhe dy dhe do të pulsojë një deri në tre herë në varësi të cilësimit të ndërprerësit sa herë që ato ndryshohen. Kur çelsat nuk ndryshojnë, LED do të pulsojë ngadalë. Për të ekzekutuar këtë kod, krijoni një direktori të re (quajeni "Basic" nëse ju pëlqen) dhe shkarkoni skedarin e mëposhtëm të kodit C dhe bëni skedar në të. Riemërtoni Makefile1.txt vetëm në Makefile. Duke përdorur WinAVR, përpiloni programin dhe ngarkojeni atë në ATtiny2313 tuaj.

Hapi 3: Një dalje e vogël në korrigjimin

Nëse jeni si unë (dhe çdo programues tjetër në botë) me siguri keni përjetuar raste kur kodi "pa gabime" që keni shtypur dhe përpiluar me kujdes nuk bën atë që prisni të bëjë. Ndoshta thjesht nuk bën asgjë! Pra, cili është problemi? Si do ta zbuloni? Për fat të mirë, ka disa qasje për t’i bërë gjërat të funksionojnë. (Merrni këtë libër për një trajtim të shkëlqyer të temës së korrigjimit. Http://www.debuggingrules.com/) Unë do të doja të ofroja disa sugjerime të thjeshta që kanë të bëjnë me temën e korrigjimit të aplikacioneve të mikrokontrolluesve. Hapi i parë është të ndërtoni ate qe dini Nëse keni marrë një dritë mbyllëse për të punuar një herë, atëherë përdorni përsëri për të parë se ku jeni në programin tuaj. Më pëlqen të ndez LED dy herë për të sinjalizuar fillimin e programit. Ju mund ta vendosni kodin për ta bërë këtë fillimisht në fillim të programit tuaj. Pasi ta dini se asgjë nuk është e gabuar me pajisjen tuaj, krijoni një funksion për të bërë ndezjen e dritës. Këtu është funksioni që përdor./************* ------------------------------ ** blinkEm-funksioni për të ndezur LED duke përdorur PD4 ** PD4 duhet të konfigurohet si dalje. ** ---------------------------------------------------- ---------------------*/void blinkEm (uint8_t numëroni) {ndërsa (numëroni> 0) {PORTD = _BV (PD4); _vonesa_ms (1000); PORTD = ~ _BV (PD4); _vonesa_ms (1000); numëroni--; }} Tani është e mundur të përdorni këtë funksion në pika të ndryshme të kodit tuaj si një sinjal që kodi ka ekzekutuar deri tani. Njohja e kodit po funksionon do të thotë që ju mund të ekzaminoni me kujdes çdo seksion që ka funksionuar, por nuk ka bërë atë që prisnit, për të gjetur gabime. Ndryshimi i një gjëje në të njëjtën kohë është gjithashtu një teknikë kryesore për korrigjimin (e përshkruar në referencën e mësipërme). Kjo metodë klasike funksionon së bashku me "ndani dhe pushtoni": ndërmarrja e hapave të foshnjës për të shtuar funksionalitetin në mënyrë graduale. Kjo mund të duket si një qasje e ngadaltë, por nuk është aq e ngadaltë sa përpjekja për të korrigjuar një pjesë të madhe të kodit që nuk funksionon menjëherë.

Hapi 4: Më shumë korrigjim

Ka shumë raste kur duam të kontrollojmë një pjesë të kodit duke anashkaluar shumicën e rreshtave në të, pastaj duke i mundësuar ato një nga një pasi verifikojmë se secila funksionon. Në mënyrë tipike, ne e bëjmë këtë duke "komentuar" rreshtat që duam të kalojmë. Një shtrirje e kësaj teknike është prerja dhe ngjitja e një blloku të kodit, komentimi i origjinalit (në mënyrë që të mos e humbim atë) dhe heqja e kopjes. C ka katër mënyra të thjeshta për të komentuar rreshtat. Vendosja e "//" para një rreshti komenton atë rresht. Mbyllja e një ose më shumë rreshtave në "/*" dhe "*/" do të komentojë një seksion të tërë. Që kjo metodë të funksionojë në mënyrë efektive, nuk duhet të ketë asnjë "*/" tjetër në bllokun e kodit (përveç atij që mbaron). Pra, një disiplinë efektive është përdorimi i // për komentet brenda blloqeve të kodit, dhe rezervimi i konstruktit / * * / për blloqet e komenteve dhe për komentimin e pjesëve të kodit. Vendosja e "#if 0" në fillim të një blloku për të komentuar dhe përfundimi i seksionit me "#endif". Më shumë kontroll selektiv është i mundur duke përdorur "#ifdef (identifikues)" në fillim të një blloku dhe "#endif" në fund. Nëse dëshironi që blloku të përpilohet, përdorni "#define (identifikues)" më herët në program. Vini re se kuotat janë vetëm për theks dhe nuk duhen përfshirë. Kombinimi i këtyre teknikave duhet të sigurojë një qasje të dobishme për të korrigjuar programet tuaja ATtiny2313. Ju mund t'i gjeni këto mjete të dobishme ndërsa vazhdojmë me këtë Udhëzues.

Hapi 5: Përdorimi i kohëmatësit/numëruesit 0 për sinjalizues

Përdorimi i kohëmatësit/numëruesit 0 për bip
Përdorimi i kohëmatësit/numëruesit 0 për bip

ATtiny2313 ka dy burime të fuqishme kohëmatëse/numëruese: një 8-bit dhe një 16-bit. Këto mund të konfigurohen si gjeneratorë të frekuencës, kontrollues të modulimit të gjerësisë së impulsit të ndryshueshëm dhe regjistra krahasues të daljeve. Funksionaliteti i plotë i këtyre përshkruhet në 49 faqe të fletës së të dhënave. Sidoqoftë, ne do të përdorim një rast të thjeshtë. Vetëm Kohëmatësi/Numëruesi 0 (ai 8-bitësh) do të përdoret dhe do të përdoret thjesht si gjenerator frekuence. Frekuenca do të kalojë në një altoparlant të vogël për të prodhuar një bip. Kohëmatësi/Numëruesi 0 përshkruhet plotësisht në faqet 66 deri 83 të fletës së të dhënave ATtiny2313. Një lexim i afërt i këtij materiali do t'i sigurojë një person një kuptim të plotë të Kohës/Numëruesit 0. Për fat të mirë, një mënyrë mjaft e thjeshtë, Clear Timer on Compare (CTC), është gjithçka që kërkohet për të gjeneruar tingullin e sinjalit që ne duam.

Për mënyrën që ne do të përdorim, funksionimi i kohëmatësit/numëruesit është i drejtpërdrejtë. Kur zgjidhet një sinjal i orës, numëruesi fillon me zero dhe rrit çdo puls të orës. Kur vlera e numëratorit arrin vlerën në Regjistrin e Krahasimit të Daljeve (TOP), numëruesi rivendoset në zero dhe numërimi fillon përsëri. Biti i daljes i lidhur me Kohëmatësin/Numëruesin ndryshohet për të prodhuar një dalje valore katrore. Kjo drejton drejtpërdrejt një dhënës audio për të bërë një tingull bip. Një transmetues i vogël audio TDK prodhon bip. Një njësi e përshtatshme është Digikey 445-2530-ND, TDK SD1209T3-A1 (kam përdorur një version të hershëm të kësaj). Ky është një version 3 volt; versioni 5 volt gjithashtu do të funksionojë unë pres. Unë e heq këtë direkt nga porti dalës i Attiny2313 dhe duket se funksionon mirë. Sparkfun ka një pajisje të ngjashme.

Hapi 6: Konfigurimi i kohëmatësit/numëruesit 0

Modaliteti CTC mund të përdoret për të ndryshuar daljen OC0A në Pin 2, Port B (kunja fizike 14). Për të aktivizuar daljen në këtë kunj, DDRB duhet të vendoset në mënyrë të përshtatshme. Kodi C për këtë është njësoj si të vendosni një dalje për një dritë blinkenlight. DDRB = _BV (PB2); // Porti B2 është një dalje. Hapi tjetër është të siguroni një sinjal të orës dhe të ngarkoni regjistrin e krahasimit të daljes për të prodhuar një formë vale si frekuencë. Ekuacioni për frekuencën që rezulton është dhënë në fletën e të dhënave (faqe 72). Kushtet në ekuacion do të përshkruhen më poshtë. Këtu është ekuacioni: fOC0A = fclk_I/O/2*N*(1+OCR0A) Ku fOC0A: = frekuenca e daljes fclk_I/O: = frekuenca e burimit të orës N: = faktori i paracaktimit të orës OCR0A: = vlera në regjistrin e krahasimit të daljes për Timer/ Counter 0A. Frekuenca e burimit të orës, fclk_I/O Kjo është frekuenca e orës së sistemit. Vlera e paracaktuar është 1 MHz. Bitet CS00, CS01 dhe CS02 të TCCR0B kontrollojnë këtë përzgjedhje. Meqenëse këto bite gjithashtu zgjedhin vlerën e N, ajo përshkruhet më pas. Vlera e parakalimit, NN është vlera e përdorur për të ndarë, ose para -shkallëzuar, orën e sistemit. Bitet CS00, CS01 dhe CS02 të TCCR0B kontrollojnë këtë përzgjedhje. Tabela 41 në faqen 81 të fletës së të dhënave ATtiny2313 përshkruan kombinimet. Meqenëse një frekuencë afër 1kHz është e dëshiruar, bitet CS00 dhe CS01 të TCCR0B do të vendosen. Vini re se vendosja e të tre bitëve në 0, duke zgjedhur kështu asnjë burim të orës, ndalon efektivisht daljen. Kjo është metoda që do të përdoret për të filluar dhe ndaluar bip. Vlera TOP, OCR0Kjo vlerë është vlera TOP për numëruesin e cila është ngarkuar në Regjistrin e Krahasimit të Daljeve për Kohëmatësin/Numëruesin 0A. Kur të arrihet kjo vlerë, numëruesi do të rivendoset në zero dhe numërimi do të fillojë përsëri derisa të arrihet TOP dhe cikli të përsëritet. TOP modifikohet lehtë, kështu që frekuenca e sinjalit është e lehtë për tu ndryshuar. Meqenëse një frekuencë pranë 1kHz është e dëshiruar, TOP është vendosur në 7. (Vini re se parashkruesi mund të ishte vendosur në 8, dhe TOP i vendosur në 63. I njëjti rezultat - zgjedhja juaj.) Frekuenca e daljes, fOC0APërdorimi i ekuacionit për të llogaritur rezultatet e frekuencës së daljes në: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Mbyll mjaft! Këtu keni kodin për të ngarkuar Regjistrin e Krahasimit të Daljeve dhe Regjistrin e Kontrollit të Kohëmatësit 0B. Ju lutemi shikoni kodin aktual të programit për të kuptuar se si përdoren këto. OCR0A = 7; // Vlera e kohës TCCR0B = _BV (CS01) | _BV (CS00); // Zgjidh orën e brendshme & prescale = 8 TCCR0B = 0; // asnjë burim i orës nuk fik tonin Vendosja e modalitetit të kohës/numëruesit Si detaj i fundit, ne do të specifikojmë modalitetin kohëmatës/numërues që dëshirojmë duke vendosur bite të përshtatshme në regjistruesin e kohëmatësit/numërimit 0A. Modaliteti CTC zgjidhet duke vendosur bitin WGM01 siç përshkruhet në Tabelën 40, faqe 79 të fletës së të dhënave. Meqenëse duam që dalja të ndryshojë çdo cikël, bit COM0A0 gjithashtu duhet të vendoset siç përshkruhet në Tabelën 34 në faqen 77. Këtu është kodi: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Modaliteti i kalimit të CTC

Hapi 7: Përdorimi i katër ndërprerësve

Ndërsa zbatojmë sinjalin, le të zgjerojmë harduerin dhe softuerin tonë për të trajtuar katër ndërprerës. Meqenëse dalja e Kohëmatësit Counter 0A është në Portin B, pin 2, ne nuk mund të lidhim thjesht më shumë ndërprerës në mënyrë radhazi në Portin B. Një zgjidhje e lehtë do të ishte përdorimi i Portës D, por le ta mbajmë atë port të disponueshëm për funksione të tjera (ndoshta një motor stepper). Pra, le të lidhim çelsat shtesë në PB3 dhe PB4. Leximi i çelsave është kryesisht i pandryshuar. Vlera e maskës ndryshohet në 0x1B (00011011 binar) në maskën e bitit 2 së bashku me 5, 6 dhe 7. Një mashtrim tjetër përdoret për të krijuar një numër binar 4-bit. Zhvendosni bitët 3 dhe 4 djathtas një bit dhe kombinojini ato me bitët 0 dhe 1 në një numër binar 4 bitësh. Kjo është sintaksa standarde C për zhvendosjen dhe kombinimin e pjesëve, por mund të mos jetë shumë e njohur për fillestarët. but1a = (but1 & 0x03) | ((por1 & 0x18) >> 1); // but1 ka leximin e ndërprerësNë funksionim, programi do të pulsojë dy herë dhe do të bjerë dy herë për të sinjalizuar fillimin. Sa herë që ndërrohen ndërprerësit, numri që ato përfaqësojnë do të bjerë. Kur çelsat nuk ndryshojnë, LED do të pulsojë. Për të ekzekutuar këtë kod, krijoni një direktori të re (quajeni Beep nëse ju pëlqen) dhe shkarkoni skedarin e mëposhtëm të kodit C dhe futeni në të. Riemërtoni Makefile2.txt vetëm në Makefile. Duke përdorur WinAVR, përpiloni programin dhe ngarkojeni atë në Attiny2313 tuaj.

Hapi 8: Përdorimi i Ndërtuesit të Ndërprerësit/rastit

Hapi i fundit është "vetëm softuer": Siç ishte premtuar, ne do të zbatojmë konstruksionin e ndërprerës/rastit. Edhe pse ky shembull tregon vetëm dy veprime alternative, duhet të jetë shumë e qartë se si të përdoret ky konstrukt për të zgjedhur një nga disa seksione të kodit alternativ. Në funksion, ky program monitoron çelsin dhe nëse ka një ndryshim, ai do të bip numrin e duhur nëse është tek; do të vezullojë nëse numri është çift. Nuk bën asgjë nëse një ndërrues nuk ndryshon.

Për të ekzekutuar këtë kod, krijoni një drejtori të re (quajeni Switch nëse ju pëlqen) dhe shkarkoni skedarin e mëposhtëm të kodit C dhe bëni skedar në të. Riemërtoni Makefile3.txt vetëm në Makefile. Duke përdorur WinAVR, përpiloni programin dhe ngarkojeni atë në Attiny2313 tuaj.

Hapi 9: Përfundim

Përfundim
Përfundim

Pra, kjo është ajo! Tani ju e dini se si t'i përdorni çelsat për të kontrolluar ekzekutimin e programit tuaj duke i lexuar ato dhe duke zgjedhur një veprim bazuar në cilësimin e ndërprerësit. Ju gjithashtu dini si të krijoni një tingull biip dhe keni mësuar edhe ndonjë strategji korrigjimi.

Nëse dëshironi të provoni të kuptuarit tuaj, provoni të modifikoni programin e fundit për të dhënë bip në një zë të lartë nëse është i barabartë, bip një shënim të ulët nëse është i çuditshëm dhe ndezni LED vazhdimisht nëse nuk ka ndryshim në çelsat. Ju mund të dëshironi të shikoni përsëri në pjesën për korrigjimin e gabimeve për ndihmë.

Recommended: