I2C Befehl innerhalb einer ISR= Controller hängt sich auf

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

    • I2C Befehl innerhalb einer ISR= Controller hängt sich auf

      Moin!
      Der Titel ist schon meine Frage.
      Bascom und AVR sind ja schwer ins Koma zu bringen. Da muss man schon ganz wilde Sachen machen, aber
      innerhalb einer ISR I"C-Befehle...damit gehts und zwar sofort!
      Ist das normal? Gibt es da einen Trick?
      Muss ich denn erst umständlich in der ISR einen Flag setzen und diesen im Hauptprogramm umsetzen?

      isr:
      Ausgang1_d = 0
      Gosub I2c_ausgaberoutine
      return

      I2c_ausgaberoutine:
      Ausgang_1 = 0
      If Ausgang1_a = 1 Then Ausgang_1 = Ausgang_1 + 1
      If Ausgang1_b = 1 Then Ausgang_1 = Ausgang_1 + 2
      If Ausgang1_c = 1 Then Ausgang_1 = Ausgang_1 + 4
      If Ausgang1_d = 1 Then Ausgang_1 = Ausgang_1 + 8
      If Ausgang1_e = 1 Then Ausgang_1 = Ausgang_1 + 16
      If Ausgang1_f = 1 Then Ausgang_1 = Ausgang_1 + 32
      If Ausgang1_g = 1 Then Ausgang_1 = Ausgang_1 + 64
      If Ausgang1_h = 1 Then Ausgang_1 = Ausgang_1 + 128
      I2cstart
      I2cwbyte Pcf85741
      I2cwbyte Ausgang_1
      I2cstop
      Return
    • schon wieder diese 'erweiterte Antwort' Geschichte ...
      diesen Post habe ich schon vor Stunden gesendet:


      ja. Die Routine funktioniert außerhalb der ISR einwandfrei.

      was ich will:
      4-kanal Funkempfänger an 4 ISR Pins angeschlossen.
      Bei Auslösung eines der 4 ISR Pins soll eine von 4 LEDs kurz Rückmeldung geben.
      Die LEDs hängen am PCF8574er. Daher der I2C Befehl
    • hier sind noch mehr Leute mit dem gleichen Problem:
      forum.arduino.cc/index.php?topic=344497.0
      forum.arduino.cc/index.php?topic=390631.0



      ceperiga schrieb:

      insbesondere die Berechnung packe ich nicht in die ISR,
      ja, das werde ich wohl auch machen (müssen). Ist ja auch kein Problem. Ich wollte das nur mal grundsätzlich für mich klären, ob das geht oder nicht.
      Aber weil hier noch keiner von EUCH aufschreit:"Nein, tu das nicht. Das ist wie mit dem GOTO. Bloß nicht!!" , scheint das ja an meinem Programm zu liegen.
      Ok. Das reicht mir als Antwort. Vielen Dank!
    • Michael schrieb:

      Poste doch bitte dein Programm.
      Folgende ISR funktioniert ohne Probleme- einwandfrei:

      Isr:
      If T = 0 Or T = 1 Then
      If Standby_flag_eram = 1 Then
      If Pinb.2 = 1 Then
      If T = 0 Then Aa = 1
      Standby_led = 1
      Do
      Waitms 10
      Incr X
      If X > 200 Then
      Standby_flag_eram = 2
      Gosub Ausgabe
      Gosub Eramspeicher
      Cls
      Gosub Standby
      End If
      If X < 2 Then
      Gosub Buzzer
      End If
      Loop Until Pinb.2 = 0
      Programm_vor = 1
      Standby_led = 0
      X = 0
      End If
      End If
      If Pinb.3 = 1 Then
      Standby_flag_eram = 1
      Programm_zurueck = 1
      If T = 0 Then Aa = 1
      Standby_led = 1
      Gosub Buzzer
      Waitms 110
      If Standby_flag_eram = 2 Then
      Standby_flag_eram = 1
      End If
      Standby_led = 0
      End If
      End If
      If T = 1 Then
      If Standby_flag_eram = 1 Then
      If Pinb.4 = 1 Then
      Standby_led = 1
      Speed = Speed + Fi
      If Speed > 100 Then
      Speed = 100
      End If
      Gosub Buzzer
      Waitms 110
      Standby_led = 0
      End If
      End If
      If Standby_flag_eram = 1 Then
      If Pinb.5 = 1 Then
      Standby_led = 1
      If Speed > 9 Then
      Speed = Speed - Fi
      Else
      Speed = 0
      End If
      Gosub Buzzer
      Waitms 110
      Standby_led = 0
      End If
      End If
      End If
      Return


      Was ich jetzt möchte:
      ich will alle LEDs, die hier in der ISR angesprochen werden, AUCH an den Portetender (PCF8574) via I2C schicken.
      Als Beispiel die fünftletze Programmzeile von obiger ISR mit dem Zusatz:

      Isr:
      If T = 0 Or T = 1 Then
      If Standby_flag_eram = 1 Then
      If Pinb.2 = 1 Then
      If T = 0 Then Aa = 1
      Standby_led = 1
      Do
      Waitms 10
      Incr X
      If X > 200 Then
      Standby_flag_eram = 2
      Gosub Ausgabe
      Gosub Eramspeicher
      Cls
      Gosub Standby
      End If
      If X < 2 Then
      Gosub Buzzer
      End If
      Loop Until Pinb.2 = 0
      Programm_vor = 1
      Standby_led = 0
      X = 0
      End If
      End If
      If Pinb.3 = 1 Then
      Standby_flag_eram = 1
      Programm_zurueck = 1
      If T = 0 Then Aa = 1
      Standby_led = 1
      Gosub Buzzer
      Waitms 110
      If Standby_flag_eram = 2 Then
      Standby_flag_eram = 1
      End If
      Standby_led = 0
      End If
      End If
      If T = 1 Then
      If Standby_flag_eram = 1 Then


      If Pinb.4 = 1 Then
      Standby_led = 1
      Speed = Speed + Fi
      If Speed > 100 Then
      Speed = 100
      End If
      Gosub Buzzer
      Waitms 110
      Standby_led = 0
      End If
      End If
      If Standby_flag_eram = 1 Then
      If Pinb.5 = 1 Then
      Standby_led = 1
      If Speed > 9 Then
      Speed = Speed - Fi
      Else
      Speed = 0
      End If
      Gosub Buzzer
      Waitms 110
      Standby_led = 0
      Ausgang1_c = 1
      Gosub I2c_ausgaberoutine
      End If
      End If
      End If
      Return


      Dieser Einschub in rot markiert führt zum Controller-Komplettabsturz- nichts geht mehr. Display (über i2C angesteuert) zeigt auch dann nur noch Sonderzeichen an. Encoder funktioniert nicht mehr.
      Reset auch nicht. Nur noch Stromunterbrechung bringt den Controller wieder auf Kurs
    • Michael schrieb:

      Du hast ja kein Programm gepostet.
      Trotz freundlicher Nachfrage.
      ich habe da so meine Erfahrungen...man postet das ganze Programm und bekommt dann alle anderen Programmierfehler 'um die Ohren gehauen'- nur nicht den, der das aktuelle Problem löst.
      Na gut...
      Ich betone aber nochmal, daß das Programm störungsfrei funktioniert- auch wenn es nicht danach aussieht und mir schon ein bischen peinlich ist...
      Die interessanten Zeilen sind ab 2345 und 2408
      Dateien
    • Hm, ich finde öfters ein 'goto Auswahl' und wenn ich den Programmteil 'Auswahl' betrachte, finde ich am Ende ein 'return'.
      Das geht jetzt leider in die Richtung deiner Befürchtung, aber sowas ist halt nicht korrekt und kann lustige :S Fehler produzieren.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • djmsc schrieb:

      Aber ist das denn so schlimm?
      neeeeein. natürlich nicht-ganz im Gegenteil. Jetzt setze Dich mal (virtuell) ganz kurz auf den Stuhl eines Bascom- Programmier-Anfängers:
      Man tüftelt stundenlang an der Ursache des Problems- mal abgesehen davon, daß es draußen (und drinnen) gerade sehr warm ist. Man findet den Fehler nicht
      und ist frustriert/genervt. Dann wendet man sich ans Forum und postet den ganzen Code. Die normale Antwort ist dann: " Erstmal solltest Du DAS hier ändern und
      dann schau Dir lieber DIESES nochmal an und warum hast Du JENES denn so gemacht? Das ist ja alles ganz furchtbar..."
      Das Ende vom Lied: Man steht im Frust des einen Problems und hat ZUSÄTZLICH noch erzählt bekommen, daß man ansonsten das Restprogramm ja auch völlig vermurkst hat.
      Ich wette, daß das der Grund ist, warum sich viele Anfänger damit schwer tun, ihr ganzes Programm rauszurücken.
    • @ichbinsmoin ich kann dich verstehen, aber was hilft's. Die Auswirkungen von Fehlern kann eben sehr vielschichtig sein. Drum fängt man bei der Fehlersuche auch bei den offensichtlichsten an.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • ichbinsmoin schrieb:

      jetzt würde MICHAEL wieder sagen: Dann programmiere halt richtig- dann brauchst Du auch kein GOTO verwenden.
      HAHA...wenn ich das alles könnte würde ich es auch machen und Tschoeatsch heißen.
      Meinen Namen geb' ich nicht her! Und ich mach' auch genug Fehler, aber aus denen lernt man ja auch was. Und wenn man es nicht gleich wieder vergisst, dann macht man diesen Fehler schon mal weniger oft.

      Aber jetzt zu deinem Programm, wenn das return kommt, dann wird da einfach zu der letzten Adresse die im stack steht hingesprungen und da weiter gemacht. Wo das jetzt ist, kann man nicht so einfach sagen. Und da hört dann eine Hilfestellung leider ziemlich schnell auf.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • da fällt mir gerade ein:
      debounce , eingang, 0, unterprogramm, SUB
      manchmal gehen Dinge nur MIT der Endung SUB, manchmal muß ich das SUB aber auch zwingend weglassen, damit es überhaupt funktioniert.
      Ich kann aber keine Regel erkennen. Weiß jemand mehr?

      Das ist jetzt noch ein völlig anders Problem und gehört eigentlich in einen seperaten Thread
    • Darum bin ich der Meinung, dass man nicht alles auf einmal programmieren sollten sondern Stück für Stück. Denn so kann man Fehler besser eingrenzen.
      Ich mache es zumindestens so, dass ich nach jedem neuen Programmabschnitt ersmal alles teste und wenn es funktioniert weiter programmiere.
      Somit weiss ich ab wann der Fehler aufgetreten ist und kann diesen beseitigen oder das Forum fragen :)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.