LCD-Anzeige stürtzt sporadisch nach Interrupt ab

    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!

    • LCD-Anzeige stürtzt sporadisch nach Interrupt ab

      Hallo zusammen,

      ich kämpfe mit einem etwas seltsamen Problem. In einer Applikation möchte ich ein LCD-Display 4*20 (ebay IIC/I2C/TWI/SPI Interface 1602 2004 Blue Yellow Character LCD Display Module) auf dem I2C-Bus betreiben. Mit auf dem Bus sitzt eine RTC (ebay PCF8563T RTC Module). Im Normalbetrieb wird nur die Uhrzeit angezeigt. Über einen Taster, der auf dem INT1 Eingang liegt soll in ein Untermenü gesprungen werden. Weiter läuft ein Timer-Interrupt im Hintergrund. Aktuell nutze ich das EVAL-Board von Pollin und ein Atmega32 um das Ganze zu betreiben. Jetzt kommt es sporadisch vor das die Anzeige abstürzt und nur noch ein Zeichensalat anzeigt. Um den I2C-Bus auszuschließen habe ich ein anderes Display (4x16) im 4Bit Betrieb angeschlossen, Gleiches Phänomen. Der Effekt kommt schneller wenn in der INT1-Routine noch ein Text ausgegeben wird. Gleiches "funktioniert" auch mit INT0. Es gibt eine leichte Verbesserung wenn ich alle Interrupts vor einer Ausgabe sperre und danach wieder frei geben Das kann es jedoch nicht sein.

      Vielleicht hat jemand eine Idee woran das liegen kann. Ich bin mit meinem Latein am Ende ?( ?( ?(
      Dateien
    • Danke für den Tipp. Das hatte ich auch schon gedacht. Ich habe das Programm so verändert das in der Taster_ISR nur noch 300ms gewartet wird und dann die LED toggelt. Weiter habe ich in der sub SB_Update beim Einsprung alle Interrupts gesperrt und am Ende wieder frei gegeben. Leider kommt es immer noch sporadisch zu einer falschen Anzeige. Oder darf die Ausgabe auf der LCD-Anzeige auch nicht in einer Sub-Routine stehen?
    • @Wicky1 ich vermisse ein 'nack' bei deinem Einlesen von der Rtc. Mach mal deine Schleife um ein Element kürzer (oder löse sie auf) und bestätige das Lesen des letzten Elements mit einem nack.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Das nack beeinflußt das Lcd nicht. Natürlich sollte es richtig gemacht werden aber funktionieren würde es auch ohne. Das i2c würde noch ein Byte nachschieben wollen aber dann aber mit Stop abgewürgt. Unschön für es aber ohne Auswirkungen auf den Avr und dem Lcd. Wie sehen die Stromversorgungen aus ? Abblockondensatoren vorhanden? Lange Leitungen zum Lcd? Störungen von sonst wo. Schaltnetzteil, stark genug? Spannungsregler stabil? Auch wenn Lcds mit 3V noch arbeiten können ist es doch "Unterkante"
    • Hallo Michael,

      sorry das ich nicht gleich geantwortet habe. Nach deinem Tipp mit der Vermeidung einer LCD-Ausgabe in einer Interrupt-Routine hat das recht gut funktioniert. Nun habe ich die 3. I2C-Komponente mit angeschlossen. Es ist der Temperatur- und Feuchtigkeitssensor AM2320. Dieser "Lümmel" machte mir jedoch das Leben etwas schwer. Nach einer gewissen Zeit die von wenigen Minuten bis zu mehreren Stunden reichte verabschiedete sich der Sensor und gab keine Werte mehr raus. Ich hoffe das die aktuelle Version stabil läuft. Darauf möchte ich dann weiter aufbauen. Rein aus Interesse möchte ich ein DCF-77 Modul anbinden das in bestimmten Abständen die RTC updatet. Okay, über die Sinnhaftigkeit lässt sich sicher streiten. Es ist nur aus Interesse und zur Vereinfachung der Applikation (die Uhrzeit und die Umstellung Sommer-/Winterzeit entfallen :D ) ) . Kurze Erklärung was ich vor habe: Wir haben eine sehr hohe Luftfeuchte im Keller. Mit einem Luftentfeuchter bekommt man das sehr gut in den Griff. Über die Applikation soll es möglich werden eine Einschaltzeit und die Dauer des Betriebs einzustellen, ab welcher Luftfeuchte eingeschaltet werden soll so wie ein Sofort-Start für 3 Stunden. Das Wasser, das sich im Auffangbehälter ansammelt soll automatisch abgepumpt werden.

      Hier noch die Antworten auf deine Frage und die von Pluto25.
      - Die Spannungsversorgung erfolgt über den ISP-Port direkt aus dem PC, alternativ kann ich ein Steckernetzteil mit Trafo an das EVAL-Board anschließen. Der Strom ist ausreichend, Spannung stabil
      - Abblock-Kondensatoren sind auf dem EVAL-Board und auf dem LCD-Board vorhanden.
      - zwischen dem EVAL-Board und der LCD-Anzeige sind ca. 60 cm Kabel (30cm Breadboard 30cm)
      - Der Taster hat ein Pull up von 4,7k.

      So, während ich das jetzt geschrieben habe ist der AM2320 wieder ausgestiegen a_67_e210de67 . Ein Reset hilft da nichts, man muss die Spannung abziehen. Ich habe nun bei der sub RD_AM2320 am Ende ein Wait 2 eingesetzt. Das hat im Test ohne RTC schon über 20h funktioniert. Ist natürlich keine Lösung da so die Anzeige der RTC bei den Sekunden springt. Mein erster Versuch das zu umgehen war ein 2. Soft I2C-Bus einzurichten. Hier habe ich scheinbar was falsch gemacht. Meine Idee war es in der Sub-Routine neue Ports für SCL und SDA über das Config-Kommando anzulegen und diese dann wieder vor dem Verlassen auf die Ursprungswerte zurück zu setzen. Wollte aber nicht so wie ich wollte X( . Leider habe ich noch nichts darüber gefunden wie man das richtig macht.

      So, das war mal richtig viel Prosa nun aber das aktuellste Programm. Und, by the way, 1000 Danke für den schnellen und guten Support. 1A Forum :thumbsup: :thumbsup: :thumbsup:
      Dateien
    • Wie schaut es bei dir mit den I2C-pullups aus? Hast du welchen und wenn ja, wieviele? Mess doch einfach mal gegen Vcc, so um die 4,7k sollten passen. Wenn jedes Modul schon welche drauf haben, dann könnte zu straff nach Vcc gezogen werden.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,

      das war ein guter Tipp, Das LCD-Display hat tatsächlich schon 4,7k Pullups "on board". So waren es, mit meinen eingesetzten 4,7k nur noch 2,35k. Dies ist, denke ich, keine Erklärung warum der AM2320 abstürzt sobald ich ihm die 2 sec I2C-Bus Ruhe nicht gönne, oder? Mit diesem Wait 2 läuft die HW schon über 6 Stunden. Jetzt habe ich das Programm ohne diesen Zwangspause geladen. Mal sehen wie lange es gut geht. Normalerweise stürzte das Programm sonst recht bald ab.
    • @tschoeatsch: nein, weder die RTC noch der AM2320 hat einen Pullup on board. Nach dem ich meine aus dem Breadboard gezogen hatte konnte ich beim SCL und SDA-Pin 4,7k gegen VCC messen.
      @Pluto25: Ja, die Versorgung läuft über einen USBASP-Brenner. Aktuell messe ich eine Spannung von 4,8 V. Okay, etwas niedrig. Das Verhalten des AM2320 hat sich jedoch auch mit einem externen Netzteil nicht verbessert.
      Wenn ich dich mit der Lib richtig verstanden habe dann meinst du die Umschaltung zwischen 2 I2C-Ports, oder? Das Was ich versucht hatte war beim Einsprung in die SUB RD_AM2320 folgendes:

      Config Scl = Portc.2 (RTC und LCD nutzen Config Scl = Portc.0)
      Config Sda = Portc.3 (RTC und LCD nutzen Config Scl = Portc.1)

      kurz vor dem Verlassen wurde wieder zurück gestellt auf

      Config Scl = Portc.0
      Config Sda = Portc.1

      Das hat jedoch nicht den gewünschten Effekt gebracht. Die Idee war das der AM2320 seinen eigenen I2C-Bus hat und ich dennoch die standardbefehle nutzen kann. Was mir eben noch eingefallen ist, müsste ich nach den Configs ein I2Cinit machen? DAs habe ich noch nicht ausprobiert. Derzeit läuft das Testprogramm nachdem ich meine beiden Pullups gezogen habe ohne Wait. Daher möchte ich das mit dem I2Cinit jetzt nicht ausprobieren.
    • In der Lib meinten die wohl wenn die Pinns zwischendurch anders genutzt werden. Ein Umschalten wird nicht gehen da sie (Sda,Scl) als Konstanten abgelegt werden. Das erste Config legt sie fest und jedes weitere wird ignoriert. ( ohne Fehlermeldung)
      Das I2Cinit macht nichts anderes als die Pins vorzubereiten ( Config Portx.y as Inpunt , Reset portx.y) Nur nötig falls sie was anderes waren.
    • Wicky1 schrieb:

      Nun habe ich die 3. I2C-Komponente mit angeschlossen. Es ist der Temperatur- und Feuchtigkeitssensor AM2320. Dieser "Lümmel" machte mir jedoch das Leben etwas schwer.
      Der Sensor kann I2C-Bus und Single-Bus als Schnittstelle.
      Welche hast du denn am Sensor konfiguriert?

      Den Sensor kann auch nur bis zu 100kBit mit I2C-Bus mithalten (lt. Datenblatt).
      Welchen Bustakt verwendest du? Hat der Takt auch diese eingestellte Frequenz?

      Sind die Fusebit korrekt zum Quarz eingestellt?

      Hier noch das Datenblatt.

      Dann habe ich noch einen Ansatz in deinem Code, woran es liegen könnte.

      In der "Timercount_isr" wird die Variable "AM2320_Abfrage" alle 0,5s hochgezählt.

      Und in der Hauptschleife fragst du diese Variable ab, und wenn sie 0 ist, rufst du die Sub RD_AM2320() auf.


      Bedeutet, dass die Variable 0,5 Sekunden lang den Wert 0 hat und daher der Sensor mehrfach abgefragt wird.

      Vielleicht mag der das nicht.


      Besser in der ISR ein Flag setzen und dieses in der Hauptschleife abfragen.

      Ind wenn gesetzt wird die Routine aufgerufen und das Flag gelöscht. Damit wird dann wirklich nur 1x die Routine aufgerufen.

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

    • @Mitch64: Fusebits sind korrekt eingestellt. Ich nutze den externen 16 Mhz Quarz.
      Mit Config I2Cdelay = 15 sollte der Bus mit 66,6 kHz arbeiten. Es ändert sich auch nichts wenn ich den Delay-Wert auf 10 setze (100kHz).
      Mit dem Flag hast du natürlich recht. Hab ich geändert, jedoch verabschiedet sich der Baustein trotzdem nach 3-4 Stunden.
      Die (bisher) einzige Lösung die ich habe ist am Ende der Abfrageroutine ein Wait mit 2 sec einzubauen. Dann läuft alles wunderbar. Naja, mehr als 24h. Doof ist dabei natürlich das ich die RTC auch immer alle 2 sec
      abfragen kann und dann sieht die Sekundenanzeige nicht so schick aus.

      Im Bascom-AVR habe ich unter dem Suchbegriff I2Cinit etwas interessantes gefunden. Da wird mit der I2C_TWI-MULTI.lib genau das gemacht was mir als Lösung vorschwebt. Auf einfache Weise werden 2 TWI interfaces erstellt. So könnte an dem einen der Feuchtigkeitssensor alleine hängen und der gesamte Rest am anderen. Leider findet Bascom diese Lib nicht. Auch google gibt keinen Hinweis wo diese zum Download bereit steht. Hab mal den Service angeschrieben.
    • Darf die 2 Sekunden jetzt garnix auf dem Bus passieren? Wenn du in der timer-isr noch weiter zählst, dass das flag für den Sensor nur alle 5 oder 10 Sekunden gesetzt wird, klappt das auch nicht?
      Ich kann jetzt nicht nachschauen, das Pollinboard hat jetzt nicht noch Verbindungen zu diesen pins, von den Tastern oder Leds?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo Pluto25,

      geht leider nicht, da, so wie ich es verstanden habe diese Lib nur für XMEGAs ist. Hier der Passus aus dem BASCOM-AVR:

      For the XMEGA which has multiple TWI interfaces you can use a channel to specify the TWI interface otherwise the default TWIC will be used.
      For normal AVR processors with multiple TWI interfaces you can specify the interface : TWI or TWI1.

      Ich hatte das schon probiert, jedoch ohne Erfolg.