- LiTime Speicher und Akkus         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Problem mit Interrupts

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14

    Problem mit Interrupts

    Anzeige

    Praxistest und DIY Projekte
    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:

    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;
    
    }
    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:
    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);
    	}
    }
    (Warte ist bei mir nichts anderes als Msleep)

    Eigentlich tut er also dabei die meiste Zeit "Sleep". Nur das komische ist, wenn ich das Sleep im Hauptteil einfüge, funktioniert es

    Code:
    #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;
    
    }
    Ich will doch nur, dass der Asuro auch beim beschleunigen Hindernisse erkennt Kann mir bitte jemand helfen?

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Zitat Zitat von Hubert.G
    Wenn dein Programm einmal in der Endlosschleife ist, was soll es dann machen?
    Auf Interrupts reagieren! Oder hab ich da etwas falsch verstanden?

    Zitat Zitat von Hubert.G
    Wo ist deine Interrupt-Funktion?
    Die steht auch in der Funktionen.c

    Code:
    ISR(INT1_vect)
    {
    	StopSwitch();
    	MotorSpeed(0, 0);
    }

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Zitat Zitat von Hubert.G
    Wohin springt das Programm wenn der Interrupt abgearbeitet ist?
    Wieder in die Endlosschleife und macht genau das was es vorher gemacht hat.
    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 Zitat von Hubert.G
    Es ist sehr schwer aus Programmfragmente einen Fehler herauszulesen.
    Sorry, ich dachte, ich geb dir lieber ein paar Ausschnitte, da das ganze etwas umfangreicher ist.

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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:

    Code:
          for(momentan=start; momentan<end; momentan++)
       {
          Geschwindigkeit(momentan, momentan);
          Warte(zeitschritt);
          if(switched) break;
       }
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    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.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Zitat Zitat von Valen
    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.

    Jedenfalls gehts jetzt. Der Fehler war, dass die Beschleunigen Funktion nach dem Interrupt nicht unterbrochen wird. Danke an alle für die schnellen Antworten

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Zitat Zitat von Hubert.G
    In den Interrupt sollst du keine Wartezeit setzen, dort gehört ein Flag gesetzt.
    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.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus