Sari la conținut
ELFORUM - Forumul electronistilor

Ceas cu PIC-16F876A


Postări Recomandate

Domnilor,

am o problema in legatura cu constructia unui ceas cu PIC-16F876A la 16.000 MHz pentru care va solicit opinia, sfatul. Doresc sa am un ceas de 24 de ore, cu valori intre 00:00:00 si 23:59:59. RTCC (TMR0) este aranjat sa faca overflow la 4096 microsec iar intrerupere legata de TMR0 exista numai la overflow. In acea rutina (isr) exista secventa urmatoare:

 

if( (U32_CEAS24__US_000000_999999+=4096) >= ONE_MILLION ){  U32_CEAS24__US_000000_999999 -= ONE_MILLION ;  //  // a trecut 1 Secunda  if( ++U08_CEAS24__SS_00_59 >= 60 )  {   U08_CEAS24__SS_00_59=0;   if( ++U08_CEAS24__MM_00_59 >= 60 )   {    U08_CEAS24__MM_00_59=0;    if( ++U08_CEAS24__HH_00_23 >= 24 ) U08_CEAS24__HH_00_23 = 0;   }  }}

1.

Este corecta aceasta evolutie a celor 3 variabile?

Parca am avut impresia ca ramane in urma. Mentionez faptul ca (din anumite motive, nelegate de constructia ceasului) as cam vrea sa nu scriu octetul de la adresa 0x01 - cu exceptia initializarilor programului. Citirea, daca trebuie, sigur ca e permisa oricand.

 

2.

(Intrebare de om care nu este inginer).

Un ceas facut cu PIC este suficient de precis? Ma refer la comparatia cu ceasurile existente pe automobile (de fapt vreau sa inlocuiesc un asemenea ceas), care merg intr-un range foarte larg de temperaturi iar dupa luni de zile arata ora corect (e drept, fara secunde).

Link spre comentariu
  • Răspunsuri 38
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

de ce nu folosesti un integrat specializat legat la pic (PCD8833 - pare-mi-se) si un pic mai slabut - daca multiplexezi iti ajung pinii. La integratul specializat conectezi o baterie de backup (similara cu cele din PC-uri) - in felul acesta o sa ai si precizie si memorare timp.

am facut mai multe timere - aveam cristal la 4 mhz, intrerupere tmr0, 4ms, - si nu prea aveam erori - intra pe site la http://www.microchip.com si vei gasi mai multe ceasuri.

Link spre comentariu

MirceaM,1)Nu. Un calcul simplu arata ca "secunda ta" dureaza 1.003.520us, adica ai o secunda un pic mai lunga. Nu e de mirare ca ceasul ramane in urma.2)Da. Precizia depinde de precizia referintei cu cuart si de dibacia programatorului de a nu "scapa" impulsuri. Daca vrei sa fii extrem de precis, poti folosi un TCXO. Asta e compensat in temperatura si sta destul de tzapan cu frecventa. Softanul e alta mancare de peste. Desi ceea ce se afla in corpul IF-ului pare sa fie corect, conditia nu cred ca poate sa conduca la precizie suficienta. Ca sa ai precizia soft de care vrei, trebuie sa descompui rata de divizare in factori primi, apoi sa distribui ratele de divizare pe unde se poate.De ex, daca vrei sa divizezi cu 1 milion, asta inseamana 2^6*5^6. 2^6=64, deci nu ai ce sa cauti cu divizare cu 2^12=4096. Divizand cu 4096, ai adaugat 6 divizari cu 2 in plus, iar rezultatul va fi inevitabil fractionar. De aici e beleaua cu timingul.O varianta de distributie a divizarii ar fi cam asa. 1)Divizezi cu 2^6 cu prescalerul.2)Divizezi cu puterea maxima a lui 5 care se incadreaza in 8 biti. Asta este 5^3=125. Deci vei reincarca timer0 cu 125 la fiecare expirare.3)Mai faci o divizare cu 125 cu un numarator de intreruperi.Rata totala de divizare va fi de 64*125*125=1.000.000 adica exact cat iti trebuie. EDIT: Atentie, descrierea de mai sus e numai smantana problemei. Trebuie sa ai grija cum gestionezi latentza de acceptare a intreruperii, ca sa nu scape pe-acolo niscaiva impulsuri. Dar ideea e ca se poate face ceas si merge foarte precis si elegant.In cazul tau, daca primesti intr. la 4096us, secunda ta va fi de 4096*244=999.424us, adica prea scurta si ceasul o va lua inainte sau de 4096*245=1.003.520us, adica prea lunga (cum e si cazul tau) si ceasul va ramane in urma.Ideea de a pune inca un cip cand ai deja un procesor la indemana si viteza nu e o problema, mi se pare cel putin neeconomica. :) Bafta!Cirip

Link spre comentariu

Cirip,

este drept ca se intra in primul if (cel mai "exterior") nu la 1000000 US ci la ceva mai mult. Dar sa vedem mai detaliat.

Sa spunem ca avem drept criteriu de a verifica daca secventa e buna sau nu pretentia "a trecut 1 secunda". Daca secunda este "batuta" corect vor fi bune si celelalte (MM si HH).

La fiecare intrerupere de TMR0 overflow se parcurge secventa citata.

Se aduna 4096 US. Avem instructiunea:

 

if( (U32_CEAS24__US_000000_999999+=4096) >= ONE_MILLION )

 

Prima data se intra in corpul acestui if la valoarea de 245*4096 = 1003520 US. Este rau ca nu este exact 1000000 dar sa vedem ce se intampla mai departe.

De indata ce s-a intrat in corpul acestui if avem instructiunea:

 

U32_CEAS24__US_000000_999999 -= ONE_MILLION ;

 

adica variabila devine egala cu 1003520 - 1000000 = 3520 US.

Deci contorizarea (numararea) microsecundelor pentru secunda urmatoare se face NU incepand de la 0 ci de la "surplusul" ramas de la secunda anterioara, 3520 in acest moment (al granitei dintre prima secunda si a doua).

 

Ce se intampla la oricare alta granita de secunda? Eu cred ca se intampla acelasi lucru, cu o valoare oarecare pe post de surplus, oricum mai mica decat 4095.

Aceasta "compensare" de la o secunda la alta face (cred) ca, desi multe secunde nu sunt "batute" corect (dar toate fiind foarte aproape de a fi bine) totusi lucrurile NU se acumuleaza, nu evolueaza spre rau.

 

Intrebarea mea ramane: e buna secventa sau nu?

 

Nici mie nu imi surade sa adaug alt integrat si nici sa folosesc alt timer.

Este vorba de un soft destul de complex in care ceasul este doar o parte.

Link spre comentariu

DACA SPUI CA ESTE DESTUL DE COMPLEX ATUNCI SIGUR TE SFATUIESC SA MAI PUI UN INTEGRAT (DIL8). PLUS CA AI AVANTAJUL CA NU PIERZI ORA SETATA IN CAZUL INTRERUPERILOR DE TENSIUNE (POTI CITI SI ANUL, ETC.)DEZAVANTAJ: INCA UN QUARTZ, SOFT PENTRU i2c,.ORICUM - DACA FOLOSESTI UN COMPILATOR SI NU LUCREZI DIRECT IN ASM - O SA-TI FIE CAM GREU SA OBTII PRECIZIE FARA CEAS EXTERN - DOAR DACA NU ESTI FOARTE EXPERT, AI DESTULA RABDARE SI TE APUCI SA VEZI TRADUCEREA FIECAREI INSTRUCTIUNI IN ASM.

Link spre comentariu

ORICUM - DACA FOLOSESTI UN COMPILATOR SI NU LUCREZI DIRECT IN ASM - O SA-TI FIE CAM GREU SA OBTII PRECIZIE FARA CEAS EXTERN - DOAR DACA NU ESTI FOARTE EXPERT, AI DESTULA RABDARE SI TE APUCI SA VEZI TRADUCEREA FIECAREI INSTRUCTIUNI IN ASM.

Nu neaparat, poti obtine delay-uri foarte precise, folosind un limbaj de nivel inalt (si in assembler, desigur). Trebuie doar un pic de grija sa nu scapi intreruperi, insa nu e neaparat necesar sa fii atent pana la ultimul ciclu instructiune:http://www.microchipc.com/HiTechCFAQ/#exactintIn felul asta nu e neaparata nevoie de un RTC extern (care ar oferi, intr-adevar multe avantaje, personal recomand aceasta solutie). Pentru reglare automata poti adauga si un receptor DCF77.PS: nu e nevoie sa strigi, te "auzim" foarte bine :)Later Edit: @MirceaMSecventa data de tine pare a fi corecta si foloseste acelasi principiu ca in link-ul de mai sus. De ce nu folosesti simulatorul MPLAB pentru a verifica daca functioneaza corect, are o facilitate foarte utila (StopWatch) cu care poti urmari exact numarul de cicli instructiune.
Link spre comentariu

MirceaM,Foarte interesant si marturisesc ca mi-a scapat semnificatia instructiunii aceleia "de compensare". In conditiile date, secventa pare buna, dar as inclina spre sugestia lui Cristiano de a folosi StopWatch-ul. Ala e cel mai sigur. Daca contorizarea ciclilor, asa cum o arata StopWatch-ul, este precisa, atunci singurul element de care ar mai depinde exactitatea ceasului va fi precizia clockului si stabilitatea acestuia in raport cu temperatura, tens de alimentare si alte cele.Cirip.

Link spre comentariu

Cirip,

Inainte de a deschide acest topic am aranjat sistemasul, l-am alimentat cu o baterie din aceea gen caramida (12V/7A) si l-am lasat toata noaptea. In momentul alimentarii sistemului cu PIC, pc-ul era deschis, cu fereastra de ceas afisata. Am aranjat ca secundele (de pe lcd si din ecranul de pc) sa fie sincrone, pe cat posibil. A doua zi dimineata era jale, erau mult deosebite.

Voi testa din nou si voi observa mai atent daca o ia inainte, daca ramane in urma, cu cat anume. Voi testa si cu simulatorul.

Cat de precis este un cuartz?

Link spre comentariu

MirceaM,Nu cred ca sincronizarea vizuala a secundelor de pe LCD cu cele de pe PC este suficienta. Metoda mi se pare mult prea empirica, neprofesionala, as zice. De exemplu o sutime de secunda diferenta nu o poti sesiza cu ochiul, dar eroarea ar fi de 36 de secunde /ora, ceea ce mi se pare cam mult.Cuartul... Discutia e mai ampla aici. Daca vorbesti numai de cuartul in sine, atunci precizia de acord la temperatura relativ constanta poate fi facuta destul de buna prin acordul cu ajutorul unui trimer. Daca temperatura variaza in limite largi, atunci treaba devine mai complicata. Cred ca cuarturile uzuale pentru circuitele digitale au precizie intre 20...50ppm. Il poti aduce chiar si mai jos prin acord, dar poti sa stii cum se va comporta in temperatura. In functie de taietura, dependenta de temperatura poate fi diferita de la cuart la cuart. Cred ca aici este locul sa amintesc ca daca cineva pune un cuart in montaj si cuartul nu oscileaza exact pe frecventa scrisa pe el, ci cu 2...3KHz mai sus sau mai jos, asta nu inseamna ca cuartul e nasol. Insemana ca nu a fost incarcat cu condensatoarele potrivite. Cuartul pus intre 2 condensatoare (schema cea mai des intalnita la circuitele digitale) se comporta ca o bobina. Frecventa lui de oscilatie este undeva intre rezonanta serie si cea derivatie a cuartului; intre aceste limite, impedanta cuartului este de natura inductiva. In functie de incarcarea capacitiva , frecventa se poate ajusta intre cele doua limite. Distanta dintre cele doua frecvente depinde in general de raportul dintre capacitatea dinamica a cuartului si capacitatea asociata monturii. Gata, am aberat destul pe tema asta. :)Daca folosesti un TCXO, atunci cate zerouri are in coada, cel putin atatea sunt garantate. De ex un TCXO pe care scrie 16.00000MHz e mai precis decat unul pe care scrie 16.000MHz. In plus, TCXO-ul nu are nevoie de conzi de ajustare. De fapt cred ca cel mai bine e sa te duci in site-ul producatorului si sa vezi ce si cum.Cirip

Link spre comentariu

M-am referit la examinarea cu ochiul liber atunci cand aceasta este posibil, cand stii bine ca secundele le-ai pus sa fie cam la fel iar dimineata (dupa un timp de peste 10 ore) constati ca aceasta diferenta a ajuns la peste 10 sec. Asemenea constatare se poate face si cu ochiul liber.

Link spre comentariu

Inteleg ideea, dar mi se pare, totusi, prea empirica metoda. Eu am masurat si ajustat frecventa oscilatorului cu cuart cu ajutorul unui frecventmetru cu precizie de 1e-9. Dupa un an era inca la fix cu ora exacta de la radio. Norocul meu ca nu s-a intrerupt curentul in anul ala. Intr-adevar, ceasul statea in casa unde temperatura era destul de stabila.Pe de alta parte, da, cu cat creste intervalul de observatie la masurare, cu atat mai mult se poate scade eroarea, dar oare ai intotdeauna timp sa astepti? :)Cirip

Link spre comentariu
  • 2 luni mai târziu...

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări