Binārais rokas pulkstenis. Pulkstenis uz AVR mikrokontrollera ar DS1307 DIY bināro pulksteni

Viss sākās ar vēlmi uz AVR mikrokontrollera izgatavot kādu pilnīgi gatavu ierīci.

Izvēle krita uz binārajiem pulksteņiem, jo Tie ir viegli izgatavojami un izskatās diezgan iespaidīgi. Un arī tāpēc, ka man vienmēr patika KDE binārā pulksteņa plazmoīds, kas izskatās šādi:

Kas ir binārais pulkstenis?

Tiem, kas nezina, kas ir binārais pulkstenis un kā pēc tā noteikt laiku, izdarīšu nelielu atkāpi. Binārais pulkstenis ir vienkārši pulkstenis, kas rāda laiku binārajā (vai binārajā) skaitļu sistēmā, nevis mums ierastajā decimālskaitļu sistēmā.

Binārie pulksteņi ir dažādi (tāpat kā parastie pulksteņi kopumā) - ar dažādiem indikatoru numuriem un atrašanās vietām, ar sekundēm vai bez tām, ar 24 vai 12 stundu laika formātu utt. Es nolēmu izvēlēties opciju, kas ir pēc iespējas līdzīga iepriekš minētajam KDE plazmoīdam:


Pulkstenis sastāv no sešām vertikālām kolonnām - divas kolonnas norāda stundas, divas minūtes un divas sekundes (no kreisās uz labo). Katra kolonna būtībā ir viens cipars (t.i., divi cipari stundām, minūtēm un sekundēm).

Pulkstenim ir četras horizontālas līnijas, jo mums ir jāspēj parādīt ciparus no nulles līdz deviņiem (vismaz vismazāk nozīmīgajam ciparam), un deviņu binārais attēlojums ir 1001 , satur četrus ciparus (bitus). Mazāk nozīmīgais cipars ir apakšā.

Vienkāršākais veids, kā saprast, cik pulkstenis rāda, ir analizēt “ciparnīcu” no kreisās puses uz labo, no apakšas uz augšu. Pierakstīsim binārā skaitļa vērtību, ko attēlo augšējā attēlā redzamā pulksteņa galējā kreisā kolonna (pieņemot, ka iedegts indikators nozīmē vienu, bet nodzisis - nulli): 0010 binārajā skaitļu sistēmā tā ir 2 - decimāldaļās. Rakstīsim otrās kolonnas vērtību līdzīgi: 0001 binārajā skaitļu sistēmā (kā decimāldaļā) vai vienkārši viens. Tas ir, pulkstenī 21 stunda. Tādā pašā veidā jūs varat lasīt, ko rāda pulkstenis 35 minūtes un 28 sekundes Nedaudz praktizējot, jūs varēsit nolasīt laiku no binārā pulksteņa gandrīz tikpat ātri kā no parastā pulksteņa.

Īstenošana

Tātad, ideja ir skaidra, ķersimies pie īstenošanas.

Sāksim ar indikatoru ("ciparnīcu") - kas ir gaismas diožu režģis.

Tā kā pulkstenim ir 4 horizontālās un 6 vertikālās rindas, kopējais nepieciešamo gaismas diožu skaits ir 6 * 4 = 24. Patiesībā jūs varat iztikt ar mazāk gaismas diožu, jo netiks izmantoti visi cipari - piemēram, pulksteņa nozīmīgākais cipars (visvairāk kreisā kolonna) var parādīt skaitli, kas nav lielāks par diviem (ar divdesmit stundu laika formātu), kas nozīmē, ka varat saglabāt pat divus Gaismas diodes. Bet es to nedarīju un uzstādīju visas 24 gaismas diodes, jo... vēlējās (nākotnē) izmantot šo pulksteni, lai rādītu vienkāršas īsziņas.

Lai iestatītu laiku, jums būs nepieciešamas pogas. Tie ir trīs: pirmā poga pārslēdz pulksteni uz laika iestatīšanas režīmu un atpakaļ. Otrā poga, ciparu izvēle, pārslēdz kolonnu, kurā pašlaik tiek regulēts laiks. Un visbeidzot, trešais palielina laiku atlasītajā kolonnā par vienu.

ATMega32 tiek izmantots kā mikrokontrolleris. Protams, nav nepieciešams izmantot tik jaudīgu mikrokontrolleri tik vienkāršam uzdevumam, bet man tāds jau bija, tāpēc es to izmantoju.

Shēma un PCB

Shēma ir diezgan standarta: mikrokontrolleris, barošanas avots, atiestatīšana, savienotājs programmētāja pievienošanai. Pulksteņa kvarcs ir savienots ar TOSC1 un TOSC2, no kuriem pulkstenis atzīmēs. Laika iestatīšanas pogas ir pievienotas barošanas spriegumam. Desmit LED izejas (6 kolonnas + 4 rindas). Katrai horizontālajai rindai ir pievienots rezistors, lai ierobežotu strāvu caur LED.

Iespiedshēmas plate izrādījās vienpusēja, bet tomēr ar diviem džemperiem otrā pusē (atzīmēti ar sarkanu), kurus ir diezgan vienkārši izgatavot no plānas vara stieples.

Rāmis

Šī, iespējams, ir visneinteresantākā daļa. Bet tajā pašā laikā tā bija viņa, kas aizņēma lielāko daļu laika.

Pats korpuss ir izgatavots no koka dēļiem, kas piestiprināti ar naglām un līmi. Pēc montāžas dēļi tika rūpīgi noslīpēti, pārklāti ar traipu un vairākām mēbeļu lakas kārtām.

Gaismas diodes ir uzstādītas režģī ar starpsienām, kas izgatavotas no koka lineāliem, izmantojot finierzāģi. Gaismas izkliedēšanai katrā šūnā ar LED tiek ievietots parastā pauspapīra gabals (ko izmanto zīmējumiem vai rakstiem).

Pulksteņa priekšpusē ir pielīmēts divpusējs matēts stikls. Aizmugurējā daļa ir pārklāta ar skrūvējamu vāku, no kura izvirzās laika iestatīšanas pogas.

Programmatūras daļa

Es nolēmu rakstīt programmu assemblerā. Ne tāpēc, ka tā ir ērtākā izstrādes valoda, bet gan tikai un vienīgi izglītības nolūkos. Avota kodus var atrast zemāk sadaļā "Faili".

Es neaprakstīšu visu kodu, jo... tas ir komentēts pietiekami detalizēti. Es aprakstīšu tikai galvenos punktus.

Skenēšana tiek veikta kolonnās, tas ir, vispirms kādu laiku iedegas tikai pirmās kolonnas gaismas diodes, pēc tam otrā utt. Tas notiek ļoti ātri un acs nepaspēj to pamanīt, tāpēc šķiet, ka visas izgaismotās gaismas diodes deg vienlaicīgi. Lai kolonnā parādītu laika vērtību, izmantojiet makro DISPLAY_COLUMN. Kolonnas tiek pārslēgtas, izmantojot Timer0 taimeri.

Laika maiņa notiek reizi sekundē, kad tiek pārtraukts taimeris/skaitītājs2. Tā kā kristāla frekvence ir 32768 Hz un taimera priekšskalotājs ir iestatīts uz 128, viena baita taimeris pārplūdīs reizi sekundē ( 32768 / (128 * 256) = 1 ), kas ir ļoti ērti.

Pogu klikšķu apstrāde notiek procedūrās button_stop_pressed pogai, lai pārslēgtu pulksteni iestatīšanas režīmā un atpakaļ, button_set_pressed laika iestatīšanas pogai un button_switch_pressed kolonnas pārslēgšanas pogai. Ņemiet vērā, ka procedūrā button_stop_pressed pašreizējais laiks tiek saglabāts EEPROM. Tas tiek darīts, lai laiks netiktu atiestatīts, ja nepieciešams, piemēram, pārslēgt pulksteni uz citu ligzdu (kad pulkstenis ir ieslēgts, laiks tiek nolasīts no EEPROM).

Viss galvenais “darbs”, piemēram, pogu stāvokļa aptauja, aktīvās skenēšanas kolonnas pārslēgšana un laika parādīšana, notiek galvenajā . Sākotnējā inicializācija tiek veikta atiestatīt.

Rezultāts

Rezultātu var redzēt zemāk esošajā video. Tur arī iemūžināti daži ražošanas procesa posmi.

Faili

Programmaparatūras, shēmu un vadu plates pirmkodi atrodas šajā GitLab repozitorijā.

Kā secinājums

Kopumā pirmajai ierīcei, manuprāt, tas izrādījās diezgan labs.

Ja šajā rakstā atrodat kādas neprecizitātes vai ja uzskatāt, ka kaut kas būtu jāapraksta sīkāk, lūdzu, rakstiet komentāros.

Labdien, dārgie radio amatieri. Piedāvāju jūsu uzmanībai bināros, Radokot atradu ķēdi, tikko nomainīju programmaparatūru 7,2 MHz kvarca rezonatoram (jo tas jau ilgu laiku tvēra putekļus uz plaukta un nezināja, kur to izmantot, Pārtaisīju dēli, tā kā autors izstrādāja, manuprāt ne visai pareizi pievadu (ceru, ka viņš neapvainosies par maniem vārdiem), pievienoju elektrības līnijai jonistoru - tas ir lielas kapacitātes kondensators, 0,47 Farads

(fotoattēlā tas ir melns, taisnstūrveida, aizzīmogots no sava veida automašīnas radio), lai, pārslēdzot UPS releju, laiks netiktu atiestatīts (tieši tajā es būvēšu šo pulksteni), un 78L05 stabilizators, jo manam nepārtrauktās barošanas blokam nav 5V sprieguma (visu loģiku tajā darbina 12V). Un kas? Kaut kā UPS izskatījās pārāk vienkārši, un tagad būs laiks parādīt un arī palīdzēt domāt binārajā kodā, kas neļaus smadzenēm atrofēties.


Es ceru, ka visi zina, kā pārvērst skaitļus no decimālskaitļiem uz bināriem? Atkārtošu katram gadījumam. Ar četriem bitiem var pārsūtīt skaitli no 1 līdz 15, bitu cena tiek aprēķināta no labās puses uz kreiso pusi, t.i., 8_4_2_1, kā redzat, augstākā bita cena ir vienāda ar divkāršu zemākā cena. Piemērs: pārvēršam 5 no decimālās sistēmas uz bināro, iegūstam 0_1_0_1, tas ir, saskaitām bitu cenu, kas vienāda ar loģisko. Un tagad, gluži pretēji, 1_0_0_1 būs 8+1=9. Sapratu? Lieliski.


Šajā pulkstenī gaismas diode nozīmē vienu, bet negaismojoša LED nozīmē nulli. Rakstam pievienoju tās ierīces fotogrāfiju, kuru atkārtoju.

Īss pusminūtes video par pulksteņa darbību

Vēloties salikt bināro pulksteni, es nekad neatradu internetā pieņemamu gatavu dizainu. Lielākajai daļai pulksteņu bija nopietns trūkums - izslēdzot strāvu, laika iestatījumi tika zaudēti. Paveicās, neilgi pirms tam es sāku apgūt C valodu un AVR mikrokontrollerus. Tāpēc tika nolemts iegūtās zināšanas nostiprināt ar praktisko pieredzi un vienlaikus izgudrot riteni no jauna. Man arī ļoti patīk zaļās mirgojošās gaismas diodes.



Shēma



RTC

Pašreizējo iestatījumu saglabāšanas problēmu lieliski atrisina reālā laika pulkstenis (RTC). Mana izvēle krita uz DS1307 mikroshēmu.

Pēc ražotāja domām, ja strāva ir izslēgta, tas var ietaupīt laiku un datumu 10 gadus, patērējot tikai CR2032 litija baterijas enerģiju. Tas ir, pulkstenis turpina tikšķēt, saglabājot pieņemamu precizitāti. Laiks netiek zaudēts; atkal ieslēdzot pulksteni, uz ciparnīcas tiek parādīts reālais laiks, nevis laiks tā izslēgšanas brīdī. Mikroshēma sazinās ar mikrokontrolleri, izmantojot “kvadrātveida kopni” I 2 C, ziņojot par precīzu laiku un pieņemot tā jaunās vērtības.

Ierīces sirds

Mega32a mikrokontrollera izvēli noteica šādi faktori:
Ir pietiekami daudz pieslēgvietu, lai izvairītos no dinamiskā displeja izmantošanas, kas man nepatīk galvenokārt tāpēc, ka tas kairina acis (mirkšķināšana augstā frekvencē jebkurā gadījumā ir nedabiska). Es ar to iepazinos, spēlējot ar PIC mikrokontrolleriem Proton PICBasic valodā, un, ja ir iespējams neizmantot dinamisko displeju, es gribētu to darīt.
Salīdzinoši zemas izmaksas 130 rubļi (piemēram, Mega16a maksā tikpat), un ar atlaidi parasti ir 104 rubļi.
Caurspīdīgs QPF-44 iepakojums, ar ērtu tapu


Ports “A” parāda sekundes, ports “B” parāda minūtes, un ports “C” parāda stundas. Ir ļoti ērti, ka no DS1307 ņemtās laika vērtības var piešķirt pieslēgvietām bez izmaiņām. Pogas ir savienotas ar portu “D” (kontakti 3-7), tapas 0 un 1 darbojas attiecīgi kā pulksteņa līnija (SCL) un seriālā datu līnija (SDA). RTC mikroshēma ir konfigurēta tā, lai tā savā septītajā daļā rada impulsus ar frekvenci 1 herts. Šī kāja ir savienota ar porta “D” 3. tapu. Šis ports pats par sevi ir konfigurēts kā ieeja, un katram gadījumam ir iekļauti iekšējie pievilkšanas elementi uz barošanas bloku plus, kas dublēti ar SMD rezistoriem ārpusē. Šādas darbības pilnībā pasargā no jebkādiem pārsteigumiem.

Gaismas diodes


Es izvēlējos gaismas diodes matētā korpusā ar zemu spilgtumu. Vispirms tika pārbaudītas spilgtas diodes caurspīdīgā korpusā, taču pat ar strāvu 3 mA tās spīdēja pārāk spilgti un nevienmērīgi, kas atkal radīja diskomfortu. Ja sprieguma kritums pāri diodei ir 2 volti, barošanas spriegums 5 volti un rezistoru 1 kOhm, caur diodi plūstošās strāvas vērtība būs vienāda ar (5–2)/1000 = 3 mA. Šī vērtība tika izvēlēta empīriski, un mirdzuma spilgtums ir lieliski piemērots blāvai telpai. Ja plānojat uzstādīt pulksteni tiešos saules staros, tad rezistoru vērtība ir jāsamazina līdz 200 omiem, lai iegūtu spilgtāku spīdumu (paldies Cap).

Pogas

Uz atsevišķas tāfeles ar pogām ir “drošinātājs” (tas pasargās mūs no nejauša šāviena galvā), citas Bt6 pogas veidā. Laiku var rediģēt, vispirms turot to nospiestu.

Programmatūra

Kods ir uzrakstīts CodeVisionAvr vidē.
Programma sākas ar mikrokontrollera perifērijas ierīču iestatīšanu.
Konfigurējiet portus (A, B, C - izeja, D - ieeja)
Katram gadījumam tiek nodrošināta 300 ms pauze, lai DS1307 būtu laiks “nākt pie prāta”
"Kvadrātveida autobusa" inicializācija
Mēs konfigurējam RTC mikroshēmu tā, lai tā katru sekundi radītu taisnstūrveida impulsus uz SQW/OUT tapas
Mēs pārbaudām, vai ir nospiesta poga CLR. Ja jā, tad atiestatiet visas vērtības uz 0
Iespējot globālos pārtraukumus
Jā, daži vārdi par viņiem. Mēs izmantojam ārējos pārtraukumus INT0 uz PD2 uz krītošās malas, t.i. katru sekundi programma nonāks pārtraukumu apstrādātājā, kurā mēs nolasām laika vērtības no DS1307 un parādīsim tās uz LED indikatoriem.
Mēs ieejam bezgalīgā cilpā, kur aptaujam pogas
Ja poga ir nospiesta, pievienojiet (atņemiet) stundu (minūti) un nosūtiet jauno vērtību caur I2C
Tajā pašā laikā mēs pārbaudām, vai jaunās laika vērtības iekļaujas 24 stundu un 60 minūšu diapazonā.

Iespiedshēmas plate

Dēlis ir izgatavots, izmantojot Great Cosmic Laser-Ironing Technology uz vienpusēja tekstolīta. Izgatavojot augšējo dēli, tika izmantots parasts papīrs (neveiksmīgs eksperiments).


Šai tehnoloģijai ir daudz variāciju. Manuprāt, šis ir labākais:
1. Izgrieziet vajadzīgā izmēra PCB gabalu.
2. Mēs noslīpējam galus, atbrīvojoties no kaitīgām burām.
3. Ieeļļojiet topošo dēli ar tīrīšanas pulveri vai zobu pastu un berziet to ar sūkļa cieto pusi, līdz tas spīd.
4. Iemērciet mūsu gabalu uz pāris desmitiem sekunžu vājā siltā dzelzs hlorīda šķīdumā, līdz parādās viendabīga, matēta, bordo-brūna virsma. Izvelkot no šķīduma, šķidrumam vajadzētu pilnībā samitrināt virsmu.
5. Nomazgājiet kakas un rūpīgi nosusiniet, nepieskaroties virsmai ar pirkstiem vai ko citu taukainu. Nekavējoties novietojiet to uz tīra papīra ar vara pusi uz leju, lai izvairītos no putekļiem vai matiem.
6. Spoguļattēlu izdrukā uz plāna(!) glancēta papīra, vari izgriezt, piemēram, no žurnāla. Mēs nepieskaramies zīmējumam ar rokām. Uzmanīgi izgrieziet un novietojiet rakstu uz leju.
7. Uzklājiet to uz sagatavotā PCB gabala, gludiniet to caur 1-2 tīra papīra kārtām, iestatot gludekli uz maksimālo temperatūru. Ar 10 sekundēm vajadzētu pietikt, jo, pārspīlējot, sliedes saplacinās un plūdīs viena otrai virsū. Tonerim pilnībā jālīp pie vara.
8. Izmērcē zem tekoša silta ūdens, var atstāt ūdenī uz 10 minūtēm. Uzmanīgi noplēsiet un nokasiet papīru. Man palīdz veca zobu birste. Ar adatu noņemiet atlikušos papīra gabalus. Toneris paliek uz PCB.
9. Uzkarsē ūdens vannā spēcīgu dzelzs hlorīda šķīdumu, iemet tajā mūsu dēli un vairākas minūtes šļaksti (pēc Van Hofa likuma, temperatūrai paaugstinoties par 10 grādiem, reakcijas ātrums palielinās 2 reizes. Varš pazūd tieši mūsu acu priekšā.Var nesildīt, bet būs jāgaida ilgāk.
10. Tiklīdz viss nevajadzīgais varš ir pazudis, izslēdziet gāzi, izvelciet (piemēram, ar pinceti) dēli, mēģiniet nomazgāt plāksni un pirkstus no dzelzs hlorīda. Mēs to nomazgājam no dēļa ar tekošu ūdeni.
11. Paņemiet acetonu (nagu lakas noņēmēju) un noslaukiet toneri. Varat mēģināt to nokasīt ar smilšpapīru vai sūkli.
12. Urbt caurumus.
13. Piekrāpsim. Es izmantoju LTI kā kušņu, un iesaku jums, tomēr pēc alvošanas un lodēšanas šī plūsma ir jānomazgā (ar to pašu acetonu vai vēl labāk ar spirta un benzīna maisījumu 1: 1), jo LTIshka ir zināma vadītspēja.
Visi darbi jāveic ventilējamā vietā, laikā
izdalās daudz kaitīgu izgarojumu.


Plātnes ir savienotas viena ar otru, izmantojot PBS un PLD savienotājus. Pirmie tiek savienoti ar augšējo plati, izmantojot tievu montāžas vadu, to var izvilkt, piemēram, no vecā LPT kabeļa vai adaptera.


Otrie ir pielodēti pie apakšējās plāksnes, un tapas, kas ved uz tastatūru, ir saliektas (skatiet fotoattēlu).

Ir iekļautas iespiedshēmu plates SprintLayout5.0 formātā. Bildēs ir pāris kļūdas, bet tās jau ir izlabotas pievienotajos failos.

Mikrokontrollera programmaparatūra

Šim nolūkam tika salikts USBasp programmētājs, kas redzams augstāk esošajā fotoattēlā. Tā ir diezgan jauka lieta, viegli lietojama, un jūs to varat nēsāt līdzi kabatā visu gadu (es ceru, ka neviens to nedarīs). Lai mirgotu mega32 programmaparatūru, jums būs jāinstalē "Slow SCK" džemperis.
Drošinātāji:
Zems drošinātājs = 0xC4
Augsts drošinātājs = 0xD9
Mūsu mikrokontrolleris tiek darbināts no iekšējā RC oscilatora ar frekvenci 8 MHz. Man bija jāatspējo JTAG interfeiss PortC, pretējā gadījumā dažas gaismas diodes neiedegas.
Platei ir ISP10 savienotājs ātrai mirgošanai/atkļūdošanai.

Priekšējais panelis

Izgatavota no alumīnija plāksnes, 40 mm plata un 1,5 mm bieza. Tam ir izurbti 18 caurumi ar diametru 5 mm un 4 caurumi ar diametru 3 mm statīvu piestiprināšanai.


Vispirms veidne tika izdrukāta un ielīmēta uz plāksnes. Pēc tam ar 1,5 mm urbi tika izurbti piloturbumi, pēc tam galvenie urbumi tika izurbti ar vajadzīgā diametra urbjiem.


Visbeidzot, plāksne tika saliekta, noslīpēta ar smalku smilšpapīru un nopulēta ar GOI pastu.
Veidne ir iekļauta pievienotajos failos kā izkārtojuma 5.0 fails

Sarkanā gaismas diode augšējā kreisajā stūrī

Atkārto DS1307 ģenerētos impulsus 7. kājā, t.i. mirgo katru sekundi. Neliels p-kanāla MOSFET tranzistors darbojas komutācijas režīmā, atverot un aizverot laikā ar impulsiem. Sākumā es gribēju izveidot fona apgaismojumu (piemēram, Ambilight), kuram es uzbūvēju CMOS invertoru uz papildu tranzistoru pāra (lai pārliecinātos). Bet man tas nepatika. Vienai gaismas diodei pietiek ar vienu tranzistoru, jūs pat varat izmantot pnp tipa bc857. Es izmantoju irlml6402 vai irlml6302 atvērtā rāmja mosfet.

Faili

Avoti, hex fails, iespiedshēmu plates, shēmas, ķēde proteusā un drošinātāji ir iekļauti šajā attēlā arhīva veidā. Es neuzticos failu glabāšanai, man vēl nav sava servera, tāpēc, manuprāt, visdrošākā uzglabāšanas vieta būtu Habr. Windows lietotāji var piekļūt failiem, atverot saglabātu attēlu, izmantojot WinRar.
Jā, šī ir bilde.

Video

Secinājums

Varat izmantot jebkuru strāvas avotu, kas spēj nodrošināt 5 voltus ar strāvu 70 mA. Tam ir diezgan piemērots USB ports. Galvenais, lai jauda būtu “tīra” un nepārsniedz 5 voltus. Barojot pulksteni no līdzstrāvas-līdzstrāvas pārveidotāja no mc34063 mikroshēmas ar trokšņu līmeni ~50 mV, novēroju kļūmes iestatot laiku. Tagad ierīci darbina tuvumā esošais slēdzis. Tas izvada stingri 5 voltus. No labās puses jums ir arī jāizveido droša aizsardzība diodes veidā un kaut kāds lineārs stabilizators 3,3–5 voltiem.
Modinātāja un datuma displeja funkciju neesamība pulkstenī ir diezgan pamatota: tālrunī ir abi, kas nozīmē, ka ar lielu varbūtību neviens tos neizmantos binārajā pulkstenī (paldies onkulim Okam par šo secinājumu) .

Vēloties salikt bināro pulksteni, es nekad neatradu internetā pieņemamu gatavu dizainu. Lielākajai daļai pulksteņu bija nopietns trūkums - izslēdzot strāvu, laika iestatījumi tika zaudēti. Paveicās, neilgi pirms tam es sāku apgūt C valodu un AVR mikrokontrollerus. Tāpēc tika nolemts iegūtās zināšanas nostiprināt ar praktisko pieredzi un vienlaikus izgudrot riteni no jauna. Man arī ļoti patīk zaļās mirgojošās gaismas diodes.



Shēma



RTC

Pašreizējo iestatījumu saglabāšanas problēmu lieliski atrisina reālā laika pulkstenis (RTC). Mana izvēle krita uz DS1307 mikroshēmu.

Pēc ražotāja domām, ja strāva ir izslēgta, tas var ietaupīt laiku un datumu 10 gadus, patērējot tikai CR2032 litija baterijas enerģiju. Tas ir, pulkstenis turpina tikšķēt, saglabājot pieņemamu precizitāti. Laiks netiek zaudēts; atkal ieslēdzot pulksteni, uz ciparnīcas tiek parādīts reālais laiks, nevis laiks tā izslēgšanas brīdī. Mikroshēma sazinās ar mikrokontrolleri, izmantojot “kvadrātveida kopni” I 2 C, ziņojot par precīzu laiku un pieņemot tā jaunās vērtības.

Ierīces sirds

Mega32a mikrokontrollera izvēli noteica šādi faktori:
Ir pietiekami daudz pieslēgvietu, lai izvairītos no dinamiskā displeja izmantošanas, kas man nepatīk galvenokārt tāpēc, ka tas kairina acis (mirkšķināšana augstā frekvencē jebkurā gadījumā ir nedabiska). Es ar to iepazinos, spēlējot ar PIC mikrokontrolleriem Proton PICBasic valodā, un, ja ir iespējams neizmantot dinamisko displeju, es gribētu to darīt.
Salīdzinoši zemas izmaksas 130 rubļi (piemēram, Mega16a maksā tikpat), un ar atlaidi parasti ir 104 rubļi.
Caurspīdīgs QPF-44 iepakojums, ar ērtu tapu


Ports “A” parāda sekundes, ports “B” parāda minūtes, un ports “C” parāda stundas. Ir ļoti ērti, ka no DS1307 ņemtās laika vērtības var piešķirt pieslēgvietām bez izmaiņām. Pogas ir savienotas ar portu “D” (kontakti 3-7), tapas 0 un 1 darbojas attiecīgi kā pulksteņa līnija (SCL) un seriālā datu līnija (SDA). RTC mikroshēma ir konfigurēta tā, lai tā savā septītajā daļā rada impulsus ar frekvenci 1 herts. Šī kāja ir savienota ar porta “D” 3. tapu. Šis ports pats par sevi ir konfigurēts kā ieeja, un katram gadījumam ir iekļauti iekšējie pievilkšanas elementi uz barošanas bloku plus, kas dublēti ar SMD rezistoriem ārpusē. Šādas darbības pilnībā pasargā no jebkādiem pārsteigumiem.

Gaismas diodes


Es izvēlējos gaismas diodes matētā korpusā ar zemu spilgtumu. Vispirms tika pārbaudītas spilgtas diodes caurspīdīgā korpusā, taču pat ar strāvu 3 mA tās spīdēja pārāk spilgti un nevienmērīgi, kas atkal radīja diskomfortu. Ja sprieguma kritums pāri diodei ir 2 volti, barošanas spriegums 5 volti un rezistoru 1 kOhm, caur diodi plūstošās strāvas vērtība būs vienāda ar (5–2)/1000 = 3 mA. Šī vērtība tika izvēlēta empīriski, un mirdzuma spilgtums ir lieliski piemērots blāvai telpai. Ja plānojat uzstādīt pulksteni tiešos saules staros, tad rezistoru vērtība ir jāsamazina līdz 200 omiem, lai iegūtu spilgtāku spīdumu (paldies Cap).

Pogas

Uz atsevišķas tāfeles ar pogām ir “drošinātājs” (tas pasargās mūs no nejauša šāviena galvā), citas Bt6 pogas veidā. Laiku var rediģēt, vispirms turot to nospiestu.

Programmatūra

Kods ir uzrakstīts CodeVisionAvr vidē.
Programma sākas ar mikrokontrollera perifērijas ierīču iestatīšanu.
Konfigurējiet portus (A, B, C - izeja, D - ieeja)
Katram gadījumam tiek nodrošināta 300 ms pauze, lai DS1307 būtu laiks “nākt pie prāta”
"Kvadrātveida autobusa" inicializācija
Mēs konfigurējam RTC mikroshēmu tā, lai tā katru sekundi radītu taisnstūrveida impulsus uz SQW/OUT tapas
Mēs pārbaudām, vai ir nospiesta poga CLR. Ja jā, tad atiestatiet visas vērtības uz 0
Iespējot globālos pārtraukumus
Jā, daži vārdi par viņiem. Mēs izmantojam ārējos pārtraukumus INT0 uz PD2 uz krītošās malas, t.i. katru sekundi programma nonāks pārtraukumu apstrādātājā, kurā mēs nolasām laika vērtības no DS1307 un parādīsim tās uz LED indikatoriem.
Mēs ieejam bezgalīgā cilpā, kur aptaujam pogas
Ja poga ir nospiesta, pievienojiet (atņemiet) stundu (minūti) un nosūtiet jauno vērtību caur I2C
Tajā pašā laikā mēs pārbaudām, vai jaunās laika vērtības iekļaujas 24 stundu un 60 minūšu diapazonā.

Iespiedshēmas plate

Dēlis ir izgatavots, izmantojot Great Cosmic Laser-Ironing Technology uz vienpusēja tekstolīta. Izgatavojot augšējo dēli, tika izmantots parasts papīrs (neveiksmīgs eksperiments).


Šai tehnoloģijai ir daudz variāciju. Manuprāt, šis ir labākais:
1. Izgrieziet vajadzīgā izmēra PCB gabalu.
2. Mēs noslīpējam galus, atbrīvojoties no kaitīgām burām.
3. Ieeļļojiet topošo dēli ar tīrīšanas pulveri vai zobu pastu un berziet to ar sūkļa cieto pusi, līdz tas spīd.
4. Iemērciet mūsu gabalu uz pāris desmitiem sekunžu vājā siltā dzelzs hlorīda šķīdumā, līdz parādās viendabīga, matēta, bordo-brūna virsma. Izvelkot no šķīduma, šķidrumam vajadzētu pilnībā samitrināt virsmu.
5. Nomazgājiet kakas un rūpīgi nosusiniet, nepieskaroties virsmai ar pirkstiem vai ko citu taukainu. Nekavējoties novietojiet to uz tīra papīra ar vara pusi uz leju, lai izvairītos no putekļiem vai matiem.
6. Spoguļattēlu izdrukā uz plāna(!) glancēta papīra, vari izgriezt, piemēram, no žurnāla. Mēs nepieskaramies zīmējumam ar rokām. Uzmanīgi izgrieziet un novietojiet rakstu uz leju.
7. Uzklājiet to uz sagatavotā PCB gabala, gludiniet to caur 1-2 tīra papīra kārtām, iestatot gludekli uz maksimālo temperatūru. Ar 10 sekundēm vajadzētu pietikt, jo, pārspīlējot, sliedes saplacinās un plūdīs viena otrai virsū. Tonerim pilnībā jālīp pie vara.
8. Izmērcē zem tekoša silta ūdens, var atstāt ūdenī uz 10 minūtēm. Uzmanīgi noplēsiet un nokasiet papīru. Man palīdz veca zobu birste. Ar adatu noņemiet atlikušos papīra gabalus. Toneris paliek uz PCB.
9. Uzkarsē ūdens vannā spēcīgu dzelzs hlorīda šķīdumu, iemet tajā mūsu dēli un vairākas minūtes šļaksti (pēc Van Hofa likuma, temperatūrai paaugstinoties par 10 grādiem, reakcijas ātrums palielinās 2 reizes. Varš pazūd tieši mūsu acu priekšā.Var nesildīt, bet būs jāgaida ilgāk.
10. Tiklīdz viss nevajadzīgais varš ir pazudis, izslēdziet gāzi, izvelciet (piemēram, ar pinceti) dēli, mēģiniet nomazgāt plāksni un pirkstus no dzelzs hlorīda. Mēs to nomazgājam no dēļa ar tekošu ūdeni.
11. Paņemiet acetonu (nagu lakas noņēmēju) un noslaukiet toneri. Varat mēģināt to nokasīt ar smilšpapīru vai sūkli.
12. Urbt caurumus.
13. Piekrāpsim. Es izmantoju LTI kā kušņu, un iesaku jums, tomēr pēc alvošanas un lodēšanas šī plūsma ir jānomazgā (ar to pašu acetonu vai vēl labāk ar spirta un benzīna maisījumu 1: 1), jo LTIshka ir zināma vadītspēja.
Visi darbi jāveic ventilējamā vietā, laikā
izdalās daudz kaitīgu izgarojumu.


Plātnes ir savienotas viena ar otru, izmantojot PBS un PLD savienotājus. Pirmie tiek savienoti ar augšējo plati, izmantojot tievu montāžas vadu, to var izvilkt, piemēram, no vecā LPT kabeļa vai adaptera.


Otrie ir pielodēti pie apakšējās plāksnes, un tapas, kas ved uz tastatūru, ir saliektas (skatiet fotoattēlu).

Ir iekļautas iespiedshēmu plates SprintLayout5.0 formātā. Bildēs ir pāris kļūdas, bet tās jau ir izlabotas pievienotajos failos.

Mikrokontrollera programmaparatūra

Šim nolūkam tika salikts USBasp programmētājs, kas redzams augstāk esošajā fotoattēlā. Tā ir diezgan jauka lieta, viegli lietojama, un jūs to varat nēsāt līdzi kabatā visu gadu (es ceru, ka neviens to nedarīs). Lai mirgotu mega32 programmaparatūru, jums būs jāinstalē "Slow SCK" džemperis.
Drošinātāji:
Zems drošinātājs = 0xC4
Augsts drošinātājs = 0xD9
Mūsu mikrokontrolleris tiek darbināts no iekšējā RC oscilatora ar frekvenci 8 MHz. Man bija jāatspējo JTAG interfeiss PortC, pretējā gadījumā dažas gaismas diodes neiedegas.
Platei ir ISP10 savienotājs ātrai mirgošanai/atkļūdošanai.

Priekšējais panelis

Izgatavota no alumīnija plāksnes, 40 mm plata un 1,5 mm bieza. Tam ir izurbti 18 caurumi ar diametru 5 mm un 4 caurumi ar diametru 3 mm statīvu piestiprināšanai.


Vispirms veidne tika izdrukāta un ielīmēta uz plāksnes. Pēc tam ar 1,5 mm urbi tika izurbti piloturbumi, pēc tam galvenie urbumi tika izurbti ar vajadzīgā diametra urbjiem.


Visbeidzot, plāksne tika saliekta, noslīpēta ar smalku smilšpapīru un nopulēta ar GOI pastu.
Veidne ir iekļauta pievienotajos failos kā izkārtojuma 5.0 fails

Sarkanā gaismas diode augšējā kreisajā stūrī

Atkārto DS1307 ģenerētos impulsus 7. kājā, t.i. mirgo katru sekundi. Neliels p-kanāla MOSFET tranzistors darbojas komutācijas režīmā, atverot un aizverot laikā ar impulsiem. Sākumā es gribēju izveidot fona apgaismojumu (piemēram, Ambilight), kuram es uzbūvēju CMOS invertoru uz papildu tranzistoru pāra (lai pārliecinātos). Bet man tas nepatika. Vienai gaismas diodei pietiek ar vienu tranzistoru, jūs pat varat izmantot pnp tipa bc857. Es izmantoju irlml6402 vai irlml6302 atvērtā rāmja mosfet.

Faili

Avoti, hex fails, iespiedshēmu plates, shēmas, ķēde proteusā un drošinātāji ir iekļauti šajā attēlā arhīva veidā. Es neuzticos failu glabāšanai, man vēl nav sava servera, tāpēc, manuprāt, visdrošākā uzglabāšanas vieta būtu Habr. Windows lietotāji var piekļūt failiem, atverot saglabātu attēlu, izmantojot WinRar.
Jā, šī ir bilde.

Video

Secinājums

Varat izmantot jebkuru strāvas avotu, kas spēj nodrošināt 5 voltus ar strāvu 70 mA. Tam ir diezgan piemērots USB ports. Galvenais, lai jauda būtu “tīra” un nepārsniedz 5 voltus. Barojot pulksteni no līdzstrāvas-līdzstrāvas pārveidotāja no mc34063 mikroshēmas ar trokšņu līmeni ~50 mV, novēroju kļūmes iestatot laiku. Tagad ierīci darbina tuvumā esošais slēdzis. Tas izvada stingri 5 voltus. No labās puses jums ir arī jāizveido droša aizsardzība diodes veidā un kaut kāds lineārs stabilizators 3,3–5 voltiem.
Modinātāja un datuma displeja funkciju neesamība pulkstenī ir diezgan pamatota: tālrunī ir abi, kas nozīmē, ka ar lielu varbūtību neviens tos neizmantos binārajā pulkstenī (paldies onkulim Okam par šo secinājumu) .

Binārā pulksteņa izgatavošana ir katra pasaules nedraķa sapnis, vai ne? (...vai varbūt izmanto zilo lāzeru gaismas zobenam :)). Šī ideja man radās pēdējā skolas gadā un vēlāk nolēmu izstrādāt un uzbūvēt bināro rokas pulksteni.

Šobrīd tikai studēju mikrokontrollerus, tāpēc šim projektam izvēlējos populāro PIC16F628.

Lai norādītu laiku pulkstenī, tiek izmantotas 4 gaismas diodes, lai parādītu stundas, un 6 gaismas diodes, lai parādītu minūtes:

Varat arī izmantot zaļās gaismas diodes, lai norādītu stundas, un sarkanās gaismas diodes minūtes:

Kā uzlabot laika precizitāti?

Lai palielinātu pulksteņa precizitāti, es izmantoju Timer 1 (TMR1), kas darbojas asinhronā režīmā, ideja ir šāda:
Lai pagarinātu akumulatora darbības laiku, mikrokontrolleris ir miega režīmā, kad netiek rādīts laiks, un gaismas diodes iedegsies tikai dažas sekundes pēc vienas no divām pogām nospiešanas. Miega režīmā gandrīz visas mikrokontrollera funkcijas ir atslēgtas, bet TMR1 taimeris/skaitītājs turpina darboties asinhronā režīmā, lai laiku varētu skaitīt, kamēr PIC16F628 guļ.

Kad 16 bitu TMR1 reģistrs reģistrē pārplūdi, pārtraukuma signāls liks mikrokontrollerim pamosties, šajā gadījumā sekunžu skaitītājs tiks atjaunināts un mikrokontrolleris atgriezīsies miega režīmā.

Lai izmantotu TMR1 asinhronajā režīmā, ir jāiestata pulksteņa avots, tas tiek darīts, savienojot 32,768 Hz kristālu starp tapām RB7 un RB6.

Kā parādīt laiku?

Laiks tiek parādīts, nospiežot vienu no divām pogām. Tagad jautājums ir: kā jūs varat noteikt pogas stāvokli, ja mikrokontrolleris ir miega režīmā? Nu, protams, es izmantoju līmeņa maiņas pārtraukumu uz tapām RB4 un RB5, kad mainīsies šo kontaktu stāvoklis, kontrolieris pamodīsies. Nospiežot pogu, TMR0 taimeris tiks ielādēts ar vērtību, kas tiek izmantota displeja laika mērīšanai, un tiks aktivizēti pārtraukumi; kad TMR0 pārplūst, visas gaismas diodes nodzisīs un mikrokontrolleris atgriezīsies miega režīmā.

Pulksteņa darbības algoritms:

Starta programma (inicializācija);
- Iet uz miega režīmu.

Ja notiek TMR1 pārpilde
- Atmoda;
- laiks atjaunināt;
- Iet uz miega režīmu.

Ja notiek ārējs pārtraukums
- Atmoda;
- Laika indikācija, izmantojot gaismas diodes;
- Gaida TMR0 pārplūdi;
- Izslēdziet gaismas diodes;
- Iet uz miega režīmu.

Kā iestatīt laiku?

Šajā gadījumā laiks tiek iestatīts, izmantojot pogas un tikai tad, kad pulkstenis tiek ieslēgts pirmo reizi.

Pulksteņa diagramma

Korpuss ir izgatavots no plastmasas, akumulatora nodalījums CR2032 akumulatoram tika izgriezts, izmantojot CNC mašīnu. Siksna ir vienkārši pielīmēta korpusa apakšā.

Programmējot mikrokontrolleri, iestatiet konfigurācijas bitus, kā parādīts attēlā zemāk:

Arhīvs rakstam "Binārais rokas pulkstenis uz PIC16F628"
Apraksts: Programmas pirmkods (Assembler)
Faila lielums: 33,9 KB Lejupielādes skaits: 610