semi-broken Timer_Update mechanism
authorTero Marttila <terom@fixme.fi>
Fri, 14 May 2010 18:19:59 +0300
changeset 32 7ceb76b5a104
parent 31 dfb246ecaf23
child 33 0d0309787be3
semi-broken Timer_Update mechanism
adc.inc
led7seg.s
timer.inc
--- a/adc.inc	Fri May 14 18:19:22 2010 +0300
+++ b/adc.inc	Fri May 14 18:19:59 2010 +0300
@@ -2,33 +2,45 @@
 ;; Basic ADC operation
 ;;
 
+; Reference select
+.set ADC_REF    = 0b01      ; AVcc
+
+; Bit adjustment
+.set ADC_LAR    = 1         ; Left-adjust
+
+; Input select
+.set ADC_MUX    = 0b000     ; ADC0
+
+; Auto-trigger source
+.set ADC_ATS    = 0b011     ; TC0 OCA
+
+; Auto-trigger enable
+.set ADC_ATE    = 1
+
+; Prescaler
+.set ADC_PS     = 0b111     ; 1/128
+
+; I/O pins
 .equ ADC_DDR    = DDRC
 .equ ADC_PORT   = PORTC
 .equ ADC_PIN    = PORTC0
         
 ;; Initialize the ADC for starting conversions
 ADC_Init:
-    ; Setup ADMUX
-        ; Use AVcc as ref
-        ; Left-adjust result (for 8-bit access)
-        ; Select ADC0
-        ldi         r16, (0b01 << REFS0) | (1 << ADLAR) | (0b000 << MUX0)
+    ; ADMUX
+        ldi         r16, (ADC_REF << REFS0) | (ADC_LAR << ADLAR) | (ADC_MUX << MUX0)
         sts         ADMUX, r16
     
-    ; Setup ADCSRB
-        ; Free-running mode
-        ldi         r16, (0b000 << ADTS0)
+    ; ADCSRB
+        ldi         r16, (ADC_ATS << ADTS0)
         sts         ADCSRB, r16
 
-    ; Setup ADCSRA
-        ; Enable
-        ; Start right away...
-        ; Auto-trigger
-        ; ???: Enable Interrupt
-        ; Sample clock scale 1/128
-        ldi         r16, (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (1 << ADIE) | (0b111 << ADPS0)
+    ; ADCSRA
+        ; ADSC: No need if using external auto-trigger ???
+        ; Enable interrupt
+        ldi         r16, (1 << ADEN) | (1 << ADSC) | (ADC_ATE << ADATE) | (1 << ADIE) | (ADC_PS << ADPS0)
         sts         ADCSRA, r16
-
+    
     ; Disable digital circuit for pin
         ldi         r16, (1 << ADC_PIN)
         sts         DIDR0, r16
@@ -36,9 +48,14 @@
     ; Done
         ret
 
+;; Interrupt handler stub for ADC_HANDLER
 ADC_Interrupt:
-    ; Done
-        reti    
+        in          r0, SREG
+
+        rcall       ADC_HANDLER
+
+        out         SREG, r0
+        reti
 
 ;; Read the current 8-bit ADC sample 
 ; Returns value in r16
@@ -49,4 +66,3 @@
     ; Done
         ret
 
-
--- a/led7seg.s	Fri May 14 18:19:22 2010 +0300
+++ b/led7seg.s	Fri May 14 18:19:59 2010 +0300
@@ -2,6 +2,7 @@
 .include "m168def.inc"      ; Same family as 328P
 .list
 
+
 ;; Interrupt Vector
 .org 0x00
         rjmp        init
@@ -35,6 +36,24 @@
 .include "dip.inc"
 
 ;; ADC
+
+; ADC Interrupt handler
+On_ADC:
+    ; DEBUG
+		sbi			PIND, PORTD7
+
+    ; Check timer, from r16
+        rcall       ADC_Read8
+
+        ldi         r17, 64
+        mul         r16, r17
+        mov         XL, r0
+        mov         XH, r1 
+
+        rjmp       Timer_Update
+
+.set ADC_Handler = On_ADC
+
 .include "adc.inc"
 
 ;; Timer
@@ -48,8 +67,8 @@
 
 Sleep_ADC:
         ; delay
-        ; rcall       ADC_Read8 
-        rcall       DIP_Read8
+        rcall       ADC_Read8 
+        ; rcall       DIP_Read8
         
         ; Sleep for 64 * var timer cycles
         ldi         r17, 64
@@ -61,13 +80,10 @@
 
 ;; Show value
 Main_ShowValue:
-    ; DEBUG
-		sbi			PIND, PORTD7
-
         ; load value to r16
         ; rcall       DIP_Read8
-        ; rcall       ADC_Read8
-        rcall       Timer0_Read8
+        rcall       ADC_Read8
+        ; rcall       Timer0_Read8
 
         ; display from r16
         rcall       LED7_ShowHex
@@ -176,6 +192,7 @@
         mov         r16, r24
         mov         r17, r24
         com         r17
+        andi        r17, 0b00111111
         rcall       LED7_ShowRaw
 
         ; delay
@@ -218,11 +235,11 @@
         cbi         PORTD, PORTD7
 
     ; Run
+        rcall       Main_Countup
+        ; rcall       Main_Countdown
         ; rcall       Main_ShowValue
-        rcall       Main_Spin
-        ; rcall       Main_Countup
-        ; rcall       Main_Countdown
-        ; rcall       Main_Blink
+        ; rcall       Main_Spin
+        rcall       Main_Blink
 
 end:
         rjmp        end
--- a/timer.inc	Fri May 14 18:19:22 2010 +0300
+++ b/timer.inc	Fri May 14 18:19:59 2010 +0300
@@ -139,6 +139,14 @@
 		out			SREG, r0
 		reti
 
+;; Prime the timer and sleep for 1s
+Timer_Sleep_1s:
+	; Initialize counter to 16k cycles
+		ldi			XH, high(16 * 1024)
+		ldi			XL, low(16 * 1024)
+
+	;; Continue
+
 ;; Count to X
 Timer_Sleep:
 	; Set TOP
@@ -158,12 +166,31 @@
 	; Done
 		ret
 
-;; Prime the timer and sleep for 1s
-Timer_Sleep_1s:
-	; Initialize counter to 16k cycles
-		ldi			XH, high(16 * 1024)
-		ldi			XL, low(16 * 1024)
+;; Update timer for given timeout
+Timer_Update:
+	; Set TOP
+		sts			OCR1AH, XH
+		sts			OCR1AL, XL
+	
+	; Check timer
+		lds			YL, TCNT1L
+		lds			YH, TCNT1H
+		
+		cp			YL, XL
+		cpc			YH, XH
 
-	; Start timer
-		rjmp		Timer_Sleep
+		brlo		timer_up_out
 
+	; Update
+	; XXX: figure out a better way to do this...
+		ldi			r16, 0
+		subi		XL, 2
+		sbc			XH, r16
+
+		sts			TCNT1L, XL
+		sts			TCNT1H, XH
+
+timer_up_out:
+	; Done
+		ret
+