Kažkaip neparašau apie laikrodžių darymą. Kiekvienas bent kiek įvaldęs kontroleriuką kada nors pradeda gaminti laikrodį. Aš irgi 🙂 Labai labai seniai dariau RTC laikrodį su PIC procesorium. Rašiau aš jį asembleryje… ir labai nervinaus, nes buvo sunku ir tas PICas turėjo savo bjauriu niuansu. Šiaip internete pilna laikrodžių- visokiems procesoriams, visokiems ekranams. Pasibandžiau keletą, kai kurie patiko, kai kurie ne. Pagaliau vieną dieną pasakiau- va ateis savaitgalis ir pradėsiu rašyti laikrodį nuo nulio.
Pagrindinės užduotis kurias sau pastačiau:
- RTC nepriklausantis nuo maitinimo. T.y. atjungiam maitinimą, o laikrodis sau toliau veikia.
- Hardwarinis laikrodis- tikras nesusipratimas smaukytis su procesoriaus kodu, kad skaičiuoti kiekvieną pirstelėjimą ir apsakaičiuoti laiką. Laika turi skaičiuoti RTC čipas- procesorius užsiima grožiu ir User Interface.
- Valdymas turi būti aiškus, o ne su vienu nupiepusiu mygtuku. Naudojam kaip minimum 6 klavišus (juolab kad naudojant ADC mygtukus, jų skaičiaus kaitaliojimas nėra nei hardwariškai, nei softwariškai sudėtingas). Mygtukai: kairėn, dešinėn, aukštyn, žemyn, OK ir Cancel. Kaip bet kuriame teliko distanciniam.
- Jokių asemblerių, advanced dalykėlių (ir atminties taupymo). Turi kompiliuotis su gcc.
- Laikrodžio variklis (core) turi lengvai persikelti ant kito “displėjaus”. T.y. dabar rašau naudojant LCD ekraniuką, bet su minimaliu pokyčiu, softas turi persikelti kad ir į LED matricą ar kokį rotary clock displėjų.
Konstravimui panaudota esama hardwarė. Tik papildomai, prie I2C porto pajungta RTC mikroschema, kurią man maloniai padovanojo Intersil semiconductors: isl1208.
Čia kiek geriau matosi analoginių mygtukų “matrica” kuri pajungta prie MCU tik trim laidais: Vcc, GND ir analog. Tai pat matosi, kad RTC turi savo rezervinį energijos šaltinį: Ličio batareiką CR2025 (čia iš seno kompo išlupau).
Visas kodas dar neparašytas. Jau galima užprogramuoti laiką ir datą, beveik pabaigtas žadintuvas ir konfiguracinis modulis.
Pats žadintuvas irgi nedaromas su ATMEGA16, o jis tupi RTC mikroschemoje- netgi yra speciali kojytė, kuri gali generuoti žadinimo signalą be MCU pagalbos. Arba paprasčiausiai MCU nuskaito būklės registrą ir pradeda čirškėti. Įdomumas tame, kad žadintuvas gali suveikinėti kiekvienos valandos kažkurią minutę, arba galima nustatyti kad žadintuvas skambėtu tik pirmadieniais, trečią valandą penkiolika minučių ir 27 sekundės, arba kad skambėtu kiekvienos valandos 3 minutę tik balandžio 23 dieną ir jei ta diena išpuola sekmadienį… 🙂 Ten daug navarotų turi tas čipukas. O jei dadėti ir MCU navarotus, tai tikras CRON daemonas gaunasi. Nekalbant apie tai, kad softas pats žino, kelintadienis bus bet kurią 21 amžiaus dieną ir taip pat puikiai susipažinęs su keliamųjų metų skaičiavimais.
Softas turi bent trijų lygių menių sistemą. Meniu sistema automatiškai išsijungia, jei vartotojas ilgai neliečia klavietūros. Su minimaliais pokyčiais si sistema modifikuojasi ir galima konstruoti kokį nors termostatą- juk užtenka pajungti prie to pačio I2C kad ir FM75 mikroschemą. Arba galima valdyti kokią nors periferiją… Čia tik reikia įjungti fantaziją. Šiaip viskas sugrūsta į TIMER0 pertraukimą- visą kitą laiką ATMEGA dinderį muša.
Softas neskirtas “C” kalbos puristams ir specialistams. Aš iškarto pasakau, kad niekada nesimokiau “C” programavimo. Todėl daugelis momentų padaryta kvailai. Tik žinau, kad gerasis gcc nerado nei vienos priekabės prie šios programos- kompiliuojasi be jokių warning…
Štai jis: RTC clock core source code. Dalinamas pagal GNU GPL licenzija- imkit ir naudokit.
Kodas kaip kodas – tobulejimui ribu nera, net ir TOP koderiai kvailysciu priraso, nes ne visada turi laiko (bet dazniausiai noro) strukturos bei stiliaus tobulinimui. Bet suzavejo genialiai paprasta apsauga nuo “lamerisko” panaudojimo 🙂 🙂
Ir teisingai: ner cia ko be jokiu pastangu kitu darbo vaisiais naudotis, tegu nors truputi pasuka galva ir pasiskaito aprasymus 🙂
Kaip tikslumas laikroduko gavosi?
Dariau ne vianą su PCF8583 tai nugrybaudavo per savaitę porą minučių, o tai buvo per daug.. Reikėjo paderinti trimeri prie kvarco, bet kaip tai atiderinsi be precizinio dažnomačio, o stebint paklaidą derinimas mėnesiais truks:)
Per mažai laiko praėjo, kad pastebėčiau. Bet šiaip, bent jau šitas RTC turi kelis “pareguliavimo” registrus: ATR- pagrindinis dažnio reguliatorius, DTR- grubus koeficientas. Ir dar yra keli bitukai batareikiniam režimui pareguliuoti. Reguliavimas daromas taip- užprogramuojama IRQ koja kokiam nors dažniui ir su geru dažnomačiu matuojamas dažnis. Ir keičiamos registrų reikšmės.
Na taip, bet kuriuo atveju be gero dažnomačio neišsiversi..
As meginau irgi su tokia pacia mikrsuke ta RTC bet man kazko ji lyg it nejuda.. :O is tos funkcijos kur tiesiogiai skaito kaip debuginimui norejau paziuret ka rodo o man tik 00:00:00 ta funkcija idejau i amzina cikla.. idomu kur cia galetu but beda? nuojauta kuzda kad RTC chipo pusej tik tiek kad ten beveik nera ka blogai padaryt 🙂
beda buvo tame kad nenustatydavau laikrodzio 🙂 matyt reikia bent pradines reiksmes duot 🙂