Time10s - Timer set up and Interrupt based time delay


The main program can be broken up into five main areas:

;**************************************************************************
;
; This Program developed by Peter Hayles for PIC 16C711
; Flashes the LEDs on B1 and B2
; at 2 and 200 timer intervals using the timer
; 
;

;**************************************************************************

#include 	"p16c711.inc"
        	LIST P=16C711

;--------------------------------------------------------------------------
; Variables
;--------------------------------------------------------------------------

RAM		EQU	0x10	

Loop1       	EQU   	RAM+0
Loop2	      	EQU   	RAM+1
Loop3		EQU	RAM+2
Ones		EQU	RAM+3
Hunds		EQU	RAM+4


;--------------------------------------------------------------------------
; Program Code
;--------------------------------------------------------------------------

            	ORG   	0       
            	GOTO  	Start
		ORG	4
		GOTO	Interrupt

;--------------------------------------------------------------------------
; Main Program
;--------------------------------------------------------------------------

            	ORG   	H'10'

Start

; Set up I/O Ports

		MOVLW	B'00011111'		; Port A 0-4=Input
		BSF	STATUS,RP0
		MOVWF	TRISA
				
		MOVLW	B'11111001'		; Port B 1,2=Output 0,3-7=Input	
		BSF	STATUS,RP0
		MOVWF	TRISB
		BSF	STATUS,RP0		; Enable weak pullups
		BCF	OPTION_REG,NOT_RBPU	; Set PortB Pulled up
		BCF	STATUS,RP0
		MOVLW	B'11111001'		
		MOVWF	PORTB

; Set up Timer

		CLRWDT				;Clear WDT and prescaler
		BSF	STATUS,RP0		;Assign prescaler and set it up
		BCF	OPTION_REG,T0CS		;Internal Clock
		BCF	OPTION_REG,PSA		;Prescaler ->Timer0
		MOVLW	B'000000111'		;1:128 Prescaler
		IORWF	OPTION_REG,1
		BCF	STATUS,RP0

; Set initial values	

		CLRF	Ones
		CLRF	Hunds

; Setup for quick Interrupt entry the first time, and enable interrupts		

		MOVLW	H'FF'			;Dummy Value !!
		MOVWF	TMR0
		MOVLW	B'10100000'		;Enable Timer0 Interrupt INTCON,GIE
		MOVWF	INTCON	

Main		NOP	
		GOTO	Main


; This routine gets entered every 1 second

Interrupt	CLRF	INTCON			;Disable Interrupts during ISR
		
		INCF	Ones,1
		BTFSC	Ones,0
		GOTO	ON1
		CALL	LED1OFF
		GOTO	Next1		
ON1		CALL	LED1ON


Next1		
		MOVLW	D'100'
		SUBWF	Ones,0
		BTFSS	STATUS,Z		;If Zero, then =100
		GOTO	Next2
		INCF	Hunds,1
		CLRF	Ones
		BTFSC	Hunds,0
		GOTO	ON2
		CALL	LED2OFF
		GOTO	Next2		
ON2		CALL	LED2ON

Next2		

		MOVLW	H'00'			;Enable Interrupt after a fixed number of cycles
		MOVWF	TMR0
		MOVLW	B'10100000'		;Enable Timer0 Interupt	INTCON,GIE
		MOVWF	INTCON	
		RETFIE



; LED Routines

LED1ON	BCF	PORTB,1
		RETLW	0

LED1OFF	BSF	PORTB,1
		RETLW	0

LED2ON	BCF	PORTB,2
		RETLW	0

LED2OFF	BSF	PORTB,2
		RETLW	0

		END


Back Download Home Page

Contacts: