ADC\!
authorTero Marttila <terom@fixme.fi>
Fri, 07 May 2010 01:46:22 +0300
changeset 8 449fee4187f6
parent 7 697ea917c901
child 9 30c3807baac1
ADC\!
led7seg.s
--- 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