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.
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
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.
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?
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 !?
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
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/ze...142&highlight=
Code: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
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
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
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
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...
Lesezeichen