higret
08.06.2005, 21:23
Hi
ich versuch grad den ADC vom Atmega8 zu aktivieren, aber anscheinend funktioniert es nicht.
AVcc und ARef hab ich mit Vcc verbunden und AGnd mit GND
Ich häng mal das Programm an, vielleicht findet ihr den Fehler ja
.include "m8def.inc"
.equ cputakt = 1000000 ;arbeitet im Bereich von (1 - 20 MHz)
.set count_ms = cputakt / (4000 + 1) ;ergibt in wait_ms ca.1ms vom Aufruf aus
.MACRO wait_ms
ldi temp, @0 ;Lade temp mit Zähler (in ms)
rcall delay_ms ;Aufruf Verzögerungschleife
.ENDMACRO
.equ LED_PORT = PORTD
.equ LED_DIR = DDRD
.def LED_REG = r16
.def temp = r20
.def temp2 = r21
.def temp3 = r22
.cseg
.org 0x0000
rjmp reset ; Interruptvektoren überspringen
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti
reti
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
rjmp adc ; ADC Conversion Complete Interrupt Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler
reset:
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp
ldi temp, 0xFF ; 0xFF in Reg. temp laden
out LED_DIR, temp ; alle ports als ausgänge
ldi LED_REG, 0b00000000 ; alle Pins ein
out LED_PORT, LED_REG
wait_ms(255)
ldi LED_REG, 0b11111111 ; alle Pins aus
out LED_PORT, LED_REG
wait_ms(255)
rjmp initadc
mainloop:
rjmp mainloop
initadc:
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
cbi ADMUX, REFS0
cbi ADMUX, REFS1
;sbi ADMUX, ADLAR
sbi ADCSR, ADPS0
sbi ADCSR, ADPS1
cbi ADCSR, ADPS2
sbi ADCSR, ADEN
sbi ADCSR, ADFR
sbi ADCSR, ADIE
cbi ADCSR, ADIF
sei
sbi ADCSR, ADSC ; start conversion
rjmp mainloop
adc:
in temp, ADCL ; ADC-Wert einlesen
in temp2, ADCH ; 10 Bit
ror temp2 ; xxxxxxxN c=N
ror temp ; Nnnnnnnn c=n
ror temp2 ; xxxxxxxx c=N
ror temp ; NNnnnnnn c=n
out LED_PORT, temp
reti
; ************************************************** ******************
; delay_ms verzögert um x ms
; Parameter : Zeit in ms (1-255) in temp, in Z-Register keine Änderung
; Rückgabe : keine
; ************************************************** ******************
delay_ms:
push ZL ;Z auf den Stack retten
push ZH
delay_ms_1:
ldi ZH, HIGH(count_ms) ;Lade höherwertiges Byte nach Z
ldi ZL, LOW(count_ms) ;Lade niederwertiges Byte nach Z
delay_ms_2:
sbiw ZL, 1 ;subtrahiere 1 von Z
brne delay_ms_2 ;solange bis Z = 0
dec temp ;temp um 1 herunterzählen
brne delay_ms_1 ;solange bis temp = 0
pop ZH ;Z vom Stack zurückholen
pop ZL
ret
Vielen Dank schonmal
ich versuch grad den ADC vom Atmega8 zu aktivieren, aber anscheinend funktioniert es nicht.
AVcc und ARef hab ich mit Vcc verbunden und AGnd mit GND
Ich häng mal das Programm an, vielleicht findet ihr den Fehler ja
.include "m8def.inc"
.equ cputakt = 1000000 ;arbeitet im Bereich von (1 - 20 MHz)
.set count_ms = cputakt / (4000 + 1) ;ergibt in wait_ms ca.1ms vom Aufruf aus
.MACRO wait_ms
ldi temp, @0 ;Lade temp mit Zähler (in ms)
rcall delay_ms ;Aufruf Verzögerungschleife
.ENDMACRO
.equ LED_PORT = PORTD
.equ LED_DIR = DDRD
.def LED_REG = r16
.def temp = r20
.def temp2 = r21
.def temp3 = r22
.cseg
.org 0x0000
rjmp reset ; Interruptvektoren überspringen
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti
reti
reti ; Timer1 Capture Handler
reti ; Timer1 CompareA Handler
reti ; Timer1 CompareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; USART RX Complete Handler
reti ; UDR Empty Handler
reti ; USART TX Complete Handler
rjmp adc ; ADC Conversion Complete Interrupt Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
reti ; Two-wire Serial Interface Handler
reti ; Store Program Memory Ready Handler
reset:
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp
ldi temp, 0xFF ; 0xFF in Reg. temp laden
out LED_DIR, temp ; alle ports als ausgänge
ldi LED_REG, 0b00000000 ; alle Pins ein
out LED_PORT, LED_REG
wait_ms(255)
ldi LED_REG, 0b11111111 ; alle Pins aus
out LED_PORT, LED_REG
wait_ms(255)
rjmp initadc
mainloop:
rjmp mainloop
initadc:
cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
cbi ADMUX, REFS0
cbi ADMUX, REFS1
;sbi ADMUX, ADLAR
sbi ADCSR, ADPS0
sbi ADCSR, ADPS1
cbi ADCSR, ADPS2
sbi ADCSR, ADEN
sbi ADCSR, ADFR
sbi ADCSR, ADIE
cbi ADCSR, ADIF
sei
sbi ADCSR, ADSC ; start conversion
rjmp mainloop
adc:
in temp, ADCL ; ADC-Wert einlesen
in temp2, ADCH ; 10 Bit
ror temp2 ; xxxxxxxN c=N
ror temp ; Nnnnnnnn c=n
ror temp2 ; xxxxxxxx c=N
ror temp ; NNnnnnnn c=n
out LED_PORT, temp
reti
; ************************************************** ******************
; delay_ms verzögert um x ms
; Parameter : Zeit in ms (1-255) in temp, in Z-Register keine Änderung
; Rückgabe : keine
; ************************************************** ******************
delay_ms:
push ZL ;Z auf den Stack retten
push ZH
delay_ms_1:
ldi ZH, HIGH(count_ms) ;Lade höherwertiges Byte nach Z
ldi ZL, LOW(count_ms) ;Lade niederwertiges Byte nach Z
delay_ms_2:
sbiw ZL, 1 ;subtrahiere 1 von Z
brne delay_ms_2 ;solange bis Z = 0
dec temp ;temp um 1 herunterzählen
brne delay_ms_1 ;solange bis temp = 0
pop ZH ;Z vom Stack zurückholen
pop ZL
ret
Vielen Dank schonmal