Working clock example using 32K watch crystal


Closed Thread
Results 1 to 20 of 20

Hybrid View

  1. #1
    Join Date
    Jan 2005
    Location
    Boston MA
    Posts
    19

    Default Working clock example using 32K watch crystal

    Looked all over trying to find an example with a second crystal connected to the TIMER1 overflow. This example uses the earlier 18F452 version of the Olimex PIC-WEB board. Ran the clock for a day without gaining or loosing a second! Lots of places where I was not sure what to do. Comments are welcome.
    Regards
    Tim C
    Code:
    ' Name        : TMR1CLK.pbp
    ' Target PIC  : PIC18F452 or similar 18F types
    ' Hardware    : PIC-WEB ver A board with added LCD
    ' Oscillator  : 10MHz crystal. You May have to modify default 18F452 fuses for > 4Mhz
    ' Resolution  : Expect to get +- 5sec/day or better
    ' Description : PicBasic Pro program using external 32K watch xtal and Timer1
    ' interrupt for a real-time clock.
    ' Origional ver from: http://melabs.com/resources/samples/18f/tmr1clk18.htm  
    '
    DEFINE      OSC 10          ' We're using a 10MHz oscillator
    DEFINE      LOADER_USED 1   ' Boot-Loader is being used
    Define		INTHAND myint	' Define interrupt handler
    Symbol		LED_0 = PORTD.5
    symbol		BUTTON_0 = PORTB.0
    
    wsave		VAR BYTE bankA system   ' Saves W
    ssave		VAR BYTE bankA system   ' Saves STATUS
    
    seconds		VAR BYTE bankA  ' variables within myint must be in bank 0.
    minutes		VAR Byte      ' Elapsed minutes
    hours		var byte
    
    ' LCD config
    Define  LCD_DREG  PORTD
    Define  LCD_DBIT  0
    Define  LCD_RSREG PORTE
    Define  LCD_RSBIT 0
    Define  LCD_EREG  PORTE
    Define  LCD_EBIT  1
    
       ADCON1 = 7          ' Set PORTA and PORTE for digital operation
       Low PORTE.2         ' Enable the LCD
    
       Pause 150           ' Pause to allow LCD to initialize
       LCDOut $fe,1        ' Clear LCD
    
    	hours = 2
    	minutes = 23       ' Pre Set time here then add seconds to clock using button
    	seconds = 0
    
    	T1CON.7=0	' 8 Bit r/w (16 bit seems to cause problems)
    	T1CON.5=0	' Part 1 of 1:1 prescale
    	T1CON.4=0	' Part 2 pf 1:1 prescale
    	T1CON.3=1	' turn on the low freq clock osc
    	T1CON.2=1	' Do not Sync low Freq clock with main clock
    	T1CON.1=1	' use 32Khz xtal as the Timer1 source
    	T1CON.0=1	' enable Timer1
    		
    	PIE1 = $01         ' Enable TMR1 overflow interrupt
    	INTCON  = $C0      ' Finally Enable global interrupt and peripheral interrupts
    
       GoTo mainloop          ' jump over the interrupt handler and sub
    
       ' Assembly language interrupt handler
    Asm
    myint
       ; Save the state of critical registers
       movwf   wsave      ; Save W
       swapf   STATUS, W  ; Swap STATUS to W (swap avoids changing STATUS)
       clrf    STATUS     ; Clear STATUS
       movwf   ssave      ; Save swapped STATUS
    
       ; Set the high register of Timer1 to cause an interrupt every
       ; 32768 counts (2^15).
    
       movlw   080h       ; Prepare to set TMR1 high register
       movwf   TMR1H      ; Set TMR1H to 80h
       incf    _seconds,F ; INCREMENT seconds COUNT
       bcf     PIR1, 0    ; Clear interrupt flag
    
       swapf   ssave, W   ; Retrieve the swapped STATUS value (swap to avoid changing STATUS)
       movwf   STATUS     ; Restore it to STATUS
       swapf   wsave, F   ; Swap the stored W value
       swapf   wsave, W   ; Restore it to W (swap to avoid changing STATUS)
       retfie             ; Return from interrupt
    EndAsm
    
    ' Subroutine to update the time variables
    get_time:
    
    	if seconds > 59 then
    		seconds = seconds - 60	' better then making seconds=0
    		minutes = minutes + 1
    		if minutes > 59 then
    			minutes = 0
    			hours = hours + 1
    			if hours > 12 then	' simple 12 hour clock format
    				hours = 1
    			endif
    		endif
    	endif      
    
    Return
    
    mainloop:
    
    	GoSub get_time      ' Update minutes and seconds
    	TOGGLE LED_0
    
    	LCDOut $fe,2,"Time: ",DEC hours, ":", DEC2 minutes, ":", DEC2 seconds, "   "
    
    	Pause 300           ' Pause to see LED blink. Also help with debounce
    	if button_0 = 0 then
    		LCDOut $fe,$C0,"+1s "
    		seconds = seconds + 1
    		else
    		LCDOut $fe,$C0,"     "
    	endif
    	GoTo mainloop       ' Repeat main loop
    
       End

  2. #2
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    ' Description : PicBasic Pro program using external 32K watch xtal and Timer1
    But 50% of the program is in assembler

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by malc-c View Post
    But 50% of the program is in assembler
    Then show him how it's done. (in straight PBP)
    This task is worth 2 free 4x20 Parallel LCD's ... shipping outide of US/Canada extra.

    In case of multiple responses ... style will prevail.
    As judged by Darrel Taylor
    Ends 11/10/2010 Midnight Mountain Time
    DT

  4. #4
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Talking Naw only just point the way

    INCLUDE "DT_INTS-18.pbp" ; Base Interrupt System
    INCLUDE "ReEnterPBP-18.pbp" ; Include if using PBP interrupts"
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  5. #5
    Join Date
    Jan 2005
    Location
    Boston MA
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    The earlier versions I wrote had NO asm but lost almost a minute an hour. To make up for that one could re-tune using TMR1H and TMR1L with a larger value. Problem is every change made to the program would mean spending a few days retuning and it would never be as precise.

    So yea I would love to be able to do this without asm in PBP AND be as accurate!

    Down the road I intend to join this interrupt sample with a SNTP internet program so I can have a near perfect millisecond low power $60 clock.

    Regards
    Tim C

  6. #6
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Code:
       ' Int handler doesn't mess with any PBP system variables - or lower 15-bits
       ' of TMR1 accumulated time. Uses only 4 instructions to set TMR1H high bit,
       ' increment seconds, clear the interrupt flag bit, save & restore WREG, STATUS,
       ' BSR and return from int handler.
     
    @myint                  ; create myint label
       TMR1H.7=1            ' Set TMR1 high bit for 1 second overflows
       seconds = seconds+1  ' Increment seconds
       PIR1.0=0             ' Clear TMR1 int flag
       @ retfie  FAST       ; Return with 'auto restore' of WREG, STATUS and BSR
    Should do it.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  7. #7
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    Then show him how it's done. (in straight PBP)
    I wish --- (I'll remove my tongue from in my cheek now )

  8. #8
    Join Date
    Jan 2005
    Location
    Boston MA
    Posts
    19


    Did you find this post helpful? Yes | No

    Default

    Thank you Bruce
    Smaller, tighter, yet perfect speed. Started the clock last night with your change and so far the PIC18F452 has not gained or lost one second.
    Tim C

  9. #9
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,614


    Did you find this post helpful? Yes | No

    Default

    Hi,

    I didn't see that one :
    http://www.pbpgroup.com/modules/wfse...hp?articleid=8

    did I miss something ???

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

Members who have read this thread : 1

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

Tags for this Thread

Posting Permissions

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