PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Interrupt



Bluesmash
02.08.2005, 17:23
hallo zusammen

ist es möglich nach dem abarbeiten eines interrupts nicht mit return zu der stelle zurückzukehren wo das programm unterbrochen wurde sondern an eine bestimmte stelle z.B. an den start des programmes? goto vor dem return geht ja nicht, oder? sonst wird ja die interrupt unterrutine gar nie zuende ausgefuührt...

mfg bluesmash

linux_80
02.08.2005, 17:46
Hallo,

Du kannst dir höchstens eine Variable anlegen, die Du im Hauptprogramm öfter kontrollierst, wenn ein bestimmter Wert drin steht an den Anfang springen.
In der Interrupt-Routine wird der Wert der Variablen gesetzt.

Bluesmash
02.08.2005, 18:11
hmm... ich glaube nicht dass, das bei mir geht... das problem ist wen ich in einer sub bin und in dieser zeit der interrupt ausgelöst wird möchte ich nicht wieder zurück in die sub springen da dann irgendwie mein rogramm abstürzt... wenn ich in keiner sub bin funktioniert der interrupt...
würde es funktionieren wenn ich in der interrupt routine den interrupt disable und dann an den start springe und dann den interrupt wieder enable?

linux_80
02.08.2005, 18:31
Ein Interrupt ist ja dafür da, das er nach seinem Geschäft dort weitermacht wo er interruptet hat.
Wenn Du in der Interruptroutine was umbaust, sodass das Hauptprogramm nciht mehr richtig laufen kann, musst Du trotzdem irgendeine marke setzen, um Ordnungsgemäss weitermachen zu können !

Evtl. kann jemand weiterhelfen wenn Du genauer schilderst was Du da genau gebastelt hast, bzw. was raus kommen soll !?

izaseba
02.08.2005, 18:45
Hallo, da muß ich dem linux_80 recht geben,

Interrupts sollten immer sauber verlassen werden, und zwar legt der µC die Rücksprungadresse auf dem Stack ab, damit der weiß wo er naher wieder zurückspringen soll. Wenn Du jetzt aus dem Interrupt irgendwohin anders springst bleibt die Adresse auf dem Stack drauf.
Irgendwann ist Dein Ram voll, alle Variablem gelöscht, und der AVR schmiert erst recht ab.
Es wäre wohl denkbar irgendwoanders hinzuspringen, mit zwei pops die Rücksprungadresse aus dem Stack zurückholen, und die Interrupts wieder einschalten, aber ich denke daß es kalter Kaffee ist und eine ganz schlechte Art zu Programmieren.

Finde lieber raus warum Dein Programm immer abschmiert.

Gruß Sebastian

Bluesmash
02.08.2005, 18:51
jenachdem welcher sensor angesprochen hat lasse ich meinen bot mehr oder weniger drehen... dafür habe ich sub rechts/links wenn er nun am drehen ist und gleichzeitig nen interrupt reinkommt führt er den interrupt aus und bleibt dann stehen und macht nicht mehr weiter... ich habe mal die 2 wichtigsten sachen zusammenkopiert... die sub zum drehen und die interrupt sub vielleicht kann mir ja jemand helfen... übrigens: progge och nicht so lange...
was ich gebastelt hab? hier: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11142&highlight=



Sub Rechts
Gosub Stopp
'schieberegister für impulsgeber einlesen
Spiinit
Ss = 0
Ss = 1
Spiin I(1) , 4
I1alt = I1neu
I2alt = I2neu
I1count = 0
I2count = 0
'warten bis fertig gedreht
Do
'Motor links
Portb.0 = 1
Portb.1 = 0
'Motor rechts
Portc.6 = 0
Portc.7 = 1
Gosub Zaehler
If I1count > Dx Or I2count > Dx Then Exit Do
Loop
Gosub Stopp
End Sub

'interrupt routine
Kollision:
Gosub Stopp
'zählerstand speichern
I1count_save = I1count
I2count_save = I2count
'schieberegister für porterweiterung einlesen
Spiinit
Ss = 0
Ss = 1
Spiin I(1) , 4
'bumper rechts
If Br = 0 Then
Incr Y1
Dx = 20
Gosub Retour
Dx = 20
Gosub Links
End If
'bumper links
If Bl = 0 Then
Incr Y1
Dx = 20
Gosub Retour
Dx = 20
Gosub Rechts
End If
'zählerstand wiederherstellen
I1count = I1count_save
I2count = I2count_save
Return

02.08.2005, 19:17
Wovon wird der Interrupt ausgelöst ?
Kannst Du die Routine nicht in das Hauptprogramm auslagern, so wie Linux_80 das vorgeschlagen hat?
Irgenwo wird er da in einer Endlosschleife hängen, oder so was...
Hast Du eventuell ein paar LED auf dem bot frei, dann kanst Du sie zum debuggen benutzen,
einfach nach jedem gosub eine Diode einschalten, dann weißt Du wie weit er die routine abarbeitet, und wo der fehler eventuell ist.

Gruß Sebastian

Bluesmash
02.08.2005, 19:52
mal schauen ob ich irgendwo noch ein fehler finde... sonst muss ich irgendeine lösung finden mal sehen ob ich es so machen kann wie es linux vorgeschlagen hat... danke schonmal für eure hilfe!

mfg bluesmash

izaseba
02.08.2005, 20:06
Was mir noch eingefallen ist, wenn ein Interrupt ausgelöst wird, werden ja Interrupts allgemein abgeschaltet.
In Deiner Interruptroutine springst Du per gosub nach Stopp, Retour, links, rechts, je nach dem.
nicht, daß dort irgendwas ausgeführt wird, was auch von Interrupts abhängt.
Da könnte er dann hängen. wie gesagt, bau nach den gosubs ein Befehl zu LED einschalten, wenn die nicht angeht, dann ist dort auch was faul.
Gruß Sebastian

Bluesmash
02.08.2005, 20:38
waitms 1 in der do...loop schleife der links/rechts sub und es geht... aber keine ahnung wiso... ich habe mal print befehle eingesetzt zum debuggen, und dan gings plötzlich... dan dachte ich mir es liegt an der verzögerung die der print befehl bringt und es lag wirklich daran, dann hab ich einfach waitms 1 eingesetzt, komisch... vielleicht ist es auch nur ne laune von meinem bot und morn geht es nicht mehr... (hoffentlich nicht)

vielleicht weiss ja von euch jemand wiso...