- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Interrupt probleme!!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69

    Interrupt probleme!!

    Code:
    #include "asuro.h"
    #include <avr/interrupt.h>
    int main(void)
    {
    Init();
    StartSwitch();
    StatusLED(GREEN);
    MotorDir(FWD,FWD);
    MotorSpeed(100,100);
    SIGNAL(SIG_INTERRUPT1){
    StatusLED(RED);
    MotorDir(RWD,FWD);
    MotorSpeed(100,100);
    unsigned char i;
    for(i = 0;i < 255;i++){
    Sleep(255);
    }
    }
    
    while(1);
    return 0;
    }
    Hi

    ich wolltte mal versuchen die taster interruptgesteuert auszulesen, aber wenn ich diesen code flashe, macht der asuro etwas anderes, als das, was ich will:

    Wenn kein Taster gedrückt ist, fährt er ganz normal, wenn ich jetzt aber irgendeinen Taster drücke gehen die Motoren aus und die beiden BackLED gehen an, wenn dann kein taster mehr gedrückt ist, fährt er normal weiter.

    Ich hoffe das mir jemand helfen kann und danke alle antwortern schon im vorraus für ihre unterstützung.

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    der interrupt hat nichts in der main funktion zu suchen, sondern steht extra wie eine eigene funktion. was willst du denn was passiert?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.10.2007
    Beiträge
    68
    Hallo asuror,

    Code:
    #include "asuro.h"
    #include <avr/interrupt.h>
    
    // Damit der IRQ funktioniert, muß dieser freigeschaltet werden
    GICR = (1<<INT1);  //z.B beim ATMega8
    
    // IRQ INT1
    SIGNAL(SIG_INTERRUPT1){
    //... hier steht was im Interrupt gemacht werden soll.
    }
    
    int main(void)
    {
     Init(); 
     sei();                  // Globale IRQ's freigeben 
     StartSwitch();
     StatusLED(GREEN);
     MotorDir(FWD,FWD);
     MotorSpeed(100,100);
     StatusLED(RED);
     MotorDir(RWD,FWD);
     MotorSpeed(100,100);
     unsigned char i;
     for(i = 0;i < 255;i++){
     Sleep(255);
     }
    
    while(1);
    return 0;
    }
    Ich weiß nicht ob, Du die anderen Dinge die ich aus der SIGNAL... entfernt habe im Interrupt ausgeführt haben willst?

    Wenn dem so ist, so ist dies nicht die richtige Art. Der Interrupt soll nur kurz die normale Abarbeitung unterbrechen
    und nicht stundenlang was eigenes tun, dann ist der Sinn verfehlt.

    Grüße

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69
    hallo gummi_ente,

    Wenn ich in mein programm

    GICR = (1<<INT1);

    schreibe und dann versuche zu compilisieren belkomme ich folgende Fehlermeldung:

    error: parse error before "volatile"


    wenn ich GICR... nicht reinschreibe komm ich zwar in die interrupt service routine, aber dann komm ich nicht mehr aus der isr raus

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    wenn ich GICR... nicht reinschreibe komm ich zwar in die interrupt service routine, aber dann komm ich nicht mehr aus der isr raus
    Woher weisst Du, daß Du in die ISR "reinkommst" ?
    Ich meine sowas hatten wir erst vor kurzem.
    Bekommst Du keine Warnung vom Kompiler, daß der Interrupt doppelt vorkommt ?
    Schau mal in der asuro.c nach SIGNAL(SIG_INTERRUPT1) , wenn Du sie findest, solltest Du die ganze Funktion auskommentieren.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69
    in der isr steht FrontLED(ON); das passiert auch, aber die motoren hören auf zu drehen

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69
    inzwischen funktioniert der interrupt aber ich hab ma ne andere frage:

    kann man in der isr überhaupt sleep() verwenden?
    Das ist doch auch ne interrupt funktion und wenn ich mich nich irre ist die Priorität von sleep() niedriger als die von INT1, oder?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Es wurde schon gesagt, daß es eine schlechte Idee ist, im Interrupt Krieg und Frieden zu treiben, und schon garnicht sleep zu verwenden.
    Was du mit Prioritäten meinst, weiß ich nicht, sleep hat keine Priorität genauso wie ein Interrupt.
    Es gibt zwar Prioritäten unter den Interrupts, wenn mehrere zum abarbeiten anstehen, aber eine normale Funktion hat keine, sie wird gnadenlos von einem Interrupt abgebrochen(es sei den Du schaltest Interrupts davor ab).
    Befindest Du Dich schon in einem Interrupt, wird der nicht von einem weiterem Interrupt unterbrochen(es sei den, sowas wurde erlaubt), was aber ziemlich schlecht ist.
    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    31
    Beiträge
    69
    achso

    gibt es denn trotzdem eine Möglichkeit, asuro z.B. 3s im kreis fahren zu lassen, oder geht das nicht?

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.064
    lass ihn losfahren, warte mit sleep oder msleep 3 sekunden, und halte ihn an...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests