Turinys:

Skaitymo jungikliai naudojant ATtiny2313: 9 žingsniai
Skaitymo jungikliai naudojant ATtiny2313: 9 žingsniai

Video: Skaitymo jungikliai naudojant ATtiny2313: 9 žingsniai

Video: Skaitymo jungikliai naudojant ATtiny2313: 9 žingsniai
Video: Mastering Active Directory Health: Dcdiag Troubleshooting Tips for IT Pros 2024, Lapkritis
Anonim
Skaitymo jungikliai naudojant ATtiny2313
Skaitymo jungikliai naudojant ATtiny2313

Buvo keletas instrukcijų, susijusių su ATtiny2313 ir panašių AVR įrenginių išėjimais. Pavyzdžiui, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Variklis su AVR mikroprocesoriumi/. Dirbdamas su naujausiu „The Real Elliot“, kuriame buvo parodyta, kaip valdyti žingsninius variklius, pastebėjau, kad būtų tikrai naudinga, jei toje pačioje programoje būtų galima paleisti alternatyvius kodo skyrius, todėl man nereikėjo perprogramuoti kiekvieno „ATtiny2313“norėjau išbandyti nedidelį kodo variantą (pvz., pusę žingsnio arba paleisti žingsnį atvirkščiai). Nors lengva parašyti kodą naudojant jungiklio/atvejo pareiškimą, kad būtų galima pasirinkti alternatyvius variantus, reikia tam tikro atvejo pasirinkimo būdo. Tai reiškia, kad norint valdyti bylą reikia perskaityti tam tikrą įvesties įrenginį. Laimei, „ATtiny2313“turi daug įvesties/išvesties kaiščių ir yra gerai suprojektuotas skaityti įvestis iš jungiklių. Ši instrukcija parodys, kaip skaityti įvestis ir priimti sprendimus pagal jų būseną. Kadangi vien tai padarys gana nuobodų „Instructable“, paaiškinsiu paprastą būdą, kaip naudoti „ATtiny2313“laikmačio/skaitiklio funkciją, kad būtų galima garsiakalbiu valdyti mažą garsiakalbį. Taip pat bus atliktas nedidelis nukrypimas nuo paprastų derinimo metodų.

1 žingsnis: įvesties įrenginys

Įvesties įrenginys
Įvesties įrenginys
Įvesties įrenginys
Įvesties įrenginys

Ši instrukcija remiasi puikiu „The Real Elliot“darbu ir naudoja jo aprašytą „ATtiny2313 Ghetto“kūrimo sistemą. „Atmel“duomenų lapas „ATtiny2313“yra galutinė visų funkcijų nuoroda, tačiau jį nebūtinai lengva perskaityti. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Nuorodoje yra visi AVR duomenų lapai, suraskite 2313.) Paveikslėlyje parodytas paprastas įvesties jungiklių rinkinys. Tai tiesiog keturių įjungimo/išjungimo jungiklių paketas; taip pat žinomas kaip vieno poliaus, vieno metimo jungikliai (SPST). Paprastai kiekvieno jungiklio viena jungtis arba polius yra prijungtas prie žemės, o kita jungtis aukštai ištraukiama per srovės ribojimo rezistorių (maždaug 10K). Prie rezistoriaus prie poliaus prijungtas mikrovaldiklio įėjimas. Jei jungiklis atidarytas, mikrovaldiklis skaitys įvestį kaip HI. Jei jungiklis uždarytas, mikrovaldiklis skaitys įvestį LO. Išsamesnės informacijos ieškokite schemoje. ATtiny2313 supaprastina dalykus, įvesties/išvesties kaiščiuose pateikdama programuojamus ištraukiamus rezistorius, kai jie sukonfigūruoti kaip įėjimai. Tai reiškia, kad jungikliai gali tiesiog turėti vieną polių, prijungtą prie žemės (LO), o kitą - prie procesoriaus įvesties. Pirmasis pavyzdys rodo tik du jungiklius. Jungikliai skaitomi ir konfigūruojami pagal šį kodą. Sukonfigūruokite jungiklius kaip įvestis: (kodo nereikia; tai numatytoji nuostata.) Įjunkite traukiamus rezistorius: PORTB = _BV (PB0) | _BV (PB1); Skaitykite įvestis: but1 = ~ PINB & 0x03; Atkreipkite dėmesį į inversijos ir maskavimo naudojimą, kad gautumėte teisingą vertę.

2 žingsnis: mirksi signalo lemputės

Mes naudosime šiuos du jungiklius, kad LED mirksėtų programuojamą skaičių kartų. Šviesos diodai, kuriuos naudosime, bus „The Real Elliot“pagarsėję blyksniai. 1 ir 2 jungikliai bus laikomi dviem dvejetainiais skaitmenimis, todėl derinys gali reikšti skaičius 0, 1, 2 ir 3. Mūsų programa skaitys du jungiklius ir mirksės šviesos diodą atitinkamą skaičių kartų, bet tik tuo atveju, jei jungiklis nustatymai pasikeitė. Jungikliai atjungiami 500 milisekundžių (neoptimizuota). Išjungimo algoritmas yra gana paprastas. Jungikliai skaitomi ir rodmenys pažymimi. Jei ji skiriasi nuo „oldBut“reikšmės (paskutinė išsaugota vertė), tada programa atidedama 500 milisekundžių ir jungikliai perskaitomi dar kartą. Jei vertė yra tokia pati, kaip ir anksčiau, „oldBut“vertė bus atnaujinta, o šviesos diodas mirksės tiek kartų, kiek numato dviejų jungiklių dvejetainė vertė. Atkreipkite dėmesį į vertės inversiją, nes „įjungtas“jungiklis nuskaito LO. Jungikliai bus nuolat tikrinami dėl tolesnių pakeitimų. Norėdami sužinoti daugiau apie mirksėjimo lemputes, skaitykite ankstesnes „The Real Elliot“instrukcijas. Pažvelkite į šį https://www.ganssle.com/debouncing.pdf, kad sužinotumėte daugiau apie perjungimo jungiklius. Štai šio pavyzdžio kodas ATtiny2313. Veikiant, ši programa du kartus sumirksės PB4 (fizinis 8 kaištis) šviesos diodą, kad parodytų, kad ji inicijuota. Tada jis perskaitys vieną ir du jungiklius ir mirksės nuo vieno iki trijų kartų, priklausomai nuo jungiklio nustatymo, kai jie bus pakeisti. Kai jungikliai nesikeičia, šviesos diodas lėtai mirksės. Norėdami paleisti šį kodą, sukurkite naują katalogą (jei norite, pavadinkite jį „Basic“) ir atsisiųskite šį C kodo failą ir makefile. Pervardykite „Makefile1.txt“į „Makefile“. Naudodami WinAVR, sukompiliuokite programą ir įkelkite ją į savo ATtiny2313.

3 žingsnis: nedidelis nukrypimas derinant

Jei esate panašus į mane (ir kiekvienas kitas pasaulio programuotojas), tikriausiai patyrėte laikus, kai „be klaidų“kodas, kurį kruopščiai įvedėte ir sukomponavote, nepadaro to, ko tikitės. Galbūt tai tiesiog nieko nedaro! Taigi kokia problema? Kaip ketinate tai sužinoti? Laimei, yra keletas būdų, kaip viską padaryti. (Gaukite šią knygą, kad galėtumėte puikiai derinti derinimo temą. Http://www.debuggingrules.com/) Norėčiau pasiūlyti keletą paprastų pasiūlymų, susijusių su mikrovaldiklių programų derinimo tema. Pirmasis žingsnis - remtis ką žinote. Jei „Blinkenlight“pradėjo veikti vieną kartą, naudokite jį dar kartą, kad pamatytumėte, kur esate savo programoje. Man patinka, kad šviesos diodas mirksi du kartus, kad praneštų apie programos pradžią. Norėdami tai padaryti, iš pradžių galite įvesti kodą savo programos pradžioje. Kai žinote, kad jūsų aparatinėje įrangoje nėra nieko blogo, sukurkite mirksėjimo funkciją. Štai funkcija, kurią naudoju. /-------------------------------------------------- ------------------------------ ** blinkEm-funkcija, skirta mirksėti LED naudojant PD4 ** PD4 turi būti sukonfigūruotas kaip išėjimas. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (skaičius> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); skaičiuoti--; }} Dabar šią funkciją galima naudoti įvairiuose kodo taškuose kaip signalą, kad kodas buvo įvykdytas iki šiol. Žinant, kad kodas veikia, galite atidžiai išnagrinėti kiekvieną paleistą skyrių, bet nepadarėte to, ko tikėjotės, kad rastumėte klaidų. Vieno dalyko keitimas vienu metu taip pat yra pagrindinė derinimo technika (aprašyta aukščiau esančioje nuorodoje). Šis klasikinis metodas veikia kartu su „skaldyk ir užkariauk“: imkitės kūdikio veiksmų, kad palaipsniui pridėtumėte funkcionalumo. Tai gali atrodyti kaip lėtas metodas, tačiau tai nėra beveik taip lėta, kaip bandymas vienu metu derinti didelę neveikiančio kodo dalį.

4 veiksmas: daugiau derinimo

Yra daug kartų, kai norime patikrinti kodo skyrių, praleidžiant daugumą jo eilučių, tada įgalinant juos po vieną, kai tikriname, kad kiekvienas iš jų veikia. Paprastai tai darome „komentuodami“eilutes, kurias norime praleisti. Šios technikos pratęsimas yra iškirpti ir įklijuoti kodo bloką, komentuoti originalą (kad jo neprarastume) ir nulaužti kopiją. C turi keturis paprastus būdus komentuoti eilutes. Įdėjus „//“prieš eilutę, komentuojama ši eilutė. Įtraukus vieną ar daugiau eilučių į „/*“ir „*/“, bus komentuojamas visas skyrius. Kad šis metodas veiktų efektyviai, kodo bloke (išskyrus galutinį) neturi būti jokio kito „*/“. Taigi veiksminga disciplina yra // naudoti komentarus, esančius kodo blokuose, ir rezervuoti / * * / konstrukciją komentarų blokams ir kodo sekcijų komentavimui. Jei norite komentuoti, bloko pradžioje įrašykite „#if 0“ir užbaigti skyrių „#endif“. Daugiau selektyviai valdyti galima naudojant „#ifdef (identifier)“bloko pradžioje ir „#endif“pabaigoje. Jei norite, kad blokas būtų sudarytas, anksčiau programoje naudokite „#define (identifier)“. Atkreipkite dėmesį, kad kabutės yra tik akcentuojamos ir neturi būti įtrauktos. Šių metodų derinimas turėtų būti naudingas ATtiny2313 programų derinimui. Šie įrankiai jums gali būti naudingi, kai tęsiame šią instrukciją.

5 veiksmas: laikmačio/skaitiklio 0 naudojimas pyptelėjimams

Laikmačio/skaitiklio 0 naudojimas pyptelėjimams
Laikmačio/skaitiklio 0 naudojimas pyptelėjimams

„ATtiny2313“turi du galingus laikmačio/skaitiklio išteklius: vieną 8 bitų ir vieną 16 bitų. Jie gali būti sukonfigūruoti kaip dažnio generatoriai, kintamo impulso pločio moduliavimo valdikliai ir išvesties palyginimo registrai. Visas jų funkcionalumas aprašytas 49 duomenų lapo puslapiuose. Tačiau naudosime paprastą atvejį. Bus naudojamas tik laikmatis/skaitiklis 0 (8 bitų) ir jis bus naudojamas tik kaip dažnių generatorius. Dažnis bus nukreiptas į mažą garsiakalbį, kad pasigirstų pyptelėjimas. Laikmatis/skaitiklis 0 yra išsamiai aprašytas ATtiny2313 duomenų lapo 66–83 puslapiuose. Atidžiai perskaitę šią medžiagą, gausite pilną laiko/skaitiklio 0 supratimą. Laimei, norint sukurti norimą pyptelėjimo toną, pakanka gana paprasto režimo „Clear Timer on Compare“(CTC).

Mūsų naudojamam režimui laikmatis/skaitiklis veikia tiesiai. Pasirinkus laikrodžio signalą, skaitiklis prasideda nuo nulio ir didina kiekvieną laikrodžio impulsą. Kai skaitiklio vertė pasiekia išvesties palyginimo registro (TOP) vertę, skaitiklis atstatomas į nulį ir skaičiavimas pradedamas iš naujo. Išėjimo bitas, susietas su laikmačiu/skaitikliu, perjungiamas, kad būtų gauta kvadratinių bangų išvestis. Tai tiesiogiai skatina garso keitiklį skleisti pyptelėjimą. Mažas TDK garso keitiklis skleidžia pyptelėjimą. Tinkamas įrenginys yra „Digikey 445-2530-ND“, TDK SD1209T3-A1 (aš naudoju ankstesnę šios versiją). Tai 3 voltų versija; Tikiuosi, kad 5 voltų versija veiks. Aš tai vairuoju tiesiai iš „Attiny2313“išvesties prievado ir atrodo, kad jis veikia gerai. „Sparkfun“turi panašų įrenginį.

6 veiksmas: laikmačio/skaitiklio konfigūravimas 0

CTC režimą galima naudoti norint išjungti OC0A išvestį 2 kaiščio, B prievado (fizinis 14 kaištis). Norint įjungti šio kaiščio išvestį, DDRB turi būti tinkamai nustatytas. C kodas tam yra toks pat, kaip nustatyti blykstės išvestį. DDRB = _BV (PB2); // B2 prievadas yra išėjimas. Kitas žingsnis yra pateikti laikrodžio signalą ir įkelti išvesties palyginimo registrą, kad būtų sukurta bangos forma kaip dažnis. Gauto dažnio lygtis pateikta duomenų lape (72 psl.). Sąlygos lygtyje bus aprašytos žemiau. Štai lygtis: fOC0A = fclk_I/O/2*N*(1+OCR0A) Kur fOC0A: = išėjimo dažnis fclk_I/O: = laikrodžio šaltinio dažnis N: = laikrodžio išankstinio skalės koeficientas OCR0A: = vertė išvesties palyginimo registre laikmačiui/ Skaitiklis 0A. Laikrodžio šaltinio dažnis, fclk_I/O Tai yra sistemos laikrodžio dažnis. Numatytoji vertė yra 1 MHz. TCCR0B bitai CS00, CS01 ir CS02 kontroliuoja šį pasirinkimą. Kadangi šie bitai taip pat pasirenka N reikšmę, tai aprašyta toliau. Išankstinio keitiklio vertė, NN yra reikšmė, naudojama sistemos laikrodžiui padalyti arba pakeisti. TCCR0B bitai CS00, CS01 ir CS02 kontroliuoja šį pasirinkimą. 41 lentelė ATtiny2313 duomenų lapo 81 puslapyje aprašo derinius. Kadangi pageidaujamas beveik 1 kHz dažnis, bus nustatyti TCCR0B bitai CS00 ir CS01. Atminkite, kad nustačius visus tris bitus į 0 ir taip nepasirenkant laikrodžio šaltinio, išvestis veiksmingai sustabdoma. Tai metodas, kuris bus naudojamas pyptelėjimui pradėti ir sustabdyti. TOP vertė, OCR0A Ši vertė yra skaitiklio viršutinė vertė, įkelta į laikmačio/skaitiklio 0A išvesties palyginimo registrą. Pasiekus šią vertę, skaitiklis bus atstatytas į nulį ir skaičiavimas prasidės iš naujo, kol bus pasiektas TOP ir ciklas kartosis. TOP yra lengvai modifikuojamas, todėl pyptelėjimo dažnį lengva pakeisti. Kadangi norimas dažnis yra beveik 1 kHz, TOP yra nustatytas į 7. (Atkreipkite dėmesį, kad prescaleris galėjo būti nustatytas į 8, o TOP - į 63. Tas pats rezultatas - jūsų pasirinkimas.) Išėjimo dažnis, fOC0A in: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Uždarykite! Štai kodas, skirtas įkelti išvesties palyginimo registrą ir laikmačio skaitiklio valdymo registrą 0B. Žiūrėkite tikrąjį programos kodą, kad suprastumėte, kaip jie naudojami. OCR0A = 7; // Laiko vertė TCCR0B = _BV (CS01) | _BV (CS00); // Pasirinkite vidinį laikrodį & prescale = 8 TCCR0B = 0; // nė vienas laikrodžio šaltinis neišjungia tono CTC režimas pasirenkamas nustatant bitą WGM01, kaip aprašyta duomenų lentelės 40 lentelėje, 79 puslapyje. Kadangi norime, kad išvestis perjungtų kiekvieną ciklą, bitą COM0A0 taip pat reikia nustatyti, kaip aprašyta 34 lentelėje, 77 puslapyje. Štai kodas: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC perjungimo režimas

7 žingsnis: keturių jungiklių naudojimas

Įdiegdami pyptelėjimą, išplėsime savo aparatinę ir programinę įrangą, kad būtų galima valdyti keturis jungiklius. Kadangi laikmačio skaitiklio 0A išvestis yra B prievade, 2 kaištyje, mes negalime paprasčiausiai prijungti daugiau jungiklių iš eilės prie B prievado. Paprastas sprendimas būtų naudoti D prievadą, tačiau palikime tą prievadą prieinamą kitoms funkcijoms (galbūt žingsninis variklis). Taigi prijunkime papildomus jungiklius prie PB3 ir PB4. Jungiklių skaitymas dažniausiai nesikeičia. Kaukės vertė pakeičiama į 0x1B (00011011 dvejetainė), kad būtų užmaskuotas 2 bitas kartu su 5, 6 ir 7. Kitas triukas naudojamas 4 bitų dvejetainiam skaičiui sukurti. Perkelkite 3 ir 4 bitus į dešinįjį bitą ir sujunkite juos su bitais 0 ir 1 į 4 bitų dvejetainį skaičių. Tai yra standartinė C sintaksė keičiant ir derinant bitus, tačiau naujokams ji gali būti nepakankamai žinoma. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 turi jungiklio nuskaitymą Veikdamas programa du kartus sumirksės ir du kartus pypsės, kad signalizuotų apie inicijavimą. Kiekvieną kartą keičiant jungiklius, pypsi jų nurodytas numeris. Kai jungikliai nesikeičia, šviesos diodas mirksi. Jei norite paleisti šį kodą, sukurkite naują katalogą (jei norite, pavadinkite jį pyptelėjimu) ir atsisiųskite šį C kodo failą ir makefile. Pervardykite „Makefile2.txt“į „Makefile“. Naudodami „WinAVR“, sukompiliuokite programą ir įkelkite ją į „Attiny2313“.

8 veiksmas: jungiklio/dėklo konstrukcijos naudojimas

Paskutinis žingsnis yra „tik programinė įranga“: kaip žadėta, mes įgyvendinsime jungiklio/dėklo konstrukciją. Nors šiame pavyzdyje rodomi tik du alternatyvūs veiksmai, turėtų būti labai aišku, kaip naudoti šią konstrukciją norint pasirinkti vieną iš kelių alternatyvių kodų sekcijų. Veikiant, ši programa stebi jungiklius ir, jei pasikeičia, pypsės atitinkamu skaičiumi, jei jis nelyginis; mirksi, jei skaičius lygus. Tai nieko nedaro, nebent pasikeičia jungiklis.

Norėdami paleisti šį kodą, sukurkite naują katalogą (jei norite, pavadinkite jį „Switch“) ir atsisiųskite šį C kodo failą bei makefile. Pervardykite „Makefile3.txt“į „Makefile“. Naudodami „WinAVR“, sukompiliuokite programą ir įkelkite ją į „Attiny2313“.

9 žingsnis: Išvada

Išvada
Išvada

Taigi viskas! Dabar jūs žinote, kaip naudoti jungiklius, kad galėtumėte valdyti savo programos vykdymą, perskaitydami juos ir pasirinkdami veiksmą pagal jungiklio nustatymą. Jūs taip pat žinote, kaip sukurti pyptelėjimo toną, taip pat išmokote derinimo strategijos.

Jei norite patikrinti savo supratimą, pabandykite pakeisti paskutinę programą, kad pyptelėtų aukštai, jei lygiai, pyptelėkite žemą pastabą, jei nelyginė, ir nuolat mirksėkite, jei jungikliai nepasikeis. Galbūt norėsite Grįžkite į skyrių apie derinimą, kad gautumėte pagalbos.

Rekomenduojamas: