Contacte

Schema de ceas de pe microcontrolerul AVR. Ceas simplu pe microcontroler. Dispozitive de operare video pe canalul YouTube

Uneori este util să aveți un ceas în timpul de numărare a sistemului în câteva secunde și chiar cu o precizie ridicată. Adesea, RTC (ceasul în timp real) este utilizat în aceste scopuri. Dar acesta este un caz suplimentar, iar uneori este un fel ca Mk însuși, deși puteți face fără ea. Mai mult, multe MK au o unitate RTC încorporată. Nu există nici un adevăr în AVR, dar există un cronometru asincron, care servește ca un produs semifinit pentru fabricarea acceselor.

Mai întâi de toate, avem nevoie de un cuarț de ceas la 32768 de aici.

De ce este cuarț doar 32768Hz și de ce este numele lui pentru ceasuri? Da, totul este foarte simplu - 32768 este un grad de două. Două în a cincisprezecea. Prin urmare, cincisprezece contor de descărcare cu o frecvență de 32768 Hz va sparge o dată pe secundă. Acest lucru face posibilă construirea unui ceas pe scatter logic obișnuit fără probleme. A B. microcontroler AVR. Este posibilă organizarea orelor cu secunde aproape fără utilizarea creierului, asupra reflexelor periferiei.

Modul temporizator asincron
Amintiți-vă cum funcționează cronometrele? Frecvența ceasului de la generatorul de ceas principal (RC externă sau internă, cuarț extern sau generator extern) intră în infractori și de la ieșirea ofertelor face deja valorile registrului TCNT. Fie semnalul de intrare provine din intrarea de numărare a TN și face clic pe Registrul TCNT

Pentru a face acest lucru, concluziile TOSC2 și TOSC1 atârnă un rezonator de cuarț. Frecvență redusă, de obicei ceas cuarț la 32768Hz. Este montat în partea dreaptă a controlerului și se conectează cu jumperii. în plus frecvența ceasului Procesorul ar trebui să fie mai mare de patru ori. Avem un clum de la generatorul intern de 8 MHz, astfel încât această condiție nu are grijă deloc :)

Și nu numărați numărul de ceasuri de cuarț de bază și, dacă nu este, deranjează frecvența plutitoare a generatorului RC încorporat. Oră cuarț are mult mai mult dimensiuni compacte decât cuarțul obișnuit și este mai ieftin.


De asemenea, este important faptul că un cronometru asincron se poate bifa singură, de la cuarț de oră, deoarece frecvența ceasului procesorului nu este necesară și acest lucru înseamnă ceasul kernelului controlerului (cel mai dornic lucru pe care îl are) poate fi întors Off, procesorul din hibernare a redus semnificativ consumul de energie și trezindu-se numai prin cronometrul depășit (de 1-2 ori pe secundă) pentru a înregistra noi citiri de timp.

Configurare
Pentru a activa, trebuie doar să instalați biții AssR AS2 - și tot, cronometrul funcționează în modul asincron. Dar există o singură caracteristică pe care am meritat o mulțime de pui la un moment dat. Faptul este că atunci când lucrați de la cuarț, toate registrele interne ale temporizatorului încep să se sincronizeze în propriul quartz. Și are un program lent și de bază poate schimba valoarea deja introdusă mult mai rapidă decât este tratată cu un cronometru.

Aceștia, de exemplu, ați preinstalat valoarea TCNT2, cronometrul de la 32khz gâtul nu a avut nici măcar timp să-l fumeze și m-am alăturat deja algoritmului și ceva a înregistrat-o din nou - ca rezultat, gunoiul va fi probabil cădea în tcnt2. Că acest lucru nu se întâmplă să înregistreze tamponele. Acestea. Credeți că ați scris datele din TCNT2, dar de fapt că cad într-un registru temporar și în numărătoarea va cădea doar prin trei tacturi de un generator lent.

Registrele de comparare OCR2 și registrele de configurare TCCR2 sunt, de asemenea, amplasate.

Cum să aflați datele deja introduse în cronometru sau atârnă în celule intermediare? Da, foarte simplu - pe steaguri în Registrul AssR. Acestea sunt biți TCN2UB, OCR2UB și TCR2UB - toată lumea este responsabilă pentru registrul său. Când, de exemplu, scriem o valoare în TCNT2, atunci TCNUB devine 1 și, de îndată ce numărul nostru din registrul intermediar a trecut la registrul de numărare real TCNT2, iar începutul este deja bifat, atunci acest steag este resetat de către mașină.

Astfel, în modul asincron, atunci când scrieți la registrele TCNT2, OCR2 și TCCR2, trebuie mai întâi să verificați steagurile TCN2UB, OCR2UB și TCR2UB și scrieți numai dacă sunt zero. În caz contrar, rezultatul poate fi imprevizibil.

Da, altul un moment important - Când treceți între modul sincron și asincron, valoarea din registrul de numărare TCNT poate fi întreruptă. Deci, pentru întrerupătoare de fiabilitate așa:

  • Interzice întreruperile din acest cronometru
  • Treceți la modul dorit (sincron sau asincron)
  • Re-regla tunerea temporizatorului ca avem nevoie. Acestea. Expuneți presetarea TCNT2 dacă aveți nevoie pentru a reinstala TCCR2
  • Dacă treceți la modul asincron, așteptăm până când toate steagurile TCN2UB, OCR2UB și TCR2UB sunt resetate. Acestea. Setările aplicate și gata de lucru.
  • Aruncați steagurile întreruperilor temporizatorului / contorului. pentru că Cu toate aceste perturbări, ele pot stabili accidental
  • Permiteți întreruperile din acest cronometru

Nerespectarea acestei secvențe duce la glitches imprevizibil și dificil de detectabil.

Moduri de dormit și cronometru asincron
pentru că Timerul asincron este adesea folosit în diferite moduri de economisire, atunci există o singură caracteristică care stabilește întregul câmp de la rake.

Linia de jos este că un cronometru care funcționează dintr-un cuarț lent nu are timp pentru procesorul principal, iar în Dofiga dependențelor de pe periferie - aceleași întreruperi, de exemplu. Și când procentul de dormit, aceste dependențe nu pot fi realizate, ca rezultat, glitches par a fi întrerupte întrerupte sau valori deteriorate în registre. Deci, logica de lucru cu un cronometru asincron și un mod de dormit ar trebui să fie construită astfel încât un cronometru asincron să reușească să lucreze câteva din ceasurile sale între trezirea și dumpingul în hibernare și și-au îndeplinit toate afacerile.

Exemple:
Controlerul folosește modul de economisire a energiei și închideți kernelul și se trezește pentru întreruperi de la timer asincron. Este necesar să se ia în considerare faptul că, dacă schimbăm valorile registrelor TCNT2, OCR2 și TCCR2, atunci îngrijirea hibernării este necesară numai după ce steagurile TCN2UB, OCR2UB și TCR2UB vor cădea. În caz contrar, se pare că un astfel de rahat - un cronometru asincron nu a reușit încă să ridice date din registrele intermediare (el este lent, sute de ori nucleul), iar kernelul a întrerupt deja. Și noua configurație nu ar fi aplicat, este nonsens.

Este mai rău că, la momentul modificărilor registrelor TCNT sau OCR, funcționarea unității de comparație este blocată, ceea ce înseamnă că kernelul este înmuiat mai devreme, apoi unitatea de comparație nu va începe - nu va fi nimeni care să-l transforme pe. Și avem întreruperea în comparație. Ceea ce este purtat în faptul că evenimentul pe care îl stau și îi vom pierde până la următoarea trezire din hibernare.
Și dacă controlerul este rupt prin întreruperea în comparație? Apoi va cădea în cele din urmă. Oops!
Deci, prinde o astfel de glitch mai târziu.

Deci, înainte de a pleca în modurile de economisire a energiei, este necesar să se ofere un cronometru asincron pentru a depune valorile introduse (dacă au fost introduse) și așteptați steagurile de zero.

O altă glumă cu un regim asincron și economie de energie este că subsistemul de întrerupere atunci când părăsește hibernarea începe pentru 1 tact de un generator lent. Deci, chiar dacă nu am schimbat nimic, este imposibil să revin în hibernare - nu vă treziți, pentru că Întreruperile nu vor avea timp să înceapă.

Astfel încât ieșirea din hibernare și adormit pe întreruperea cronometrului asincron ar trebui să fie în această formă:

  • Trezit
  • Ce a dorit
  • Sunet

Și durata operațiunii dintre trestia și a adormit nu ar trebui să fie mai mică decât un cronometru asincron. În caz contrar, anabioza va fi veșnică. Puteți întârzia, și puteți face ca o datashet recomandă:

  • Trezit
  • Ce a dorit
  • De dragul glumei, a fost înregistrat ceva în oricare dintre registrele tamponate. De exemplu, TCNT a fost 1 și am înregistrat încă o dată 1. Nimic nu sa schimbat, dar înregistrarea a avut loc, pavilionul TCN2UB a crescut că trei gheare ale generatorului lent va fi garantată ultima dată.
  • A așteptat până când pavilionul cade
  • A adormit.

De asemenea, nu este recomandat să părăsiți hibernarea pentru a citi imediat valorile TCNT - puteți lua în considerare Laude. Este mai bine să așteptați un cronometru asincron. Sau faceți o glumă cu o înregistrare în registru și așteptare, în timp ce steagul va cădea așa cum a fost scris mai sus.

Ei bine, ultimul, dar important, moment - după furnizarea de energie sau ieșire din hibernare profundă, dezactivarea nu numai a kernelului, dar, în general, întreaga periferie, utilizați generatorul lent este recomandat cu tărie nu mai devreme decât prin 1 secunda (nu o milisecundă, dar o întreagă a doua!). În caz contrar, generatorul poate fi în continuare instabil și în registrele vor fi mai multe terci și gunoi.

Și, la sfârșitul articolului, un mic instalator. Rularea unui cronometru asincron pe Atmega16 (ca depozite de deșeuri este folosit)

Proiectul este tipic, pe baza dispecerului, o diferență este una dintre diferență - dispecerul este mutat în timer0 pentru a elibera temporizatorul2.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Int principal (void) (initall (); // inițializați periferie INTITOS (); // inițializați kernelul Runrtlos (); // Porniți kernelul. Udr \u003d "R"; // marcator de pornire, pentru depanare Settimertask (INITASS_TIMER, 1000); // Din moment ce temporizatorul din modul asincron // începe încet, atunci faceți // Expunerea la lansarea inițializării cronometrului. În timp ce (1) // Ciclul principal de dispecer (WDT_RESET (); // dumping un cronometru de câine Gestionar de sarcini (); // dispecer de provocare ) Retur 0; )

iNT Principal (Void) (inițial (); // inițializarea periferiei Initros (); // inițializați kernelul Runrtos (); // începerea kernelului. Udr \u003d "R"; // marcator de pornire, pentru depanarea settimertask (Initass_timer, 1000); // Deoarece temporizatorul din modul asincron // începe încet, atunci vom face // Viteza obturatorului pentru a rula inițializarea cronometrului. În timp ce (1) // Ciclul principal Dispecer (WDT_RESET (); // Dumping a TaskManager (); // dispecer de provocare) retur 0;)

Procedura de inițiere a unui cronometru în modul asincron este realizată sub forma unui automat finit. Când începeți pentru prima oară, se prăbușește bitul de mod asincron și face gătit, după ce începe din nou, prin dispecer pentru a permite altceva să alunece în coadă fără a bloca sistemul să aștepte sistemul.

La intrările ulterioare, sunt verificate biții de pavilion de pregătire a registrelor cronometrelor. Dacă sunt toți la zerouri, atunci suntem doar în cazul în care un steaguri de întrerupere a temporizatorului, astfel încât să nu existe nici o glitches și fals pozitive și apoi să ne permită să întrerupăm. Și ieși.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 VOID INITASS_TIMER (VOID) (dacă (AssR & (1<< AS2) ) // Dacă aceasta este a doua intrare (Dacă (AssR & (1<< TCN2UB | 1 << OCR2UB | TCR2UB) ) // verificarea dacă există cel puțin un pavilion de biți (Settask (INTIASS_TIMER); // Dacă există, trimitem un ciclu repetat de așteptare ) Altfel. // Dacă totul este curat, atunci puteți rula întreruperile (Tifr | \u003d 1<< OCF2 | 1 << TOV2; // Reîncărcați steagurile de întrerupere, doar în caz. TIMSK | \u003d 1<< TOIE2; // Permiteți întreruperea depășirii Întoarcere; )) TIMSK & ~ (1<< OCIE2 | 1 << TOIE2) ; // interzice întreruperile temporizatorului 2 ASR \u003d 1.<< AS2; // activați modul asincron Tcnt2 \u003d 0; Tccr2 \u003d 5.<< CS20; // Oferta 128 la 32768 va da 256 de căpușe pe secundă // ceea ce va da 1 întrerupere de depășire pe secundă. Settask (initass_timer); // Rulați prin dispecer pentru a merge din nou. }

vOID INITASS_TIMER (VOID) (dacă (AssR & (1<

Isr (timer2_ovf_vect) // întreruperea depășirii temporizatorului 2 (UDR \u003d I; I ++;)

Puteți face variabile care conțin ore: minute: secunde și faceți clic pe aceste variabile cu tot logica de ceas de ceas, dar am fost leneș. Și totul este clar.

Updated 07/23/2018. Salutare tuturor. Pentru a lucra cu ceasul, în ultimul articol, interfața TWI a fost luată în considerare, pe care ne vom referi astăzi. Să începem. Aceste ceasuri sunt compatibile cu TWI, adică Principiul schimbului de date pe anvelopă va fi același cum am luat în considerare.

Figura de mai jos prezintă locația concluziilor, descrierea și forma ceasului nostru sau modul în care următorul va fi numit RTC (ceas în timp real) - ceas în timp real sau generator de puls de timp. Acest aparat" DS1307. El consideră câteva secunde, minute, ore, zi de lună, lună, zi a săptămânii și a anului împreună cu salturi. Calendarul este valabil până la 2100. Cred că pentru vârsta noastră :).

După cum se poate vedea din descriere, există o intrare de nutriție internă de la baterie când alimentarea externă este oprită. În acest mod, RTC sprijină numai scopul principal - numărătoarea inversă, fără cereri externe. Tensiunea bateriei trebuie să fie de 2 - 3,5V. Descrierea tehnică este scrisă că atunci când se încarcă mai mult de 48 MA / h, la o temperatură de 25 de grade Celsius, schema noastră va dura aproximativ 10 ani. Mai mult decât este necesar. Figura de mai jos arată "Tableta" CR2032 și fixarea pe care o vom folosi.

Acum trecem prin nutriție externă. Tensiunea de operare de ceas 5V cu o gamă mică de 4,5 -5,5V. Tensiunea de la bateria 3b (minim 2, maxim 3,5V) Funcționarea RTC este împărțită în trei moduri de tensiune:

1. VCC \u003d 5b - citirea, înregistrarea, numărarea;
2. VCC \u003d sub 1,25 * VBAT, dar deasupra VBAT + 0.2V - Numai numărarea bateriei din alimentele externe.
3. VCC sub VBAT: RTC și RAM merge la putere de la baterie. Consum în starea activă de 1,5 mA, de la bateria de 500-800.
Tensiune pentru transmiterea / primirea informațiilor:
Logic 0: -0,5b - + 0.8V
Logic 1: 2.2 V - VCC + 0.3B

Ca și în posturile trecute, să începem să începem în Proteus. Codul de plecare. Și vom transfera totul la fier. Mai jos este o schemă de conectare.

În cazul în care SQW / Out este o ieșire a ceasului care poate fi programată pentru a obține frecvența 1Hz, 4.096Hz, 8.192Hz și 32.768Hz. Acestea. Puteți utiliza pentru întreruperea externă a controlerului cu o frecvență de 1 s. Foarte utilă. Dar nu vom fi utile. Apropo, este, de asemenea, cu un colector deschis, deci este necesar un rezistor de tragere. Nominal 4.7 COM.

Concluzii X1 și X2 - Conectează un rezonator de cuarț cu o frecvență de 32,768 kHz. Sau puteți aplica un generator de ceas extern cu aceeași frecvență. Dar, cu această ieșire, X1 se conectează la semnal, iar X2 rămâne neconectat (agățat în aer.).

Ei bine, concluziile SDA și ale SCL cu care am întâlnit ultimul articol.

Vom opri puțin pe rezonator (desenul de mai jos). Care poate fi numită inima ceasului și pe care depinde acuratețea cursului. Calitatea rezonatorului însuși constă în conștiința producătorului, dar pentru partea sa, putem reduce eroarea pe care factorii externi contribuie dacă aderăm la următoarele recomandări pentru plasarea rezonatorului:

2. Lățimea piesei este, de asemenea, mai puțin posibil pentru a reduce probabilitatea de interferență din alte surse.

3. Conturul sub formă de inel de protecție trebuie plasat în jurul cristalului, care ajută la izolarea cristalului de zgomot.

4. Conductorii locați în inel și conectați-vă la pământ.

5. Transportul rezonatorului la sol. Dacă Pământul este divorțat adevărat și există încredere.

Figura de mai jos arată conturul și locul este lipit la sol.

Cum să conectați sortarea. Mergem mai departe - vom da seama cum sa lucrez cu ea. RTC este programabil și are 8 octeți de registre speciale pentru configurația și memoria statică non-volatilă de 56 octeți. Pentru schimbul de informații necesită un autobuz de date cu 2 cabluri, adică. Autobuzul de date secvențial - pe care l-am uitat la ultimul articol. Deci, pentru munca pe care am pus-o pe fișa tehnică. De ce avem nevoie:

Tabelul de înregistrare. Figura de mai jos. Primele opt registre sunt pentru retragerea și programarea ceasului nostru. Când contactați 00h la cel de-al șaptelea bi (CH) și instalarea acesteia în 0 - Lăsați ceasul. Aș dori să menționez că configurația registrelor poate fi oricare, atunci când începeți mai întâi, este necesar să îl configurați sub cerințele dumneavoastră. Restul de șapte biți de unități și zeci de secunde.

01h - minute.
02h - Ceasuri care sunt configurate:
- biți 6 - cu 1 format de 12 ore, 0 - 24.
- biți 5 - la 1 (la ora 12) PM, 0-AM
- biți 5 - (la 24 de ore de format) Aceasta este retragerea celei de-a doua zeci de ore (20-23 ore.)
- Bit4 - Primul cort al ceasului, restul biților sunt unități de ore.
03h - zi a săptămânii;
04h - data;
05h - luna anului
06h - an.

Ei bine, ultimul registru 07h. Acest registru este managerul. În cazul în care este responsabil pentru gestionarea producției SQW / Out. Mai jos este pornirea tabelului de ieșire.

Out.
Sqwe.
SQW / OUT.
1
0
1
0
0
0

Sqwe - Când instalați acest bit B, 1 la ieșiri, impulsurile sunt în afara frecvenței specificate, care sunt instalate, biți RS1 și RS0.

Această concluzie nu este utilă pentru noi în proiect. Deși pentru el am răspândit pista pe tablă. Deoarece experimentele pot fi undeva în viitor și se aplică, pentru că aici puteți face întreruperi în 1 secundă.

Acum având toate informațiile necesare, scrieți funcții pentru a lucra cu ceasul. Și lansați, de asemenea, proiectul în Proteus. . Care va avea forma următoare:

Rețineți că rezonatorul din Proteus nu poate fi conectat la ceas (prăbușit în roșu).

Figura a scos terminalul de ceas, care afișează timpul, care la rândul său este atașat la timpul sistemului. Terminalul de depanare al protocolului I2C sau TWI, care afișează timpul de trimitere și de primire, unde D0 este comanda transmisă, recepția D1. Mai jos, voi afișa capturile de ecran ale terminalului cu rezultatul programului.

Program. Având în vedere că setările de ceas de bază scrieți caracteristica de inițializare.

/ * Funcția de inițializare include setarea cursului de schimb de date cu formula (în articolul precedent), instalând un dealer și pornind modulul TWI * /
void Init_DS1307 (Void)
{
Twbr \u003d 2; / * La o frecvență de 1 MHz * /
Twsr \u003d (0<< TWPS1)|(0 << TWPS0); / * Preferime pe 64 * /
TWCR | \u003d (1<< TWEN); / * Pornirea modulului TWI * /
}

vid write_ds1307 (uint8_t reg, uint8_t timp)/ * Transmit doi parametri: adresa de registru la care vom primi și transmite informații * /
{
/ * Formați starea de început, expunerea descărcărilor Registrului de control * /
Twcr \u003d (1<
/ * Permiteți funcționarea modulului Twen; Formați starea portului Twsta; Resetați Twint * /
/ * Așteptăm ca sfârșitul formării condiției, adică. până când pavilionul este setat, codul de stare \u003d 08 * /
În timp ce (! (TWCR & (1<
/ * Următoarea adresă de adresă personală (adresa dispozitivului). Conținutul pachetului este încărcat în twdr * / registru
Twdr \u003d 0xd0; / * 0B1101000 + 0 - Adresa + Bits de înregistrare * /
/ * Resetați pavilionul pentru transferul de informații * /
Twcr \u003d (1<
/ * De așteptare pentru setarea pavilionului * /
În timp ce (! (TWCR & (1<
/ * Trecem registrul la care vom contacta * /
Twdr \u003d reg;
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
/ * Transmitem informații pentru a scrie la registrul de octet * /
Twdr \u003d timp;
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
/ * Formați starea opritorului * /
Twcr \u003d (1<
}

În această caracteristică am trecut trei octeți, adresa dispozitivului, adresa înregistrării și octetul informațiilor pentru a scrie în acest registru și a format starea opririi.

Ultima funcție de citire rămâne. Sub formatul de citire.

În această caracteristică, dispozitivul este transferat de dispozitivul + biți ai înregistrării, octeți adresa de registru Pentru a instala indicatorul la acesta, efectuați starea supapei, transmiterea byte-ului dispozitivului + bit-ul de citire, citirea înregistrării a cărei adresă am fost anterior a trecut.

Dacă ne întoarcem la orele în format de citire, atunci când apăsați ceasul, indicatorul schimbă un octet în jos, inclusiv 56 de octeți de memorie RAM, de la 00h până la 3fh. Când se atinge ultima adresă, indicatorul merge la adresa 00.

/ * Funcția de citire a datelor de la DS1307 * /
uINT8_T READ_DS1307 (UINT8_T REG)/ * Adresa de înregistrare a transferului * /
{
Uint8_t timp;
/ * Formați starea pornirii * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
Twdr \u003d 0xd0; / * Transferați adresa + biți de înregistrare * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
Twdr \u003d reg; / * Adresa de înregistrare * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
/ * Formați starea Misstur * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
Twdr \u003d 0xd1; / * Transferați adresa + bit de citire * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
/ * citiți datele * /
Twcr \u003d (1<
În timp ce (! (TWCR & (1<
Timp \u003d twdr;
Timp \u003d (((Time & 0xf0) \u003e\u003e 4) * 10) + (TIME & 0X0F);
/ * Formați starea opritorului * /
Twcr \u003d (1<
Timpul de întoarcere;
}

Deci, am scris trei funcții pe care trebuie să le lucrăm cu ceasul. Folosind aceste caracteristici, lansați programul în Proteus. Retrage, de exemplu, data.

#Include.
#Include.
uint8_t timp;
vid init_ds1307 (void);
uint8_t citi_ds1307 (uint8_t reg);
vid write_ds1307 (uint8_t reg, uint8_t timp);
int principal (void)
{
Ddrc \u003d 0 × 00; / * Expuneți portul ca intrare * /
PORTC \u003d 0xFF; / * Strângeți rezistența * /
init_ds1307;
În timp ce (1)
{
_delay_ms (50);
citit_ds1307 (0 × 04); / * Data înregistrării citirii * /
}
}

Sub rezultatul programului este citirea datei.

În fereastra de depanare i2c ( Twi. ) Se poate observa că mai întâi adresa registrului în RTC (Circle Green) este trimisă, în acest caz 04, care este responsabilă pentru data lunii și apoi ceasul transmite răspunsul 21 (cercuri roșii).

Când lansăm ceasul în glandă, va trebui să fie atins. Mai jos este un exemplu al unui program de schimbare a programului.

În timp ce (1)
{
_delay_ms (500);
citiți_DS1307 (0 × 01); / * Citiți minutul * /
_delay_ms (500);
write_ds1307 (0 × 01, 15); / * Scrieți minutul necesar * /
_delay_ms (500);
citiți_DS1307 (0 × 01); / * Citiți minutul * /
}

Cifra arată că este mai întâi să se înregistreze 01, un minut 23 este citit. Apoi, folosim funcția de înregistrare și vom face o valoare de 15. La următoarea funcție de citire, avem o valoare de 15 pe ceas.

Ei bine, ultimul exemplu al programului este rezultatul valorilor tuturor registrelor

În timp ce (1)
{
întârziere_ms (500);
citiți_ds1307 (0 × 00);
_delay_ms (500);
citiți_DS1307 (0 × 01);
_delay_ms (500);
citiți_DS1307 (0 × 02);
_delay_ms (500);
citiți_DS1307 (0 × 03);
_delay_ms (500);
citit_ds1307 (0 × 04);
_delay_ms (500);
citiți_ds1307 (0 × 05);
_delay_ms (500);
citiți_ds1307 (0 × 06);
_delay_ms (500);
}

Figura de mai jos arată că aceste 7 registre au fost aduse.

Codul sursă cu proiectul este atașat:

(Descărcări: 601 de persoane)

Asta e tot. În articolul următor, ceasul din glandă, retrage timpul la indicator și se familiarizează cu un format zecimal binar pentru a lucra cu ceasul. Până acum.

Schema și programul de ceas foarte simplu pe microcontrolerul AVR folosind chip DS1307 în timp real

Bună ziua Dragă amatori radio!
Salutări pentru tine pe site-ul "

Astăzi, dragi amatori radio, ești foarte simplu schema ceasului pe microcontrolerul AVR și ceasul real cu interfața serială I2C DS1307.

Designul este asamblat pe microcontrolerul ATYNI26 (doar acest MK a fost la îndemână). Dar puteți aplica orice alt MK, principalul lucru este că are 13 intrări gratuite - 11 pentru a ieși din ora curentă pe indicatorul LED cu șapte segmente de patru segmente și 2 ieșiri - pe butoanele de instalare și corectarea timpului.

Schema ceasului:

Următoarele detalii sunt aplicate în diagramă:
- Microcontroler - ATYNI26 ÎN CASE
- ceas în timp real - DS1307 în Corpul DIP
- cuarț - 32.768 kHz, cu o capacitate de intrare de 12 pf (puteți lua placa de bază a computerului), precizia ceasului depinde de acest cuarț
- Power Backup DS1307 - 3 Volt Element de litiu CR2032
- Indicator cu LED-uri cu șapte segmente pe 4 biți - FYQ-5641UB -21 cu catod partajat (strălucire ultra-culoare, albastră)
- toate sistemele de tranzistori - structuri NPN, puteți aplica orice (CT3102, CT315 și analogii lor străini), am folosit SP547C
- Stabilizator de tensiune microcircuit Tip 7805
- Toate rezistențele de 0,25 Watt
- condensatoare polare pentru tensiunea de lucru 50 volți
Consumul curent prin dispozitiv este de până la 30 mA.
Pentru a alimenta designul, puteți utiliza orice încărcător inutil de la telefon sau o sursă de alimentare adecvată cu o tensiune de ieșire de 7-9 volți.
Comunicarea microcontrolerului cu ceasul DS1307 are loc prin intermediul magistralei I2C și este organizat de software.
DS1307 Bateriile de backup de ceas nu pot fi instalate, dar în acest caz, când tensiunea este pierdută în rețea, ora curentă va trebui să fie instalată din nou.
Placa de circuite imprimată a dispozitivului nu este dată, designul a fost colectat în cazul unui ceas mecanic defect. LED-ul (cu o frecvență intermitentă de 1 Hz) servește la separarea ceasului și a minutelor în design.

Program de lucru.
Frecvența ceasului microcontrolerului este de 1 MHz (setare din fabrică, biți de siguranțe pentru a atinge și a instala nu este nevoie). Dimensiunea programului este de 1 kilobyte.
La pornirea programului, programul are loc:
- Porniți cronometrul T0 cu frecvența presetată SC / 8 și apelați întreruperea de supraîncărcare (cu o astfel de frecvență preinstală, apare un apel de întrerupere la fiecare 2 milisecunde)
- inițializarea porturilor (porturile0-6 și PV0-3 sunt configurate să se retragă, R7 și PB6 Input)
- inițializarea anvelopei I2C (concluzii ale PB4 și PV5)
- Când începeți mai întâi sau cu o repornire atunci când nu există o putere de rezervă DS307, 7 biți (CH) din registrul zero DS1307 este verificată și apare o tranziție la setarea inițială a orarului curent. În același timp, butonul S1 - pentru a seta ora, butonul S2 - trecerea la următoarea descărcare. Setarea timpului și minutele sunt înregistrate în DS1307 (secunde sunt instalate la zero), precum și ieșirea SQW / Out (ieșire 7) este configurată pentru a genera impulsuri dreptunghiulare cu o frecvență de 1 Hz
- Întreruperea globală este permisă
- Programul trece într-un ciclu cu un studiu de studiu Coppe S2
Atunci când depășește un program de contor T0 T0 continuă să întrerupă întreținerea (la fiecare 2 ms):
- Ora curentă este citită din DS1307, care este scrisă la patru variabile SRAM (zeci de ore, unități de ore, zeci de minute, unități de minute)
- subprogramul producției de timp curent este realizat dintr-o indicație dinamică a timpului curent pe indicatorul LED
- Când apăsați butonul S2, programul interzice o întrerupere globală și intră în subrutina de corecție a timpului (butoanele S1 și S2 sunt instalate, apoi, de la 0 secunde, apăsând butonul S2, timpul rafinat este înregistrat În DS1307, permisiunea întreruperii globale și revenirea la programul de bază).

Ceasurile DS1307 aplicate în circuit ne permit să afișăm o secundă, câteva minute, zi a săptămânii, data și anul.
Dacă în diagramă, în loc de indicatoarele LED, aplicați afișajul LCD, de exemplu, WH0802 (două linii, cu ieșirea de opt caractere în șir) sau similare, atunci puteți organiza un ceas complet cu o putere completă Ora curentă și sursa de alimentare a dispozitivului este organizată din elemente galvanice sau baterii.

Locația concluziilor microcontrolerului ATYNI26:

DS1307 Constatări Locație:

Diagrama tipică de conectare D1307:

Lecția 23.

Partea 1

Colectăm ore pe indicatorul DS1307 și LED

Astăzi, vom continua lucrarea noastră cu un microcircuit care este ceasul în timp real, a început și, și acum vom încerca să colectăm ore pe ea folosind un indicator de cristal non-lichid și cu utilizarea unui indicator al A condus din patru cifre pe baza principiului indicației dinamice. Am trecut cu toții cu dvs., indicația a fost de asemenea adoptată, a fost conectat un astfel de indicator, astfel încât nu vom fi atât de greu de implementat.

Dar, în ciuda tuturor cunoștințelor noastre, lecția nu promite să fie scurtă, dar, dimpotrivă, va fi foarte extinsă, deoarece ansamblul ceas pe astfel de indicatori necesită o soluție la foarte multe sarcini suplimentare, mai ales pentru că nu avem 32 de cunoștințe, ca pe LCD-ul nostru și doar 4 și dot sau colon. Și toate citirile ar trebui să fie de ieșire vor fi pentru o anumită coadă și necesită, de asemenea, abilitățile de la noi să organizăm o schimbare a citirilor (traducere) folosind butoanele și pot utiliza în general butoanele ca parte a utilizării doar patru cifre.

Dar nu ne temem de dificultăți, chiar mai interesante cu ei.

Prin urmare, să începem să inventăm ceva.

Indicatorul va fi așa, dintre ele, exact tipul cu anodul general

Și astfel indicatorul arată în direct

Judecând după celulele a 5 milieni în dimensiune, este ușor de estimat dimensiunile sale.

Iată aspectul lui

De asemenea, am un alt indicator cu o dimensiune mai mică, dar pe pinul exact la fel ca cel precedent. Asta este, doar scot din tabloul dummy și introduc un altul în ea și totul funcționează.

Aici sunt amândoi pentru comparație

Iată o etichetare a unui indicator mic

De asemenea, putem utiliza indicatori separați pentru fiecare cifră, conectați-le în consecință, rezultatul va fi același. Acest tip de conexiune este de obicei utilizat atunci când ceasurile sunt necesare cu numere mari și este greu de găsit un indicator combinat de dimensiuni mari. Metoda de conectare demonstrată în mod clar în schema noastră din Proteus, deoarece am găsit într-un proteus și un indicator combinat, dar din anumite motive nu am funcționat corect (faceți clic pe imagine pentru a mări imaginea)

Această schemă ne amintim de la lecția software-ului. Doar acolo au fost doar 2 indicatori, astfel încât să vă conectați încă două, vor fi de asemenea utilizate încă două taste de tranzistor, iarba din care va trece prin rezistorul limitativ curent la 2 kilometri din porturile porturilor PB2. și Pb4.. Vom trece la a treia parte a portului B pentru utilizarea ulterioară într-o altă calitate alternativă, ca un picior al hardware-ului PWM pentru a regla luminozitatea strălucirii indicatorului.

Creați un proiect numit Myclock1307led., iar codul este tot la modulul principal, luați doar de la lecția de la indicarea dinamică, din proiect Test08.. În acel moment, nu am avut încă o programare modulară, iar întregul cod util a fost conținut într-un singur modul principal.

Pentru a începe, vom colecta proiectul nostru, le vom conecta la controler și valorile mobiliare și vom vedea pentru dobândă rezultatul codului de cod

Vedem că doi indicatori drepți lucrează în mod normal. Dar avem nevoie de patru.

Pentru a începe, vom adăuga încă două variabile pentru două descărcări neutilizate.

nesemnat.int.i.;

nesemnat.char.R1.=0, R2.=0, R3.=0, R4. =0 ; // cifre indicatoare

Vom declara porturile portului de pe ieșirea din funcția PORT_INI (), se aplică și funcției PORT_INI, inclusiv la picior.

DDRB.= 0B000. 111 11;

De asemenea, adăugați codul la funcția LedPrint

nulă.ledPrint.( nesemnat.int.număr)

R1.= număr%10;

R2.= număr%100/10;

R3.= număr%1000/100;

R4.= număr/1000;

Încă mai avem rezultatul numărului de numere lipsă, precum și în a doua categorie au existat unele schimbări din cauza unuia. Că el nu este ultimul acum și trebuie să arunci sute și mii.

Am calculat variabilele, a rămas cumva să se afișeze pe indicator.

Pentru a face acest lucru, vom schimba codul în manipulatorul de întrerupere a temporizatorului

ISR.( Timer1_compa_vect.)

dacă( n_count.==0) { Portb.&=~(1<< Portb0.); Portb.|=(1<< Portb1.)|(1<< Portb2.)|(1<< Portb4.); segchar.( R1.);}

dacă( n_count.==1) { Portb.&=~(1<< Portb1.); Portb.|=(1<< Portb0.)|(1<< Portb2.)|(1<< Portb4.); segchar.( R2.);}

dacă( n_count.==2) { Portb.&=~(1<< Portb2.); Portb.|=(1<< Portb0.)|(1<< Portb1.)|(1<< Portb4.); segchar.( R3.);}

dacă( n_count.==3) { Portb.&=~(1<< Portb4.); Portb.|=(1<< Portb0.)|(1<< Portb1.)|(1<< Portb2.); segchar.( R4.);}

N_count.++;

Dacă( n_count.>3 ) n_count.=0;

Aici, cred că totul este clar, oferim un zero logic la tranzistorul cheie al descărcării de gestiune de care avem nevoie, deoarece știm că cheile pe care le avem inverse și cu o altă componentă vor fi o unitate și, de asemenea, de unități logice la tranzistoarele cheie ale Acești evacuări care, în acest moment, nu trebuie să strălucească, considerăm, de asemenea, nu unul, ci la trei.

Cu asta, totul.

Dar, deoarece acum avem numărul de indicatori a crescut, acum coada înainte de același indicator vine mai târziu, adică viteza de evaluare a mărturiei unui indicator a căzut și trebuie să reconfigurați ușor cronometrul. Cum să o faci, nu trebuie să învățăm

OCR1AH.= 0B00001111.; // Scrieți un număr în registru pentru comparație

OCR1AL.=0B01000010.;

Ei bine, să facem posibilă numărul nu până la 99 și la 9999 pentru acest lucru în ciclu nu vom scrie 100 și 10000

pentru( i.=0; i.< 10000 ; i.++)

Și, de asemenea, reducerea întârzierii, altfel nu ridicăm cea de-a patra cifră la o viteză atât de viteză

Întârziere_ms.(10 );

Colectăm codul, conectați controlerul și vedeți rezultatul lucrării noastre

Acum un alt lucru. Acum avem un cod de lucru pentru a organiza indicarea dinamică a indicatorului dinamic din patru cifre, deci în următoarea parteclasele noastre nu vor mai trebui să se mai întoarcă la această problemă.

5 542 Această opțiune se face astfel încât să simplifice schema cât mai mult posibil, să reducă consumul de energie și, eventual, să obțineți un dispozitiv ușor plasat în buzunar. Prin selectarea bateriilor miniaturale pentru alimentarea schemei, SMD - instalare și difuzor miniatural (de exemplu, de la un telefon mobil non-de lucru), puteți obține un design, o cutie ușor mai mult.
Utilizarea unui indicator supraomanic vă permite să reduceți curentul consumat de sistem. Reducerea curentului de consum este, de asemenea, realizată în modul "LOFF" - indicatorul este rambursat, în timp ce numai punctul intermitent al descărcării junior a ceasului este pornit.

Indicaţie
Luminozitatea reglabilă a indicatorilor vă permite să selectați cea mai confortabilă afișare a citirilor (și reduceți din nou consumul de energie).
În ore, sunt implementate 9 moduri de indicare. Tranziția prin moduri se efectuează utilizând butoanele "plus" și "minus". Înainte de a afișa indicarea mărturiei în sine, este afișată un scurt rezumat al denumirii modului. Durata de ieșire a vârfului este o secundă. Utilizarea solicitărilor pe termen scurt a făcut posibilă realizarea unui număr bun ergonomic. Când tranzițiile prin intermediul modurilor de afișare (care s-au dovedit a fi suficiente, pentru un dispozitiv simplu, ca un ceas obișnuit) nu apar confuzie și este întotdeauna clar care lectură sunt afișate pe indicator.

Corectarea citirilor afișate pe indicator pornește când faceți clic pe butonul "Corecție". În acest caz, un indiciu pe termen scurt este afișat cu 1/4 secunde, după care valoarea corectată începe să clipească cu o frecvență de 2 Hz. Reglează citirile cu butoanele "plus" și "minus". Cu un buton de presare lungă, ajutorul auto este activat, cu o frecvență dată. Frecvențele butonului apăsând butonul sunt: \u200b\u200btimp de ore, luni și zi a săptămânii - 4 Hz; Timp de minute, anul și luminozitatea indicatorului - 10 Hz; Pentru o valoare corectivă - 100 Hz.
Toate valorile ajustate, cu excepția orelor, minutelor și secundelor, sunt înregistrate în EEPROM și sunt restaurate după oprirea alimentării. Secunde sunt resetate când sunt corectate. Din toate modurile, cu excepția unui ceas de minute, minute, secunde și LOFF au organizat o rambursare automată. Dacă nu sunt apăsate butoane în decurs de 10 secunde, ceasul intră în modul de afișare a ceasului.
Apăsând butonul "On / Off-Bud.". Activat / Oprit ceasul de alarmă. Includerea ceasului de alarmă este confirmată de un sunet bidimensional scurt. Când alarma este activată, punctul este aprins în descărcarea indicatorului inferior.
În modul "Corr", pe indicator este afișat o constantă corectivă, valoarea inițială este de 5000 microsecunde pe secundă. La întârzierea ceasului, constanță crește întârzierea calculată în microsecunde într-o secundă. Dacă ceasul se grăbește, atunci constanta este redusă cu același principiu.

Sistem



Ți-a plăcut articolul? Împărtășește-l