Sigisman Postat Iulie 12, 2015 Partajează Postat Iulie 12, 2015 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
Elison Postat Iulie 12, 2015 Partajează Postat Iulie 12, 2015 Incearca sa apelezi la interuperii, renunta la delay. Link spre comentariu
mars01 Postat Iulie 12, 2015 Partajează Postat Iulie 12, 2015 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
Mircea Postat Iulie 13, 2015 Partajează Postat Iulie 13, 2015 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
deejay2k1 Postat Iulie 13, 2015 Partajează Postat Iulie 13, 2015 (editat) 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 Iulie 13, 2015 de deejay2k1 Link spre comentariu
Sigisman Postat Iulie 13, 2015 Autor Partajează Postat Iulie 13, 2015 Buna ziua, Voi incerca ideea propusa de domnul mars01 (momentan nu am cunostintele necesare pentru a putea lucra cu timere si intreruperi). Multumesc tuturor pentru ajutor !!! O zi buna ! Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum