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, Studeni
Anonim
Prekidači za čitanje s ATtiny2313
Prekidači za čitanje s ATtiny2313

Bilo je nekoliko instruktora koji 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-s-AVR-mikroprocesorom/. Radeći na najnovijem iz The Real Elliota, koji je pokazao kako kontrolirati koračne motore, otkrio sam da bi bilo jako korisno imati mogućnost pokretanja zamjenskih odjeljaka koda u istom programu pa nisam morao reprogramirati svaki ATtiny2313 vrijeme kad sam htio isprobati malu varijaciju koda (kao što je polukorak ili trčanje koraka unatrag). Iako je lako napisati kôd pomoću naredbe switch/case kako bi se omogućio odabir zamjenskih varijacija, potreban je neki način odabira slučaja. To znači da se za kontrolu kućišta mora čitati neka vrsta ulaznog uređaja. 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 temelju 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 pogrešaka.

Korak 1: Ulazni uređaj

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

Ovaj Instructable temelji se na izvrsnom radu The Real Elliota i koristi razvojni sustav ATtiny2313 Ghetto koji opisuje. ATtiny2313 podatkovni list tvrtke Atmel krajnja 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 podatkovne listove, 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 s jednim bacanjem (SPST). Obično je jedna veza ili stup svake sklopke vezana za masu, dok je druga veza visoko povučena kroz otpornik za ograničavanje struje (10 K ili više). Otpornikom je na pol spojen ulaz mikrokontrolera. Ako je prekidač otvoren, mikrokontroler će očitati ulaz kao HI. Ako je sklopka zatvorena, mikrokontroler će očitati ulaz LO. Za pojedinosti 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 jednostavno mogu 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 postavka.) Uključite pull-up otpornike: PORTB = _BV (PB0) | _BV (PB1); Očitajte ulaze: but1 = ~ PINB & 0x03; Zapamtite uporabu inverzije i maskiranja kako biste dobili ispravnu vrijednost.

Korak 2: Blinkenlights za signal

Pomoću ova dva prekidača trepćemo LED diodu koja se može programirati nekoliko 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š će program 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čitanje se bilježi. Ako se razlikuje od oldBut vrijednosti (zadnja spremljena vrijednost), tada se program odgađa 500 milisekundi i prekidači se ponovno č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 pozornost na inverziju vrijednosti jer prekidač koji je "uključen" čita LO. Prekidači će se neprestano skenirati radi daljnjih izmjena. Molimo vas da pogledate ranije upute The Real Elliota da biste saznali više o blinkenlightsu. Pogledajte ovaj https://www.ganssle.com/debouncing.pdf kako biste saznali više o uklanjanju prekidača. Evo ATtiny2313 koda za ovaj primjer. Tijekom rada ovaj će program dvaput treptati LED na PB4 (fizički pin 8) kako bi pokazao da je inicijaliziran. Zatim će čitati prekidače jedan i dva, a trepnuti će jedan do tri puta, ovisno o postavci prekidača kad god se promijene. Kad se prekidači ne mijenjaju, LED će polako treptati. Da biste pokrenuli ovaj kôd, stvorite novi direktorij (nazovite ga "Basic" ako želite) i preuzmite sljedeću datoteku C koda i makefile u nju. Preimenujte Makefile1.txt u samo Makefile. Pomoću WinAVR -a sastavite program i učitajte ga u svoj ATtiny2313.

Korak 3: Mala digresija pri otklanjanju pogreš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 čini ono što očekujete. Možda jednostavno ne radi ništa! Pa u čemu je problem? Kako ćete to saznati? Srećom, postoji nekoliko pristupa kako bi stvari funkcionirale. (Nabavite ovu knjigu za izvrstan prikaz teme otklanjanja pogrešaka. Http://www.debuggingrules.com/) Želio bih ponuditi nekoliko jednostavnih prijedloga koji se odnose na temu otklanjanja pogrešaka u aplikacijama mikrokontrolera. Prvi korak je nadogradnja što ti znaš. Ako ste jednom uključili blinkenlight, upotrijebite ga ponovo da vidite gdje se nalazite u svom programu. Volim da LED dioda dvaput zatreperi kako bi signalizirala 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 (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _kašnjenje_ms (1000); PORTD = ~ _BV (PD4); _kašnjenje_ms (1000); računati--; }} Sada je moguće koristiti ovu funkciju na različitim mjestima u vašem kodu 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 nije učinio ono što ste očekivali, kako biste pronašli pogreške. Promjena jedne po jedne stvari ključna je tehnika i za otklanjanje pogrešaka (opisano u gornjoj referenci). Ova klasična metoda funkcionira zajedno s "podijeli pa vladaj": poduzimajući dječje korake za postupno dodavanje funkcionalnosti. Ovo se može činiti kao spor pristup, ali nije ni približno toliko spor kao pokušaj ispravljanja velikih dijelova neradnog koda odjednom.

Korak 4: Više otklanjanja pogrešaka

Mnogo je puta kada želimo provjeriti dio koda preskačući većinu redaka u njemu, a zatim ih omogućujući jednu po jednu dok provjeravamo radi li svaki. Obično to činimo "komentiranjem" redaka koje želimo preskočiti. Proširenje ove tehnike je izrezivanje i lijepljenje bloka koda, komentiranje izvornika (da ga ne izgubimo) i hakiranje kopije. C ima četiri jednostavna načina za komentiranje redaka. Postavljanje "//" ispred retka komentira taj redak. Zatvaranjem jednog ili više redaka u "/*" i "*/" komentirat će se cijeli odjeljak. Da bi ova metoda djelovala učinkovito, u bloku koda ne smije biti drugih "*/" (osim završnog). Stoga je učinkovita disciplina koristiti // za komentare unutar blokova koda i rezervirati / * * / konstrukciju za blokove komentara i za komentiranje dijelova koda. Postavljanje "#if 0" na početak bloka za komentiranje 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 sastavi, upotrijebite "#define (identifier)" ranije u programu. Imajte na umu da su navodnici samo za naglasak i ne smiju se uključivati. Kombiniranje ovih tehnika trebalo bi pružiti koristan pristup otklanjanju pogrešaka u vašim programima ATtiny2313. Ovi alati će vam možda biti korisni dok budemo prolazili kroz ovu uputu.

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

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

ATtiny2313 ima dva snažna izvora vremena/brojača: jedan 8-bitni i jedan 16-bitni. Oni se mogu konfigurirati kao generatori frekvencije, regulatori modulacije promjenjive širine impulsa i registri za usporedbu izlaza. Puna funkcionalnost opisana je na 49 stranica podatkovnog lista. No, poslužit ćemo se jednostavnim slučajem. Koristit će se samo Timer/Brojač 0 (8-bitni) koji će se koristiti jednostavno kao generator frekvencije. Frekvencija će se preusmjeriti na mali zvučnik kako bi se proizveo zvučni signal. Mjerač vremena/brojač 0 u potpunosti je opisan na stranicama 66 do 83 lista s podacima ATtiny2313. Pomno čitanje ovog materijala pružit će vam potpuno razumijevanje vremena/brojača 0. Srećom, 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 jednostavan. Kad je odabran signal sata, brojač počinje od nule i povećava svaki impuls takta. Kad vrijednost brojača dosegne vrijednost u registru usporedbe izlaza (TOP), brojač se vraća na nulu i odbrojavanje počinje ponovno. Izlazni bit povezan s mjeračem vremena/brojačem prebacuje se na izlaz kvadratnog vala. Ovo izravno pokreće audio sondu za stvaranje zvučnog signala. Mali zvučni pretvarač TDK proizvodi zvučni signal. Prikladna jedinica je Digikey 445-2530-ND, TDK SD1209T3-A1 (koristio sam ranu verziju ovoga). Ovo je verzija od 3 volta; verzija od 5 volti također će raditi očekivano. Vozim ovo izravno s 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); // Priključak B2 je izlaz. Sljedeći korak je opskrba signalom takta i učitavanje izlaznog registra za usporedbu za stvaranje valnog oblika kao frekvencije. Jednadžba za rezultirajuću frekvenciju data je u podatkovnom 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 usporedbe izlaza za Timer/ Brojač 0A. Časovna frekvencija izvora, fclk_I/OOvo je frekvencija takta sustava. Zadana vrijednost je 1MHz. Bitovi CS00, CS01 i CS02 TCCR0B kontroliraju ovaj odabir. Budući da ti bitovi također odabiru vrijednost N, to je opisano u nastavku. Vrijednost predškolca, NN je vrijednost koja se koristi za dijeljenje ili predskaliranje sistemskog sata. Bitovi CS00, CS01 i CS02 TCCR0B kontroliraju ovaj odabir. Tablica 41 na stranici 81 podatkovnog lista 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, dakle odabir izvora takta, učinkovito zaustavlja izlaz. Ovo je metoda koja će se koristiti za pokretanje i zaustavljanje zvučnog signala. TOP vrijednost, OCR0AOva vrijednost je TOP vrijednost za brojač koji se učitava u registar usporedbe izlaza za mjerač vremena/brojač 0A. Kad se postigne ova vrijednost, brojač će se vratiti na nulu i odbrojavanje će početi ponovno 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čun 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; // Vremenska vrijednost TCCR0B = _BV (CS01) | _BV (CS00); // Odaberite unutarnji sat & predmjer = 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 podatkovnom listu. Budući da želimo da se izlaz mijenja za svaki ciklus, bit COM0A0 također je potrebno postaviti kako 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 svoj hardver i softver na četiri prekidača. Budući da se izlaz brojača timera 0A nalazi na priključku B, pin 2, ne možemo jednostavno spojiti više prekidača uzastopno na priključak B. Jednostavno rješenje bilo bi korištenje porta D, ali neka taj port ostane dostupan 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 mijenja se u 0x1B (00011011 binarno) kako bi se maskirao bit 2 zajedno s 5, 6 i 7. Još jedan trik koristi se za stvaranje 4-bitnog binarnog broja. Pomicanje bitova 3 i 4 udesno za jedan bit te ih kombinirajte s bitovima 0 i 1 u 4 -bitni binarni broj. Ovo je standardna C sintaksa za pomicanje i kombiniranje bitova, ali početnicima možda neće biti dobro poznata. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 ima očitanje prekidačaU radu, program će dvaput zatreperiti i dvaput zvučnim signalom signalizirati inicijalizaciju. Kad god se prekidači promijene, broj koji predstavljaju će se oglasiti zvučnim signalom. Kad se prekidači ne mijenjaju, LED će treptati. Da biste pokrenuli ovaj kôd, stvorite novi direktorij (nazovite ga Beep ako želite) i preuzmite sljedeću datoteku C koda i makefile u nju. Preimenujte Makefile2.txt u samo Makefile. Pomoću WinAVR -a sastavite 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. Tijekom rada ovaj program nadzire prekidače i ako dođe do promjene, oglasit će zvučni signal odgovarajući broj 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. Pomoću WinAVR -a sastavite program i učitajte ga u svoj Attiny2313.

Korak 9: Zaključak

Zaključak
Zaključak

Znaci to je to! Sada znate kako pomoću prekidača kontrolirati izvršavanje vašeg programa čitajući ih i odabirom radnje na temelju postavke prekidača. Također znate stvoriti zvučni signal, a također ste naučili i neke strategije otklanjanja pogrešaka.

Ako želite provjeriti svoje razumijevanje, pokušajte izmijeniti posljednji program tako da se oglasi visokim zvučnim signalom ako je paran, bip niskim tonom ako je neparan, a LED lampica neprestano trepće ako nema promjena u prekidačima. Možda biste htjeli pogledati natrag u odjeljak o otklanjanju pogrešaka za pomoć.

Preporučeni: