BlackOps
Full Member level 5
- Joined
- Jan 1, 2005
- Messages
- 279
- Helped
- 14
- Reputation
- 28
- Reaction score
- 3
- Trophy points
- 1,298
- Location
- AZERBAIJAN
- Activity points
- 2,496
;***********************************************************************************
;
;
;
;
;***********************************************************************************
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC ;_INTRC_IO
RESET_ADDR EQU 0x00
ISR_ADDR EQU 0x04
COMRAM_ADDR EQU 0x70
CBLOCK COMRAM_ADDR
status_temp
w_temp
count ; first count variable
count2 ; second count variable
ENDC
ORG RESET_ADDR
START
goto SETUP
ORG ISR_ADDR
;==================================================
PER_INT_V
BCF STATUS, RP0 ; Bank0
BTFSC PIR1, TMR1IF ; Timer1 overflowed?
GOTO T1_OVRFL ; YES, Service the Timer1 Overflow Interrupt
;
; Should NEVER get here
;
ERROR1 ; NO, Unknown Interrupt Source
BSF PORTB, 1 ; Toggle a port pin to indicate error
BCF PORTB, 1
GOTO ERROR1
;
T1_OVRFL
BCF PIR1, TMR1IF ; Clear Timer1 Interrupt Flag
MOVLW 0x80 ; Since doing key inputs, clear TMR1
MOVWF TMR1H ; for 1 sec overflow.
; Do Interrupt stuff here
movlw b'00000001'
xorwf PORTB,f
RETFIE ; Return / Enable Global Interrupts
;================================================================
;
;==============================================================
SETUP ; POWER_ON Reset (Beginning of program)
CLRF STATUS ; Do initialization (Bank0)
;--------------------
banksel TRISB
movlw b'11000000'
movwf TRISB
banksel PORTB
clrf PORTB
;banksel OSCCON
; movlw b'01100000' ; should be 4 mhz
; movwf OSCCON
;-----------------------
BCF T1CON, TMR1ON ; Timer1 is NOT incrementing
; Do Initialization stuff here
MOVLW 0x80 ; TIM1H:TMR1L = 0x8000 gives 1 second
MOVWF TMR1H ; overflow, at 32 KHz.
CLRF TMR1L ;
;
CLRF INTCON
CLRF PIR1
BSF STATUS, RP0 ; Bank1
CLRF PIE1 ; Disable all peripheral interrupts
;
BSF PIE1, TMR1IE ; Enable TMR1 Interrupt
;
; Initialize the Special Function Registers (SFR) interrupts
;
BCF STATUS, RP0 ; Bank0
CLRF PIR1 ;
BSF INTCON, PEIE ; Enable Peripheral Interrupts
BSF INTCON, GIE ; Enable all Interrupts
;
MOVLW 0x0E
MOVWF T1CON ; Enable T1 Oscillator, Ext Clock, Async, prescaler = 1
BSF T1CON, TMR1ON ; Turn Timer1 ON
;
MAINLOOP
SLEEP
GOTO MAINLOOP ; Sleep, wait for TMR1 interrupt
end
RTCinit
BANKSEL TMR1H
MOVLW 0x80 ; Preload TMR1 register pair
MOVWF TMR1H ; for 1 second overflow
CLRF TMR1L
MOVLW b’00001111’ ; Configure for external clock,
MOVWF T1CON ; Asynchronous operation, external oscillator
CLRF secs ; Initialize timekeeping registers
CLRF mins
MOVLW .12
MOVWF hours
BANKSEL PIE1
BSF PIE1, TMR1IE ; Enable Timer1 interrupt
RETURN
RTCisr
BANKSEL TMR1H
BSF TMR1H, 7 ; Preload for 1 sec overflow
BCF PIR1, TMR1IF ; Clear interrupt flag
INCF secs, F ; Increment seconds
MOVF secs, w
SUBLW .60
BTFSS STATUS, Z ; 60 seconds elapsed?
RETURN ; No, done
CLRF seconds ; Clear seconds
INCF mins, f ; Increment minutes
MOVF mins, w
SUBLW .60
BTFSS STATUS, Z ; 60 seconds elapsed?
RETURN ; No, done
CLRF mins ; Clear minutes
INCF hours, f ; Increment hours
MOVF hours, w
SUBLW .24
BTFSS STATUS, Z ; 24 hours elapsed?
RETURN ; No, done
CLRF hours ; Clear hours
RETURN ; Done
;***********************************************************************************
;
; Delay formula = (TMR1H:TMR1L * 4 * count) / 4 000 000
;
;
;***********************************************************************************
#include <p16F88.inc>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_ON & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
RESET_ADDR EQU 0x00
ISR_ADDR EQU 0x04
COMRAM_ADDR EQU 0x70
CBLOCK COMRAM_ADDR
status_temp
w_temp
count ; count variable
ENDC
ORG RESET_ADDR
START
goto SETUP
ORG ISR_ADDR
;================================================================
; START OF THE INTERRUPT SERVICE ROUTINE
;================================================================
INTERRUPT
movwf w_temp
swapf STATUS, w
movwf status_temp;
MOVLW 0xd8 ; Since doing key inputs, clear TMR1
MOVWF TMR1H ; for 1 sec overflow.
MOVLW 0xf0 ; Since doing key inputs, clear TMR1
MOVWF TMR1L ; for 1 sec overflow.
decfsz count, f ;decrement count, exit ISR if count iz zero
goto INTEXIT
movlw .100
movwf count
; Do Interrupt stuff here
movlw b'00000001'
xorwf PORTB,f
INTEXIT
banksel PIR1
BCF PIR1, TMR1IF ; Clear Timer1 Interrupt Flag
swapf status_temp, w
movwf STATUS
swapf w_temp, f
swapf w_temp, w
RETFIE ; Return / Enable Global Interrupts
;================================================================
; END OF THE INTERRUPT SERVICE ROUTINE
;================================================================
;==============================================================
; START OF THE SETUP ROUTINE (RUNS ONLY ONCE)
;================================================================
SETUP
; POWER_ON Reset (Beginning of program)
CLRF STATUS ; Do initialization (Bank0)
;--------------------
banksel TRISA
movlw b'00000000'
movwf TRISA
banksel TRISB
;bsf PORTA,5
movlw b'00000000'
movwf TRISB
banksel PORTB
clrf PORTB
;banksel OSCCON
; movlw b'01100000' ; should be 4 mhz
; movwf OSCCON
;-----------------------
banksel T1CON
BCF T1CON, TMR1ON ; Timer1 is NOT incrementing
; Do Initialization stuff here
MOVLW 0xd8 ; TIM1H:TMR1L = 0xd8f0 gives 1 second
MOVWF TMR1H ; overflow, with: 4Mhz Crystal,count = .100,
MOVLW 0xf0 ; Prescaler of 1 and Internal divide by 4
MOVWF TMR1L
CLRF INTCON
CLRF PIR1
banksel PIE1
CLRF PIE1 ; Disable all peripheral interrupts
BSF PIE1, TMR1IE ; Enable TMR1 Interrupt
; Initialize the Special Function Registers (SFR) interrupts
banksel PIR1
CLRF PIR1 ;
movlw b'11000000' ; GIE = 1, PEIE = 1
movwf INTCON
MOVLW b'01001000'
MOVWF T1CON ; Enable T1 Oscillator, Int Clock/4 , prescaler = 1
BSF T1CON, TMR1ON ; Turn Timer1 ON
banksel PORTA
bsf PORTA,0
;================================================================
; MAIN PROGRAM START
;================================================================
MAINLOOP
SLEEP
GOTO MAINLOOP ; Sleep, wait for TMR1 interrupt
;================================================================
; MAIN PROGRAM END
;================================================================
END
banksel OSCCON
movlw b'01100000' ; should be 4 mhz
movwf OSCCON
That's not true.blueroomelectronics said:No the cheap 32768 Hz watch crystal is the most accurate. Crystals are rated in PPM and the faster they go the less accurate they generally are.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?