ccp1 with 24 hr timer


Closed Thread
Results 1 to 1 of 1
  1. #1
    Join Date
    Feb 2012
    Posts
    7

    Default ccp1 with 24 hr timer

    Hello ,All
    Can someone please help me to insert code for 24 hour timer in the following water level code using ccp1 to measure water consumption in 24 hours. I found Darrel Instant routine is very simple to use I used it before (Thanks to Darrel Talor) but I am not able to make it work with this code (pic16f628A):

    Code:
      define OSC 16
        PAUSE 10000                       'To allow use of in circuit programming
        DEFINE LCD_DREG  PORTB   	' Set LCD Data port
    	DEFINE LCD_DBIT  4        	' Set starting Data bit (0 or 4) if 4-bit bus
    	DEFINE LCD_RSREG PORTB     	' Set LCD Register Select port
    	DEFINE LCD_RSBIT 0       	' Set LCD Register Select bit
    	DEFINE LCD_EREG  PORTB   	' Set LCD Enable port
    	DEFINE LCD_EBIT  1       	' Set LCD Enable bit
    	DEFINE LCD_BITS  4       	' Set LCD bus size (4 or 8 bits)
    	DEFINE LCD_LINES 2       	' Set number of lines on LCD
    	DEFINE LCD_COMMANDUS   2000	' Set command delay time in us
    	DEFINE LCD_DATAUS        50	' Set data delay time in us
        Pause 1000                  ' WAIT FOR LCD TO COME UP
       'OPTION_REG.7=0
    ' Software Defines 
    ' ----------------
       capture VAR PIR1.2 
    ' CCP1 capture flag 
       overflow VAR PIR1.0 
    ' Timer1 overflow flag 
       CalPeriod var word  'Caliberated Period.
       temp var word      'pereiod storage 
       period VAR WORD 
    ' Period value 
       TempA var word 
       TempB var Word
       Zreading var word
       cal var PORTB.2
       barnum var    byte
       h var byte
       level var word
       barsiz var    byte
       CalValue var word
       I VAR BYTE
       hight var word
      DIMswitch var PORTA.1  ' SET DIMENTION SWITCH 
       LENGTH VAR WORD
       WIDTH VAR WORD
       T VAR WORD
       REMD VAR WORD
       LVL VAR WORD
       S VAR WORD
       F VAR WORD
       UPDATE VAR BIT
       wl var word
       wlrmndr var word
       BarNum=2                   'to prevent divide by 0
     'SET DEFAULT DIMENTION 
    
     'FIRST, ON START UP DISPLAY HIGHT
        READ 2,HIGHT.BYTE0
        READ 3,HIGHT.BYTE1            'READ HIGHT FROM EEPROM AND DISPLAY IT.
        READ 4,LENGTH.BYTE0
        READ 5,LENGTH.BYTE1
        READ 6,WIDTH.BYTE0
        READ 7,WIDTH.BYTE1  
        Lcdout $fe,1,"HI,"," ","LEN,"," ","WID"	
        Lcdout $fe,$C0,#hight,",",#LENGTH,",",#WIDTH," ","cm"
        PAUSE 6000      'WAIT 5S TO SEE DIMENTION DISPLAY.
    
    ' Initialise Hardware 
    ' ------------------- 
         UPDATE=0
    
    'CALL ENTER HIGHT SUBROUTINE
        GOSUB ENTERHIGHT
        gosub ENTERLENGTH
        GOSUB ENTERWIDTH   
        TRISA.0=1
        TRISA.2=1
        TRISA.3=0   'porta as input A0,A2,A4 input A3, output 
        TRISB.2=1       'reset swich input
        TRISB.3=1  
        
        ' prescale 1:1 AND Timer OFF 
        T1CON=%00000000
       
       ' Capture is OFF 
        CCP1CON=0 
     
       ' Main Program Loop 
    ' ----------------- 
     Loop: 
        CMCON = %110         ' Set comparators mode
        select case cal
        CASE 0 
    
    'place error in CalValue nonvolitile memory (EEprom) storage
        Calvalue=LVL
        Write 0,calvalue.byte0
        write 1,calvalue.byte1
        LCDOut $FE,1,"Caliberations"
        LCDOUT $FE,$C0,"ERROR= ",#LVL
        Pause 2000
    goto loop
        end select
     
     'INITALIZATION
    ' -------------- 
        CMCON = %110         ' Set comparators mode
        TMR1L=0 ' Reset Timer 
        TMR1H=0 ' Remember Timer is OFF 
        overflow=0
        capture=0 ' Reset Capture Flag 
        CCP1CON = %00000111  ' Capture mode, capture on every 16 rising edge
        While Capture=0
        CMCON = %110         ' Set comparators mode
        Wend 
     ' Junk 1st Result 
        T1CON.0=1           ' Enable Timer 
        TMR1L=0 ' Reset Timer low byte
        TMR1H=0 ' Reset Timer high byte 
        capture=0 ' Reset Capture Flag 
     ' Wait for 2nd Result 
        While Capture=0
        CMCON = %110         ' Set comparators mode
        Wend 
    ' Store the captured value in period variable     
        LEVEL.lowbyte = CCPR1L 
        LEVEL.highbyte = CCPR1H 
        LVL=LEVEL        'NON CALIBERATED LEVEL (ERROR).
        T1CON.0=0 ' Timer is OFF 
        CCP1CON=0 ' Capture is OFF 
    
    ' Display Section 
    ' --------------- 
        If overflow=0 then 'converted to uS(Period/2 * 25/100 1tick=.25uS
        If LEVEL<32768 then
    'read stored caliberation value (ERROR) from EEprom
        read 0,calvalue.byte0
        read 1,calvalue.byte1
        select case CalValue             'Zreading
        case is > LEVEL
        LEVEL=Calvalue
        end select
        READ 2,HIGHT.BYTE0
        READ 3,HIGHT.BYTE1            'READ HIGHT FROM EEPROM AND DISPLAY IT.
        READ 4,LENGTH.BYTE0          'READ LENGTH AND WIDTH TO DISPLAY VOLUME
        READ 5,LENGTH.BYTE1
        READ 6,WIDTH.BYTE0
        READ 7,WIDTH.BYTE1  
        LEVEL=LEVEL-Calvalue
        if level>0 then            'prevent divide by 0
        level=(level*92)/100         'level=(level*43)/10     'WATER LEVEL In cm 
        Wl=level/100            'water level in meter
        wlrmndr=level//100      ' remainder   
               S=LEVEL*LENGTH*WIDTH  'WATER VOLUME
               F=DIV32 10000
               T=F/100              'WATER VOLUME IN TONS
               REMD=F//100          'remainder in decimal fraction        
        barsiz=HIGHT/16
        barnum=level/barsiz
        endif
              
              'DISPLAY WATER LEVE IN CM WITH BAR GRAPH.
         LCDOut $FE,1,#Wl,".",dec2 wlrmndr," ","M"," ",#T,".",dec2 REMD," ","T"          '"LEVEL =",#level," ","cm" 
         LCDOUT $fe,$C0,rep%11111111\barnum
         pause 500
         goto DisplayErrorSkip 
         Endif
         endif
    'OUT OF RANGE
         LCDOut $FE,1,"Out of Range"
         PAUSE 1000
         Overflow=0 ' Reset error flag 
         DisplayErrorSkip: 
         Pause 500 ' Allow Time for user to view 
         Goto Loop 
    
    'SUBROUTINE TO ENTER HIGHT IN CM
    ENTERHIGHT:
         CMCON=7    'COMPARATORS OFF TO ENABLE PORTA I/O.
         TRISA.1=1   'PORTA.1 INPUT
         'Pause 500    ' Wait for LCD to startup
    'ENTER HIGHT NOW BY BUTTON PRESS     
         Lcdout $fe,1,"New Hight CM"
         PAUSE 3000
         HIGHT=0 'CLEAR HIGHT
    InsertHight:    
         select case DIMswitch 
         case 0   
       if update=0 then
        hight = hight+10
        IF HIGHT>900 THEN
        HIGHT=0
        ENDIF
      debounceH:
        For i = 1 To 25
            Pause 10        ' 10ms at a time so no interrupts are lost
            Next i             
          UPDATE=1 
           GOTO DISPLAYH	
    DISPLAYH:
    if UPDATE=1 THEN
        Lcdout $fe,1,"    Hight "	
        Lcdout $fe,$C0,"    ",#hight," ","cm"	
    'WRITE HIGHT TO EEPROM
        Write 2,HIGHT.BYTE0
        WRITE 3,HIGHT.BYTE1
         ENDIF
         pause 500
        UPDATE=0
        Goto inserthight
        endif
        END SELECT
        rETURN
        
        'SUBROUTINE TO ENTER length IN CM
    ENTERLENGTH:
         CMCON=7    'COMPARATORS OFF TO ENABLE PORTA I/O.
         TRISA.1=1   'PORTA.1 INPUT
         'Pause 500    ' Wait for LCD to startup
    'ENTER LENGTH NOW BY BUTTON PRESS     
         Lcdout $fe,1,"New Length cm"
         PAUSE 3000
         LENGTH=0 'CLEAR HIGHT
    InsertLENGTH:    
         select case DIMswitch 
         case 0   
       if update=0 then
        LENGTH = LENGTH+10
        IF LENGTH>900 THEN
        LENGTH=0
        ENDIF
      debounceL:
        For i = 1 To 25
            Pause 10        ' 10ms at a time so no interrupts are lost
            Next i             
          UPDATE=1 
           GOTO DISPLAYL	
    DISPLAYL:
    if UPDATE=1 THEN
        Lcdout $fe,1,"    Length "	
        Lcdout $fe,$C0,"    ",#LENGTH," ","cm"	
    'WRITE LENGTH TO EEPROM
        Write 4,LENGTH.BYTE0
        WRITE 5,LENGTH.BYTE1
         ENDIF
         pause 500
        UPDATE=0
        Goto insertLENGTH
        endif
        END SELECT
        rETURN
    
    'SUBROUTINE TO ENTER WIDTH IN CM
    ENTERWIDTH:
         CMCON=7    'COMPARATORS OFF TO ENABLE PORTA I/O.
         TRISA.1=1   'PORTA.1 INPUT
    'ENTER WIDTH NOW BY BUTTON PRESS     
         Lcdout $fe,1,"New Width cm"
         PAUSE 3000
         WIDTH=0 'CLEAR HIGHT
    InsertWIDTH:    
         select case DIMswitch 
         case 0   
       if update=0 then
       WIDTH= WIDTH+10
        IF WIDTH>900 THEN
        WIDTH=0
        ENDIF
      debounceW:
        For i = 1 To 25
            Pause 10        ' 10ms at a time so no interrupts are lost
            Next i             
          UPDATE=1 
           GOTO DISPLAYW	
    DISPLAYW:
    if UPDATE=1 THEN
        Lcdout $fe,1,"    Width "	
        Lcdout $fe,$C0,"    ",#WIDTH," ","cm"	
    'WRITE HIGHT TO EEPROM
        Write 6,WIDTH.BYTE0
        WRITE 7,WIDTH.BYTE1
         ENDIF
         pause 400
        UPDATE=0
        Goto insertWIDTH
        endif
        END SELECT
        RETURN
    End
    Obaid
    Last edited by abofar; - 20th June 2012 at 10:41.

Members who have read this thread : 1

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