adc.inc
author Tero Marttila <terom@paivola.fi>
Sun, 20 Apr 2014 23:51:57 +0300
changeset 80 5254ba612630
parent 32 7ceb76b5a104
permissions -rw-r--r--
dmx-web: slightly better RGB colorpicker control..
;;
;; 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