PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Anzeige funktioniert nicht



hf59
17.11.2007, 18:41
ich benutze eine Dot Matrix LCD (4 x 20) angesteuert von einem
PCF 8574 T (I2C - Bus ) als Controller benutze ich den AT-Mega 32
bei 4 MHz Taktfrequenz gibt es keine probleme aber bei 16MHz Taktfrquenz stimmt die LCD-Anzeige nicht mehr (es läuft eine Zeichenfolge ab und dann nichts mehr , es ist auch nur die erste und dritte Zeile aktiv)

Wie kann ich das Problem beheben ?

linux_80
17.11.2007, 18:46
Hallo,

evtl. stimmen dann die Zeiten nicht mehr, die Daten werden zu schnell an den PCF und somit LCD gesendet :-k

hf59
17.11.2007, 20:14
Vielen dank für die Info. :) )
Ich hätte noch eine Frage, mit was für einem Befehl kann die
Übertragungsrate verlangsamt werden? ("Wait" Befehl? :) )

linux_80
17.11.2007, 23:13
Hier könnten wir mal einen Ausschnitt aus Deinem Programm brauchen, wie Du den PCF ansteuerst.
Wenn das mit einer Bascom-Lib passiert, kann man mit Wait nicht soviel ausrichten, da die Wartezeiten intern geregelt werden.
Normalerweise sollte Bascom aber die Zeiten richtig ausrechnen, wenn man die richtigen Frequenzen im Programm angibt ($crystal) :-k

hf59
18.11.2007, 00:00
Danke nochmals !
hier der Programmausschnitt :

$lib "Lcd_i2c.lib" 'I2C-Bus Treiber für LCD
$regfile = "m32def.dat" 'Controller Dateien
$crystal = 16000000 'Quarzfrequenz XTAL
$baud = 19200 'Übertragungsrate



$prog &HFF , &HEF , &HD9 , &HFF ' generated. Take care that the chip supports all fuse bytes.( 101111 16MHz)


Enable Interrupts

Const Pcf8574_lcd = &H40 'Defines the address of the I/O expander for LCD


Config Scl = Portc.0 'Configure i2c SCL
Config Sda = Portc.1 'Configure i2c SDA

Dim _lcd_e As Byte 'Needed to control 4 line LCD
_lcd_e = 128 'Upper half of 4-line display is selected
Config Lcd = 20 * 4 'Konfigurationsdatei LCD 20*4
Config Lcdbus = 4
Config Lcdmode = Bus


Config Date = Mdy , Separator = / 'ANSI Format
Config Clock = Soft

Date$ = "11/04/07"

Time$ = "23:55:00"


Config Porta = Input 'Port A = Eingang
Config Porta = 255 'PullUp aktiv (Eingang auf High)

Config Portd.7 = Output 'Port D.7 = Ausgang Gerät Ein/Aus
Config Portd.6 = Output 'Port D.6 = Ausgang OK - Taste
Config Portd.5 = Output 'Port D.5 = Ausgang Rec - Taste
Config Portd.4 = Output 'Port D.4 = Ausgang Stop - Taste
Config Portd.3 = Output
Config Portd.2 = Output



Config Pinb.0 = Output 'Port b.0 = Ausgang
Config Pinb.1 = Output 'Port b.1 = Ausgang
Config Pinb.2 = Output 'Port b.2 = Ausgang
Config Pinb.3 = Output 'Port b.3 = Ausgang
Config Pinb.4 = Output 'Port b.4 = Ausgang

Config Pinc.2 = Output 'Port c.2 = Ausgang (LCD-Beleuchtung Ein-Aus)
Config Pinc.3 = Output 'Port c.3 = Ausgang (Nf-Verstärker-Eingang -> Alarmton)
Config Pinc.4 = Output 'Port c.4 = Ausgang (Relais)
Config Pinc.5 = Output 'Port c.5 = Ausgang (Relais)

Speaker Alias Portc.3 'Tonausgabe

Const Keys = 8 '8 x Eingänge

Dim I As Byte
Dim Key As Byte 'Variable mit Tastennummer
Dim Var As Byte

Dim X As Byte
Dim Y As Byte
Dim Z As Byte

Deflcdchar 0 , 23 , 20 , 20 , 30 , 20 , 20 , 20 , 20 'Sonderzeichen HF

'Initlcd



'----------------------------Programmbeginn-------------------------------------


Starte:
'Sprungmarke 1
X = 0

Y = 0

Cls

Set Portc.2 'Port c.2 = Ausgang (LCD-Beleuchtung Ein )



Initlcd

Lcd " Alarmanlage - " ; Chr(0)
Lowerline
Lcd "Alle Schleifen aktiv"
Thirdline
Lcd " Starte Programm "
Fourthline
Lcd "--------------------"


Wait 3

Reset Portc.2 'Port c.2 = Ausgang (LCD-Beleuchtung Aus )


Weiter: 'Sprungmarke 2

Set Portc.2 'Port c.2 = Ausgang (LCD-Beleuchtung Ein )

Cls

linux_80
18.11.2007, 13:52
Hallo,

auch wenn das Programm nicht ganz vollstädig ist,
zum umschalten der 2 hälften des LCD musst Du die Variable _lcd_e ändern,
so wie es in der Lib angegeben ist:


;_lcd_e should have one of the following values
;128 to enable E1, 64 to enable E2, 192 to enable both E1 and E2 (cls, deflcdchar)

Vor jedem LCD-Befehl, damit es die richtige Hälfte erreicht, bzw. immer wenn auf die andre umgeschaltet werden soll !

Das Initlcd weiter oben angeben, bevor der erste LCD-Befehl vorkommt,

PS:
Programmausschnitte bitte immer mit Code-Tags versehen, dann liest es sich besser !

hf59
18.11.2007, 14:44
Hallo,
danke für denn Tipp ! :)
ich habe die Variable auf 192 geändert die Anzeige funktioniert aber so
noch nicht, was ich noch versucht habe , die Frequenz mit 32 MHz anzugeben ($crystal = 32000000) der Quarz ist aber 16MHz , so funktioniert die Anzeige :-k

hf59
18.11.2007, 15:35
Hallo Linux_80,
danke nochmals für die Unterstützung =D>

Ich habe es mit dem 'Config I2Cdelay = 10 ' Befehl versucht das Programm funktioniert jetzt einwanfrei (die Daten wurden zu schnell an
an die LCDanzeige gesendet.

linux_80
18.11.2007, 18:42
Wenns an diesem Befehle gelegen hat, war der PCF die Schwachstelle, der kann nur bis ca. 100kHz, wenn der AVR zu schnell sendet kann schon mal eine Übertragung verloren gehen, obwohl die lcd-i2c-lib alles dreimal sendet :-k