Hallo,
ich betreibe am RN-Board (ATMega16) ein 2x16 Zeichen Standard-LCD Display (4Bit-Modus) über einen PCF8574 Porterweitungsbaustein am I2C-Bus.
Ein beispielhaftes Programm könnte so aussehen:
Das Problem:Code:$regfile = "m16def.dat" $lib "Lcd_i2c.lib" Dim _lcd_e As Byte Dim Count As Integer $crystal = 16000000 $baud = 9600 Config Adc = Single , Prescaler = Auto Config Scl = Portc.0 Config Sda = Portc.1 Config I2cdelay = 15 Const Pcf8574_lcd = &H40 Const Ref = 5 / 1023 Sound Portd.7 , 400 , 450 _lcd_e = 128 Initlcd Count = 0 Do Count = Count + 1 If Count > 5000 Then Count = 0 End If Upperline Lcd "counter:" ; Count ; " " Loop End
Bei einem Reset (egal ob ISP oder Taster) ist die Wahrscheinlichkeit sehr hoch, dass sich der LCD-Controller verhaspelt, weil ich ihn genau bei einem Zugriff erwische. Nach meinem Verständnis müsste er aber durch den initlcd-Befehl wieder auf die Füße fallen, was er aber leider nicht tut. Vielmehr bekommt man ihn nur durch mehrere Resets zufällig oder durch poweroff wieder zur Raison. Gibt es einen Weg das LCD auch ohne poweroff per Software zu einem wirksamen Reset zu bewegen?
Im Beispielcode zur LCD_i2c.lib wird das Problem durch wait 1 statistisch entschärft. Man hat einfach weniger Gelegenheit, bei LCD Zugriffen zu stören. Aber das ist ja keine Lösung!
Ich überlege das LCD nur bei Änderungen von Anzeigedaten zu triggern, aber auch das empfinde ich eher als Krücke. Bei jedem Neustart sollte das LCD in einen definierten Zustand gebracht werden aber scheinbar tut das der lcdinit-Befehl so nicht.
Danke für jeden Hinweis







Zitieren


Lesezeichen