PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt probleme!!



asuroer
05.10.2007, 23:14
#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.

damaltor
06.10.2007, 00:31
der interrupt hat nichts in der main funktion zu suchen, sondern steht extra wie eine eigene funktion. was willst du denn was passiert?

gummi_ente
06.10.2007, 00:54
Hallo asuror,



#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

asuroer
06.10.2007, 15:47
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

izaseba
06.10.2007, 16:06
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

asuroer
06.10.2007, 16:30
in der isr steht FrontLED(ON); das passiert auch, aber die motoren hören auf zu drehen

asuroer
06.10.2007, 16:44
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?

izaseba
06.10.2007, 16:55
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

asuroer
06.10.2007, 17:05
achso

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

damaltor
06.10.2007, 17:08
lass ihn losfahren, warte mit sleep oder msleep 3 sekunden, und halte ihn an...

asuroer
06.10.2007, 17:25
das geht doch nich, oder? man kann doch in einer isr nicht noch ein interrupt auslösen

izaseba
06.10.2007, 17:50
man kann doch in einer isr nicht noch ein interrupt auslösen
Wozu braucht man einen Interrupt, wenn man den Asuro im Kreis fahrenlassen will ?

asuroer
06.10.2007, 17:55
ich meinte, dass man sleep() nicht benutzenkann, da man ja kein interruot in einer isr auslösen kann. im Kreis fahren geht zwar, aber nicht eine bestimmte zeit lang, oder?

izaseba
06.10.2007, 18:04
Klar geht das, hat doch damaltor oben geschrieben.
Oder willst Du, daß er erst nach einem Tastendruck in Verbundung mit INT1 losfährt ?
Das kannst Du z.B. so lösen:


...
...
volatile uint8_t fahrlos = 0;
SIGNAL(SIG_INTERRUPT1){
fahrlos = 1;
}

int main(void) {
for(;;){
while(!fahrlos);
fahre();
sleep(250);
haltan();
fahrlos = 0;
}
return 0;
}
fahre() und haltan() mußt Du entsprechend ändern

Gruß Sebastian

damaltor
06.10.2007, 18:05
du benötigst überhaupt keine interrupts zum kreise fahren... nicht im allergeringsten. für die ersten 50-60 auch komplexen prorgamme wirst du dich mit den interrupts nicht beschäftigen müssen.

--- du schaltest die motoren ein. mit motordir und motorspeed.
--- du machst eine dreisekündige warteschleife. mit sleep oder msleep.
--- du hältst die motoren wieder an. mit motordir und motorspeed.

das wars. beispiel:


MotorDir(FWD,FWD);
MotorSpeed(255,150);
Msleep(3000);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);


ohne interrupts...

asuroer
06.10.2007, 18:17
hi damaltor,

Sleep funktioniert doch auch mit nem Interrupt, dem SIG_OUTPUT_COMPARE2, also doch wieder n Interrupt

damaltor
07.10.2007, 00:13
naja aber um den musst du dich doch gar nicht kümmern... du musst nur den quelltext nutzen, die interrupts sind bereis eingestellt...

Sternthaler
07.10.2007, 04:03
Hallo zusammen,
das hat ja mal Seltenheitswert. Alle haben Recht.
izaseba erklärt die Prios von Interrupts und unterbrochene Funktionen.
damaltor liefert Kreisprogramme für 3 Sekunden und weitere Erklärungen.
asuroer stellt fest, das Sleep() in einem anderen Interrupt nicht sinnvoll ist, da es nicht geht.

Warum das nicht geht liegt allerdings nicht am SIG_OUTPUT_COMPARE2, sondern am SIG_OVERFLOW2. In der dazu gehörenden Interrupt-Funktion wird ja die Variable count36kHz hochgezählt. Und wenn die Sleep()-Funktion diesen Wert nun innerhalb einer gerade laufenden Interruptfunktion abfragt, bleibt der Wert in count36kHz ja tatsächlich auf immer und ewig stehen, da eine begonnene Interruptfunktion ja nicht unterbrochen werden kann (ausser man will es wie izaseba schon sagte). Somit kann Sleep() also nie verlassen werden. Und damit steht das System.

izaseba
07.10.2007, 10:28
Hallo Sternthaler,
das ist natürlich eine gute Möglichkeit den Programmierer davon abzuhalten Warteschleifen in der ISR zu machen :-$
Ein Hoch auf dei asurolib =D>

Gruß Sebastian

Sternthaler
08.10.2007, 01:17
Hallo izaseba,
klar ist die Möglichkeit nicht schlecht. Genau das habe ich ja beabsichtigt.
Warum also soll man asuroer nicht eine sinnvolle Erklärung zu seinem ja schon selbst gefundenen Sachverhalt geben? Man kann ja wohl recht zufrieden sein, dass ein 14-jähriger hier schon weiterdenkt und solche 'verzwickten' Dinge bemerkt. Und da er mit Nachdruck bzw. mit Traute auch ein 2.tes mal fragt, ob seine Vermutung nun stimmt oder nicht, hat er meiner Meinung nach auch eine Antwort verdient. (Ich gehe nicht davon aus, das dies der gesperrte Küchenbrett-User ist.)
Natürlich ist die Asuro-LIB nicht das nonplusultra. Aber genau darum geht es ja, jeder darf sie nutzen und ändern, oder er läßt es eben.

Gruß Sternthaler

P.S.: Ich wäre total an deiner LIB interressiert. Wenn du Spaß daran hättest, würde ich die mal gegen meine tauschen wollen. Ich stehe auf interruptbetriebene Sensorabfragen. (Soll neugierig machen.) PN?

liggi
08.10.2007, 19:56
also ich würde im Interrupt eine Variable ändern, und die dann abfragen.

izaseba
08.10.2007, 20:35
Hi Sternthaler,
ich hoffe stark, daß ich nicht falsch verstanden worden bin 8-[
Die Arbeit, die in der Asurolib steckt, und die Mühe, die sich die Leute damit gemacht haben weiß ich zu schätzen.
Ich verfolge sie ja, seitdem Weja angefangen hat daran rumzuschrauben, und das ist schon eine Weile her.
Die Sache, daß sich Sleep in einer ISR nicht nutzen lässt find ich wirklich gut, so bekommen die Programmierer erstmal ein paar auf die Finger, und wissen gleich, das es keine gute Idee war [-X
Ich denke mal an so Probleme, wie:
"Mein M32 verhält sich komisch, seitdem ich in der ISR wait 5 eingegeben habe"
Ich habe keine Lust nach Beispielen zu Suchen, davon habe ich aber genug gesehen.
Leider habe ich das Problem von asuroer nicht richtig verstanden und habe versucht anders zu helfen :-(
Du hast es aber richtiggebogen, wofür ich Dir dankbar bin.

Wo Du es gerade ansprichst, meinst Du, meine Vermutung mit dem gesperrten User ist richtig :-k :-$

Eh, meine asurolib 8-[
Ich habe keine, ehrlich gesagt liegt mein Asuro krank im Keller und wartet auf einen Wunderheiler.
Ich hatte den in Assembler programmiert, und da ist eher copy/paste angesagt, als lib.
Ich kann nur meine direkte Hilfe anbieten, die wirst Du aber sicher nicht brauchen ;-)
Interruptbetriebene Sensorabfragen ? Das macht schon neugierig in welche Richtung das geht, vor allem, weil ich selber anfange mir Gedanken zu machen über die Sensorik an meinem jetzigem Projekt.

Jetzt hab ich aber ziemlich viel OT geschrieben hier, sorry.

Gruß Sebastian

izaseba
08.10.2007, 20:40
also ich würde im Interrupt eine Variable ändern, und die dann abfragen.

Hallo,
genau das habe ich schon oben ^^^^ vorgeschlagen

Gruß Sebastian

damaltor
08.10.2007, 22:02
was at der kleine denn? evtl könne wir ihm ja helfen...

izaseba
08.10.2007, 22:30
Hallo Damaltor,
Danke für das nette Angebot, es ist im Moment aber ziemlich hoffnungslos...
Ich habe mal sein Herz(Mega 8 ) einem jüngerem RN-User geschenkt, der ziemlich down war, weil er wohl seinen kaputt gemacht hat...
Und da ich noch viele normale M8 zuhause hatte, hatte ich vor meinem Asuro einen Zwischensockel zu basteln mit einer 0815 ISP Schnittstelle...
Tja, es ist schon locker ein Jahr her und der arme wartet immernoch ;-)

Gruß Sebastian

Sternthaler
08.10.2007, 22:52
Hallo izaseba,
doch, ich muss leider zugeben, dass ich nicht besonders glücklich war über deine Antwort. Aber, so hat sich ja alles geklärt, und alle sind zufrieden. Lohnt sich also immer den Mund aufzumachen um offene Fragen nicht im Raum stehen zu lassen. Jetzt hoffe ich nur, dass ich nicht zu pampig war.

Gruß Sternthaler

P.S.: Ich sehe gerade deine und damaltor's Diagnosen. Somit nützt es auch wenig, wenn ich dir ein paar Motorritzel geboten hätte.

damaltor
09.10.2007, 13:50
hmm ich hätte da noch einen ASURO-meg8 liegen....

izaseba
09.10.2007, 19:09
@Sternthaler,
ich freue mich, daß alles geklärt wurde ;-)
@Damaltor,
Danke für das Angebot, ich glaube aber, daß ich jetzt wirklich motiviert genug bin die Zwischenplatine zu bauen, ich werde berichten.
Gruß Sebastian