Mihai Popa Postat Iunie 4, 2010 Partajează Postat Iunie 4, 2010 Buna ziua.Vreau sa fac un ceas cu afisare pe 6 digiti, care sa afiseze ore,minute, secunde si apoi zi, luna, an. Ceasul il fac cu DS1307.procesorul este pic16f690. Simulatea o fac in Proteus, iar codul il scriu in Picbasic Pro. Problema mea este ca inca nu stiu cum sa fac sa afisez 5 secunde, sa zicem, ora-minut-secunde, apoi 5 secunde data; si tot asa....Va rog, daca ma puteti ajuta cu metoda de afisare a unor informatii , apoialtele, revenire la primele... Link spre comentariu
nooob64 Postat Iunie 4, 2010 Partajează Postat Iunie 4, 2010 Cel mai simplu faci utilizind un delay de 5000 ms , trebuie sa aibe compilatorul asa ceva , vezi in help functie 'built in' de delay ; mai frumos ar fii sa utilizezi un timer , pe care il calculezi si iti faci un contor care se incrementeaza pina cind au trecut 5 secunde, in acest fel nu mai faci citiri infinite din acel DS1307 , ci doar intr-un interval de 5 secunde. Link spre comentariu
stefan_k Postat Iunie 4, 2010 Partajează Postat Iunie 4, 2010 Avand in vedere ca se citesc/afiseaza si secundele, cel mai simplu e sa compari secunda noua cu secunda de referinta (numeri efectiv 5 secunde). In felul acesta nu mai conteaza nici frecventa cu care citesti ora din DS1307; poti sa faci citiri incontinuu, fara pauze, si sa numeri de cate ori se schimba secundele. Link spre comentariu
Mihai Popa Postat Iunie 5, 2010 Autor Partajează Postat Iunie 5, 2010 Va multumesc pentru raspunsuri.Problema mea este cam asa: ceasul vreau sa il fac cu ds1307 pentru ca are ceas si data. Deci, eu vreau sa afisez pentru o perioada, sa zicem 5 secunde, ceasul si pentru aceeasi perioada, data; apoi sa se reia afisarea.Am definit 6 variabile, cate una pentru fiecare digit.Pot afisa permanent doat una din informatii, ceasul sau data, in sa nu ma prind cum as putea sa le comut. Link spre comentariu
puiu Postat Iunie 5, 2010 Partajează Postat Iunie 5, 2010 1. Crezi doua stari interne una pentru care afisezi ora si una pentru afisatea datei. Comutarea intre cele doua stari se face printr-unul din sistemele descrise mai sus. De ce nu faci ceasul cu resurse interne si nu mai ai DS1307?2. Daca mi-a aduc aminte bine, DS1307 genereaza o intrerupere la fiecare secunda si o poti utiliza pentru a numara secundele. Link spre comentariu
srdjan Postat Iunie 5, 2010 Partajează Postat Iunie 5, 2010 char secVeche='\0';char Ora[7], Data[7];//Ora[6]='\0'; Data[6]='\0';void citesteValori(){ //citesti adresele 0x00-0x07 (poti sari peste 0x03=ziua din saptamana) si le pui in Ora[] si Data[]}void arataOra(){}void arataData(){}main(){int count=0; while(1) { citesteValori(); if(secVeche!=Ora[5]) { count++; secVeche=Ora[5]; } if(count<=5) { arataOra(); } else { arataData(); if(count>10) count=0; } }} nu ma pot expirma in basic, ti-am scris in C ca sa iti arat cum am gandit-o eu. daca sintaxa e problema nu te pot ajuta :| Link spre comentariu
fratello Postat Iunie 5, 2010 Partajează Postat Iunie 5, 2010 Pentru PicBasicPro uita-te si pe aici : picbasic.co.uk/forum. Sigur vei gasi raspunsul... Link spre comentariu
Vizitator ics_igrec_zet Postat Iunie 21, 2010 Partajează Postat Iunie 21, 2010 Eu am folosit ds1307 si 16f628, uite codul: define i2c_sclout 1cx var portb.7dx var portb.6secunda var byteminut var byteora var byteziuaS var byteziuaF var byteluna var byteanul var byteact var biteeprom 0,[0]read 0,actif act=0 then setRTCstart:i2cread dx,cx,%11010000,0,[secunda]i2cread dx,cx,%11010000,1,[minut]i2cread dx,cx,%11010000,2,[ora]i2cread dx,cx,%11010000,3,[ziuaS]i2cread dx,cx,%11010000,4,[ziuaF]i2cread dx,cx,%11010000,5,[luna]i2cread dx,cx,%11010000,6,[anul]lcdout $fe,1,hex2 ora,":",hex2 minut,":",hex2 secundalcdout $fe,$c0if ziuaS=$1 then lcdout "Dum."if ziuaS=$2 then lcdout "Lun."if ziuas=$3 then lcdout "Mar."if ziuas=$4 then lcdout "Mie."if ziuaS=$5 then lcdout "Joi."if ziuaS=$6 then lcdout "Vin."if ziuas=$7 then lcdout "Sam."lcdout $fe,$c5,hex2 ziuaf,"/"lcdout $fe,$cb,"/20",hex2 anullcdout $fe,$c8 if luna=$1 then lcdout "Ian" if luna=$2 then lcdout "Feb" if luna=$3 then lcdout "Mar" if luna=$4 then lcdout "Apr" if luna=$5 then lcdout "Mai" if luna=$6 then lcdout "Iun" if luna=$7 then lcdout "Iul" if luna=$8 then lcdout "Aug" if luna=$9 then lcdout "Sep" if luna=$10 then lcdout "Oct" if luna=$11 then lcdout "Nov" if luna=$12 then lcdout "Dec"pause 500goto startsetRTC:i2cwrite dx,cx,%11010000,0,[$00] ;setare secunde 0-60pause 10i2cwrite dx,cx,%11010000,1,[$30] ;setare minute 0-60pause 10i2cwrite dx,cx,%11010000,2,[$13] ;setare ora 0-23pause 10i2cwrite dx,cx,%11010000,3,[$2] ;setare zi saptamana 1-7pause 10i2cwrite dx,cx,%11010000,4,[$27] ;setare zi luna 0-31pause 10i2cwrite dx,cx,%11010000,5,[$9] ;setare luna 1-12pause 10i2cwrite dx,cx,%11010000,6,[$10] ;setare anpause 10i2cwrite dx,cx,%11010000,7,[$10] ;setare pin7 ds1307 1Hzpause 10write 0,1goto startend Salut, sper sa te ajute. Link spre comentariu
XAN77 Postat Iunie 22, 2010 Partajează Postat Iunie 22, 2010 pai faci asa : definiri etc ale programului..............docitesti ceasul, care da datele in format BCDGosub verifica_secundadaca <=4 then Gosub afiseaza_ceasdaca >4 then Goto afiseaza_dataun posibil delay sa nu afiseze foarte des si sa dea efect de flicarireloopafiseaza_ceas:afisezi efectiv oraReturnAfiseaza_data:afisezi efectiv dataReturnVerifica_secunda:rutina in care pui secundele intr-o alta variabila si ii stergi cei mai semnificativi 4 biti, sa ramai doar cu primul digit bcd, adica doar unitatile numarului total de secundeReturnEND 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