Hallo, ich habe ein Problem und weis nicht mehr weiter. Ich habe ein Lauflicht Programmiert der mit einer Taste eingeschaltet wird und anderer wieder aus. Das Problem ist dass der Lauflicht erst durchlaufen muss um ausgehen zu können. Aber sieht selbst: #include <avr\io.h> void warte_ms(unsigned int Verzoegern); int main(void) { DDRB=0b00111111; PORTC=0b11111111; DDRC=0b00000000; PORTD=0b11111111; DDRD=0b00000000; int X=0b00000001; int Zeitwert=2; int t; int g; do { if (!(PINC & (1<<PINC0))) { do { do { PORTB=X; X=X*2; warte_ms(Zeitwert); } while(X<33); X=0b00000001; } while(PINC & (1<<PINC5)); } PORTB =0b00000000; } while(1); } //__________Funktion___Wartezeit_in_ms______________ void warte_ms(unsigned int Zeitwert) //Lade Funktion "warte_ms" mit dem Wert Zeitwert { while(Zeitwert!=0) { unsigned int j; for(j=0;j<1000; j++) {asm("nop");} Zeitwert--; } } Wie kann ich erreichen dass ich das laufen jederzeit unterbrechen kann?
Pack' dein Lauflicht in einen Timer-Interrupt (Ein Schritt pro Aufruf). Dann kannst du es bequem durch (de-)aktivieren des Timers ein- und ausschalten. Warteschleifen dieser Grössenordnung sind sowieso denkbar ungünstig, da beschäftigst du den Controller zu 100% mit Däumchendrehen.
ok dann muss ich erstmal lernen was ein Timer Interrupt ist. Danke für den Tipp
Eine Kurze frage. Ist die Aufgabe überhaupt, mit Kopf und Fußgesteuerten Schleifen, lössbar?
Max wrote: > Eine Kurze frage. > Ist die Aufgabe überhaupt, mit Kopf und Fußgesteuerten Schleifen, > lössbar? Sicher ist sie das. Dein Problem ist folgendes: Die innerste Schleife ist deine Lauflichtschleife. Die läuft solange durch, bis dein Licht einmal rum ist. Und erst danach wird geprüft ob der Taster gedrückt ist. Das muesstest du ändern. Die innerste Schleife soll solange laufen * bis das Lauflicht einmal rundum ist * oder bis eine Taste gedrückt wurde was auch immer zuerst eintrifft. Du musst also an der Abbruchbedingung der inneren Schleife arbeiten. Die wird jetzt etwas komplizierter. Ist eine gute Übung für einen Anfänger um mit etwas kompliziertern Schleifenkonstrukten zu arbeiten und um die logischen Operatoren UND (&&) und ODER (||) kennen zu lernen.
warum nicht. Gewöhn Dir das mit den sinnlosen Warteschleifen erst garnicht an. Der Controller tut nichts in der Zeit, nicht mal auf deinen Ausschaltwunsch kann er reagieren.
@ Max (Gast) >Ich habe ein Lauflicht Programmiert der mit einer Taste eingeschaltet >wird und >anderer wieder aus. >Das Problem ist dass der Lauflicht erst durchlaufen muss um ausgehen zu >können. >Wie kann ich erreichen dass ich das laufen jederzeit unterbrechen kann? >Eine Kurze frage. >Ist die Aufgabe überhaupt, mit Kopf und Fußgesteuerten Schleifen, >lössbar? Sicher.
1 | #include <avr\io.h> |
2 | #define F_CPU 1000000L
|
3 | #include <util\delay.h> |
4 | |
5 | int main(void) |
6 | |
7 | {
|
8 | DDRB=0b00111111; |
9 | PORTC=0b11111111; |
10 | DDRC=0b00000000; |
11 | PORTD=0b11111111; |
12 | DDRD=0b00000000; |
13 | |
14 | uint8_t X=0b00000001; |
15 | int Zeitwert=2; |
16 | |
17 | while(1) { // Endlosschleife |
18 | while ((PINC & (1<<PINC0))); // Warte auf Starttaste |
19 | do { |
20 | PORTB=X; // Port setzen |
21 | X <<=1; // nach links schieben |
22 | if (X==0x40) X=1; // Reload |
23 | _delay_ms(Zeitwert); // Warten |
24 | } while(PINC & (1<<PINC5)); // solange PC5 nicht gedrückt ist |
25 | PORTB =0b00000000; // Port löschen |
26 | }
|
27 | }
|
MfG Falk
Die Warteschleife haben wir in der Schule gemacht. Mir geht es bei der Aufgabe richtig mit Kopf und Fußgesteuerten Schleifen zu arbeiten. Ok danke für die Hilfe, da muss ich wohl noch etwas üben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.