Da hab ich mir was angetan ;-)Zitat:
Versteh nur noch nicht warum es besser ist zwei Variablen zu deklarieren anstatt eine global zu deklarieren...
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:
Bei dieser Variante ist return result nicht nötig, weil result bei Dir global ist, die Funktion hätte ohne Rückgabewert funktioniert.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;
}
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
Hier wird Dein ADC Ergebnis zurückgeliefert, ich habe mir erlaubt noch 2 Änderungen vorzunehmen, OK ?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;
}
Diese Funktion wird in main so aufgerufen und zwar ohne lokale Variable zu nehmen
Ich hoffe, du stimmst mir zu, das die Sache übersichtlicher ist 8-[Code:if(ADC_einlesen() <350)
{
PORTB &= ~(1<<PB1); //Einschalten der LED an B1
}
else
{
PORTB |= (1<<PB1); //wenn result größer, LED ausschalten
}
}
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 O:)