;;
;; 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:
; ADMUX
ldi r16, (ADC_REF << REFS0) | (ADC_LAR << ADLAR) | (ADC_MUX << MUX0)
sts ADMUX, r16
; ADCSRB
ldi r16, (ADC_ATS << ADTS0)
sts ADCSRB, r16
; 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
; Done
ret
;; Interrupt handler stub for ADC_HANDLER
ADC_Interrupt:
in r0, SREG
rcall ADC_HANDLER
out SREG, r0
reti
;; Read the current 8-bit ADC sample
; Returns value in r16
ADC_Read8:
; Copy
lds r16, ADCH
; Done
ret