--- a/led7seg.s Thu May 06 00:41:27 2010 +0300
+++ b/led7seg.s Fri May 07 01:46:22 2010 +0300
@@ -9,6 +9,9 @@
.org SPIaddr
rjmp SPI_Interrupt
+.org ADCCaddr
+ rjmp ADC_Interrupt
+
;; SPI
.equ SPI_DDR = DDRB
.equ SPI_PORT = PORTB
@@ -175,7 +178,60 @@
; Display
rjmp SPI_Send
+;; ADC
+.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)
+ sts ADMUX, r16
+
+ ; Setup ADCSRB
+ ; Free-running mode
+ ldi r16, (0b000 << ADTS0)
+ sts ADCSRB, r16
+
+ ; Setup ADCSRA
+ ; Enable
+ ; Start right away...
+ ; Auto-trigger
+ ; Enable Interrupt
+ ; Scale 1/128
+ ldi r16, (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (1 << ADIE) | (0b111 << ADPS0)
+ sts ADCSRA, r16
+
+ ; Disable digital circuit for pin
+ ldi r16, (1 << ADC_PIN)
+ sts DIDR0, r16
+
+ ; Debug LED
+ sbi DDRD, PORTD7
+ sbi PORTD, PORTD7
+
+ ; Done
+ ret
+
+ADC_Interrupt:
+ ; Off
+ cbi PORTD, PORTD7
+
+ ; Done
+ reti
+
+;; Read the current 8-bit ADC sample
+; Returns value in r16
+ADC_Read8:
+ ; Copy
+ lds r16, ADCH
+
+ ; Done
+ ret
;; Delay for approx. one second
Delay_1s:
@@ -255,9 +311,12 @@
mov r16, r24
rcall LCD_ShowRaw
- ; short delay
- ldi r20, 6
- ldi r21, 255
+ ; variable delay -> r16
+ rcall ADC_Read8
+
+ ; short delay, from ADC
+ mov r20, r16
+ ldi r21, 1
rcall ShortDelay
; next segment
@@ -280,10 +339,13 @@
; Enable interrupts
sei
+ ; ADC (slowest to start up)
+ rcall ADC_Init
+
; SPI
rcall SPI_Init
- ; LCD (requires interrupts)
+ ; LCD (requires interrupts, blocks)
rcall LCD_Init
; Run