PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verhalten LCD am I2C nach Reset und "initlcd"



highbeta
14.12.2007, 21:59
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:



$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

linux_80
14.12.2007, 23:48
Hallo,

wenn ein LCD direkt angebunden ist, wird immer die Resetleitung des LCDs benutzt, bei der I2C-Version gibts das nicht, deshalb wird das LCD nicht zurückgesetzt.

Wenn Du ein LCD mit nur einem Controller benutzt, könntest Du die 2. Enable-Leitung für den Reset verwenden, und somit selbst einen Reset auslösen.


Edit:
war käse, denn Reset gibts nur bei GLCDs !

highbeta
15.12.2007, 10:52
leider kann ich Dir noch nicht ganz folgen. Welche Leitung ist die Reset-Leitung ?
Ich habe mal die Schaltung meines I2C-Bausteins mit LCD und das der normalen LCD Schaltung angehängt. Für mich unterscheiden sich die Schaltungen nicht?
Aber wie Du sagst, ist mir bei der direkten Beschaltung des LCD am AVR dieses Verhalten auch nicht aufgefallen.

http://home.arcor.de/pflueckhahn/PICs/i2c_lcd.gif

http://home.arcor.de/pflueckhahn/PICs/Lcd_4bit.gif

linux_80
15.12.2007, 12:54
Hui, :oops:
Reset gibts ja nur bei GLCDs.

Dann könntest Du evtl. einen FET in die Stromversorgung einbauen und bei bedarf das LCD ganz abschalten :-k

highbeta
15.12.2007, 13:57
verflixt, da hat mir die Serverauslastung einen Streich gespielt, oder besser mein nervöser Zeigefinger ist Schuld ;)

highbeta
15.12.2007, 13:57
Leider gibt es die Schaltung schon fix und fertig und eine wirklich saubere Lösung mit einem FET ist das auch nicht.

Es gibt gibt doch das Steuerkomando: Display ON/OFF, könnte man das nicht per I2Csend an das LCD schicken? Hat das eine Reset-Wirkung? Warum gibt es eigentlich kein Reset-Steuerkommando??

Fragen über Fraqen..

highbeta
15.12.2007, 14:02
Leider gibt es die Schaltung schon fix und fertig und eine wirklich saubere Lösung mit einem FET wäre das auch nicht. Dann wäre eine getriggerte Ansteuerung bei Änderung der Anzeigewerte bzw. eine Aktualisierung der Anzeige z.B. alle 500 Programm Zyklen (kann man sich bei den meisten Anwendungen ja erlauben) eine einfachere Möglichkeit, die Statistik auf seine Seite zu bringen, so häufig kommen ja Resets auch nicht vor.

Aber:
Es gibt gibt doch das Steuerkomando: Display ON/OFF, könnte man das nicht per I2Csend an das LCD schicken? Hat das eine Reset-Wirkung? Warum gibt es eigentlich kein Reset-Steuerkommando??

Fragen über Fraqen..

linux_80
15.12.2007, 16:25
Das Problem ist ja, wenn der µC mitten während einer Übertragung im 4-Bit-Modus neu anfängt, kommt der LCD-Controller durcheinander, weil er die nächsten 4Bit als 2. Teil der letzten Übertragung interpretiert.
Deshalb kommt es auch vor, das es nach einigen Resets wieder geht. Nämlich dann, wenn gerade das ganze Byte beim 4-Bit-Modus ans LCD gesendet wurde.

Das Commando Display OFF schaltet nur die Pixel aus, ein Reset ist das nicht.

Im DB zum HD44780 steht nur was von internem Reset, und der ist nur nach dem aktivieren der Stromquelle.
Also scheint es nur mit dem deaktivieren derselbigen zu gehen, wenn man das LCD im 4-Bit-Modus betreibt, um sicherzustellen, das nach einem Reset des µC das LCD auch einen definierten Zustand hat.