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:
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
Das Problem:
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
Lesezeichen