Sadržaj:

Prekidači za čitanje s ATtiny2313: 9 koraka
Prekidači za čitanje s ATtiny2313: 9 koraka

Video: Prekidači za čitanje s ATtiny2313: 9 koraka

Video: Prekidači za čitanje s ATtiny2313: 9 koraka
Video: Как записать загрузчик Outseal PLC Nano на Arduino Nano 2024, Juli
Anonim
Prekidači za čitanje sa ATtiny2313
Prekidači za čitanje sa ATtiny2313

Bilo je nekoliko instrukcija koje se bave izlazima iz ATtiny2313 i sličnih AVR uređaja. Na primjer, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-sa-AVR-mikroprocesorom/. Radeći na najnovijem iz The Real Elliota, koji je pokazao kako se upravlja koračnim motorima, otkrio sam da bi bilo zaista korisno imati mogućnost pokretanja zamjenskih dijelova koda u istom programu pa nisam morao reprogramirati svaki ATtiny2313 vrijeme kad sam htio isprobati malu varijaciju koda (poput polukoraka ili pokretanja stepera unatrag). Iako je lako pisati kôd pomoću naredbe switch/case kako bi se omogućio izbor alternativnih varijacija, potreban je neki način odabira slučaja. To znači da se mora čitati neka vrsta ulaznog uređaja za kontrolu kućišta. Srećom, ATtiny2313 ima dosta I/O pinova i dobro je dizajniran za čitanje ulaza sa sklopki. Ovaj Instructable će pokazati kako čitati unose i donositi odluke na osnovu njihovog stanja. Budući da bi samo to moglo biti prilično dosadno za instruktore, objasnit ću jednostavan način korištenja mogućnosti mjerača vremena/brojača na ATtiny2313 za pogon malog zvučnika kao bipera. Bit će i male digresije o jednostavnim tehnikama otklanjanja grešaka.

Korak 1: Ulazni uređaj

Ulazni uređaj
Ulazni uređaj
Ulazni uređaj
Ulazni uređaj

Ovaj Instructable se nadovezuje na odličan rad The Real Elliota i koristi razvojni sistem ATtiny2313 Ghetto koji opisuje. ATtiny2313 podatkovni list iz Atmela najbolja je referenca za sve funkcije, ali nije nužno lako čitati. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Link sadrži sve AVR listove podataka, pronađite 2313.) Slika prikazuje jednostavan skup ulaznih prekidača. Ovo je jednostavno paket od četiri prekidača za uključivanje/isključivanje; poznat i kao jednopolni prekidači sa jednim bacanjem (SPST). Obično je jedna veza ili stup svakog prekidača vezana za uzemljenje, dok je druga veza visoko povučena kroz otpornik za ograničavanje struje (10 K ili više). Ulaz mikrokontrolera spojen je na pol pomoću otpornika. Ako je prekidač otvoren, mikrokontroler će očitati ulaz kao HI. Ako je prekidač zatvoren, mikrokontroler će očitati ulaz LO. Za detalje pogledajte shemu. ATtiny2313 pojednostavljuje stvari pružajući programabilne pull-up otpornike na I/O pinovima kada su konfigurirani kao ulazi. To znači da prekidači mogu jednostavno imati jedan pol vezan za masu (LO), a drugi pol spojen na ulaz procesora. Prvi primjer prikazuje samo dva prekidača. Prekidači se čitaju i konfiguriraju sa sljedećim kodom. Konfigurirajte prekidače kao ulaze: (Nije potreban kôd; ovo je zadana vrijednost.) Uključite pull-up otpornike: PORTB = _BV (PB0) | _BV (PB1); Očitajte ulaze: but1 = ~ PINB & 0x03; Zapamtite upotrebu inverzije i maskiranja da biste dobili ispravnu vrijednost.

Korak 2: Blinkenlights za signal

Ova dva prekidača koristit ćemo za treptanje LED -a programiran broj puta. LED diode koje ćemo koristiti bit će blinkeri koje je The Real Elliot proslavio. Prekidači 1 i 2 bit će tretirani kao dvije binarne znamenke, pa kombinacija može predstavljati brojeve 0, 1, 2 i 3. Naš program će pročitati dva prekidača i treptati LED odgovarajući broj puta, ali samo ako je prekidač postavke su se promijenile. Prekidači se odvajaju 500 milisekundi (nije optimizirano). Algoritam debounce je prilično jednostavan. Prekidači se očitavaju i očitavanje se bilježi. Ako se razlikuje od oldBut vrijednosti (zadnja spremljena vrijednost), tada se program odgađa za 500 milisekundi i prekidači se ponovo čitaju. Ako je vrijednost ista kao prethodno pročitana, vrijednost oldBut će se ažurirati i LED će treperiti onoliko puta koliko implicira binarna vrijednost dva prekidača. Obratite pažnju na inverziju vrijednosti jer prekidač koji je "uključen" čita LO. Prekidači će se neprestano skenirati radi daljnjih promjena. Molimo vas da pogledate ranije upute The Real Elliota da biste saznali više o blinkenlightsu. Pogledajte ovaj https://www.ganssle.com/debouncing.pdf da biste saznali više o uklanjanju prekidača. Evo ATtiny2313 koda za ovaj primjer. Tokom rada, ovaj program će dvaput treptati LED na PB4 (fizički pin 8) kako bi pokazao da je inicijaliziran. On će tada čitati prekidače jedan i dva i treptati jedan do tri puta u zavisnosti od postavki prekidača kad god se promijene. Kada se prekidači ne mijenjaju, LED će polako treptati. Da biste pokrenuli ovaj kôd, kreirajte novi direktorij (nazovite ga "Basic" ako želite) i preuzmite sljedeću datoteku C koda i makefile u nju. Preimenujte Makefile1.txt u samo Makefile. Koristeći WinAVR, kompajlirajte program i učitajte ga u svoj ATtiny2313.

Korak 3: Mala digresija pri otklanjanju grešaka

Ako ste poput mene (i svakog drugog programera na svijetu), vjerojatno ste doživjeli trenutke kada kôd bez grešaka koji ste pažljivo unijeli i sastavili ne radi ono što očekujete. Možda jednostavno ne radi ništa! U čemu je problem? Kako ćete saznati? Srećom, postoji nekoliko pristupa kako bi stvari funkcionirale. (Nabavite ovu knjigu za odličan tretman teme otklanjanja grešaka. Http://www.debuggingrules.com/) Želio bih ponuditi nekoliko jednostavnih prijedloga koji se odnose na temu otklanjanja grešaka u aplikacijama mikrokontrolera. Prvi korak je nadogradnja ono što znaš. Ako ste jednom uključili blinkenlight, ponovo ga upotrijebite da vidite gdje se nalazite u svom programu. Volio bih da LED dioda dvaput zatreperi kako bi signalizirao početak programa. Kôd možete unijeti da biste to učinili na početku programa. Kad znate da s vašim hardverom ništa nije u redu, stvorite funkciju koja će treptati. Evo funkcije koju koristim./*------------------------------------------ ------------------------------ ** blinkEm-funkcija treptanja LED-a pomoću PD4 ** PD4 mora biti konfigurirana kao izlaz. ** ------------------------------------------------ ---------------------*/void blinkEm (broj uint8_t) {while (broj> 0) {PORTD = _BV (PD4); _dey_ms (1000); PORTD = ~ _BV (PD4); _dey_ms (1000); count--; }} Sada je moguće koristiti ovu funkciju na različitim tačkama koda kao signal da se kôd do sada izvršio. Znajući da je kôd pokrenut znači da možete pažljivo pregledati svaki odjeljak koji je pokrenut, ali niste učinili ono što ste očekivali, kako biste pronašli greške. Mijenjanje jedne po jedne stvari ključna je tehnika i za otklanjanje grešaka (opisano u gornjoj referenci). Ova klasična metoda funkcionira zajedno s "podijeli i osvoji": poduzimanje bebi koraka za postupno dodavanje funkcionalnosti. Ovo može izgledati kao spor pristup, ali nije ni približno toliko spor kao pokušaj otklanjanja grešaka velikog dijela neradnog koda odjednom.

Korak 4: Više otklanjanja grešaka

Mnogo je puta kada želimo provjeriti dio koda preskačući većinu redova u njemu, a zatim ih omogućujući jednu po jednu dok provjeravamo da li svaki radi. Obično to radimo "komentiranjem" redova koje želimo preskočiti. Proširenje ove tehnike je izrezivanje i lijepljenje bloka koda, komentiranje originala (kako ga ne bismo izgubili) i hakovanje kopije. C ima četiri jednostavna načina za komentiranje redova. Stavljanjem "//" ispred reda komentira se taj redak. Zatvaranjem jednog ili više redova u "/*" i "*/" komentirat će se cijeli odjeljak. Da bi ova metoda djelovala efikasno, ne smije biti drugog "*/" u kodnom bloku (osim završnog). Dakle, efikasna disciplina je upotreba // za komentare unutar blokova koda i zadržavanje / * * / konstrukcije za blokove komentara i za komentarisanje dijelova koda. Postavljanje "#if 0" na početak bloka za komentarisanje i završavanje odjeljka s "#endif". Više selektivne kontrole moguće je pomoću "#ifdef (identifikator)" na početku bloka i "#endif" na kraju. Ako želite da se blok prevede, upotrijebite "#define (identifier)" ranije u programu. Imajte na umu da navodnici služe samo za naglašavanje i ne uključuju se. Kombinacija ovih tehnika trebala bi pružiti koristan pristup otklanjanju grešaka u vašim programima ATtiny2313. Ovi alati će vam možda biti korisni dok nastavljamo s uputama.

Korak 5: Korištenje mjerača vremena/brojača 0 za zvučne signale

Korištenje mjerača vremena/brojača 0 za bipove
Korištenje mjerača vremena/brojača 0 za bipove

ATtiny2313 ima dva moćna izvora vremena/brojača: jedan 8-bitni i jedan 16-bitni. Oni se mogu konfigurirati kao generatori frekvencije, kontroleri za modulaciju promjenjive širine impulsa i registri za usporedbu izlaza. Potpuna funkcionalnost ovih opisana je na 49 stranica lista s podacima. Međutim, poslužit ćemo se jednostavnim slučajem. Koristit će se samo mjerač vremena/brojač 0 (8-bitni) koji će se koristiti jednostavno kao generator frekvencije. Učestalost će biti usmjerena na mali zvučnik kako bi se proizveo zvučni signal. Tajmer/brojač 0 je u potpunosti opisan na stranicama 66 do 83 lista sa podacima ATtiny2313. Pomno čitanje ovog materijala pružit će vam potpuno razumijevanje vremena/brojača 0. Na sreću, prilično jednostavan način, Clear Timer on Compare (CTC), je sve što je potrebno za generiranje zvučnog signala koji želimo.

Za način rada koji ćemo koristiti, rad mjerača vremena/brojača je direktan. Kad je odabran signal sata, brojač počinje od nule i povećava svaki takt. Kad vrijednost brojača dosegne vrijednost u registru za usporedbu izlaza (TOP), brojač se vraća na nulu i odbrojavanje počinje ponovo. Izlazni bit povezan s mjeračem vremena/brojačem prebacuje se na izlaz kvadratnog vala. Ovo direktno pokreće audio pretvarač za stvaranje zvučnog signala. Mali TDK audio pretvarač proizvodi zvučni signal. Odgovarajuća jedinica je Digikey 445-2530-ND, TDK SD1209T3-A1 (koristio sam ranu verziju ovoga). Ovo je verzija od 3 volta; 5 voltna verzija će također raditi, očekujem. Vozim ovo direktno sa izlaznog porta Attiny2313 i čini se da radi dobro. Sparkfun ima sličan uređaj.

Korak 6: Konfiguriranje mjerača vremena/brojača 0

CTC način rada može se koristiti za prebacivanje izlaza OC0A na pin 2, port B (fizički pin 14). Da biste omogućili izlaz na ovom pinu, DDRB mora biti odgovarajuće postavljen. C kod za ovo je isto kao i postavljanje izlaza za blinkenlight. DDRB = _BV (PB2); // Port B2 je izlaz. Sljedeći korak je isporuka takta i učitavanje izlaznog registra za usporedbu da bi se dobio valni oblik kao frekvencija. Jednadžba za rezultirajuću frekvenciju data je u tehničkom listu (stranica 72). Pojmovi u jednadžbi bit će opisani u nastavku. Evo jednadžbe: fOC0A = fclk_I/O/2*N*(1+OCR0A) Gdje je fOC0A: = izlazna frekvencija fclk_I/O: = frekvencija izvora sata N: = faktor predskale sata OCR0A: = vrijednost u registru za usporedbu izlaza za Timer/ Brojač 0A. Časovna frekvencija izvora, fclk_I/OOvo je frekvencija sistemskog takta. Zadana vrijednost je 1MHz. Bitovi CS00, CS01 i CS02 TCCR0B kontroliraju ovaj odabir. Budući da ovi bitovi također odabiru vrijednost N, to je opisano u nastavku. Vrijednost predskalera, NN je vrijednost koja se koristi za dijeljenje ili predskaliranje sistemskog takta. Bitovi CS00, CS01 i CS02 TCCR0B kontroliraju ovaj odabir. Tablica 41 na stranici 81 lista s podacima o ATtiny2313 opisuje kombinacije. Budući da je željena frekvencija blizu 1 kHz, bit će postavljeni bitovi CS00 i CS01 TCCR0B. Imajte na umu da postavljanje sva tri bita na 0, čime se ne bira izvor takta, učinkovito zaustavlja izlaz. Ovo je metoda koja će se koristiti za pokretanje i zaustavljanje zvučnog signala. TOP vrijednost, OCR0ATova vrijednost je TOP vrijednost za brojač koji se učitava u registar usporedbe izlaza za mjerač vremena/brojač 0A. Kada se postigne ova vrijednost, brojač će se vratiti na nulu i odbrojavanje će početi ponovo sve dok se ne dosegne TOP i ciklus se ponavlja. TOP se lako mijenja, pa se frekvencija bipera lako mijenja. Budući da je željena frekvencija blizu 1 kHz, TOP je postavljen na 7. (Imajte na umu da je predkaler mogao biti postavljen na 8, a TOP na 63. Isti rezultat - vaš izbor.) Izlazna frekvencija, fOC0AKorištenje jednadžbe za izračunavanje rezultata izlazne frekvencije u: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977HzDovoljno blizu! Evo koda za učitavanje registra usporedbe izlaza i registra brojača mjerača vremena 0B. Molimo pogledajte stvarni programski kod da biste razumjeli kako se oni koriste. OCR0A = 7; // Vrijednost vremena TCCR0B = _BV (CS01) | _BV (CS00); // Odabir internog sata & predmjera = 8 TCCR0B = 0; // nijedan izvor sata ne isključuje ton Postavljanje vremena/brojačkog načina Kao posljednji detalj, odredit ćemo željeni način mjerača vremena/brojača postavljanjem odgovarajućih bitova u registru mjerača vremena/brojača 0A. CTC način rada odabire se postavljanjem bita WGM01 kako je opisano u Tablici 40, stranica 79 u podatkovnoj tablici. Budući da želimo da izlaz mijenja svaki ciklus, bit COM0A0 također treba postaviti kao što je opisano u Tablici 34 na stranici 77. Evo koda: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC Toggle Mode

Korak 7: Korištenje četiri prekidača

Kako implementiramo zvučni signal, proširimo naš hardver i softver na četiri prekidača. Budući da se izlaz brojača mjerača vremena 0A nalazi na priključku B, pin 2, ne možemo jednostavno priključiti više prekidača uzastopno na port B. Jednostavno rješenje bilo bi korištenje porta D, ali ostavimo taj port na raspolaganju za druge funkcije (možda koračni motor). Priključimo dodatne prekidače na PB3 i PB4. Čitanje prekidača uglavnom je nepromijenjeno. Vrijednost maske se mijenja u 0x1B (00011011 binarno) kako bi se maskirao bit 2 zajedno sa 5, 6 i 7. Još jedan trik se koristi za stvaranje 4-bitnog binarnog broja. Pomaknite bitove 3 i 4 udesno za jedan bit i kombinirajte ih s bitovima 0 i 1 u 4 -bitni binarni broj. Ovo je standardna C sintaksa za prebacivanje i kombiniranje bitova, ali početniku možda neće biti dobro poznata. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 ima prekidač za čitanjeU toku rada, program će dvaput zatreptati i dva puta zapištati kako bi signalizirao inicijalizaciju. Kad god se prekidači promijene, broj koji predstavljaju će se oglasiti zvučnim signalom. Kada se prekidači ne mijenjaju, LED će treptati. Da biste pokrenuli ovaj kôd, kreirajte novi direktorij (nazovite ga zvučnim signalom ako želite) i preuzmite sljedeću datoteku C koda i makefile u nju. Preimenujte Makefile2.txt u samo Makefile. Koristeći WinAVR, kompajlirajte program i učitajte ga u svoj Attiny2313.

Korak 8: Upotreba prekidača/kućišta Construct

Posljednji korak je "samo softver": Kao što je obećano, implementirat ćemo konstrukciju prekidača/kućišta. Iako ovaj primjer prikazuje samo dvije zamjenske radnje, trebalo bi biti vrlo jasno kako koristiti ovu konstrukciju za odabir jednog od nekoliko zamjenskih odjeljaka koda. Tokom rada, ovaj program prati prekidače i ako dođe do promjene, oglasit će zvučni signal odgovarajućeg broja ako je neparan; treptat će ako je broj paran. Ne radi ništa osim ako se ne promijeni prekidač.

Da biste pokrenuli ovaj kôd, stvorite novi direktorij (nazovite ga Switch ako želite) i preuzmite sljedeću datoteku C koda i makefile u nju. Preimenujte Makefile3.txt u samo Makefile. Koristeći WinAVR, kompajlirajte program i učitajte ga u svoj Attiny2313.

Korak 9: Zaključak

Zaključak
Zaključak

To je to! Sada znate kako koristiti prekidače za kontrolu izvršavanja vašeg programa čitajući ih i odabirom radnje na osnovu postavke prekidača. Takođe znate kako stvoriti zvučni signal, a naučili ste i neke strategije otklanjanja grešaka.

Ako želite provjeriti svoje razumijevanje, pokušajte izmijeniti posljednji program tako da se oglasi visokim zvučnim signalom ako je paran, pišite nisku notu ako je neparan, i neprestano treperite LED ako nema promjena u prekidačima. Možda biste htjeli pogledati nazad u odjeljak o otklanjanju grešaka za pomoć.

Preporučuje se: