rogerberglen
12.08.2007, 22:03
Ich habe mal Zeit gefunden und ein kleines Programm erstellt, daß ca. 0.5s den Pin ADC2 abfrägt und die anliegende Spannung in einen digitalen Wert wandelt. Ich kann aber in AVR-Studio den betreffenden Pin auf 1 setzen so viel ich will. Das Ergebnis in ADCH und ADCL ist grundsätzlich 0.
Habe ich da irgendwas übersehen? Denn der Interrupt für die AD-Wandlung wird korrekt aufgerufen. Um das Anzuzeigen blinkt eine LED jedesmal mit sobald der ADC-Eingang abgefragt wird.
Momentan werden die Werte aus ADCH und ADCL noch nicht ausgelesen! Aber in AVR sieht man schon, daß der Wert immer 0 ist.
.include "TN15def.inc" ; Prozessor ATtiny15
.def TMP1 = R16 ; Allgemeine Variable
.def LEDStat = R17 ; LED-Register
.def Prescaler = R18 ; Timer0 Startwert
.def ADHigh = R19 ; High-Byte Analogwandler
.def ADLow = R20 ; Low-Byte Analogwandler
.org 0x0000 ; Programm Startadresse $0000
rjmp Init ; Einsprung ins Hauptprogramm
.org 0x0005 ; Interrupt Timer0
rjmp Led ; Led im Sekundentakt blinken
.org 0x0008 ; Interrupt AD-Wandler
rjmp ADFertig ; Ergebnis von AD holen
.org 0x0009 ; Programmstart bei $0009
Init:
ldi TMP1,0x01 ; Pin5 auf Ausgabe
out DDRB,TMP1 ; schalten.
rol TMP1
out TIMSK,TMP1 ; Timer0 Interrupt freigeben
ror TMP1
mov LEDStat,TMP1 ; LED-Status speichern.
out PORTB,TMP1 ; LED ausschalten
ldi TMP1,0x02 ; Teilerfaktor 8
out TCCR0,TMP1 ; für Timer0 einstellen.
ldi TMP1,0x0A ; Timer0 mit Startwert
out TCNT0,TMP1 ; vorladen und Startwert
mov Prescaler,TMP1 ; speichern.
ldi TMP1,0x82 ; Interne Referenzspannung
out ADMUX,TMP1 ; einschalten und Pin3 Analogeingang
ldi TMP1,0x88 ; AD-Wandler einschalten und
out ADCSR,TMP1 ; Interrupt für AD freigeben.
sei ; Interrupts freigeben
Start:
; Hier kann ein Hauptprogramm stehen!
rjmp start ; Hauptprogrammende
; ****************************************
; * Interrupt LED An/Aus Timer0 *
; ****************************************
Led:
out TCNT0,Prescaler ; Timer mit Startwert laden
sbic PORTB,PORTB0 ; Led an?
rjmp LedAn ; Nein, dann einschalten
sbi PORTB,PORTB0 ; Ansonsten ausschalten
sbi ADCSR,ADSC ; AD-Wandlung starten
reti ; Interrupt verlassen
LedAn:
cbi PORTB,PORTB0 ; Led einschalten und
sbi ADCSR,ADSC ; AD-Wandlung starten.
reti ; Rücksprung zum Hauptprogramm
; ****************************************
; * Interrupt AD-Wandler *
; ****************************************
ADFertig:
reti
Habe ich da irgendwas übersehen? Denn der Interrupt für die AD-Wandlung wird korrekt aufgerufen. Um das Anzuzeigen blinkt eine LED jedesmal mit sobald der ADC-Eingang abgefragt wird.
Momentan werden die Werte aus ADCH und ADCL noch nicht ausgelesen! Aber in AVR sieht man schon, daß der Wert immer 0 ist.
.include "TN15def.inc" ; Prozessor ATtiny15
.def TMP1 = R16 ; Allgemeine Variable
.def LEDStat = R17 ; LED-Register
.def Prescaler = R18 ; Timer0 Startwert
.def ADHigh = R19 ; High-Byte Analogwandler
.def ADLow = R20 ; Low-Byte Analogwandler
.org 0x0000 ; Programm Startadresse $0000
rjmp Init ; Einsprung ins Hauptprogramm
.org 0x0005 ; Interrupt Timer0
rjmp Led ; Led im Sekundentakt blinken
.org 0x0008 ; Interrupt AD-Wandler
rjmp ADFertig ; Ergebnis von AD holen
.org 0x0009 ; Programmstart bei $0009
Init:
ldi TMP1,0x01 ; Pin5 auf Ausgabe
out DDRB,TMP1 ; schalten.
rol TMP1
out TIMSK,TMP1 ; Timer0 Interrupt freigeben
ror TMP1
mov LEDStat,TMP1 ; LED-Status speichern.
out PORTB,TMP1 ; LED ausschalten
ldi TMP1,0x02 ; Teilerfaktor 8
out TCCR0,TMP1 ; für Timer0 einstellen.
ldi TMP1,0x0A ; Timer0 mit Startwert
out TCNT0,TMP1 ; vorladen und Startwert
mov Prescaler,TMP1 ; speichern.
ldi TMP1,0x82 ; Interne Referenzspannung
out ADMUX,TMP1 ; einschalten und Pin3 Analogeingang
ldi TMP1,0x88 ; AD-Wandler einschalten und
out ADCSR,TMP1 ; Interrupt für AD freigeben.
sei ; Interrupts freigeben
Start:
; Hier kann ein Hauptprogramm stehen!
rjmp start ; Hauptprogrammende
; ****************************************
; * Interrupt LED An/Aus Timer0 *
; ****************************************
Led:
out TCNT0,Prescaler ; Timer mit Startwert laden
sbic PORTB,PORTB0 ; Led an?
rjmp LedAn ; Nein, dann einschalten
sbi PORTB,PORTB0 ; Ansonsten ausschalten
sbi ADCSR,ADSC ; AD-Wandlung starten
reti ; Interrupt verlassen
LedAn:
cbi PORTB,PORTB0 ; Led einschalten und
sbi ADCSR,ADSC ; AD-Wandlung starten.
reti ; Rücksprung zum Hauptprogramm
; ****************************************
; * Interrupt AD-Wandler *
; ****************************************
ADFertig:
reti