gr1ph0n Postat Ianuarie 27, 2011 Partajează Postat Ianuarie 27, 2011 Ceva rezultate de la teste? Link spre comentariu
dorelb Postat Ianuarie 27, 2011 Autor Partajează Postat Ianuarie 27, 2011 De aseara pana acum -3,4 secunde la Cdt_4-hex. Am prescurtat eu pentru mine, si am modificat codul pentru semnul gradeC. Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
gr1ph0n Postat Ianuarie 27, 2011 Partajează Postat Ianuarie 27, 2011 Mai importanta e varianta 5. Link spre comentariu
dorelb Postat Ianuarie 27, 2011 Autor Partajează Postat Ianuarie 27, 2011 Bine. O pun imediat. Pornirea se face de la 00:55:55. Senzorul 2 face prostii. Arata cam la 3 - 4 secunde (-0.0, -1.2, -56.4, -201.2, -166.5). Mai trebuie lucrat al senzorul 2. Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
gr1ph0n Postat Ianuarie 27, 2011 Partajează Postat Ianuarie 27, 2011 Varianta test cu nr. fara numar Actualizarea senzorilor se face la 5 sec astfel: sec. 0 se trimite comanda de conversie, sec. 1 se citesc senzorii, sec.5..., sec. 6 etc.) Afisarea date in prima zi nu se realizeaza, incepanda cu ziua 2 se realizeaza si afisarea datei (actualizarea datei o data pe zi). Cel putin in Proteus functioneaza si nu mai apar glitch-uri la afisarea temperaturilor Link spre comentariu
dorelb Postat Ianuarie 27, 2011 Autor Partajează Postat Ianuarie 27, 2011 Da. Functioneaza si nu mai apar glitch-uri la afisarea temperaturilor, si nici data. Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
dorelb Postat Ianuarie 27, 2011 Autor Partajează Postat Ianuarie 27, 2011 Pentru marik2500. Cu asta mi-am rupt maini, picioare. Am incercat si eu Sprint-ul. Am facut un 12LedChaser pentru PC. Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
dorelb Postat Ianuarie 28, 2011 Autor Partajează Postat Ianuarie 28, 2011 Pentru gr1ph0n. De cate ori se regleaza ceasul, dispare data (luna-ziua). ?????? Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
gr1ph0n Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 Pentru gr1ph0n. De cate ori se regleaza ceasul, dispare data (luna-ziua). ??????Da, pentru ca afisarea datei se face atunci cand are loc actualizarea ei si anume 1 data pe zi. Cu cat ramane in urma? Link spre comentariu
dorelb Postat Ianuarie 28, 2011 Autor Partajează Postat Ianuarie 28, 2011 De aseara pana acum a ramas 5 secunde. Si atunci data nu mai ramane afisata deloc? Ceea ce face un lucru valoros, este nu ceea ce ai tu de castigat facandu-l, ci ceea ce pierzi daca nu-l faci. Link spre comentariu
gr1ph0n Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 Poftim:Cred ca pentru mine va fi ultima varianta. Ma voi indrepta spre o varianta cu un al doilea cristal de 32.768 intre pinii RB6, RB7. Insa va necesita modificari hardware. Link spre comentariu
gr1ph0n Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 As mai incerca o singura varianta.Scrisa pentru un PIC16F628-20MHz.Daca cineva are in montajul sau un astfel de pic, va rog sa incarcati programul cu un cristal de 20 MHz si sa postati rezultatele.Teoretic in simulator cu un cristal de 4 MHz din 100 intreruperi(100 intreruperi=1sec) sunt corecte 97, cu 20 MHz corecte sunt 99. Link spre comentariu
Eugen_B Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 Nu stiu cum ai facut tu ceasul, ca nu am vazut nicaieri sa fie vreun cod, asa ca am facut si eu ceva rapid. int d;char s,m,h;void interrupt isr(void){ d+=4; T0IF = 0;}void main(){ T0CS = 0; T0IE = 1; GIE = 1; PSA = 1; s=0; m=0; h=0; while(1) { if(d>15625) { d-=15625; s++; if(s==60) { s=0; m++; if(m==60) { h++; if(h==24) { h=0; } } } } AfiseazaOra(); CitesteTemp(); AfisazaTemp(); }}Nu ar trebui sa mearga mai repede sau mai incet, decat in limitele tolerantelor cristalului, care cred ca sunt mici, cristalul e presupus de 4Mhz. Ideea e ca intreruperea se activeaza la 256uS , deci o secunda ar fi la 1/0.000256 , adica 3906.25 intreruperi , de asta cresc pe d cu 4 , ca sa fie numar intreg. In main , nu verific valoarea exacta 3906.25*4 (15625) si il dau la zero ,ci verific daca a trecut de aceasta valoare si scad 15625 pentru ca daca se intampla ca verificarea sa nu se poata realiza la fiecare incrementare , sa nu se piarda diferenta rezultata. Link spre comentariu
gr1ph0n Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 Nu am spus nicaieri ca ceasul (doar ceasul) nu ar fi precis, ci ca precizia acestuia este afectata si de celelalte lucruri pe care le face pic-ul.Schema este postata, oricine doreste poate scrie un soft functional si sa il posteze aici.Ar fi un castig. Link spre comentariu
fratello Postat Ianuarie 28, 2011 Partajează Postat Ianuarie 28, 2011 Atat eu cat si colegul gr1ph0n (caruia ii multumesc si pe acesta cale !) am scris n-spe coduri, in PicBasicPro, pentru acest proiect. Asa cum spune si el, ceasul in sine merge ~ PERFECT ! Dar, citirea senzorilor de temperatura (la rezolutie de 9 biti =93.75 ms, 10 biti =187.5 ms, 11 biti =375 ms, pentru fiecare !) introduce intarzieri in program, pe care nu le-am putut corecta software. Cineva care cunoaste mai bine programare (eu sunt un biet amator, asa cum am mai spus-o) poate rezolva problema. Si, ca dovada a celor afirmate, uitati inca doua coduri, asupra carora am facut m-spe (!) modificari, doar, doar... Niciunul nu a corespuns asteptarilor mele ! @ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFFDEFINE OSC 4 ' using a 4MHz crystalTRISA= %11111000 ' RA0..3=Outputs RA4=InputTRISB= %00001111 ' RB0..RB2=Inputs, RB3..RB7=OutputsDEFINE LCD_DREG PORTB ' LCD on port BDEFINE LCD_DBIT 4 ' Data bits B4..B7DEFINE LCD_RSREG PORTA ' RS on PORTADEFINE LCD_RSBIT 1 ' RS on A1 DEFINE LCD_EREG PORTA ' E on PORTADEFINE LCD_EBIT 0 ' E on A0DEFINE LCD_BITS 4 ' LCD 4 bit modeDEFINE LCD_LINES 2 ' 2 line LCD displayDEFINE LCD_COMMANDUS 2000 ' Command delay time in us DEFINE LCD_DATAUS 50 ' Data delay time in us ' setup vars for clockTime VAR BYTE ' accumulates TMR2 to PR2 match countsMinutes VAR BYTE ' minutesHours VAR BYTE ' hoursSeconds VAR BYTEMatch VAR PIR1.1 ' TMR2 to PR2 match interrupt flag bit CMCON = 7 ' disable comparatorsINTCON = 0 ' not using interupts. Just monitoring int flag bits Time = 0 ' clear TMR2 to PR2 match counterHours = 00 ' set clock starting hour hereMinutes = 00 ' set clock starting minutes hereSeconds = 0 PR2 = 249 ' 249 +1 extra cycle for TMR2 reset = 250*5*16*1uS=20mSMatch = 0 ' clear match flag ' setup & start TMR2T2CON = %00100110 ' 1:5 postscale, 1:16 prescale, TMR2 on Main: ' every 20mS the TMR2IF flag is set, and this routine is entered. ' Plenty of time to do other stuff. IF Match THEN ' has TMR2 matched PR2? (should happen every 20mS) Match = 0 ' yes. clear TMR2 to PR2 match flag bit Time = Time + 1 ' increment 20mS count IF Time = 50 THEN ' 50 x 20mS = 1 second Time = 0 ' show time in 1 second intervals LcdOut $FE, $80, DEC2 Hours, ":",DEC2 Minutes, ":",DEC2 Seconds,13,10 Seconds = Seconds + 1 ENDIF IF Seconds = 60 THEN ' has 60 seconds passed? Seconds = 0 Minutes = Minutes + 1 ' increment minute count IF Minutes = 60 THEN ' have 60 minutes passed? Minutes = 0 ' yes. roll-over minutes 00 Hours = Hours + 1 ' update hours IF Hours = 24 THEN Hours = 0 ' roll-over hours from 24 to 00 ENDIF ' end IF Minutes = 60 ENDIF ' end IF Seconds = 60 ENDIF ' end IF Match GOTO MainEND si @ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFFDEFINE OSC 4INCLUDE "AllDigital.pbp"TRISA= %11111000 ' RA0..3=Outputs RA4=InputTRISB= %00001111 ' RB0..RB2=Inputs, RB3..RB7=OutputsCMCON=7 ' Disable comparatorsOPTION_REG=%00000111INTCON=0DEFINE LCD_DREG PORTB ' LCD on port BDEFINE LCD_DBIT 4 ' Data bits B4..B7DEFINE LCD_RSREG PORTA ' RS on PORTADEFINE LCD_RSBIT 1 ' RS on A1 DEFINE LCD_EREG PORTA ' E on PORTADEFINE LCD_EBIT 0 ' E on A0DEFINE LCD_BITS 4 ' LCD 4 bit modeDEFINE LCD_LINES 2 ' 2 line LCD displayHzTimer Var WordHH Var Byte MM Var Byte SS Var ByteZIUA VAR BYTELUNA VAR BYTE X Var Byte col Var BitHzTimer = $7A12HH=00 : MM=00 : SS=00 : ZIUA=01 : LUNA=01 : col=0 : Mode=0Pause 500LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor offPause 100OPTION_REG.7=1TMR0=0INTCON.2=0'====================================Pause 500LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor offPause 250'==================================== MainLoop: If PORTB.0=0 then ' Mode switch pressed Pause 50 ' Debounce LcdOut $FE, 1 LcdOut $FE, $C0, " SETTING" ' Show that command is accepted PAUSE 500 LcdOut $FE, 1If PORTB.0=0 then MainLoop ' Wait until button is released Mode=Mode+1 ' Increment modeENDIFIf Mode=1 then ' SET HOURLcdOut $FE, $80, dec2 HHLcdOut $FE, $C0, "HOUR SETTING" if portb.1=0 then HH=HH+1 IF HH=24 then HH=0 ENDIF Gosub Debounce endif if portb.2=0 then IF HH = 0 then HH=24 ENDIF HH=HH-1 Gosub Debounce endifEndIfIf Mode=2 then ' SET MINUTESLcdOut $FE, $80, dec2 HH,":",dec2 MMLcdOut $FE, $C0, "MINUTES SETTING" if portb.1=0 then SS=0 MM=MM+1 IF MM=60 THEN MM=0 ENDIF Gosub Debounce endif if portb.2=0 then SS=0 IF MM =<0 THEN MM=60 ENDIF MM=MM-1 Gosub Debounce endifEndIfIf Mode=3 then ' SET DAYLcdOut $FE, $80, dec2 HH,":",dec2 MM,":",dec2 ss," ",DEC2 ZIUA,"/"LcdOut $FE, $C0, "DAY SETTING" if portb.1=0 then ziua=ziua+1 IF LUNA=2 THEN IF ZIUA > 28 THEN ZIUA=1 ENDIF ENDIF IF LUNA=4 OR LUNA=6 OR LUNA=9 OR LUNA=11 THEN IF ZIUA > 30 THEN ZIUA=1 ELSE IF ZIUA > 31 THEN ZIUA=1 ENDIF Gosub Debounce endif if portb.2=0 then ZIUA=ZIUA-1 IF ZIUA = 0 THEN ZIUA=31 Gosub Debounce endifEndIfIf Mode=4 then ' SET MONTH LcdOut $FE, $80, dec2 HH,":",dec2 MM,":",dec2 ss," ",DEC2 ZIUA,"/",DEC2 LUNALcdOut $FE, $C0, "MONTH SETTING" if portb.1=0 then luna=luna+1 if luna>12 then luna=1 endif Gosub Debounce endif if portb.2=0 then luna=luna-1 if luna<1 then luna=12 endif Gosub Debounce endifEndIfIf Mode > 4 then LCDOUT $FE, $C0, "END SETTING" PAUSE 1000 LCDOUT $FE, 1, $FE, $0C mode=0EndIfIf Mode > 0 then Mainloop '====================================Main :ClockLoop : IF INTCON.2=0 THEN ClockLoopINTCON.2=0if portb.0=0 then Gosub MainLoop HzTimer = HzTimer - $1000 'decrement timerIF HzTimer<$1000 THEN IF Col=1 THEN 'update time' SS=SS+1 IF SS=60 THEN SS=0 MM=MM+1 IF MM=60 THEN MM=0 HH=HH+1 IF HH=24 THEN HH=0 ZIUA=ZIUA+1 IF LUNA=2 THEN IF ZIUA > 28 THEN ZIUA=1 LUNA=3 ENDIF ENDIF IF LUNA=4 OR LUNA=6 OR LUNA=9 OR LUNA=11 THEN IF ZIUA > 30 THEN ZIUA=1 LUNA=LUNA+1 ENDIF ENDIF IF LUNA=1 OR LUNA=3 OR LUNA=5 OR LUNA=7 OR LUNA=8 OR LUNA=10 THEN IF ZIUA > 31 THEN ZIUA=1 LUNA=LUNA+1 ENDIF ENDIF IF LUNA=12 THEN IF ZIUA > 31 THEN ZIUA=1 LUNA=1 ENDIF ENDIF ENDIF ENDIF ENDIF'==================================== display time with : LcdOut $FE, $80, dec2 HH,":",dec2 MM,":",dec2 ss," ",DEC2 ZIUA,"/",DEC2 LUNA ELSE'==================================== display time without : LcdOut $FE, $80, dec2 HH,":",dec2 MM," ",dec2 ss," ",DEC2 ZIUA,"/",DEC2 LUNA ENDIF Col=Col+1 HzTimer=HzTimer+$7A12ENDIFgoto Main' SUBROUTINES:'====================================Debounce :For Delay= 1 to 200Pause 1next DelayReturn '====================================END ' Of program 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