# HG changeset patch # User Tero Marttila # Date 1273185982 -10800 # Node ID 449fee4187f60bad2a93bf4d018360a9848a007a # Parent 697ea917c90147e9fdf39cc6838ab83f8d9e3fcc ADC\! diff -r 697ea917c901 -r 449fee4187f6 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