Clock and Dual Termometer


Results 1 to 25 of 25

Threaded View

  1. #1
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582

    Default Clock and Dual Termometer

    Hi everyone !
    I try to build for my use , in home, one clock with dual termometer, using 16F628A, 2x16 LCD and 2 x DS18B20. I wrote the code, but... at every minute I have a few seconds more...I don't have a clue where it's the mistake. Can help me, please ? Thanks in advance !
    Code:
    @ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFF
    
    TRISA= %11111000                       ' RA0..3=Outputs RA4=Input
    TRISB= %00001111 			    ' RB0..RB2=Inputs, RB3..RB7=Outputs
    CMCON=7                                     ' Disable comparators
    OPTION_REG=%00000111
    
    DEFINE LCD_DREG PORTB               ' LCD on port B
    DEFINE LCD_DBIT 4                        ' Data bits B4..B7
    DEFINE LCD_RSREG PORTA            ' RS on PORTA
    DEFINE LCD_RSBIT 1                     ' RS on A1 
    DEFINE LCD_EREG PORTA              ' E on PORTA
    DEFINE LCD_EBIT 0                       ' E on A0
    DEFINE LCD_BITS 4                      ' LCD 4 bit mode
    DEFINE LCD_LINES 2                     ' 2 line LCD display
    
    TempC           var     word
    Float           var     word
    Sign		    var	bit		   ' +/- sign
    DQ		    var     PORTA.4	   ' One-wire data pin
    TempC2          var     word
    Float2          var     word
    Sign2		    var	BIT		   ' +/- sign
    DQ2		    var     PORTA.3	   ' One-wire data pin
    Delay           var     byte
    Mode            var     byte 
    semn		    var     word
    semn2           var     word
    
    DS18B20_1_12bit CON %01111111 	   ; 750ms,   0.0625°C  (default)
    DS18B20_2_12bit CON %01111111          ; 750ms,   0.0625°C  (default)
    
    
    Ticks		var	byte 	               ; Tick count (61 ticks=1 sec)
    Hour		var	byte 			   ; Hour variable
    Minute	var	byte 	               ; Minute variable
    Second	var	byte   	         ; Second variable
    ZIUA        var   byte 
    LUNA        var   byte 	
    Disp		var	byte 	               ; Disp=1 to update display
    
    PAUSE 500 					   ; Wait 0.5sec for LCD to initialize
    
    Hour=0 : Minute=0 : Second=0
    Ticks=0  : ZIUA=01 : LUNA=01
    
    OPTION_REG=$05 				   ; Set prescaler
    ON INTERRUPT GOTO ISR			   ; ISR routine
    INTCON=$A0 					   ; Enable TMR
    LCDOUT $FE, 1 			         ; Clear LCD
    
    ' Init Sensor 1
     OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_1_12bit]
     OWOut DQ, 1, [$CC, $48]       	    
     OWOut DQ, 1, [$CC, $B8] 
     OWOut DQ, 1, [$CC, $BE] 
     Pause 50
     OWIn DQ, 2, [TempC.byte0, TempC.byte1]
     Pause 50 
    ' Init Sensor 2
     OWOUT DQ2, 1, [$CC, $4E, 0, 0, DS18B20_2_12bit]
     OWOut DQ2, 1, [$CC, $48]       	    
     OWOut DQ2, 1, [$CC, $B8] 
     OWOut DQ2, 1, [$CC, $BE] 
     Pause 50
     OWIn DQ2, 2, [TempC2.byte0, TempC2.byte1]
     Pause 50 
    
    
    LOOP:
    
    If PORTB.0=0 then                       ' Mode switch preSeconded
      	Pause 50                          ' Debounce 
    	LcdOut $FE, 1
     	LcdOut $FE, $C0, "         SETTING"    ' Show that coMinuteand is accepted 
    	PAUSE 500
     	LcdOut $FE, 1
    If PORTB.0=0 then Loop                  ' Wait until button is released  
      Mode=Mode+1                           ' Increment mode
    ENDIF
    
    
    If Mode=1 then                          ' SET HOUR
    LcdOut $FE, $80, dec2 Hour
    LcdOut $FE, $C0, "HOUR     SETTING"
    	if portb.1=0 then
          Hour=Hour+1
            IF Hour=24 then
              Hour=0
            ENDIF
          Gosub Debounce
    	endif
    
    	if portb.2=0 then
            IF Hour = 0 then
              Hour=24
            ENDIF
          Hour=Hour-1
          Gosub Debounce
    	endif
    EndIf
    
    If Mode=2 then                          ' SET MINUTES
    LcdOut $FE, $80, dec2 Hour,":",dec2 Minute
    LcdOut $FE, $C0, "MINUTES  SETTING"        
    
    	if portb.1=0 then
          Second=0                        
          Minute=Minute+1
            IF Minute=60 THEN
              Minute=0
            ENDIF
          Gosub Debounce
    	endif
    
    	if portb.2=0 then
          Second=0                        
            IF Minute =<0 THEN
              Minute=60
            ENDIF
          Minute=Minute-1
    	Gosub Debounce
    	endif
    EndIf
    
    If Mode=3 then                          ' SET DAY
    LcdOut $FE, $80, dec2 Hour,":",dec2 Minute,":",dec2 Second,"   ",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
    	endif
    EndIf
    
    If Mode=4 then                           ' SET MONTH 
    LcdOut $FE, $80, dec2 Hour,":",dec2 Minute,":",dec2 Second,"   ",DEC2 ZIUA,"/",DEC2 LUNA
    LcdOut $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
    	endif
    EndIf
    
    If Mode > 4 then 
    	LCDOUT $FE, $C0, "END      SETTING"
    	PAUSE 1000
        LCDOUT $FE, 1, $FE, $0C 
    	mode=0
    EndIf
    
    If Mode > 0 then Loop               
    
    IF Disp=1 THEN
    
    LcdOut $FE, $80, DEC2 Hour, ":",DEC2 Minute, ":",DEC2 Second,"   ",DEC2 ZIUA,"/",DEC2 LUNA
    
    LCDOUT $FE, $C0, semn,DEC ABS TempC/100,".", DEC1 ABS TempC/10, 223,"C ", $FE, $C0 + 9, semn2,DEC ABS TempC2/100,".", DEC1 ABS TempC2/10, 223,"C   " 
    
    Disp=0
    ENDIF
    
    GOTO LOOP
    
    DISABLE
    ISR:
    Ticks=Ticks + 1
    IF Ticks < 61 THEN NoUpdate
    Ticks=0
    Second=Second + 1 		   ; Update second
    IF Second=60 THEN
    Second=0
    Minute=Minute + 1 		   ; Update Minute
    IF Minute=60 THEN
    Minute=0
    Hour=Hour + 1 			   ; Update Hour
    IF Hour=24 THEN
    Hour=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
    Disp=1 				   ; Set to update display
    Gosub Read_temp
    
    NoUpdate:
    INTCON.2=0 				   ; Re-enable TMR0 interrupts
    Resume
    ENABLE 				   ; Re-enable interrupts
    END
    
    
    ;=================================
    ;Subrutine 
    
    Debounce:
    FOR Delay=1 To 200
    Pause 1 				   ; Delay 1ms inside a loop. This way,
    NEXT Delay 				   ; timer interrupts are not stopped
    Disp=1 				   ; Set display flag to 1
    RETURN
    ;==================================
    Read_Temp:
        OWOut DQ, 1, [$CC, $44] 
        OWOut DQ, 1, [$CC, $BE]
        OWIn  DQ, 2, [TempC.byte0, TempC.byte1]         
    
        Sign = TempC.15
        TempC = ABS(TempC)
        TempC = ((TempC >> 4)*100) + ((TempC & $F)*100 >> 4)
        IF Sign THEN TempC = -TempC
    IF TempC.15 THEN 
    Semn="-" 
    else
    Semn="+"
    endif
    
        OWOut DQ2, 1, [$CC, $44] 
        OWOut DQ2, 1, [$CC, $BE]
        OWIn  DQ2, 2, [TempC2.byte0, TempC2.byte1]         
    
        Sign2 = TempC2.15
        TempC2 = ABS(TempC2)
        TempC2 = ((TempC2 >> 4)*100) + ((TempC2 & $F)*100 >> 4)
        IF Sign2 THEN TempC2 = -TempC2
    IF TempC2.15 THEN 
    Semn2="-"
    else
    Semn2="+"
    endif
    Return
    ;=====================================
    
    END 					   ; End of program
    Attached Images Attached Images  

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts