Wenn dein Programm einmal in der Endlosschleife ist, was soll es dann machen?
Da kann in deinem Hauptteil stehen was will.
Wo ist deine Interrupt-Funktion?
Hallo,
Ich hab es endlich hingekriegt meinen Asuro über einen Interrupt anhalten zu lassen, wenn er kollidiert (ein Schalter gedrückt wird). Der Code sieht so aus:
Das funktioniert auch. Obwohl er schon in der Endlosschleife ist, reagiert er trotzdem noch auf ein Hindernis. ABER, das geht nur bei Endlosschleifen! Wenn ich den MotorSpeed durch Beschleunige(120, 140, 5); ersetze, geht es nicht mehr. Meine Beschleunige-Funktion sieht so aus:Code:#include "asuro.h" #include "funktionen.h" int main(void) { // Initialisierung Init(); sei(); StartSwitch(); // hier kommt der Hauptteil des Programms StatusLED(RED); MotorSpeed(120, 120); while(1); return 0; }
(Warte ist bei mir nichts anderes als Msleep)Code:void Beschleunige(int start, int end, int zeit) { int momentan; int durchlaeufe = end - start; float zeitschritt = (float) zeit / (float) durchlaeufe * 1000; for(momentan=start; momentan<end; momentan++) { Geschwindigkeit(momentan, momentan); Warte(zeitschritt); } }
Eigentlich tut er also dabei die meiste Zeit "Sleep". Nur das komische ist, wenn ich das Sleep im Hauptteil einfüge, funktioniert es
![]()
Ich will doch nur, dass der Asuro auch beim beschleunigen Hindernisse erkenntCode:#include "asuro.h" #include "funktionen.h" int main(void) { // Initialisierung Init(); sei(); StartSwitch(); // hier kommt der Hauptteil des Programms StatusLED(RED); Warte(90000); while(1); return 0; }Kann mir bitte jemand helfen?
Wenn dein Programm einmal in der Endlosschleife ist, was soll es dann machen?
Da kann in deinem Hauptteil stehen was will.
Wo ist deine Interrupt-Funktion?
Auf Interrupts reagieren! Oder hab ich da etwas falsch verstanden?Zitat von Hubert.G
Die steht auch in der Funktionen.cZitat von Hubert.G
Code:ISR(INT1_vect) { StopSwitch(); MotorSpeed(0, 0); }
Wohin springt das Programm wenn der Interrupt abgearbeitet ist?
Wieder in die Endlosschleife und macht genau das was es vorher gemacht hat.
Was steht in der Endlosschleife?
Es ist sehr schwer aus Programmfragmente einen Fehler herauszulesen.
Du hast recht! Nach dem Abarbeiten des Interrupts, was so schnell geht, dass man es nicht merkt, fährt er direkt weiter. Ich probiere das gleich mal aus, was passiert, wenn ich in den Interrupt noch eine kleine Wartezeit einbaue.Zitat von Hubert.G
Sorry, ich dachte, ich geb dir lieber ein paar Ausschnitte, da das ganze etwas umfangreicher ist.Zitat von Hubert.G
Hallo
Mir fällt es echt schwer aus den hingeworfenen Brocken den Zusammenhang des Programms zu erkennen. Wenn du schon so eigenwilige Wege gehst, solltest du mehr Infos rauslassen.
Da ich die Switch()-Funktionen nur aus meiner 2.3er Version der Lib kenne (aber noch nie verwendet habe) ist der Einstieg etwas zäh. Für mich scheint der Fehler in der fehlenden Kommunikation der ISR mit dem Hauptprogamm zu entstehen. Beim ersten Beispiel wird die MotorSpeed() einmal gesetzt und in der ISR nach dem Tastendruck wieder gelöscht. Beim Beschleunigen wird aber immer erneut MotorSpeed() gesetzt, auch wenn die ISR aktiv war. Wie in der orginalen LIB benötigt man ein in der ISR gesetztes Flag (heißt dort switched) das in der Beschleunigungsschleife abgefragt wird und nach der ISR das Beschleunigen abbricht:
GrußCode:for(momentan=start; momentan<end; momentan++) { Geschwindigkeit(momentan, momentan); Warte(zeitschritt); if(switched) break; }
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ein kleinigkeit, und warscheinlich nicht die ursache von dein problehm. Asuro könnte aber die speicherplatz falsch interpretieren:
Zeitschrit ist einer float, aber Msleep (Warte weiss ich nich) muss einer integer wert bekommen. Typ-umwandlung geht nicht automatisch meines wissen.
Warte erwartet auch einen Integer wert. Aber anscheinend geht das wohl automatisch, denn die Beschleunige-Funktion funktioniert. Er reagiert dann halt nur nicht auf Hindernisse.Zitat von Valen
Jedenfalls gehts jetzt. Der Fehler war, dass die Beschleunigen Funktion nach dem Interrupt nicht unterbrochen wird. Danke an alle für die schnellen Antworten![]()
In den Interrupt sollst du keine Wartezeit setzen, dort gehört ein Flag gesetzt.
Solange du im Interrupt bist kann kein zweiter aufgerufen werden, er wartet bis zum Ende des ersten und wird erst dann aktiv.
Ich nehme aber einmal an das deine Programmstruktur nicht für eine Unterbrechung durch Interrupt geeignet ist.
Ok, aber wie? Ich krieg es einfach nicht hin, globale Variablen zu definieren, die ich sowohl in der main.c als auch in der funktionen.c benutzen kann.Zitat von Hubert.G
Lesezeichen