Also der ADC arbeitet folgender maßen:
0. ADC einstellen (8bit / Frequenz...)
1. ADC wird gestartet (ADCSRA|=(1<<ADSC) )
2. ADC Messung läuft (ADSC=1 & ADIF=0)
3. ADC Messung fertig
Wenn die Wandlung fertig ist, setzt der ADC Bit4 (ADIF) in ADCSRA, egal
ob du Interrupts aktiviert hast oder nicht.
Falls der ADC nicht im "Free Running Mode" läuft kann man auch das
ADSC-Bit abfragen, das ist solange 1, bis die Wandlung beendet ist, da
der ADC im "Free Running Mode" direkt danach automatisch eine Wandlung
startet ist das Bit in dem Fall nutzlos, da es immer 1 wäre.
Da du aber eine kontinuierlich Messung benötigst, bleibt dir nur das
ADIF-Bit, das ist immer 1, wenn ein neues Ergebnis vorhanden ist.
Du könntest also eine Abfrage einbauen die so aussieht
unsigned char adc_wert (void)
{
if ( ADCSRA & (1<<ADIF) ) //Wenn Bit=1 Wandlung fertig
{
ADCSRA|= (1<<ADIF); //Bit löschen, mit 1 überschreiben
return ADCH; //ADC_wert ausgeben
}
return 0; //Musst du dir selbst überlegen, was du
zurückgeben willst, falls noch kein ergebniss vorliegt
}
Alternativ kannst du natürlich auch solange warten bis es fertig ist,
aber dann hängt deine Timer-Geschichte auch, wäre also nicht so gut.
while ( !(ADCSRA & (1<<ADIF)) ) //vor dem auslesen einfügen
Aber achtung, auch hier musst du ADIF selbst wieder löschen (mit 1
überschreiben! )
Gruß
Marcus