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

    • ichbinsmoin schrieb:

      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

      Ob was funktioniert oder nicht richtet sich oft an der weiteren Vorgehensweise. Bei einer sub weiß man immer wo man ist und wo man beim return wieder hin kommt. Ohne dem sub ist es ein goto und das birgt halt einfach die große Gefahr des Verzettelns.
      Raum für Notizen

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

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

      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 :)
      Ich denke, das hat er gemacht. Jetzt kommt halt eine Erweiterung und nix geht mehr. Das kann jetzt einfach durch das Einführen weiterer Variablen sein, schon können durch einen vorhandenen Fehler plötzlich wichtige Variablen gestört werden und nix geht mehr.
      Raum für Notizen

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

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

      Darum bin ich der Meinung, dass man nicht alles auf einmal programmieren sollten sondern Stück für Stück.
      Bist Du des Wahnsinns... So ein Programm auf einmal schreiben...das waren für mich monatelange Arbeit. Ich habe an diesem Projekt extrem viel gelernt.
      Hatte vorher noch nie was von I2C, extendern, Libs, arrays und vieles mehr gehört.
      Soetawas baut sich ganz sachte Stück für Stück auf. Deshalb mache ich auch immer tageweise Zwischenspeicherungen, damit ich- wenn mal was komplett vermurkst ist- wieder auf den Stand des Vortages
      komme und nicht wieder ganz von vorne anfangen muss
    • ichbinsmoin schrieb:

      führt zum Controller-Komplettabsturz- nichts geht mehr. Display (über i2C angesteuert) zeigt auch dann nur noch Sonderzeichen an. Encoder funktioniert nicht mehr.
      Ist es eine gute Idee sowohl innerhalb als auch außerhalb von IRQS auf dem I2C-Bus zu arbeiten?
      Das kann doch gar nicht funktionieren wenn z.B. irgendwas zu einem Device (z.B. dem Display) gesendet wird und dann der IRQ dazwischenfunkt und was anderes von einem anderen Device(z.B. dem PCF) will.

      PS.:Dieser Post wurde vorher verschluckt und jetzt mittels erweiterte Antwort wieder hergestellt.
    • Naja, innerhalb kann ja nix passieren, da funkt nix dazwischen. Und außerhalb, ich weiß nicht, ob bascom währendessen die irqs sperrt, wäre sinnvoll.
      Raum für Notizen

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

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

      Naja, innerhalb kann ja nix passieren, da funkt nix dazwischen. Und außerhalb, ich weiß nicht, ob bascom währendessen die irqs sperrt, wäre sinnvoll.
      Der I2C ist doch außerdem ein synchroner bus, er hat ja einen clock, verschiedene Taktfrequenzen sind ja auch kein Problem.
      Raum für Notizen

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

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

      kommen auch keine anderen Interrupts während der Abarbeitung rein?
      doch. und ich glaube Du bist der Sache auf der Spur....
      Ich habe im Hintergrund immer eine ISR via Timer0 laufen, der den Encoder abfragt.
      Ich kann die Abfrage-Frequenz (noch) nicht errechnen, aber quarz = 20 MHZ/ prescale 1024/ const timer reload = 242
      Schätze, der Encoder wird mehrmals pro sek. abgefragt?
      Vielleicht kommt diese Timer ISR mit der besagten ISR, die ich hier gepostet habe, durcheinander?
    • Es kann nicht so einfach eine isr durch einen weiteren interrupt unterbrochen werden. Da gibt es ein flag, dass das verhindert. Ein neu kommender interrupt wird während eines laufenden zwischen gespeichert und nach dem return des ersteren ausgeführt.
      Raum für Notizen

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

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

      Es kann nicht so einfach eine isr durch einen weiteren interrupt unterbrochen werden. Da gibt es ein flag, dass das verhindert. Ein neu kommender interrupt wird während eines laufenden zwischen gespeichert und nach dem return des ersteren ausgeführt.
      ach richtig... da habe ich hier mal was von Dir gelesen. "Was ist , wenn mehrere Interrupts während der Abarbeitung der einen reinkommen?' Antwort war: Dann wird nur die erste ausgeführt, die restlichen fallen weg."
      War das so?
    • Zitronenfalter schrieb:

      Ist es eine gute Idee sowohl innerhalb als auch außerhalb von IRQS auf dem I2C-Bus zu arbeiten?
      nein, nicht gut

      tschoeatsch schrieb:

      Und außerhalb, ich weiß nicht, ob bascom währendessen die irqs sperrt, wäre sinnvoll.
      IC2 kann sehr gut außerhalb des IRQ arbeiten, da es ein synchroner Bus ist. Hast du auch in Beitrag 28 geschrieben. Störungen mit einem I2C im Interrupt sind logischerweise nicht gut.

      ichbinsmoin schrieb:

      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.
      denkst du, und tust damit deinen Helfern Unrecht.

      ichbinsmoin schrieb:

      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.
      Naja, mit der Einstellung kommst du nicht weit.
      Programmierer, die sich nicht mehr Anfänger nennen, haben jahrelangen diesen Frust erlebt.

      Setz dich mal virtuell auf den Stuhl des Nichtanfängers: Man hat jahrelange Erfahrung mit Programmierung und dann kommt ein Anfänger und meint, alles auf einmal zu stemmen. Wenn man ihm das versucht beizubringen, ist er frustriert und nimmt es persönlich.
      Die Welt ist gemein. Versuch nicht zu rennen, wenn du noch nicht stehen kannst. Du könntest hinfallen.
    • ichbinsmoin schrieb:

      tschoeatsch schrieb:

      Es kann nicht so einfach eine isr durch einen weiteren interrupt unterbrochen werden. Da gibt es ein flag, dass das verhindert. Ein neu kommender interrupt wird während eines laufenden zwischen gespeichert und nach dem return des ersteren ausgeführt.
      ach richtig... da habe ich hier mal was von Dir gelesen. "Was ist , wenn mehrere Interrupts während der Abarbeitung der einen reinkommen?' Antwort war: Dann wird nur die erste ausgeführt, die restlichen fallen weg."War das so?
      Die Antwort muss man relativieren. Läuft ein interrupt und es würden zB durch int0 2 interrupts ausgelöst werden, dann wird nur einer im Anschluss an dem laufenden gemacht. Also mehrere interrupts einer Quelle werden auf einen reduziert.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Worauf ich hinaus wollte, ist der Umstand, dass die Hauptschleife eine I2C-Sequenz beginnt (eben zum Beispiel was am Display ausgibt) und während dieser ein IRQ dazwischen funkt.
      Das kann nicht funktionieren.
      Ich denke auch nicht, dass Bascom da einfach IRQS sperrt, das würde doch das ganze IRQ-KONZEPT durcheinander bringen.
      Dem I2C wird es an sich nichts machen, unterbrochen zu werden (das gibt ja das Konzept her).
      Im konkreten Fall wird aber nicht nur unterbrochen sondern viel mehr ein anderes Device neu angesprochen, das alte aber nicht korrekt beendet (vielmehr erreichen das alte Device unter Umständen jetzt eine Vielzahl Bytes mit denen dieses nichts anfangen kann.
      Und das führt dann günstigenfalls zu einem Anzeigefehler am Display, kann dieses aber auch so verwirren, dass es dann überhaupt keine Befehle mehr annimmt oder schlimmstenfalls den Bus sogar blockiert und gar nichts mehr funktioniert, je nach Fehlerbehandlung.
    • Michael schrieb:

      denkst du, und tust damit deinen Helfern Unrecht.
      nee- nicht "denkts Du". Das hat nichts mit denken oder unterstellen zu tun, das sind erlebte Fakten.

      Michael schrieb:

      Man hat jahrelange Erfahrung mit Programmierung und dann kommt ein Anfänger und meint, alles auf einmal zu stemmen.
      wie ich schon in diesem Thread geschrieben habe: Alles step by step. Ich kann nicht ALLES auf einmal. Hab ich auch übrigens nie gemeint/gewollt?!

      Michael schrieb:

      Wenn man ihm das versucht beizubringen, ist er frustriert und nimmt es persönlich.
      das kann man pauschal auch nicht so sagen. Der Ton spielt die Musik. Frag mal Tschoetsch. Wir haben bislang über 200x hin und her gepostet- nie war da irgendetwas, wo man hätte anecken können.
      Das hat auch was mit sozialer Intelligenz zu tun, zwischenmenschlichem Miteinander...wie man mit dem Gesprächspartner umgeht und so... wie war noch das Wort?... Empathie!
      Aber wie gesagt: Ich will die alten Frikadellen nicht wieder aufwärmen. Wir hatten schon unsere Kontroverse und ich muß Dir zugestehen, daß sich seitdem Dein Tonfall schon wesentlich gemäßigt hat.
      Fachlich/inhaltlich stand es ja sowieso nie in Frage. Da hattest Du bei meinen Problemen bislang am Ende stets Recht, aber das kann ja auch Zufall sein a_144_c1e4404d
    • okidoki- zurück zum Thema: Ich bin jetzt hier ein Forum -Neuling und ich habe zufällig das gleiche I2C-ISR Problem und brauche Lösungen.
      Dann benutze ich die Suchfunktion hier und tatsäclich: "juhu, es gibt bereits einen Thread darüber:" Diesen hier.
      Dann sieht der Neuling die ganze kommunikation und scrollt ans Ende, weil er ja die Lösung sehen will und dann steht da nix.
      Am Ende nur die Frage, ob hier ein Anwalt zugegen wäre und die Antwort von DJmsc.
      Frage an die Admins: Habt Ihr eine direkten Draht zu MSC? Kann man die Frage, ob innerhalb einer ISR ein I2C Befehl ausgeführt werden darf, an
      die Holländer weiterleiten? Das ist doch mal jetzt eine nicht ganz so blöde Frage und darf doch ruhig mal gestellt werden?!