Sari la conținut
ELFORUM - Forumul electronistilor

Ceas cu DS1307 si senzor temperatura/umiditate AM2302


Postări Recomandate

Buna seara,

Am urmatoarea problema: am un modul RTC DS1307, un senzor AM2302, un display 20x4 si uC PIC18F4550. 

Am doua programe separate: 1. "Citirea" RTC-ului in fiecare secunda (delay_ms 1000); 2. "Citirea" senzorului o data la 2 secunde (delay_ms 2000) conform datasheet.

Daca "combin" cele doua programe sa imi afiseze ceasul si senzorul, ceasul se afiseaza o data la doua secunde (datorita delay-ului de la partea de senzor).

Intrebarea mea ar fi: Ce procedura (structura) de programare sa folosesc astfel incat RTC-ul sa functioneze normal, iar senzorul sa fie "apelat/citit" o data la doua secunde? 

 

Multumesc,

Marius N.

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

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Cum a spus si @elison calea mai eleganta este cea a utilizarii de timere si intreruperi.

 

Dar daca nu te descurci in acest fel ai putea, in functie de structura programului, sa "serializezi" delay-urile.

 

Ceva de genul:

 

Start bucla

   Delay_1sec;

   Citesti ceasul;

   Delay_1sec;

   Citesti ceasul;

   Citesti senzorul AM2302;

Final bucla

 

Practic ceasul se citeste de doua ori pe bucla, la fiecare secunda iar senzorul de umiditate/temperatura se citeste o data pe bucla, la doua secunde.

Link spre comentariu

Nu merita sa lucrezi cu intarzieri. Prea o sa fie dependent de ceea ce mai vrei sa faci intre timp.

 

Uite un exemplu cu intrerupere de 1ms (18F45K22, nu ca ar conta prea mult, dar ca sa faci o paralela intre registri folositi). Dar ajustezi TMR1 (16 bit) sa numere 1 secunda. Vezi cum setezi prescalerul ca sa treci de la 65ms la 1secunda.

 

Nu am foarte mult timp liber, dar daca mai ai intrebari, pune aici. Daca lucrezi in Basic, ma descurc cu sintaxa. In C avem o multime de colegi care sa-ti raspunda.

' 1ms Interrupt - Gerenreaza o intrerupere la fiecare 1ms (in acest exemplu)sub procedure InitTimer1() ' 1 millisecond timer, adapt values as needed    T1CON         = 0x01    TMR1IF_bit    = 0    TMR1H         = 0xE7    TMR1L         = 0x96end sub' Interrupt routine -  cand intreruperea la 1ms a avut loc, citeste din RTCsub procedure Interrupt()  if (TMR1IF_bit) then    TMR1IF_bit = 0    TMR1H      = 0xE7 ' adapt values if necessary to have a 1ms interrupt interval    TMR1L      = 0x96 '    Check_RTC()       ' read the RTC module  end ifend sub
Link spre comentariu

ca sa ducem ideea mai departe, foloseste intreruperea doar pentru incrementarea unui registru la 1ms, modulo 10000 . (sa zicem ca l-am definit TIMP)

 

in felul acesta, in main() poti executa Check_RTC() periodic comparand TIMP cu  1000

Editat de deejay2k1
Link spre comentariu

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