timer.inc
author Tero Marttila <terom@fixme.fi>
Sat, 08 May 2010 17:27:27 +0300
changeset 18 79b25e81721f
child 21 95549ce0e3da
permissions -rw-r--r--
use timer for 1s delay
18
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
;; vim: filetype=avr
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
;;
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
;; Timer unit control and use
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
;;
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
.include "macros.inc"
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
; Waveform Generation Mode (nibble low/high)
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
.set TIMER_WGML = 0b00
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
.set TIMER_WGMH = 0b01
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
; Clock Source
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
.set TIMER_CS = 0b101
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
.equ TIMER_FLAGS  = GPIOR0
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
.equ TIMER_BUSY   = 1
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
Timer_Init:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
		; OC1A/B disconnected from output
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
		; No PWM mode
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
		poke		[TCCR1A, r16, (0b00 << COM1A0) | (0b00 << COM1B0) | (TIMER_WGML << WGM10)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
		; Clear
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
		poke		[TCCR1B, r16, 0]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
		poke		[TCCR1C, r16, 0]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
		; Enable timer overflow interrupt
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
		poke		[TIMSK1, r16, (1 << OCIE1A)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
		
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
		ret
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
Timer_Start:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
	; Initialize timer
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
		poke		[TCNT1H, r16, high(0)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
		poke		[TCNT1L, r16, low(0)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
	; Set flag
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
		sbi			TIMER_FLAGS, TIMER_BUSY
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
		; WGM
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
		; Clock Source
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
		poke		[TCCR1B, r16, (TIMER_WGMH << WGM12) | (TIMER_CS << CS10)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
		ret
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
Timer_Stop:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
		; WGM
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
		; Clock off
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
		poke		[TCCR1B, r16, (TIMER_WGMH << WGM12) | (0b00 << CS10)]
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
		
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
	; Clear flag
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
		cbi			TIMER_FLAGS, TIMER_BUSY
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
		ret
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
;; Timer Compare 1A interrupt handler
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
Timer_OC1A:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
		in			r0, SREG
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
	
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
	; Stop timer
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
		rcall		Timer_Stop
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
		out			SREG, r0
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
		reti
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
;; Count to X
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
Timer_Sleep:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
	; Set TOP
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
		sts			OCR1AH, XH
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
		sts			OCR1AL, XL
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
	; Start timer
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
		rcall		Timer_Start
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
	; Wait for timer to complete
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
_timer_sleep:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
		;sleep
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
		sbic		TIMER_FLAGS, TIMER_BUSY
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
		rjmp		_timer_sleep
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
		
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
	; Done
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
		ret
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
;; Prime the timer and sleep for 1s
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
Timer_Sleep_1s:
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
	; Initialize counter to 16k cycles
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
		ldi			XH, high(16 * 1024)
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
		ldi			XL, low(16 * 1024)
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
	; Start timer
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
		rjmp		Timer_Sleep
79b25e81721f use timer for 1s delay
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93