Hallo
Nach vielen Versuchen kann ich nun wenigsten einen funktionierenden Ansatz präsentieren. Wie schon angekündigt habe ich die zyklische Messung rausgeschmissen:
// Initialize ADC:
ADMUX = 0; //external reference
ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
SFIOR = 0;
uint16_t readADC(uint8_t channel)
{
if((ADCSRA & (1<<ADSC))) return 0; // check if ADC is buisy...
ADMUX = (1<<REFS0) | (0<<REFS1) | (channel);
if(channel==4) ADMUX |= (1<<REFS1); // 2,56V-Referenz bei der Batteriemessung
Sleep(100);
ADCSRA = (0<<ADIE) | (1<<ADSC) | (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
while ((ADCSRA & (1<<ADSC)));
ADCSRA |= (1<<ADIF);
return ADC;
}
Der Code stammt ursprünglich vom arexx-m32, erweitert um die Referenzumschaltung für die Batteriemessung. Letztlich hatte es erst funktioniert, nachdem ich die Verzögerungszeit nach dem Laden des ADMUX-Registers eingebaut hatte (Sleep(1) dauert ca. 1/15000sec und wird mit der Timer1-OVL-ISR erzeugt). Vermutlich funktioniert es auch mit einer kürzeren Zeit. Die Programmverzögerung durch die ADC-ISR dürfte aber deutlich größer sein wenn man die Zeit für alle ISR-Aufrufe addiert.
Gruß
mic
Ach, fast vergessen:
Meine Messung ergab einen ADC-Wert von 973. Zwischen R23/R24 (nahe C22) gegen GND habe ich 2,464V gemessen. Das ergibt mit 2,464V*1023/973 ca. 2,59V als interne Referenz. Bei der zweiten Messung hatte ich 2,46V zwischen dem Spannungteiler bei einer Akkuspannung an R23 (neben Mega16) von 4,97V. Das Verhältniss am Spannungsteiler ist demnach 4,97V/2,46V=2,02. Somit ist die Akkuspannung bei ADC-Wert von 973 ca. 2,59V*973/1023*2,02=4,97V