Gast
#1314215
eine Frage an die Wahrsager:
bei einem mega8 möchte ich mir das Ergebnis der AD-Wandlung per
Interrupt geben lassen,
in den Interrupt kommt er auch rein denn wenn ich die 2. Zeile mit 766
nicht auskommentiere krieg ich den Wert 766, wenn ich ADC lese immer den
Wert 0
Hardware stimmt denn wenn ich nicht Interruptgesteuert sondern "zu Fuß"
abfrage passen die Spannungswerte
Initialsierung:
ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
Interruptroutine
ISR (ADC_vect)
{
result = ADC; // hier wird result immer 0!
// result = 766;
}
und so starte ich eine Conversion
// ADC fuer angegebenen Kanal starten
void StartADC(char channel)
{
ADMUX = channel; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung
#ifdef ohneIRQ
ADCSR |= (1<<ADSC); // eine ADC-Wandlung
#else
ADCSR |= (1<<ADSC) | _BV(ADIE); // eine ADC-Wandlung
#endif
}
und hier die zu Fuß Variante die funktioniert
uint16_t getADC(void)
{
#ifdef ohneIRQ
while(!(ADCSR & (1<<ADIF))) // auf Abschluss der Konvertierung
warten (ADIF-bit)
;
result = ADC;
#endif
return result;
}
result ist übrigens volatile und die Zugriffe darauf erfolgen in
Interrupts, d.h. es kann nicht durch einen IRQ zerfleddert werden
(könnte auch nicht damit zu tun haben dass ich immer 0 kriege und mit
766 funktionierts auch alles)
Habe ich was übersehen oder gibt es Tipps?