Interrupt mit Wait

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Interrupt mit Wait

      Hallo,

      ich habe eine Frage zu dem angehängten Screenshot
      bascomforum.de/index.php?attac…6f75d779ab1f86ac8f1681bb8

      Um ein mehrfaches auslösen von Int0 zu vermeiden, möchte ich vor Return ein Wait einfügen und das Flag für aufgelaufene Int-Anforderungen löschen
      (siehe Code)

      Impuls:
      If Inkr = 0 Then
      Inkr = 1
      Else
      Incr N
      Fehler(n) = Zaehler
      End If
      Incr Zaehler
      Waitms 10
      Gifr = 64
      Return

      Blockiere ich damit auch Int1, oder wird der sofort abgearbeitet?

      Danke
      Gruß
      Hans
      Dateien
      • SCR05.pdf

        (22,43 kB, 14 mal heruntergeladen, zuletzt: )
      Gruß
      Hans
    • Hallo tschoeatsch,

      ja, Impuls ist eine ISR, aber Int1 soll in eine andere ISR springen,

      heißt Deine Aussage nun: es kann nicht der gleiche Interrupt erneut ausgeführt werden, oder bedeutet es,
      dass auch kein anderer ausgeführt wird?

      letzere swürde ja bedeuten: Int1 wird erst ausgelöst, wenn die erste ISR (von Int0) abgearbeitet ist?
      wäre auch kein Problem, ich weiß ja, wie lange die "blauen Impulse" anstehen, das wait in der ersten ISR darf halt nicht zu lange sein,
      ich will ja nur verhindern, dass Int0 mehrmals anspricht, bei INT1 ist das egal, der macht auch bei mehrmaligem Auslösen kein kein Problem.
      Ich teste mal

      Gruß
      Hans
      Gruß
      Hans
    • Hans_L schrieb:

      ich habe eine Frage zu dem angehängten Screenshot
      SCR05.pdf
      der ist ungültig

      Hans_L schrieb:

      Int1 wird erst ausgelöst, wenn die erste ISR (von Int0) abgearbeitet ist?
      richtig

      Hans_L schrieb:

      wäre auch kein Problem, ich weiß ja, wie lange die "blauen Impulse" anstehen, das wait in der ersten ISR darf halt nicht zu lange sein,
      ich will ja nur verhindern, dass Int0 mehrmals anspricht, bei INT1 ist das egal, der macht auch bei mehrmaligem Auslösen kein kein Problem.
      Ich teste mal
      Vielleicht kannst du dein Problem mal beschreiben. Ich programmiere schon eine Weile, aber dein Problem mit den Interrupts hatte ich bisher nie.
      Das lässt sich sicher anders lösen.
    • Eine isr kann nicht durch einen interrupt unterbrochen werden. Wird wärend der Ausführung ein interrupt ausgelöst, wird das in einem flag gespeichert, damit nach Abarbeiten der laufenden isr die neue isr bearbeitet wird.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @Michael,
      wieso ist der Screenshot üngültig?
      was ist falsch?
      bei mir wird er einwandfrei dargestellt


      Das Programm ist eigentlich nur einHilsprogramm, um in einem anderen Programm einen Fehler zu finden.

      Das Hauptprogramm ist eine Schrittmotorsteuerung,
      Eingang 1 ist der Impuls eines Drehgebers (Reflexkoppler CNY70) im Screenshot die gelbe Linie
      Kommt dieser Impuls wird eine Schrittmotorendstufe angesteuert, welche einen Schrittmotor um einen definierten Winkel weiterdrhen soll.
      (die blauen Impulse)
      Nun fehlen zweitweise immer einige Ansteuerimpulse, so zwischen 3 und 5 auf 1000 Drehgeberimpule,
      da ich kein Lust habe, mich nun neben die Maschin zu setzen und permanent auf Eingänge und Ausgänge zu starren, habe ich das kleine Hilfsprogramm (läuft auf einem Entwicklungsboard)
      geschrieben.
      Es wartet auf den Impuls des Drehgebers, zählt dies durchlaufend hoch, und setzt die Variable Inkr auf 1, trifft der Ausgangsimpuls ein, wird diese wieder auf 0 gesetzt, fehlt der Ausgangimpuls, bleibt Inkr auf 1, beim nächsten Impuls des Drehgebers wird das erkannt, und die Nummer lfd. Nummer des Fehlers auf einem Display ausgegeben.
      (Die Anzahl der Drehimpulse wird auf dem Display ebenfalls angezeigt)
      Die Absicht dahinter ist, dass vielleicht die Fehler bei mehreren Testläufen an der gleichen Stelle auftreten, das würde die Fehlersuche erleichtern.

      Wenn das mit dem Anhang geklärt ist, kann ich davon ja auch ein Bild posten.

      Gruß
      Hans


      PS
      ich habe versucht, den Code anzuhängen, klappt aber irgendwie nicht, das Fenster mit dem eingefügten Code bleibt stehen und im Editor ist nichts zu sehen,
      (ich hoffe, der hängt jetzt nicht 5x dran)


      Gibt es hier kein Unterforum zum Testen?
      Gruß
      Hans

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hans_L ()

    • Hans_L schrieb:

      wieso ist der Screenshot üngültig?
      was ist falsch?
      bei mir wird er einwandfrei dargestellt
      wie gesagt, ich bekomme eine Fehlermeldung.
      Wie geht es den anderen Teilnehmern hier, seht ihr was?

      Hans_L schrieb:

      ich habe versucht, den Code anzuhängen, klappt aber irgendwie nicht, das Fenster mit dem eingefügten Code bleibt stehen und im Editor ist nichts zu sehen,
      Entweder den Code hier einhängen (auf den Button </>) und dann speichern.
      Oder anhängen, indem du unten auf Dateianhänge klickst und dann auf Hochladen (nur einmal, beim 2.mal geht's wieder weg)
    • ich versuchs nochmal
      SCR05.pdf

      BASCOM-Quellcode

      1. $regfile = "m32def.dat"
      2. $crystal = 11059200
      3. $hwstack = 16
      4. $swstack = 32
      5. $framesize = 32
      6. Baud = 9600
      7. Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
      8. Config Lcd = 16x2
      9. Initlcd
      10. Cls
      11. Config Portd = Input
      12. Portd.2 = 1
      13. Portd.3 = 1
      14. Inp1 Alias Pind.2
      15. Inp2 Alias Pind.3
      16. Dim Zaehler As Word
      17. Dim Inkr As Word
      18. Dim Fehler(7) As Word
      19. Dim N As Byte
      20. Zaehler = 0
      21. Inkr = 0
      22. N = 0
      23. Fehler(1) = 0
      24. Fehler(2) = 0
      25. Fehler(3) = 0
      26. Fehler(4) = 0
      27. Fehler(5) = 0
      28. Fehler(6) = 0
      29. Fehler(7) = 0
      30. Inp1 = 1
      31. Inp2 = 1
      32. On Int0 Impuls
      33. On Int1 Takt
      34. Config Int0 = Falling
      35. Config Int1 = Rising
      36. Enable Int0
      37. Enable Int1
      38. Enable Interrupts
      39. Do
      40. Locate 1 , 1
      41. Lcd Zaehler
      42. Locate 1 , 5
      43. Lcd Fehler(1) -1
      44. Locate 1 , 9
      45. Lcd Fehler(2) -1
      46. Locate 1 , 13
      47. Lcd Fehler(3) -1
      48. Lowerline
      49. Locate 2 , 1
      50. Lcd Fehler(4) -1
      51. Locate 2 , 5
      52. Lcd Fehler(5) -1
      53. Locate 2 , 9
      54. Lcd Fehler(6) -1
      55. Locate 2 , 13
      56. Lcd Fehler(7) -1
      57. Loop
      58. Impuls:
      59. If Inkr = 0 Then
      60. Inkr = 1
      61. Else
      62. Incr N
      63. Fehler(n) = Zaehler
      64. End If
      65. Incr Zaehler
      66. Waitms 10
      67. Gifr = 64
      68. Return
      69. Takt:
      70. Inkr = 0
      71. Waitms 5
      72. Gifr = 128
      73. Return
      74. End
      Alles anzeigen
      passt es jetzt?
      Gruß
      Hans
    • nun das Bild vom Display

      die erste Zahl ist die Zahl der Zählimpulse,
      die weiteren Zahlen sind die lfd. Nummern der fehlenden Ausgangsimpulse (hier simuliert, da das Programm ja noch nicht so tut, wie ich will
      Leider bekomme ich im realen betrieb die Störungen noch nicht weg
      Ich hatte es schon mit Debounce probiert, war aber noch störanfälliger

      Zähler.JPG

      Edit
      warum ist das Bild jetzt komplett drin, und das andere nur als Verknüpfung?
      sind anscheinend noch so ein paar Feinheiten zu beachten
      Gruß
      Hans
    • ceperiga schrieb:

      funktioniert als Download
      aber nicht im ersten Beitrag, oder?







      Hans_L schrieb:

      Gibt es hier kein Unterforum zum Testen?
      na du kannst es doch fast schon ;)



      Hans_L schrieb:

      Es wartet auf den Impuls des Drehgebers, zählt dies durchlaufend hoch, und setzt die Variable Inkr auf 1, trifft der Ausgangsimpuls ein, wird diese wieder auf 0 gesetzt, fehlt der Ausgangimpuls, bleibt Inkr auf 1, beim nächsten Impuls des Drehgebers wird das erkannt, und die Nummer lfd. Nummer des Fehlers auf einem Display ausgegeben.
      uii, sehr verworren.
      Lass mich kurz zusammenfassen:
      Während der gelbe Kanal auf High ist, möchtset du die Anzahl der Pulse messen (die blauen)

      Ich würde einen fallenden interrupt für Kanal gelb machen, dort den Zählerstand abspeichern (für Darstellung im Hauptprogranmm) und den Zähler löschen.

      Für die blauen Pulse einen steigenden Interrupt und einfach mitzählen.

      Gruß, Michael
    • @Michael,

      habe ich es wohl nicht ganz verständlich erklärt,

      Wenn alles richtig läuft, muss nach jedem gelben Impuls mindestens ein blauer kommen (in der Praxis werden es aber mindestens 20 sein)
      Die Bedingung ist also: 1 Gelber => mindestens ein Blauer
      Angezeigt werden sollen die fehlenden Blauen, also nur wenn KEIN Blauer auf einen gelben folgt.
      Wobei die erste Zahl die Anzahl der eintreffeneden Gelben anzeigt, die folgenden Zahlen laso die lfd. Nummern der fehlenden Blauen angibt.

      So wie Du es beschreibst habe ich es ja gemacht (habe Int0 auch schon mit fallend probiert)
      Die Schwierigkeit dabei ist nun, dass der Motor (welcher die Gelben ja erst erzeugt) anlaufen muss, d.h. die Impulsbreite der Gelben geht von "breit" zu "schmal"
      ich muss also, um auch den Anlauf richtig mitzuzählen, das Wait in Impuls so lange machen, dass es diesen Zeitraum überbrückt, andererseits aber so klein, dass mir die Blauen nicht verloren gehen, darum die Frage, ob mir das Wait in Impuls nicht auch den Interrupt in Takt überbrückt.
      Mal sehen, ob ich da heute noch ein paar Versuche schaffe.

      Gruß
      Hans
      Gruß
      Hans
    • Hans_L schrieb:

      muss nach jedem gelben Impuls mindestens ein blauer kommen
      nach deinem Oszibild kommen die blauen aber nicht nach dem gelben, sondern während, das ist ein signifikanter Unterschied

      Hans_L schrieb:

      Angezeigt werden sollen die fehlenden Blauen, also nur wenn KEIN Blauer auf einen gelben folgt.
      Also Fall A im angehängten Bild?

      Hans_L schrieb:

      So wie Du es beschreibst habe ich es ja gemacht
      Nein, das stimmt nicht. Du fummelst auch in Registern rum, wo es nichts zu fummeln gibt. Was brauchst du das GIFR? wird doch beim Verlassen des Interrupts sowieso erledigt, ohne die Gefahr eines Zwischeninterrupts.

      Oszi_gelb_blau.png
    • Gelb steht im Ruhezustand bei +5V, der Impuls geht auf Ground, d.h. der blaue soll nach dem "Rising" von Gelb kommen.
      Das mit dem GIFR habe ich gemacht, da der Interrupt doch mehrmals ausgelöst wird (durch die Störimpulse), d.h. er zählt mir jede Störung mit, was im ja bedeutet, dass er die Störimpulse zwischenspeichert und nach dem Return sofort wieder in die ISR reinspringt (d.h. den Zähler um mind. 3-5mal hochzählt)
      Mit dem GIFR löst er nun definitiv nur einmal aus (das habe ich in den Tests bereits erprobt)
      Gruß
      Hans
    • Nach meinem Kentnissstand gibt es für jeden interrupt ein flag, aber keinen Zähler. Wenn du gerade die int0-isr abarbeitest und es werden in der Zeit 3x int0 ausgelöst, dann wird die int0-isr ein 2. Mal abgearbeitet, aber nicht 3x.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @tschoeatsch
      das wird auch so sein, dass nur ein weiterer Interrupt zwischengespeichert wird, nur wenn während desssen Abarbeitung wieder einer ausgelöst wird, ist ja wieder einer im Speicher,
      deshalb versuche ich die Wartezeit so lange als möglich zu machen, und lösche den Interrupt-Flag, um zu vermeiden, dass die ISR nochmal angesprungen wird (also kein Gefummle)
      Übrigens hat es jetzt funktioniert, bedauerlicherweise ist es kein systematischer Fehler, sondern wohl doch durch Störimpulse verursachte Probleme.
      Jetzt ist also mal systematisches Abarbeiten der Fehlermöglichkeiten angesagt.

      @Michael
      richtig, genau Fall A im Bild
      2ms ist offensichtlich zu kurz, da löst der Zähler im Test noch zu oft aus, d.h. er zählt mehr Impulse als vorhanden sind.

      Noch eine Frage zu den Zitaten
      Wie funktioniert das denn?
      wenn ich Zitat anklicke, bekomme ich immer den gesamten Beitrag und nicht nur die beabsichtigen Sätze/satzteile rein
      (deshalb verzichte ich bis jetzt immer darauf)
      -> Ich habe diese Frage für Dich in einen anderen Thread verschoben. Gruß stefanhamburg
      Gruß
      Hans
    • Hans_L schrieb:

      2ms ist offensichtlich zu kurz, da löst der Zähler im Test noch zu oft aus, d.h. er zählt mehr Impulse als vorhanden sind.
      etwas Entprellzeit muss schon sein nach deiner Variante. Dann mach es halt 3 ms. Aber wozu brauchst du das Programm, du hast doch dein Oszi?


      Hans_L schrieb:

      durch Störimpulse verursachte Probleme.
      ja, die Leiterplatte hast du noch nicht gezeigt.