;********************************************************************
;
; Author        : ADI - Apps            www.analog.com/MicroConverter
;
; Date          : October 2003
;
; File          : TIC.asm
;
; Hardware      : ADuC842/ADuC843
;
; Description   : Demonstrates a use of a timer interval counter for 
;		counting longer intervals than the standard 8052 
;		timers are capable of.
;		
;		The LED will, on power up, flash at 6.4Hz. By pressing
;		the external interrupt button INT0 the counter will 
;		count how long the button is pressed correct to 
;		1/128th of a second. When released the program will 
;		flash the light at the measured time correct only to
;		the nearest unit (1/128s, seconds, minutes or hours)
;		rounded DOWN.
;		eg) If the button was pressed for 0.91000s the light
;		would complement every 0.90625s (less than 1 second
;		therefore it measures in 1/128s and the nearest unit 
;		less than 0.91000s is 0.90625s). However if the light
;		was on for 1.6s it complements every 1s as the nearest
;		unit is now the second.
;		Pressing the INT0 button again will record a new 
;		time interval which will flash the light in the same
;		way.

;********************************************************************

$MOD842                         ; Use 8052&ADuC842 predefined symbols

LED     EQU     P3.4            ; P3.4 drives red LED on eval board
BUTTON  EQU     P3.2		; P3.2 drives the INT0 button on the
				; eval board

;____________________________________________________________________
                                                  ; BEGINNING OF CODE
CSEG

ORG 0000h

        JMP     MAIN            ; jump to main program

;____________________________________________________________________
                                    ; EXTERNAL INTERRUPT VECTOR SPACE
ORG 0003h ;  (INT0 ISR)			

	CLR	LED		; Turn ON the LED while the INT0 
                                ; is pressed

; reset all counters and then start counting	
        ANL     TIMECON, #0FEh  ; Clear the TCEN bits to clear the
                                ; registers; 
                                ;  -Hthsec
                                ;  -sec
                                ;  -min
                                ;  -hour.
                                ; and to clears the internal counter

        ORL     TIMECON, #01h  ; Set the TCEN bit to restart counting

        JNB     BUTTON, $       ; Wait here while button is pressed

        ANL     TIMECON, #0FDh  ; Clear the TIEN bit to stop the 
                                ; counter

; after button is released we can store the value in intval 

LOOP:   SETB     LED             ; Turn off LED to indicate that the 
				; button is released.
	MOV	A, HOUR		
	CJNE	A, #00H, HOURS	; Check if any hrs have been counted
				; If so jump to HOURS
        MOV	A, MIN			
	CJNE	A, #00H, MINS	; Check if any mins have been counted
				; If so jump to MINS
        MOV	A, SEC
        CJNE	A, #00H, SECS	; Check if any secs have been counted
				; If so jump to SECS
	
HUNTHS:	MOV	INTVAL, HTHSEC	;load the value of HTHSEC into INTVAL
	MOV     TIMECON, #00h   ; clear TCEN to reset the registers
        MOV     TIMECON, #03H   ; change TIMECON to measure in 1/128s
				; reset TIEN
	RETI

SECS:	MOV	INTVAL, SEC	; load the value of SEC into INTVAL
	MOV     TIMECON, #00h   ; clear TCEN to reset the registers
	MOV	TIMECON, #13H	; change TIMECON to measure in secs
	RETI

MINS:	MOV	INTVAL, MIN	; load the value of MIN into INTVAL
	MOV     TIMECON, #00h   ; clear TCEN to reset the registers
	MOV	TIMECON, #23H	; change TIMECON to measure in mins
	RETI

HOURS:	MOV	INTVAL, HOUR	; load the value of HOUR onto INTVAL
	MOV     TIMECON, #00h   ; clear TCEN to reset the registers
	MOV	TIMECON, #33H	; change TIMECON to measure in hours
        RETI
;____________________________________________________________________
                                         ; TII INTERRUPT VECTOR SPACE
ORG 0053h
       
	CPL LED        		; Complement the LED every time the 
				; measured time runs up.
	RETI
;_____________________________________________________________________

ORG 0060h

MAIN:	

; Configure Time Interval Counter  
	MOV    PLLCON,#07H    ; Allow sufficient time for instructions to execute
	MOV    TIMECON, #03h  ; initialise timecon to count in 1/128s
                              ; -set TCEN to enable the time clock
                              ; -set TIEN to enable the TIC 
                              ; -clear STI to allow automatic relaod
                              ;  of interval timeout 
			      ; -clear TFH to disable 24 hr counting

        MOV    INTVAL, #0Ah   ; initialise to blink LED every 10 units
                              ; the units are 1/128s          

; Configure External Interrupt
	SETB    IT0            ; INT0 edge triggered
        SETB    EX0            ; enable INT0 (button on eval board)
	MOV     IEIP2,#04H     ; enable time interval interrupt
        
        SETB    EA             ; enable global interrupts


	JMP     $              ; wait here for interrupts
                               ; main program can be inserted here
	
;____________________________________________________________________

END
