--- 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
+