Sascha712 schrieb:
> Könnte ich das (fall == 1) nicht auch weglassen?
In Uwes Version nicht
> wird doch schon durch
> case 1: bestimmt?
Du willst doch, dass die ganze Delay Sache sofort unterbrochen wird,
sobald durch einen Interrupt ein anderer Fall eingestellt wird. Also ist
eben nicht gewährleistet, dass fall ständig die ganze Zeit den Wert 1
hat.
Das hier
1 | delay = 6000;
|
2 | while (delay) {
|
3 | _delay_ms(1);
|
4 | delay --;
|
bringt dir nichts. Da hättest du genausogut auch gleich
schreiben können.
Der ganze Witz in Uwes Lösung besteht ja darin, dass es hier
1 | delay = 6000;
|
2 | while ((fall == 1) && delay) {
|
3 | _delay_ms(1);
|
4 | delay --;
|
5 | }
|
2 Bedingungen gibt, unter denen die Wartezeit abgebrochen wird.
Einmal wenn die Wartezeit abgelaufen ist
und die zweite mögliche Bedingung besteht darin, dass ein Interrupt
einen anderen fall eingestellt hat. Auch denn wird die Schleife
spätestens 1ms später abgebrochen, weil dann fall eben nicht mehr 1 ist.
Aber tatsächlich ist die Lösung eher schlecht, denn du musst jeden delay
einzeln pimpen. Das erledigt man anders, in dem man die Hauptschleife
auf eine konstante Länge von zb 1ms bringt und dann einen Zähler
installiert, der zb von einer eingestellten Wartezeit runterzählt.