Sari la conținut
ELFORUM - Forumul electronistilor

pic 16f84a - termometru


dorelb

Postări Recomandate

  • Răspunsuri 859
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • dorelb

    246

  • marik2500

    97

  • GeoMar

    84

  • fratello

    69

Top autori în acest subiect

Imagini postate

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

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

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

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

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

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

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

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

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

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

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

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

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