der interrupt hat nichts in der main funktion zu suchen, sondern steht extra wie eine eigene funktion. was willst du denn was passiert?
HiCode:#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; }
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.
der interrupt hat nichts in der main funktion zu suchen, sondern steht extra wie eine eigene funktion. was willst du denn was passiert?
Hallo asuror,
Ich weiß nicht ob, Du die anderen Dinge die ich aus der SIGNAL... entfernt habe im Interrupt ausgeführt haben willst?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; }
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
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
Woher weisst Du, daß Du in die ISR "reinkommst" ?wenn ich GICR... nicht reinschreibe komm ich zwar in die interrupt service routine, aber dann komm ich nicht mehr aus der isr raus
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
Linus TorvaldSoftware is like s e x: its better when its free.
in der isr steht FrontLED(ON); das passiert auch, aber die motoren hören auf zu drehen
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?
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
Linus TorvaldSoftware is like s e x: its better when its free.
achso
gibt es denn trotzdem eine Möglichkeit, asuro z.B. 3s im kreis fahren zu lassen, oder geht das nicht?
lass ihn losfahren, warte mit sleep oder msleep 3 sekunden, und halte ihn an...
Lesezeichen