Ceas binar pe ATmega32 - microcontrolere și tehnologie

Totul a început cu faptul că am vrut să fac un dispozitiv complet finalizat pe un microcontroler AVR. Alegerea a căzut pe ceas binar, deoarece Ele sunt ușor de făcut și arata destul de impresionant. Și pentru că mi-a plăcut întotdeauna plasmoid de la KDE ceas binar care arată astfel:

Ceas binar pe ATmega32 - microcontrolere și tehnologie

Ce este un ceas binar?

Pentru cei care nu știu ce este un ceas binar și cum să le identifice timp pentru digresiune. Ceas binar este un ceas care afișează ora în sistemul număr binar (sau binar), în loc de obicei noi zecimale.

Ceas binar poate fi diferit (așa cum, în general, și orele obișnuite) - cu un număr diferit și dispunerea de indicatori, cu sau fără secunde, cu format de 24 de biți sau 12 de ore, etc. Am decis să oprească pe opțiunea cea mai similară cu plasmoid menționată mai sus din KDE:

Ceas binar pe ATmega32 - microcontrolere și tehnologie

Ceasul este format din șase coloane verticale - două coloane pe ceas, două pentru minute și două pe a doua (de la stânga la dreapta). Fiecare coloană este în esență o singură cifră (adică două cifre pentru ore, minute și secunde).

În patru ore, linia orizontală, așa cum trebuie să fie în măsură să prezinte numerele de la zero la nouă (cel puțin pentru cel mai puțin semnificativ), iar reprezentarea binară a nouă - 1001 conține patru biți (biți). LSB este în partea de jos.

Deci, ideea este clar, proceda la punerea în aplicare.

Începem cu un indicator ( „dial“) - care este o matrice de LED-uri.
Deoarece ceasul orizontală 4 și 6, rândurile verticale, numărul total de LED-uri necesare - 6 * 4 = 24. De fapt, este posibil să se administreze un număr mai mic de LED-uri, deoarece nu toate biți vor fi utilizate - de exemplu, cifre semnificative de ore (coloana din stânga), poate arăta numărul de nu mai mult de două (la douăzeci de ore în format timp), și apoi puteți salva la fel de mult ca două LED-uri. Dar nu am făcut și a pus toate cele 24 de LED-uri, ca Am vrut (în viitor) folosesc acest ceas pentru a afișa mesaje text simplu.

butoanele necesare pentru a regla ora. Trei dintre ele: primul buton transformă modul de setare și înapoi ceasul. Al doilea buton, selectați cifre comută coloana în care timpul configurat în prezent. În cele din urmă, o treime crește timpul în coloana selectată de către unul.

Microcontrolerul este folosit ca ATmega32. Desigur, nu este necesar de a utiliza un astfel de microcontroler puternic pentru o astfel de sarcină simplă, dar el era deja în mâna mea, așa că am folosit-o.

Schema și placa de circuit

Schema este destul de standard: microcontroler, putere, reset, un conector pentru programator. Prin TOSC1 și TOSC2 ceas de cuarț conectat la care va fi ticăie ceasul. Butoane de reglare Timp tras până la tensiunea de alimentare. Zece ieșiri LED-uri (coloanele 6 + 4 linii). La fiecare linie orizontală este conectat un rezistor de limitare a curentului prin LED.

Ceas binar pe ATmega32 - microcontrolere și tehnologie

Placa de circuit a transformat o singură față, dar încă cu doi jumperi pe de altă parte (marcate cu roșu), care fac doar suficient de sârmă subțire de cupru.

Ceas binar pe ATmega32 - microcontrolere și tehnologie

Aceasta este, probabil, partea cea mai neinteresante. Dar, în același timp, ea a fost cea care a luat cel mai mult timp.

Cazul în sine este făcută din scânduri de lemn deținute împreună cu cuie și lipici. După asamblare, placa a fost atent șlefuit, se colorează și a descoperit mai multe straturi de lac mobilier.

LED-urile sunt instalate în grătarul cu pereți despărțitori din linii de lemn cu ajutorul unui puzzle. In fiecare celula cu un LED pentru împrăștierea luminii este inserată o bucată de hârtie calc convențională (care este utilizat pentru desene sau modele).

La partea din față a orelor de sticlă lipite bilaterală mată. Partea din spate a capacului se închide pe șuruburi, care ies în afară de butonul de setare de timp.

Am decis să scrie un program în limbaj de asamblare. Nu pentru că este dezvoltarea limbajului cel mai convenabil, dar numai în scopuri educaționale. Codul sursă poate fi găsit mai jos în arhivă.

Scanarea se realizează pe coloane, adică LED-urile pentru prima dată sunt doar prima coloană și apoi a doua, etc. Acest lucru se întâmplă foarte repede, iar ochiul nu are timp să-l observe, astfel încât se pare că toate LED-urile sunt aprinse simultan. Pentru a afișa valorile de timp în coloana utilizează DISPLAY_COLUMN macro. Comutarea se realizează prin coloană Timer0 cronometru.

schimbarea de timp are loc o dată o a doua întrerupere Timer / counter2 depășirea timer-ului. Deoarece frecvența egală cu 32768Gts cuarț, prescaler și un cronometru este setat la 128, byte temporizator overflow va avea loc o dată pe secundă (32768 / (128 * 256) = 1). care este foarte convenabil.

Procesarea intrarile de la tastatura are loc în procedurile de transfer button_stop_pressed oră modul de setare și butoanele pentru, button_set_pressed pentru butonul de setare de timp și button_switch_pressed pentru butonul de comutare pe coloană. Vă rugăm să rețineți că procedura button_stop_pressed ora curentă este stocată în EEPROM. Acest lucru se face în așa fel încât cel mai puțin timp nu este resetat, dacă doriți, de exemplu, pentru a comuta ceasul la o altă ieșire (în cazul în care timpul de ceas este citit din EEPROM).

Toate marile „munca“, cum ar fi - starea studiu al butoanelor, comutați coloana activă timp de scanare și ieșire se produce în principal. Inițializarea se realizează în resetare.