- Das ADC-Register sollte unbedingt als 16-Bit-Wert gelesen werden, damit der Zugriff in der richtigen Reihenfolge gemacht wird.
- ausserdem ist der Wert darin unsigned.
- das Lesen muss atomar erfolgen, da sonst während des Auslesens ein ADC-IRQ auftreten kann, und man dann einen korrupten Wert liest (passiert zwar selten, aber es passiert)
Code:#include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> uint16_t volatile adc_wert; SIGNAL (SIG_ADC) { adc_wert = ADC; } // Lesen: ... uint16_t wert; uint8_t sreg; ... sreg = SREG; cli(); wert = adc_wert; SREG = sreg; ...
Lesezeichen