PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion mit for-Schleife



jeffreydj
14.02.2007, 22:31
Ich habe versucht, die Aufgabe 6.1 (2) des Asuro-Buches zu lösen.
Hier soll man alle LED´s hintereinander für eine Sekunde zum Leuchten bringen.
Dafür brauch man eine Menge for-Schleifen und so steht es dann auch in den Lösungen, aber kann man für die for-Schleife nicht eine extra Funktion erstellen, die zwischen jeder LED aufgerufen wird?

Ich habe das versucht, es aber nicht hinbekommen. Wenn das geht, könnte mir jemand ein Musterbeispiel, von mir aus mit einem Wechsel zwischen 2 LED´s, für die Sache zeigen?

Wäre echt nett!

radbruch
14.02.2007, 22:52
Sowas löst man mit Funktionen, z.b.:

void pause(unsigned int dauer) {

unsigned int i, j;

for (i=0; i<dauer; i++) for (j=0; j<1000; j++) j=j;

}

Keine Ahnung ob das funzt. Wenn ja, dann ist j der Zähler für die innere Schleife und bestimmt die Verzögerung pro Dauereinheit. j=j; ist ein dummy und sorgt dafür, das der mega8 nicht einschläft.

Das geht mit der lib natürlich auch, aber ohne sollte man es auch können. Anwendung wäre dann:

...
StatusLED(RED);
pause(500);
StatusLED(GREEN);
pause(500);
...

Das Ganze sieht dann z.B. so aus:



#include "asuro.h"

void pause(unsigned int dauer) {

unsigned int i, j;

for (i=0; i<dauer; i++) for (j=0; j<30000; j++) j=j;

}

int main(void) {
do{

Init();

StatusLED(RED);
pause(500);
StatusLED(GREEN);
pause(500);

}while (1);
return 0;
}

jeffreydj
14.02.2007, 22:59
Kann man auch ohne Überlieferung von Parametern eine Funktion einbauen?

Und was bedeutet eigentlich "void"?

radbruch
14.02.2007, 23:18
Der plöde compiler hat den dummy rausoptimiert. Hier eine bessere Variante:


#include "asuro.h"

void pause(void) {

unsigned int i, j, dauer;

dauer=500;

for (i=0; i<dauer; i++) for (j=0; j<1000; j++) sei();

}

int main(void) {

Init();

do{
StatusLED(RED);
pause();
StatusLED(GREEN);
pause();

}while (1);
return 0;
}


Das void bezieht sich auf den Rückgabewert der Funktion. void bedeutet das kein Wert zurückgeliefert wird. In der zweiten Variante bedeutet viod zusätzlich dass kein Parameter übergeben wird.

Pascal
15.02.2007, 05:48
Der plöde compiler hat den dummy rausoptimiert. Hier eine bessere Variante:

Für sowas kann man doch auch gut ein nop verwenden. Dieser Befehl braucht exakt einen Takt und bewirkt nichts außer einer Zeitverzögerung.

jeffreydj
15.02.2007, 10:44
Ich habe es fast genauso gemacht, bloß dass ich von der Verwendung von void nichts wusste.
Für den Sekundentakt nehme ich einfach Sleep().

Vielen Dank, hat mir weiter geholfen!

damaltor
15.02.2007, 10:46
also void bedeutet einfach "nichts".

steht es vor der funktion, bedeutet es dass nichts zurückgegeben wird, steht es in den klammern, bedeutet es dass keine parameter erwartet werden.

radbruch
15.02.2007, 13:18
Ich wuste nicht, ob ihr Sleep(); auch verwenden dürft. Es ist natürlich das einfachste und genauste weil Interuptgesteuert.