Versteh nur noch nicht warum es besser ist zwei Variablen zu deklarieren anstatt eine global zu deklarieren...
Da hab ich mir was angetan 
Aber wenn man a sagt muß man auch b sagen, ich versuchs mal.
Es ist allgemein besser, wenn sich Funktionen Ihre Daten gegenseitig zuschieben, anstatt die Daten über globale Variablen auszutauschen, du hast auch gut angefangen schau:
Code:
uint16_t ADC_einlesen(void)
{
uint8_t i; //Variable i deklarieren
for (i=0; i<3; i++) //for-Schleife für dreimalige Wandlung
{
ADCSRA |= (1<<ADSC); //Wandlung starten
while(ADCSRA & (1<<ADSC)); //auf Ergebnis warten
result += ADC; //Ergebnis in Variable result schreiben
}
ADCSRA &= ~(1<<ADEN); //ADC deaktivieren
result /=3; //result durch 3 teilen
return result;
}
Bei dieser Variante ist return result nicht nötig, weil result bei Dir global ist, die Funktion hätte ohne Rückgabewert funktioniert.
Du kannst von überall auf result zugreifen, verändern usw.
Das ist schon der Erste knackpunkt.
Du könntest es auch verändern ohne es zu wollen.
Zugegeben bei diesem kleinem Programm wohl nicht so einfach, du willst aber irgendwann was größeres schreiben, vielleicht über mehrere *.c Dateien verteilt, da sieht es schon anders aus mit der Übersichtlichkeit.
Sowas hat mit Datenkapselung zu tun und Gültigkeitsbereichen, ich denke da an OOP mit Klassen und private Atributen.
Nehmen wir jetzt eine Variante mit lokalen Variablen
Code:
uint16_t ADC_einlesen(void)
{
uint8_t i; //Variable i deklarieren
uint16_t result = 0;
for (i=0; i<4; i++) //for-Schleife für dreimalige Wandlung
{
ADCSRA |= (1<<ADSC)|(1<<ADEN); //Wandlung starten
while(ADCSRA & (1<<ADSC)); //auf Ergebnis warten
result += ADC; //Ergebnis in Variable result schreiben
}
ADCSRA &= ~(1<<ADEN); //ADC deaktivieren
result /=4; //result durch 3 teilen
return result;
}
Hier wird Dein ADC Ergebnis zurückgeliefert, ich habe mir erlaubt noch 2 Änderungen vorzunehmen, OK ?
Diese Funktion wird in main so aufgerufen und zwar ohne lokale Variable zu nehmen
Code:
if(ADC_einlesen() <350)
{
PORTB &= ~(1<<PB1); //Einschalten der LED an B1
}
else
{
PORTB |= (1<<PB1); //wenn result größer, LED ausschalten
}
}
Ich hoffe, du stimmst mir zu, das die Sache übersichtlicher ist
Denke man daran daß Du eventuell in einem Jahr an Deinem Programm was ändern willst.
Andere Sache ist, Globale Variablen 'leben' im Ram, lokale fast immer in Registern, auch der Rückgabewert wird in Registern übergeben was die Sache natürlich schneller macht.
Zum Schluß Zitiere ich paar Zeilen aus Kerninghan&Ritchie
" Übrigens besteht eine Tendenz alle nur denkbaren Variablen extern zu vereinbaren, denn das vereinfacht anscheinend die Zusammenarbeit
zwischen Funktionen - Parameterlisten sind kurz und Variablen sind immer verfügbar, wenn wir sie benötigen.
Aber externe Variablen sind immer verfügbar, sogar dann, wenn wir sie nicht benutzen wollen.
Sich zu sehr auf externe Variablen zu verlassen ist höchst gefählich,
denn es führt zu Programmen, deren Dattenverbindungen absolut nicht offensichtlich sind - Variablen können an unerwarteten Stellen sogar unbeabsichtlich verändert werden, und das Programm ist sehr schwer zu ändern..."
Seite 32
So jetzt habe ich keine Lust mehr 
P.S. Wenn Du mit global besser klar kommst werde ich es Dir nicht mehr ausreden, wir sprechen uns irgendwann mal wieder
Lesezeichen