Cuprins:

Comutatoare de citire cu ATtiny2313: 9 pași
Comutatoare de citire cu ATtiny2313: 9 pași

Video: Comutatoare de citire cu ATtiny2313: 9 pași

Video: Comutatoare de citire cu ATtiny2313: 9 pași
Video: TUTORIAL: Demontare maner interior usa sofer VW Golf 5, Jetta, Touran in 2 pasi 2024, Iulie
Anonim
Comutatoare de citire cu ATtiny2313
Comutatoare de citire cu ATtiny2313

Au existat mai multe instructabile care se ocupă de ieșirile de la ATtiny2313 și dispozitive AVR similare. De exemplu, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-cu-un-microprocesor-AVR /. Lucrând la cea mai recentă versiune din The Real Elliot, care a arătat cum să controleze motoarele pas cu pas, am constatat că ar fi foarte util să pot rula secțiuni alternative de cod în același program, așa că nu a trebuit să reprogramez fiecare ATtiny2313 timp am vrut să încerc o ușoară variație de cod (cum ar fi jumătate de pas sau rularea pasului în sens invers). Deși este ușor să scrieți cod folosind o declarație switch / case pentru a permite selectarea variantelor alternative, este necesară o modalitate de selectare a casei. Asta înseamnă că trebuie citit un fel de dispozitiv de intrare pentru a controla carcasa. Din fericire, ATtiny2313 are o mulțime de pini I / O și este bine conceput pentru citirea intrărilor de la comutatoare. Acest instructable va arăta cum să citiți intrările și să luați decizii în funcție de starea lor. Deoarece numai asta ar face un instructabil destul de plictisitor, vă voi explica o modalitate simplă de a folosi capacitatea de temporizare / contorizare a ATtiny2313 pentru a conduce un difuzor mic ca bip. De asemenea, va exista o mică digresiune asupra tehnicilor simple de depanare.

Pasul 1: dispozitivul de intrare

Dispozitivul de intrare
Dispozitivul de intrare
Dispozitivul de intrare
Dispozitivul de intrare

Acest Instructable se bazează pe munca excelentă a The Real Elliot și folosește sistemul de dezvoltare ATtiny2313 Ghetto pe care îl descrie. Fișa tehnică ATtiny2313 de la Atmel este cea mai bună referință pentru toate funcțiile, dar nu este neapărat ușor de citit. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Linkul are toate fișele de date AVR, localizați 2313.) Figura arată un set simplu de comutatoare de intrare. Acesta este pur și simplu un pachet de patru comutatoare de pornire / oprire; cunoscut și sub numele de comutatoare cu un singur pol, cu o singură aruncare (SPST). De obicei, o conexiune sau un stâlp al fiecărui comutator este legat la masă, în timp ce cealaltă conexiune este trasă într-un rezistor de limitare a curentului (aproximativ 10K). O intrare de microcontroler este conectată la pol cu rezistorul. Dacă comutatorul este deschis, microcontrolerul va citi intrarea ca HI. Dacă comutatorul este închis, microcontrolerul va citi intrarea LO. Consultați schema pentru detalii. ATtiny2313 simplifică lucrurile oferind rezistențe de tragere programabile pe pinii I / O atunci când sunt configurate ca intrări. Aceasta înseamnă că întrerupătoarele pot avea pur și simplu un pol legat la masă (LO) și celălalt pol conectat la o intrare de procesor. Primul exemplu arată doar două comutatoare. Comutatoarele sunt citite și configurate cu următorul cod. Configurați comutatoarele ca intrări: (Nu este necesar cod; acesta este valoarea implicită.) Porniți rezistențele de tracțiune: PORTB = _BV (PB0) | _BV (PB1); Citiți intrările: but1 = ~ PINB & 0x03; Rețineți utilizarea inversării și mascării pentru a obține valoarea corectă.

Pasul 2: lumini intermitente pentru un semnal

Vom folosi aceste două comutatoare pentru a clipi un LED de mai multe ori programabil. LED-urile pe care le vom folosi vor fi luminile intermitente pe care The Real Elliot le-a făcut celebre. Comutatoarele 1 și 2 vor fi tratate ca două cifre binare, astfel încât combinația poate reprezenta numerele 0, 1, 2 și 3. Programul nostru va citi cele două comutatoare și va clipi LED-ul de numărul corespunzător de ori, dar numai dacă comutatorul setările s-au schimbat. Comutatoarele sunt excluse pentru 500 de milisecunde (nu sunt optimizate). Algoritmul debounce este destul de simplu. Comutatoarele sunt citite și se notează citirea. Dacă este diferită de valoarea oldBut (ultima valoare salvată), atunci programul este întârziat cu 500 de milisecunde și comutatoarele sunt citite din nou. Dacă valoarea este aceeași cu cea citită anterior, valoarea oldBut va fi actualizată și LED-ul va clipi de câte ori implică valoarea binară a celor două comutatoare. Rețineți inversarea valorii deoarece un comutator care este „pornit” citește LO. Comutatoarele vor fi scanate continuu pentru modificări ulterioare. Vă rugăm să consultați Instructables anterioare de The Real Elliot pentru a afla mai multe despre luminile intermitente. Aruncați o privire la acest https://www.ganssle.com/debouncing.pdf pentru a afla mai multe despre comutatoarele de dezabonare. Iată codul ATtiny2313 pentru acest exemplu. În funcțiune, acest program va clipi LED-ul de pe PB4 (pinul fizic 8) de două ori pentru a arăta că este inițializat. Apoi va citi comutatoarele unu și doi și va clipi de una până la trei ori, în funcție de setarea comutatorului ori de câte ori acestea sunt schimbate. Când comutatoarele nu se schimbă, LED-ul va clipi încet. Pentru a rula acest cod, creați un nou director (numiți-l „Basic” dacă doriți) și descărcați următorul fișier de cod C și makefile în el. Redenumiți Makefile1.txt la doar Makefile. Folosind WinAVR, compilați programul și încărcați-l în ATtiny2313.

Pasul 3: o deviere minoră la depanare

Dacă sunteți ca mine (și orice alt programator din lume) probabil ați avut momente în care codul „fără erori” pe care l-ați introdus și compilat cu atenție nu face ceea ce vă așteptați să facă. Poate pur și simplu nu face nimic! Deci care este problema? Cum vei afla? Din fericire, există mai multe abordări pentru a face lucrurile să funcționeze. (Obțineți această carte pentru un tratament excelent al subiectului de depanare. Http://www.debuggingrules.com/) Aș dori să vă ofer câteva sugestii simple referitoare la subiectul depanării aplicațiilor de microcontroler. ce stii. Dacă ați obținut o lumină intermitentă pentru a funcționa o dată, atunci utilizați-o din nou pentru a vedea unde vă aflați în program. Îmi place ca LED-ul să clipească de două ori pentru a semnala începerea programului. Puteți introduce codul pentru a face acest lucru inițial la începutul programului. După ce știți că nimic nu este în neregulă cu hardware-ul dvs., creați o funcție pentru a clipi. Iată funcția pe care o folosesc./*------------------------------------------ ------------------------------ ** blinkEm - funcția pentru a clipi LED folosind PD4 ** PD4 trebuie configurat ca ieșire. ** ------------------------------------------------ --------------------- * / void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); numara--; }} Acum este posibil să utilizați această funcție în diferite puncte ale codului dvs. ca semnal că codul a fost executat până acum. Știind că codul rulează înseamnă că puteți examina cu atenție fiecare secțiune care a rulat, dar nu a făcut ceea ce vă așteptați, pentru a găsi erori. Schimbarea unui singur lucru la un moment dat este o tehnică cheie și pentru depanare (descrisă în referința de mai sus). Această metodă clasică funcționează împreună cu „împărțiți și cuceriți”: luând pași pentru a adăuga funcționalitate în mod incremental. Aceasta poate părea o abordare lentă, dar nu este la fel de lentă ca încercarea de a depana o secțiune mare de cod care nu funcționează simultan.

Pasul 4: mai multe depanări

De multe ori vrem să verificăm o secțiune de cod sărind peste majoritatea liniilor din ea, apoi activându-le pe rând, pe măsură ce verificăm că fiecare funcționează. De obicei, facem acest lucru „comentând” rândurile pe care dorim să le omitem. O extensie a acestei tehnici constă în tăierea și lipirea unui bloc de cod, comentarea originalului (ca să nu o pierdem) și eliminarea copiei. C are patru modalități ușoare de a comenta liniile. Punând „//” în fața unei linii comentează acea linie. Dacă introduceți una sau mai multe linii în „/ *” și „* /” se va comenta o secțiune întreagă. Pentru ca această metodă să funcționeze eficient, nu trebuie să existe alt „* /” în blocul de cod (altul decât cel de finalizare). Deci, o disciplină eficientă este de a folosi // pentru comentarii în blocuri de cod și de a rezerva construcția / * * / pentru blocuri de comentarii și pentru comentarea secțiunilor de cod. Plasând „#if 0” la începutul unui bloc pentru a comenta și încheierea secțiunii cu „#endif”. Mai mult control selectiv este posibil folosind „#ifdef (identificator)” la începutul unui bloc și „#endif” la sfârșit. Dacă doriți ca blocul să fie compilat, utilizați „#define (identificator)” mai devreme în program. Rețineți că ghilimelele sunt doar pentru accentuare și nu trebuie incluse. Combinarea acestor tehnici ar trebui să ofere o abordare utilă pentru depanarea programelor ATtiny2313. Puteți găsi utile aceste instrumente pe măsură ce parcurgem acest instructabil.

Pasul 5: Utilizarea temporizatorului / Contorului 0 pentru bipuri

Utilizarea temporizatorului / contorului 0 pentru bipuri
Utilizarea temporizatorului / contorului 0 pentru bipuri

ATtiny2313 are două resurse puternice de temporizare / contor: una pe 8 biți și una pe 16 biți. Acestea pot fi configurate ca generatoare de frecvență, controlere variabile de modulare a lățimii impulsurilor și registre de comparare a ieșirilor. Funcționalitatea completă a acestora este descrisă în 49 de pagini ale fișei tehnice. Cu toate acestea, vom folosi un caz simplu. Se va utiliza numai Timer / Counter 0 (cel de 8 biți) și va fi folosit pur și simplu ca generator de frecvență. Frecvența va fi direcționată către un difuzor mic pentru a produce un semnal sonor. Temporizatorul / Contorul 0 este complet descris în paginile 66 până la 83 din fișa tehnică ATtiny2313. O lectură atentă a acestui material vă va oferi o înțelegere completă a timpului / contorului 0. Din fericire, un mod destul de simplu, Clear Timer on Compare (CTC), este tot ceea ce este necesar pentru a genera tonul sonor dorit.

Pentru modul pe care îl vom folosi, funcționarea temporizatorului / contorului este simplă. Când este selectat un semnal de ceas, contorul pornește de la zero și crește fiecare impuls de ceas. Când valoarea contorului atinge valoarea din Registrul de comparare a rezultatelor (TOP), contorul se resetează la zero și numărarea începe din nou. Bitul de ieșire asociat temporizatorului / contorului este comutat pentru a produce o ieșire cu undă pătrată. Acest lucru conduce direct un traductor audio pentru a face un sunet sonor. Un traductor audio TDK mic produce bip. O unitate adecvată este Digikey 445-2530-ND, TDK SD1209T3-A1 (am folosit o versiune anterioară a acestui lucru). Aceasta este o versiune de 3 volți; Versiunea de 5 volți va funcționa, de asemenea, mă aștept. Îl conduc direct de pe portul de ieșire al lui Attiny2313 și se pare că funcționează bine. Sparkfun are un dispozitiv similar.

Pasul 6: Configurarea temporizatorului / contorului 0

Modul CTC poate fi folosit pentru a comuta ieșirea OC0A pe pinul 2, portul B (pinul fizic 14). Pentru a activa ieșirea pe acest pin, DDRB trebuie setat corespunzător. Codul C pentru acest lucru este la fel ca configurarea unei ieșiri pentru o lumină intermitentă. DDRB = _BV (PB2); // Portul B2 este o ieșire. Următorul pas este furnizarea unui semnal de ceas și încărcarea registrului de comparare a ieșirii pentru a produce o formă de undă ca frecvență. Ecuația pentru frecvența rezultată este dată în fișa tehnică (pagina 72). Termenii din ecuație vor fi descriși mai jos. Iată ecuația: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) Unde fOC0A: = frecvența de ieșire fclk_I / O: = frecvența sursei de ceas N: = factorul de precalare a ceasului OCR0A: = valoarea în registrul de comparare a ieșirii pentru Timer / Contor 0A. Frecvența sursei de ceas, fclk_I / O Aceasta este frecvența ceasului sistemului. Valoarea implicită este 1MHz. Biții CS00, CS01 și CS02 din TCCR0B controlează această selecție. Deoarece acești biți selectează, de asemenea, valoarea lui N, este descrisă în continuare. Biții CS00, CS01 și CS02 din TCCR0B controlează această selecție. Tabelul 41 de la pagina 81 a fișei de date ATtiny2313 descrie combinațiile. Deoarece se dorește o frecvență de aproape 1kHz, biții CS00 și CS01 din TCCR0B vor fi setați. Rețineți că setarea tuturor celor trei biți la 0, selectând astfel nicio sursă de ceas, oprește efectiv ieșirea. Aceasta este metoda care va fi utilizată pentru a porni și a opri semnalul sonor. Valoarea TOP, OCR0A Această valoare este valoarea TOP pentru contorul care este încărcat în registrul de comparație de ieșire pentru cronometru / contor 0A. Când această valoare este atinsă, contorul va fi resetat la zero și numărarea va începe din nou până când se atinge TOP și ciclul se repetă. TOP se modifică cu ușurință, astfel încât frecvența semnalului sonor este ușor de schimbat. Deoarece se dorește o frecvență de aproape 1kHz, TOP este setat la 7. (Rețineți că prescalerul ar fi putut fi setat la 8 și TOP setat la 63. Același rezultat - alegerea dvs.) Frecvență de ieșire, fOC0A Folosind ecuația pentru a calcula rezultatele frecvenței de ieșire în: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977Hz Închideți suficient! Iată codul pentru încărcarea registrului de comparare a ieșirii și a registrului de control al contorului temporizator 0B. Vă rugăm să consultați codul actual al programului pentru a înțelege modul în care acestea sunt utilizate. OCR0A = 7; // Valoare timp TCCR0B = _BV (CS01) | _BV (CS00); // Selectați ceasul intern & prescale = 8 TCCR0B = 0; // nici o sursă de ceas nu oprește tonul Setarea modului Timp / Contor Ca un ultim detaliu, vom specifica modul Timer / Contor dorit prin setarea biților corespunzători în Registrul de control Timer / Contor 0A. Modul CTC este selectat prin setarea bitului WGM01 așa cum este descris în Tabelul 40, pagina 79 din foaia de date. Deoarece dorim ca ieșirea să comute fiecare ciclu, bitul COM0A0 trebuie de asemenea setat așa cum este descris în Tabelul 34 de la pagina 77. Iată codul: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Modul de comutare CTC

Pasul 7: Utilizarea a patru comutatoare

Pe măsură ce implementăm semnalul sonor, să extindem hardware-ul și software-ul nostru pentru a gestiona patru comutatoare. Deoarece ieșirea contorului temporizator 0A este pe portul B, pinul 2, nu putem conecta pur și simplu mai multe comutatoare secvențial la portul B. O soluție ușoară ar fi utilizarea portului D, dar să păstrăm acel port disponibil pentru alte funcții (probabil un motor pas cu pas). Deci, să conectăm comutatoarele suplimentare la PB3 și PB4. Citirea comutatoarelor este în mare parte neschimbată. Valoarea măștii este modificată la 0x1B (00011011 binar) pentru a masca bitul 2 împreună cu 5, 6 și 7. Un alt truc este folosit pentru a crea un număr binar pe 4 biți. Deplasați biții 3 și 4 drept un bit și combinați-i cu biții 0 și 1 într-un număr binar de 4 biți. Aceasta este sintaxa C standard pentru deplasarea și combinarea biților, dar este posibil să nu fie bine cunoscută de începători. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 are switch switch În funcțiune, programul va clipi de două ori și va emite un semnal sonor de două ori pentru a semnaliza inițializarea. De fiecare dată când comutatoarele sunt schimbate, numărul pe care îl reprezintă va fi sonor. Când comutatoarele nu se schimbă, LED-ul va clipi. Pentru a rula acest cod, creați un nou director (numiți-l Beep dacă doriți) și descărcați următorul fișier de cod C și makefile în el. Redenumiți Makefile2.txt la doar Makefile. Folosind WinAVR, compilați programul și încărcați-l în Attiny2313.

Pasul 8: Utilizarea Switch / Case Construct

Ultimul pas este „doar software”: după cum am promis, vom implementa construcția switch / case. Deși acest exemplu arată doar două acțiuni alternative, ar trebui să fie foarte clar cum să utilizați acest construct pentru a selecta una dintre mai multe secțiuni de cod alternative. În funcțiune, acest program monitorizează comutatoarele și, dacă există o modificare, va emite numărul corespunzător dacă este impar; va clipi dacă numărul este egal. Nu face nimic decât dacă se schimbă un comutator.

Pentru a rula acest cod, creați un director nou (numiți-l Schimbați dacă doriți) și descărcați următorul fișier de cod C și makefile în el. Redenumiți Makefile3.txt la doar Makefile. Folosind WinAVR, compilați programul și încărcați-l în Attiny2313.

Pasul 9: Concluzie

Concluzie
Concluzie

Deci asta este! Acum știți cum să utilizați comutatoarele pentru a controla execuția programului dvs. citindu-le și selectând o acțiune pe baza setării comutatorului. Știi, de asemenea, să creezi un ton sonor și ai învățat și câteva strategii de depanare.

Dacă doriți să vă testați înțelegerea, încercați să modificați ultimul program pentru a emite un sunet la un ton înalt dacă este egal, emiteți o notă joasă dacă este ciudată și clipește continuu LED-ul dacă nu există nicio modificare a comutatoarelor. înapoi la secțiunea despre depanare pentru ajutor.

Recomandat: