Liviu M Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 N-am zis ca data e importanta (si eu am controllere de acvariu - cred ca stii ;) si nu "socotesc" data). Incercam doar sa gasesc o justificare pentru RTC.O alta justificare ar fi ca daca-i pui baterie nu pierde ora daca ai probleme cu alimentarea (cel putin asa am inteles, n-am folosit nici un RTC pana acum). Bateria pentru tot sistemul ar trebui sa fie mai mare. Link spre comentariu
XAN77 Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Știu bine cu cine mă conversez aici ;). Așa îl am și eu, cu acea baterie lîngă 1307. Dar foarte rar am avut alte probleme, care ar necesita back-up la controler. deaia zic ca data viitoare nu aș mai face cu 1307, oricum nu îmi prezintă niciun avantaj. Aș pune diodă de separare a alimentarii controlerului de restul perifericelor și aș pune o baterie de backup de 3V pentru controler, care dacă face și ceasul cu cristal pe timer2 (la mine e atmega), ar merge deci și ceasul în continuare.Problemele de care ziceam că le-am avut foarte rar constau în coruperea detelor din eeprom sau blocarea în stări aleatorii a controlerului cauzate de penele de curent și variațiile de tensiune pe rețea.Aceste blocaje (1-2 pe an, poate chiar mai rar) le-am întîmpinat și la o fostă versiune de automatizare la acvariu cu PIC.Întradevăr aici unde locuiesc acuma, că m-am mutat la țară de un an, variațiile de tensiune sunt mai dese și am avut mai des coruperi de eeprom. E foarte frustrant să vad cum temperatura pentru acvariu este setată la 99 sau mai știu eu ce valoare .Și cum baterie de back-up se cam impune pentru controler petnru siguranța absolută în funcționare, de ce să nu fie tot el și ceasul ? doar nu o sa umplu pcb-ul de baterii CR2032. Link spre comentariu
fratello Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Va multumesc frumos pentru sfaturi !Motivul pentru care NU renunt la DS1307 este unul simplu : cunostintele mele de programare sunt (foarte) limitate ! Asa cum am scris si in alt topic (tot ceas-termometru, cu display LCD) citirea senzorului de temperatura "induce" un delay in clock ; m-am chinuit mult sa introduc in soft ajustarea timpului. Prefer sa scap de aceste complicatii (pentru mine), mai ales ca sunt (cam) singurul care foloseste PBP ... si nici pe acesta asa cum mi-as dori :( . Link spre comentariu
XAN77 Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 și eu programez numai in Basic, Bascom pentru AVR cît și ProtonIDE pentru PIC.În rutina de tratare a întreruperii (care se execută o dată pe secundă), setezi bitul 15 al timerului, incrementezi secundele, minutele, orele etc, după caz, chestii care durează foarte puțin, după care în cadrul rutinei de întrerupere citești senzorul de temperatură. Nu vor mai fi delay-uri în acest caz, iar chiar și cu citirea senzorului execuția ISR nu poate dura o secundă. LA DS18B20 conversia/măsurarea temperaturii durează mult (750ms parcă) nu citirea ei din senzor. Astfel asiguri și citirea senzorului o dată pe secundă, deci are timp suficient de conversie. Link spre comentariu
Liviu M Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 În rutina de tratare a întreruperii (care se execută o dată pe secundă), setezi bitul 15 al timerului, incrementezi secundele, minutele, orele etc, după caz,Eu in rutina isr setez bitul 15, setez un flag si atat. Restul le fac in programul principal, "sincronizat" flagul respectiv.în cadrul rutinei de întrerupere citești senzorul de temperatură. Nu vor mai fi delay-uri în acest caz,Senzorul de temperatura poate fi si el citit in programul principal (n-are rost sa incarci rutina isr nenecesar). Eu folosesc un senzor conectat pe i2c; difera modul de comunicatie, da' principiul de functionare e acelasi. In main, in bucla infinita, testez flagul pentru ceas (ala setat anterior in isr). Cand e 1, - fac flagul respectiv 0 (sa pot detecta o noua secunda)- actualizez ceasul- la secunda impara comand o noua achizitie la senzorul de temperatura / la secunda para citesc senzorul.- afisez diversii parametri pe lcd.In felul asta "sincronizez" functionarea cu ceasul, avand la dispozitie o secunda pentru restul operatiilor. Mie secunda asta mi-a ajuns si fac ceva mai multe operatii (lucrez cu oscilator de 20MHz, e drept).Singura operatie "asincrona" e programarea diversilor parametri de la tastatura/PC. Link spre comentariu
MatyC Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Am incercat si eu sa fac programul pentru ceas termometru cu 2 senzori DS18S20 si am intampinat probleme destule din cauza intreruperilor provocate de TMR0 la 4 Mhz. Ca precizie a iesit OK, dar ma incurca la comunicatia 1-Wire, scriere citire in EEPROM intern si la afisarea pe LCD. Cam multe de facut in cateva microsecunde la dispozitie. Ceasul este inclus in rutina de intreruperi si cam dureaza ceva timp. Oricum eu nu sunt multumit de el. Ma gandesc sa folosesc TMR1 pentru ceas, la idee altor uzeri, cu un cuartz de 32768 Hz si eventual prescaler.Un alt aspect care ma incurca era modul de afisare a orei si datei in 16 caractere. Ma tot intreb de ceva timp care este rostul afisari secundei? La ce ma ajuta? In viata de zi cu zi nu-i vad rostul. Mai degraba afisez in 2 caractere ziua din saptamana (Lu, Ma, Mi, etc.) Eu asa vad o simplificare a rutinei ISR la gestionarea lui TMR1 prin utilizarea unei variabile globale pentru secunda iar in programul principal verific daca este 60 situatie in care ma ocup de ceas si calendar si refac variabila cu valoarea 0. Link spre comentariu
Liviu M Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Treaba lui TMR0 la tine care era? Il foloseai pentru comunicatia 1 wire? Link spre comentariu
XAN77 Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 cu TMR0 făcea ceasul probabil, TMR0 fiind de 8 biți avea întreruperi dese, între două întreruperi nu prea avea timp de o comunicare 1wire, deci unele comunicari cu senzorii erau prelungite de apariția ISR. Așa am înțeles eu.La proiectul meu nu am ceas soft cu timer, am 1307, și folosesc ca și tine pentru citirea senzorilor 18B20 un flag, cu care citesc o dată pe secundă senzorii.Da citirea senzorului se poate face in main loop nu in ISR, e mai indicat așa, concepeam și eu în timp ce scriam.La prima mea automatizare la acvariu foloseam PIC16F84, ceasul îl făcusem soft pe baza cristalului controlerului care după căutari și calcule am descoperit ca există și se divide perfect quart de 4,194304MHz . Ce vremuri, nu aveam 16F628. Oscilator intern era un vis Link spre comentariu
MatyC Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Pentru RTC. O varianta derivata din algoritmul lui Roman Black prezent si in softul lui Bogdi. Uite rutina ISR: // Rutina de gestionare a intreruperilor TMR0 //#pragma origin 4interrupt serverX (void){ int_save_registers char sv_FSR = FSR; // save FSR if required if (T0IF) { bres +=2048; if (!MenuMode) { if (bres >=62500) { bres -= 62500; tconv++; if (tconv==10) tconv=0; sec++; if (sec==60) { sec=0; min++; if (min==60) { min = 0; hour++; if (hour >= 24) { hour=0; day++; } } } } } T0IF = 0; } FSR = sv_FSR; debounce++; if (debounce == 2){debounce = 0;} //key_presed = key_port ^ 0x07; //key_presed = key_presed<<5; //key_presed = key_presed>>5; //key_presed = ~key_presed; int_restore_registers } Si aici initializarea la PIC16F628A: OPTION_REG = 0b0000.0110; // TMR0 on, prescaler to 128=0x110 CMCON = 7; // Disable Comparators INTCON = 0; T0IE = 1; Eu am folosit CC5X pentru compilare, tot un ANSI C, programul e oarecum varza la capitolul comentarii si este cam 80% din ce am vrut. Concluzia mea este ca vreu sa impac prea multe capre cu cate verze am. Plecand de la un cuartz de 4Mhz sa obtii secunda exacta este posibil insa cu ce costuri. Temperatura sare destul de des la 148 de grade lucrul cel mai enervant. Solutia ar fi sa implementez rutina de verificare CRC sau sa regandesc programul. Link spre comentariu
Liviu M Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Hm, interesant algoritmul, nu-l stiam. Trebuie sa-l studiez ceva mai pe indelete; pana atunci cateva observatii din ce am reustit sa ma prind pana acum (probabil unele-s prostii, da'...): - codul lui Roman Black pare mai bine optimizat decat al tau; desi teoretic codul tau e mai scurt/rapid (ai numere pe 16 biti, el pe 24), "spargand" numarul in 3 si folosind fiecare octet independent, operatiile lui sunt mult mai scurte si, cred eu, mai rapide (cu toate ca tu il mai pacalesti si folosesti (iarasi cred) si prescaler 8). - cum ai ajuns la 62500 ala din test? - dupa ce te-ai prins ca s-a facut o secunda, de ce mai stai in rutina de intreruperi? In locul tau as defini un flag (eu i-am zis secundaNoua), l-as face 1 si as iesi din rutina. In main as testa secundaNoua si... - ce compilator folosesti? C-ul lui uChip? LE Vad ca ai adaugat noi info intre timp, asa ca mi-e clar de unde 62500 si ce compilator folosesti . LLE Am incercat sa implementez algoritmul lui Roman (in picc de la Hitech). Daca si merge n-am idee #include <htc.h>unsigned char ucUpper;unsigned char ucMiddle;unsigned char ucLower;volatile bit bSecundaNoua;void main (void){ OPTION = 0b00000110; // TMR0 on, prescaler to 128=0x110 - aici am copiat de la MatyC, // trebuie fara prescaler, da' n-am data sheetul la indemana. CMCON = 7; // Disable Comparators INTCON = 0; T0IE = 1; ucUpper = 0x0F; ucMiddle = 0x42; ucLower = 0x40; bSecundaNoua = 0; while(1) { if(bSecundaNoua) { //setat ceas... ; } }}interrupt isr (void){ unsigned int uiTempLower=0; if (T0IF) { if(ucMiddle > 0) { ucMiddle--; } else if (ucUpper > 0) { ucUpper--; ucMiddle = 0xFF; } else { bSecundaNoua=1; ucUpper = 0x0F; ucMiddle = 0x42; uiTempLower = ucLower + 0x40; if(uiTempLower>255) { ucLower = uiTempLower - 255; ucMiddle++; } } T0IF = 0; } // if (T0IF)} Link spre comentariu
XAN77 Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 eu știu de ce ne încăpățînăm să folosim cristale de 4MHz, pentru ca le avem în urma tonelor de proiecte de pe net cu 16F84. Totuși cristalele de 4MHz nu se găsesc pe toate gardurile, nu prea se pot recupera din mai nimic ce defrișăm în mod normal, în afara montajelor vechi cu F84. De ce nu folosiți cristale ce se divid perfect la puterile lui 2? Se găsește foarte ușor de exemplu cristal de 4,096. Știu e interesant artificiul software, dar nu ar trebui sa primeze aplicația în sine! Link spre comentariu
fratello Postat Octombrie 20, 2011 Partajează Postat Octombrie 20, 2011 Domnilor, sunt convins ca veti reusi sa modificati acest cod, in sensul "indepartarii" DS1307 si folosirea -de exemplu- a codului lui Roman Black (care, se pare, este super-precis). Eu pun la dispozitie codul scris de mine pana acum ...mingea este in terenul Dvs. . '****************************************************************'* Name : scroll-clock-thermometer-16F877A'****************************************************************@ DEVICE pic16F877A, XT_OSC, WDT_ON, LVP_OFF, PWRT_ON, BOD_ONDEFINE OSC 4INCLUDE "ALLDIGITAL.pbp" OPTION_REG.7 = 0ADCON1 = 7PORTA = %00000000 'Set all INPUTS to 0 TRISA = %00000000 'Set PORTA RA0-RA5PORTB = %00000000 'Set all outputs to 0 (off)TRISB = %00000000 'Set PORTB to all outputPORTC = %00000001 'Set all outputs to 0 (off) EXCEPT DQTRISC = %00000001 'Set PORTCPORTD = %00000000 'Set all outputs to 0 (off)TRISD = %00000000 'Set PORTB to all output DQ var PortA.0SDA Var PORTC.0 ' DS1307 SDA pin #5SCL Var PORTC.1 ' DS1307 SCL pin #6'*************************************************************************************** eeprom 0, [%10100001,%01111010,%01110110,%01101110,%10100001] '0 eeprom 5, [%11111111,%01111101,%00000000,%01111111,%11111111] '1 eeprom 10,[%01111101,%00111110,%01101110,%01110110,%01111001] '2 eeprom 15,[%10111101,%01111110,%01110110,%01110110,%10101001] '3 eeprom 20,[%11100111,%11101011,%11101101,%00000000,%11101111] '4 eeprom 25,[%10111000,%01111010,%01111010,%01111010,%10100110] '5 eeprom 30,[%10100001,%01110110,%01110110,%01110110,%10101101] '6 eeprom 35,[%11111110,%00001110,%11110110,%11111010,%11111100] '7 eeprom 40,[%10001001,%01110110,%01110110,%01110110,%10001001] '8 eeprom 45,[%11111001,%01110110,%01110110,%01110110,%10001001] '9 counter var byte scan var byte scroll var byte leddata var byte[75] 'Column Data for display 75 columns temperature var Word 'reading from sensor Sign var BIT tempA var byte 'Stores First digit (High) tempB var byte 'stores Second digit (Mid) tempC var byte 'stores Third digit (low) n var byte ore var word minute var word oraa var byte orab var byte minutea var byte minuteb var byteDB Var BYTE[8] ' Data byte arrayRTCSec Var DB[0] ' alias individual bytes in arrayRTCMin Var DB[1]RTCHour Var DB[2]RTCDay Var DB[3]RTCDate Var DB[4]RTCMonth Var DB[5]RTCYear Var DB[6]RTCCtrl Var DB[7] DS18B20_12bit CON %01111111Gosub write_1307 START: CLEAR ' Init Sensor OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_12bit] OWOut DQ, 1, [$CC, $48] OWOut DQ, 1, [$CC, $B8] OWOut DQ, 1, [$CC, $BE] Pause 50 OWIn DQ, 2, [temperature.byte0, temperature.byte1] Pause 50 OWOut DQ, 1, [$CC, $44] OWOut DQ, 1, [$CC, $BE] OWIn DQ, 2, [temperature.byte0, temperature.byte1] Sign = temperature.15 temperature= ABS(temperature) temperature=((temperature >> 4)*100) + ((temperature & $F) * 100 >> 4) if sign then temperature= -temperature tempA = temperature DIG 3 tempB = temperature DIG 2 tempC = temperature DIG 1 if tempA = 0 then FOR counter = 0 TO 4 leddata [counter+8] = %11111111 next else for counter = 0 to 4 READ tempA*5+counter,leddata [counter+8] 'stores 1st digit in leddata locations 8,9,10,11,12 NEXT endif FOR counter = 0 TO 4 READ tempB*5+counter,leddata [counter+14] 'stores 2nd digit in leddata locations 14,15,16,17,18 NEXT FOR counter = 0 TO 4 READ tempC*5+counter,leddata [counter+23] 'stores 3rd digit in leddata locations 23,24,25,26,27 NEXT Gosub read_1307 oraa = ore dig 1 orab = ore dig 0 minutea = minute dig 1 minuteb = minute dig 0 FOR counter = 0 TO 4 READ oraa*5+counter,leddata [counter+41] NEXT FOR counter = 0 TO 4 READ orab*5+counter,leddata [counter+47] NEXT FOR counter = 0 TO 4 READ minutea*5+counter,leddata [counter+57] 'stores minut digit in leddata locations NEXT FOR counter = 0 TO 4 READ minuteb*5+counter,leddata [counter+63] 'stores minut digit in leddata locations NEXT ;========================================================================================================== 'leddata locations 0-7 are blank so that data scrolls onto display 'leddata locations 8-12 1st digit (leading digit) 'leddata location 13 blank column between digits 'leddata locations 14-18 2nd digit 'leddata location 19 blank column between digits 'leddata locations 20 & 21 Decimal Point 'leddata locations 23 - 27 3rd digit (last digit) 'leddata locations 28 blank column between digits 'leddata locations 29 - 34 Degrees C symbol 'leddata location 35 is a blank column at end to clear display as it scrolls ' etc, etc;========================================================================================================== for n=0 to 7leddata [n] = %11111111next n leddata [13] = %11111111 leddata [19] = %11111111 leddata [20] = %00111111 ' DECIMAL POINT leddata [21] = %00111111 leddata [22] = %11111111 leddata [28] = %11111111 leddata [29] = %11111100 ' degrees c leddata [30] = %11111100 leddata [31] = %11100011 leddata [32] = %10111101 leddata [33] = %10111101 leddata [34] = %10111101 leddata [35] = %11111111 leddata [36] = %11111111 leddata [37] = %11111111 leddata [38] = %11111111 leddata [39] = %11111111 leddata [40] = %11111111 leddata [46] = %11111111 leddata [52] = %11111111 leddata [53] = %11111111 leddata [54] = %10111011 leddata [55] = %11111111 leddata [56] = %11111111 leddata [62] = %11111111 leddata [68] = %11111111 leddata [69] = %11111111 leddata [70] = %11111111 leddata [71] = %11111111 leddata [72] = %11111111 leddata [73] = %11111111 leddata [74] = %11111111 leddata [75] = %11111111 LOOPing:FOR scroll = 0 TO 70 FOR scan = 0 TO 7 PORTB=%11111111 PAUSE 1 PORTD = 1 FOR counter = 0 TO 7 PORTB = leddata [counter] PAUSE 1 PORTD = PORTD * 2 NEXT NEXT FOR counter = 0 TO 70 leddata [counter] = leddata [counter+1] NEXTNEXTpause 5000GOTO STARTWrite_1307: I2CWRITE SDA,SCL,$D0,$00,[$00,$55,$15,$2,$6,$7,$4,$90] ' Write to DS1307 pause 10RETURNread_1307: ' Read time Secs,Mins,Hours,Day,Date,Month,Year,Control I2CREAD SDA,SCL,$D1,$00,[STR DB\8] ' Read 8 bytes from DS1307ore = (db[2] & $F )+((db[2]>>4)*10) ' Hex to Dec hourminute = (db[1] & $F )+((db[1]>>4)*10) ' Hex to Dec minutesRETURNENDAtasez si fisierul pentru simulare.scr_877a.zip Link spre comentariu
MatyC Postat Octombrie 24, 2011 Partajează Postat Octombrie 24, 2011 Prin toate cuarturile care le am nu am gasit unul care sa fie vreo putere a lui 2 si am cateva zeci. Cuartz de 4,0963 Mhz am gasit de cumparat dar ce sa fac cu aia 300Hz in plus? Sa ma complic cu condensatori?Oricum pentru mine a fost un proiect scoala de pe urma caruia sa invat cateva aspecte legate de creearea unui program pentru microcontrolere, atat si nimic mai mult.Concluzia este ca pentru a obtine secunda din 4 Mhz este o provocare mare si ceva mai complexa fatza de ce credeam. Pe viitor eu nu voi implementa asa ceva in proiectele care depasesc rolul de simplu ceas. Prefer ca in cazul in care am la dispozitie componente auxiliare care sa se ocupe de anumite functii ale montajului am sa le folosesc. De aceea nu-i recomand lui fratello sa renunte la DS1307. Eu am 2 buc plus PCF 8583 cumparate special pentru teste legate de ceas/calendar.@dorelb: m-am pierdut prin paginile din linkul prezentat de tine si tot nu am gasit originalul la ceasul tau. Nu am DS1302 la dispozitie pentru teste dar mai ales nu am timpul necesar pentru un proiect cap-coada. I-mi pare rau dar deocamdata voi sta deoparte. Link spre comentariu
XAN77 Postat Octombrie 24, 2011 Partajează Postat Octombrie 24, 2011 depinde de aplicatie. Daca montajul este in principal un ceas, si mai face eventual in plus un task (termometru sau altceva) eu as face ceasul software, buna e varianta roman black da eu nu am implementat inca asa ceva. S-ar complica cablajul si ar mari costul un rtc dedicat.Daca aplicatia e mai complexa un 1307 ceva e chiar util, debarasand controlerul de o intrerupere obligatorie si alte operatii.De exemplu ceasul lui bogdi este frumos tocmai pentru ca e asa cum e, daca era facut cu un 1307 nu mai avea niciun farmec. Plus ca ar fi fost lipsit de functia de tunning fin al preciziei. Link spre comentariu
iuli09 Postat Noiembrie 30, 2011 Partajează Postat Noiembrie 30, 2011 http://www.bogdi.ro/electronics/digital ... b20_CA.png Cu ce as putea inlocui diodele BAT43 in schema de mai sus ? am cateva BAT85 , se poate inlolocui cu asa ceva ? 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