Ne vom ocupa de formatul BCD. Formatul BCD (Decimal Binar Codat) este un format binar-zecimal care poate fi despachetat și ambalat. La prima variantă, cifra zecimală ocupă întreaga octet, dezavantajul aici este utilizarea neeconomică a memoriei, deoarece Cea mai mare nibble este întotdeauna 0. Singurul avantaj este că nu există nicio discrepanță; cifra în hexazecimal este zecimal și nu este nevoie să efectuați operații suplimentare.
A doua variantă este împachetată și pentru a stoca numărul zecimal utilizează un tetrad (nibble, nibble), adică patru cifre. pentru că Memoria de registru este limitată, în acest caz cel de-al doilea număr zecimal este stocat în semi-octetul de înaltă ordine. Deci, "ceasul" nostru, lucrați doar în această versiune.
Amintiți-vă că reprezentarea internă a numerelor în registre este binară. format BCD Prin urmare, ambalate oferă o oportunitate unică nu numai pentru a salva bytes, dar, de asemenea, împreună cu informații de ieșire de la octet conține biții de reglare (fig. de mai jos), de exemplu, într-un articol anterior (№29) în tabelul de registru 2 -lea registru al terminalului de ceas 6 și 5 biți conțin biții de reglare. și deja 5 (în funcție de setările 6) și 4 conțin 2 și respectiv 10 ore, iar restul de 4 biți inferiori reprezintă o reprezentare binară a unităților de ore, de aici formatul BCD.
De asemenea, aș dori să observ că unele sisteme de microprocesoare au o instrucțiune specială pentru corectarea acestui format, dar în AVR. nu există o astfel de instrucțiune. Dar nu contează, după cum veți vedea mai jos, prin operații aritmetice mici, vom face conversia cu ușurință.
Să analizăm operațiile suplimentare pentru a doua variantă cu un exemplu. De exemplu, doriți să înregistrați numărul zecimal 37, în format BCD, acesta va arata 11, 0111. De exemplu, calculatorul interpretează codul binar ca zecimal sau hexazecimal 55. 37 10 0101. Prin urmare, sunt necesare pentru a efectua următoarele operații.:
- 37 împărțiți cu 10, rezultând un număr întreg 3, toate fracționate sunt aruncate înapoi, obținem forma binară 0000 0011;
- deplasați jumătatea inferioară a cârligului, care conține 3 până la 4 biți în stânga. au deja forma 0011 0000;
- Aplicați acum modulul 10 de divizare (% 10), adică numărul 37% 10. Ca rezultat, obținem 7, în tampon avem un cod binar 0000 0111;
- și ultima - adăugăm 0011 0000+ 0000 0111 = 11 0111;
- toate trimite acest cod la ceas.
Mai jos este codul pentru conversia unui număr în format zecimal binar:
timpul = ((timp / 10)<<4) + time%10;
TWDR = timp;
care este introdus în funcția de înregistrare (care a fost considerată în articolul precedent nr. 29), înainte de a introduce informațiile în registrul de date.
void write_DS1307 (uint8_t reg, uint8_t timp)
timpul = (((timpul 0xF0) >> 4) * 10) + (timpul 0x0F);
Mai întâi selecem șuvoiul superior, îl transferăm celui mai tânăr. înmulțiți cu 10 și obțineți zeci. Apoi, selectați partea inferioară și toate acestea se fac și obținem rezultatul.
În ceea ce privește articolul precedent (nr. 29), în program s-au adăugat biblioteci de indicatori de șapte segmente. Și în funcția principală, timpul citit și convertit, orele și minutele, traduc și trimit pe afișaj după cum urmează
m = read_DS1307 (0 × 01); citiți minutele
_delay_ms (100); // este nevoie de întârziere pentru simulator
h = read_DS1307 (0 × 02); / citiți ceasul
_delay_ms (100); // întârziere
i = h + (m * 0,01); / * treceți formatul timpului la indicator, înmulțiți-l cu 0,01 pentru acest minut și adăugați ceasul, obțineți următorul format hh, mm * /
Afișaj (i); // funcția de afișare a afișajului
Cum nu vezi nimic dificil. Sursele și proiectul sunt prezentate la sfârșitul articolului. Mai jos rezultă Proteus și glanda. Poate că ar trebui să observăm diferența dintre ele:
- pentru indicatorul din proteus, întârzierea de oprire a tranzistorilor este de 50 ms, în fierul 30;
- După cum puteți vedea mai sus, între funcțiile de transmitere a informațiilor pentru un proteus, am stabilit o întârziere de 100 ms. Pentru fier, poți și nu.
Surse și proiect
Asta e tot. În următorul articol, integrăm codul scris pentru ceas în controlerul nostru de colectare a datelor. Să rezumăm. Planificăm restul lucrărilor pentru a finaliza proiectul. Încercați, experimentați. Toate pentru moment.
Bună ziua, am un program pentru DS1302 și cu permisiunea administratorului aș vrea să-l post aici, poate că va veni la îndemână. Nu voi spune că este ideal, deoarece sunt nou în programare, totuși cineva care este mai experimentat poate spune cum să o optimizeze. Voi începe cu o descriere. Portul D este conectat la un indicator cu șapte segmente prin rezistențe de 330 ohmi. PB6, PB7 - butoanele pentru setarea orelor și minutelor, PC1 - butonul când îl apăsați (trebuie să îl păstrați în mod constant) programul intră în setarea de timp. Când apăsați, începe citirea timpului. Butoanele sunt strânse în plus prin intermediul unui rezistor de 10k. Cred că nu pot fi puse, dacă includeți o bretele pe porturile potrivite, dar acestea mi-au costat, deci cred că este mai sigur. PB0, PB1, PB2, PB3 - porturile care sunt responsabile pentru includerea cifrei corespunzătoare, sunt pornite prin tranzistori, am KP505. Între port și poarta tranzistorului sunt plasate rezistențe de 3 kOhm, între poartă și sol la 10 kOhm (deși acest lucru poate fi inutil). Sursa este conectată la masă, scurgeți la cifra corespunzătoare de pe indicator. DS1302 este conectat după cum urmează: 5 - PC5 - primul, 6 - PC4 - I / O - date, 7 - PC3 - sclk - sincronizare. Conectarea la microcontroler și ds1302 este standard.
Aici facem definiția porturilor și atribuim variabilele