-         

Ergebnis 1 bis 10 von 10

Thema: Frage zu Interrupt

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979

    Frage zu Interrupt

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    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 !?

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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: http://www.roboternetz.de/phpBB2/zei...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

  7. #7
    Gast
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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...

Berechtigungen

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