Pin change interrupts an den ISP pins MISO & SCK

    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!

    • Arg!! Ein 'goto' in einer interrupt-Routine?? Garnicht gut, eher sehr schlecht!
      Nachden mein Akku schlapp macht und ich hier mit einer schlechten Internetverbindung kämpfe, schlage ich vor, du probierst mal dein zuerst gepostetes Programm mit verschieden langen Pegeln an den Eingängen aus und beobachtest, wann ein interrupt ausgelöst wird. Es sollte sowohl bei high zu low, bzw low zu high ausgelöst werden. Verschieden lang deshalb, weil durch das wait in der isr diese eine gewisse Zeit braucht.
      Ich melde mich für heute ab.
      Vielleicht kann dir noch jemand anders erklären, warum man nicht mit einem goto aus einer sub springt, schon garnicht aus einer interrupt-sub, oder du suchst hier im Forum ein bisschen. Gute Nacht.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Arg!! Ein 'goto' in einer interrupt-Routine?? Garnicht gut, eher sehr schlecht!
      jaa ich weiß...*schäm... a_52_eb39d6ae Ich dachte, es wäre das "geringere Übel" als hier ein gosub zu nehmen, weil ein goto im stack keine Leichen hinterläßt...
      Es ist nämlich so, daß das Programm nach dem "goto standby" nicht wieder zur isr zurückkehrt, um das gosub aus dem Stack zu löschen.
      Aber wisst Ihr was? Das ist doch mal eine tolle Werbung für Bascom! Da macht einer so grobe Fehler wie ich: Packt ein "goto" in eine ISR und das Programm läuft jetzt trotzdem einen Woche ohne Fehler rund um die Uhr.
      Da kann man mal sehen, wie gutmütig das System ist. Es verzeiht so einige Böcke und Schnitzer... gute Nacht!
    • djmsc schrieb:

      Doch, gerade das passiert bei Goto.
      Achso? Ich dachte "goto" hinterläßt keine Spuren?! Aber wohl ist mir bei der Goto-Sache auch nicht. Ich verwende den Befehl nur unter Schmerzen. Außerdem verzweifelt Tschoeatsch schon an mir. Er hat mir das schon 100x erklärt das goto nicht gut ist und gosub ein return verlangt. Ich vergleiche es mit dem linken Fuß in einem Auto mit Automatikgetriebe: Man sollte ihn besser nicht benutzen, aber wenn man es trotzdem tut, führt es nicht zwangsweise zu einem Unfall. So auch mit dem "goto" im Bascon Programm.
    • tschoeatsch schrieb:

      schlage ich vor, du probierst mal dein zuerst gepostetes Programm mit verschieden langen Pegeln an den Eingängen aus
      ok, nach all den lustigen goto/gosub Diskussionen zurück zum Thema: PCINT auslösen bei low-high-Flanke an den PCINT-Pins
      Dieses hier:

      $regfile = "m328pdef.dat"
      $crystal = 16000000
      $hwstack = 100
      $swstack = 100
      $framesize = 100
      Ddrb = &B11011111
      Acsr = &B01000011
      On Pcint0 Isr
      Pcmsk0 = &B00100000
      Enable Pcint0
      Enable Interrupts
      Led Alias Portb.2
      Portb.5 = 1

      Do
      Led = 0
      Loop

      Isr:
      Led = 1
      Return



      sollte doch funktioneren. Ich verbinde VCC mit pinb.5 und die LED leuchtet, solange ich die Verbindung halte, oder?
    • Nein.

      Ich schreib jetzt nicht 'du musst noch 3x raten', bringt nix.
      Pcint ist ein 'pin change interrupt', die passende isr wird angesprungen, wenn der 'Auslöser' pin change oder Pegelwechsel statt findet. In deinem Fall, wenn du mit dem pin b.5 an gnd gehst (du bist mit dem pullup grad an high). Dann wird die isr angesprungen und die Led würde eingeschaltet (wenn der port als output definiert geworden wäre) und durch das Hauptprogramm gleich wieder ausgeschaltet. Würdest du b.5 wieder von gnd lösen, gibt es wieder einen Pegelwechsel und die Led würde wieder angeschaltet (wenn...) usw. Ein dauerhafter Pegel löst nix aus, nur ein Wechsel.
      Probier mal als main
      do
      loop (also keine weiteren Aktionen), und eine isr mit
      toggle Led (Port als output)
      Jetzt sollte beim Anlegen von b.5 an gnd die Led an gehen, beim Loslassen aus gehen, bei jedem Pegelwechsel von b.5 also toggeln.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mal noch so neben her, @ichbinsmoin du unterschätzt, was das 'return' alles macht. Bei einer 'normalen' sub, räumt es die 'Spuren', die gosub anlegt, weg, bei einer interrupt-sub passiert das auch, aber zusätzlich wird mit dem return der interrupt beendet. Geht dir jetzt ein Lichtlein an, wenn du nachdenkst, was passiert, wenn du innerhalb deiner gezeigten isr in 'standbye' gehst und bleibst? (Na, das war jetzt mal ein gigantischer Satzbau, ha!) Das Programm verbleibt im interrupt und deshalb sind andere interrupts blockiert.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Ich schreib jetzt nicht 'du musst noch 3x raten', bringt nix.
      danke. das spart Zeit und schont Nerven. Grundsätzlich helfe ich mir am liebsten selbst. Aber wenn ich schon eine Frage ans Forum stelle, dann habe ich ALLES versucht, was mein Wissen und meine Geduld hergaben.
      Ich würde mich nie ans Forum aus Bequemlichkeit richten.

      Also das mit dem toggle (und Deine Erklärung dazu) war jetzt der entscheidene Hinweis.

      Dieses hier:

      $regfile = "m328pdef.dat"
      $crystal = 16000000
      $hwstack = 100
      $swstack = 100
      $framesize = 100
      Ddrb = &B11011111
      Acsr = &B01000011
      On Pcint0 Isr
      Pcmsk0 = &B00100000
      Enable Pcint0
      Enable Interrupts
      Led Alias Portb.2
      Portb.5 = 0
      Do
      Loop

      Isr:
      Toggle Led
      Waitms 50
      Return

      bewirkt, wenn ich ein high an pinb.5 anlege, die Led für 50ms leuchtet. Das ist genau, was ich wollte.
      Danke.
    • Moment! Die Led leuchten nur die 50msec(eher länger), weil du den pinb.5 wieder eher auf low bringst. Ein pulldown wäre angebracht! Wenn du den pin auf high hälst, dann leuchtet die Led ständig. Brindst du ihn auf low, toggelt die Led und bleibst ständig aus. Bringst du portb.5 aud high und innerhalb 50msec wieder auf low, bleib die Led wieder dauerhaft an. Probier mal jetzt sehr kurze Pulse und längere Pulse.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • mit waitms 50 läuft es in der Tat unzuverlässig. Meistens gehts. Manchmal bleibt die led aber auch einfach an, obwohl ich die PCINts in Ruhe lasse.
      Bei waitms 150 läuft es viel viel stabiler.- egal ob mein Puls an B5 lang oder kurz ist. Ganz selten bleibt bei Stresstest aber auch hier die LED an.
      portb.5 = 0 bewirkt, daß ich einen Zufallsgenerator habe, ob die Led nun angeht oder nicht.
    • ichbinsmoin schrieb:

      portb.5 = 0 bewirkt, daß ich einen Zufallsgenerator habe, ob die Led nun angeht oder nicht.
      ignoriert diesen Satz!
      portb.5 MUSS auf 0 gesetzt sein, damit es überhaupt funktioniert.
      Ich muss allerdings auch dazu sagen, daß ich Funktionen immer einem üblen Stresstest unterziehe:
      Ich ticke wie ein Verrückter minutenlang immer wieder den B5 an. Es darf nicht ein einziges Mal die LED ausbleiben oder gar anbleiben.
      Das ist bei waitms 150 aber immer noch (wenn auch sehr selten) der Fall. Also unbefriedigend
    • Portb.5=0 bewirkt einen offenen Eingang am portb.5, kein pullup. Der Eingang ist dann natürlich sehr störempfindlich. Schalte einen externen pulldown (Widerstand 10k gegen gnd) dran, dann geht es besser.
      Noch was, der interrupt wird bei einem Pegelwechsel ausgelöst (ist jetzt klar, oder?). Während die isr läuft, werden Pegelwechsel ignoriert, es wird kein 'Folgeinterrupt' ausgelöst. Das ist auch das tückische an dem pcint. Mehrere pins können auslösen. Wird die isr abgearbeitet, können die anderen pins zappel, wie sie wollen, sie werden ignoriert.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • 'Es darf nicht ein einziges Mal die LED ausbleiben oder gar anbleiben'
      Wenn ich das jetzt interpretiere, dann möchtest du einen interrupt bei steigender Flanke? Dann mach den doch!
      Die main:

      do
      loop

      die isr:

      if pinb.5=1 then
      led=1
      else
      led=0
      end if
      return
      Jetzt leuchtet die Led, solange pinb.5 an high liegt.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • 10K pulldown gesetzt: Jjetzt läuft alles wunderbar.

      tschoeatsch schrieb:

      Portb.5=0 bewirkt einen offenen Eingang
      und ich dachte immer, daß dann der Eingang mit einem pulldown auf GND liegt!

      tschoeatsch schrieb:

      Noch was, der interrupt wird bei einem Pegelwechsel ausgelöst (ist jetzt klar, oder?)
      das war mir immer klar, aber ich dachte, daß man mit portb.x = 0 den Eingang mit ca. 10K auf GND gelegt bekommt.
      Das war die ganze Zeit der Denkfehler. Vielen Dank. Das war ne große Hilfe.