PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierungsproblem mit dem I²C-BUS LC-DISPLAY C-CONTROL



MarkusM1S
07.06.2009, 19:00
Hi,

ich bin Schüler und habe mir das I²C-BUS LC-DISPLAY C-CONTROL I bei Conrad bestellt (http://www.conrad.de/goto.php?artikel=198330) und versucht es mit meinem atmega32 und einem Quarz von 16MHz zum Laufen zu bringen. Scl(Portc.0) und Sda(Portc.1) sind genauso wie V+ und Gnd angeschlossen.

Zum Programmieren habe ich mir die Lcd_i2c.lib heruntergeladen (http://www.mcselec.com/index.php?option=com_content&task=view&id=82&Itemid=57) und das beiligende Demoprogramm so umgeschrieben:



$regfile = "m32def.dat"
$crystal = 16000000

$lib "Lcd_i2c.lib" 'My i2c driver for the LCD

Config I2cdelay = 1

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 select E1, 64 select E2, 192 select both (for CLS or DefLCDChar etc.)
_lcd_e = 128 'Upper half of 4-line display is selected

'Here the LCD test program that is included in BASCOM follows
'and at the end there is a demo of the keyboard scan routine

Dim A As Byte
Config Lcd = 16 * 2 'configure lcd screen
'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
'When you dont include this option 16 * 2 is assumed
'16 * 1a is intended for 16 character displays with split addresses over 2 lines

'$LCD = address will turn LCD into 8-bit databus mode
' use this with uP with external RAM and/or ROM
' because it aint need the port pins !
' Put your own strings here
Cls 'clear the LCD display
Lcd "Hello world." 'display this at the top line
Wait 1
Lowerline 'select the lower line
Wait 1
Lcd "Shift this." 'display this at the lower line
Wait 1
For A = 1 To 10
Shiftlcd Right 'shift the text to the right
Waitms 250 'wait a moment
Next

For A = 1 To 10
Shiftlcd Left 'shift the text to the left
Waitms 250 'wait a moment
Next


Locate 2 , 1 'set cursor position
Lcd "*" 'display this
Wait 1 'wait a moment

Shiftcursor Right 'shift the cursor
Lcd "@" 'display this
Wait 1 'wait a moment

Home Upper 'select line 1 and return home
Lcd "Replaced." 'replace the text
Wait 1 'wait a moment

Cursor Off Noblink 'hide cursor
Wait 1 'wait a moment
Cursor On Blink 'show cursor
Wait 1 'wait a moment
Display Off 'turn display off
Wait 1 'wait a moment
Display On 'turn display on

End

Außer der Beleuchtung funktioniert nichts. Kein Cursur etc. ...

Auch mit einem an ein Display mit 16 * 2 angepassten Code, den ich aus dem Buch "Roboter selbst bauen" (http://books.google.de/books?id=tjUAeHXa33IC&pg=PT1&dq=roboter+selbst+bauen#PPA59,M1) entnommen habe, tut sich nichts.

Vielleicht hatte jemand das selbe Problem und hat es gelöst ?
Ich würde mich über Lösungen, Raschläge oder Fragen über Unklarheiten freuen ...

Gruß,
Markus

for_ro
07.06.2009, 19:10
Dies ist ein ziemlich spezielles Display, aber hier im Forum kannst du schon einige Beiträge zum Thema PCF8574 finden. Schau mal in der Suche.

Gruß

Rolf

guenter1604
07.06.2009, 20:49
Hallo Markus,

die von dir eingesetzte Library $lib "Lcd_i2c.lib" erwartet am Ausgang P4 das RS des Displays und am P5 das RW-Signal.

Beim Conrad-Teil sind diese 2 vertauscht.

Quelle:
http://www2.produktinfo.conrad.com/datenblaetter/175000-199999/198330-an-01-de-I2C_LC_Display_Modul.pdf
http://www.mcselec.com/index.php?option=com_content&task=view&id=82&Itemid=57

ob das die einzigen Unterschiede sind, kann ich dir leider nicht sagen.

Günter

MarkusM1S
07.06.2009, 22:21
Hallo alle zusammen und vielen Dank für die schnellen Antworten

Ich hatte schon im Forum gesucht, bin aber nur auf eins gekommen, dass zu mir passen könnte (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=40663&highlight=pcf8574). Dort schreibt dirtyklaus er habe es damit gelöst:

Getrennt -also aufgepitscht -zwischen Display Platine und Controlerplatine:
Die Pinne: pin 3, pin 4

An Displayplatine:
- pin 4 (RS) auf Pin 5 auf Controlerplatine (PCF8547)
- Pin 5 (R/W) auf Masse (pin1) gelötet - fest Read

Nachtrag:
die Variable _lcd_e = 192 ist auf 192 zu setzen.

Doch damit bin ich nicht viel weitergekommen... (wieso pin 3 und pin 4 auftrennen, wenn dann unten von pin 4 und pin 5 die Rede ist?)

Ich habe ,wie guenter1604 dann beschrieben hat, pin 4 und pin 5 aufgetrennt und die beiden vertauscht ... Leider ohne Erfolg.

Dann bin ich dazu übergegangen noch Pin 5 auf Masse zu legen und die Programmzeile, wie dirtyklaus beschrieben hat, zu änderen, aber wieder ohne Erfolg.

Gruß,
Markus

guenter1604
07.06.2009, 22:33
Die richtige Adresse gejumpert?

Suggarman
08.06.2009, 10:50
Ich stand kürzlich vor genau dem gleichen Problem.

Die Leitungen DB4 bis DB7 sind gleich angeschlossen. Alle anderen Leitungen gehen auf andere Ports des PCF8574. Nimm lieber eine andere Adapterplatine und ein anderes Display.

AVR: http://www.rn-wissen.de/index.php/Bild:Lcdmodul_i2c_schem.png
C-Control: http://www.spiketronics.com/downloads/BA005.pdf



mfg

Stefan

mat-sche
08.06.2009, 12:04
Hi,

schau Dir mal diesen Code an, bei mir funst das LCD.

http://www.mcselec.com/index.php?option=com_content&task=view&id=82&Itemid=57

Gruß MAT

Suggarman
08.06.2009, 13:07
schau Dir mal diesen Code an, bei mir funst das LCD.


Der Code funktioniert.... allerdings nicht mit dem I2C-LCD der C-Control.

mfg

Stefan

MarkusM1S
08.06.2009, 14:06
Hallo alle und danke für die weitern Antworten,

hier sind erstmal ein paar Bilder, wie jetzt mein Display aussieht.
http://file1.npage.de/001026/22/bilder/display.jpg

http://file1.npage.de/001026/22/bilder/dscf2089.jpg

An den Jumpern habe ich nichts geändert; sind alle auf Low. => H&40, was auch im Programmcode steht.

Ich würde nur ungern mir ein neues Display kaufen, da es runde 40€ gekostet hat. Also versuche ich lieber noch daran rumzubasteln ...

Die Pins P0 bis P5 müssten ja jetzt passen.

Eventuell muss ich noch P7 mit P6 vertauschen? Ich weiß aber nicht, ob das überhaupt einen Sinn hat.

@Suggarman: Hast du einen Code, der passt ?

Hat irgendjemand noch eine Idee oder sollte ich das wirklich aufgeben ?

Vielen Dank,
Markus

Suggarman
08.06.2009, 14:13
Ich würde nur ungern mir ein neues Display kaufen, da es runde 40€ gekostet hat


OK. Ich habe für mein 4x40 LCD nur ca. 5 EUR bezahlt :-)



Eventuell muss ich noch P7 mit P6 vertauschen? Ich weiß aber nicht, ob das überhaupt einen Sinn hat.


Hast Du die obigen Schaltpläne angesehen?



@Suggarman: Hast du einen Code, der passt ?


Der Code, den Mat-sche verlinkt hat funktioniert.

mfg

Stefan

MarkusM1S
08.06.2009, 14:31
Hi,


Hast Du die obigen Schaltpläne angesehen?

Ich hab mir die Schaltpläne angeschaut und habe gesehen, dass P4 und P5 vertauscht sind (habe ich ja geändert) und dass an P7 E ist im Gegensatz zum Conrad Display, wo P7 das Backlight regelt und an P6 E ist. Aus Verzweiflung würde ich das auch noch vertauschen ...


Der Code, den Mat-sche verlinkt hat funktioniert.

Ich benutze ja diesen Code nur angepasst an einen Quarz mit 16MHz und ohne Keyboard. Weil ich mir aber nicht sicher mit der Umschreibung war, habe ich ihn ganz am Anfang gepostet.

Gruß,
Markus

Suggarman
08.06.2009, 15:27
Ich benutze den Beispielcode ohne Änderungen an einem RN-Mega2560.

Ich würde das Conrad-Modul nicht weiter vergewaltigen. Ein PCF8574, ein Sockel, ein Stück Platine und ein bischen Kabel und du hast den passenden Adapter hergestellt. Die LCD bis 4x20 gibt es doch für ganz kleines Geld zu kaufen.

mfg

Stefan

MarkusM1S
08.06.2009, 16:55
Das wundert mich.

Muss man nicht auf jeden Fall noch $regfile mit seinem Displaynamen reinschreiben?
Außerdem müsstest du ja den Code mit dem Keyboard rauslöschen, sofern du keins benützt.

Und noch ein Problem, das ich habe, ist das crystal auf ein 8MHz eingestellt ist und ich ein 16MHz Quarz benutze, dass allein wäre nicht alzu schwerwiegen; doch muss ich dann auch das Delay ändern und / oder alle Wartezeiten ? Ich kenne mich halt leider überhaupt nicht mit asm aus ...

Gruß,
Markus

Suggarman
09.06.2009, 07:51
Ja natürlich, das regfile muss rein. Hier mein I2C_LCD_Testcode:



$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 '64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
$baud = 9600

$lib "Lcd_i2c.lib" 'My i2c driver for the LCD

Config I2cdelay = 1
Const Pcf8574_lcd = 64 'Defines the address of the I/O expander for LCD

'Config Portd.0 = Input
'Config Portd.1 = Input

'Portd.0 = 1
'Portd.1 = 1

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

Dim _lcd_e As Byte 'Needed to control 4 line LCD
Enable Interrupts

'_lcd_e = 128 select E1, 64 select E2, 192 select both (for CLS or DefLCDChar etc.)
_lcd_e = 128 'Upper half of 4-line display is selected




Dim A As Byte
Config Lcd = 20 * 4 'configure lcd screen

Start:
Cls 'clear the LCD display
Lcd "1. Zeile" 'display this at the top line
Wait 2
Lowerline 'select the lower line
Wait 1
Lcd "2. Zeile" 'display this at the lower line
Wait 2

Upperline
Locate 1 , 21 'set cursor position to 3. zeile, 1. Zeichen
Lcd "3. Zeile" 'display this
Wait 2 'wait a moment

Lowerline
Locate 2 , 21 'set cursor position to 3. zeile, 1. Zeichen
Lcd "4. Zeile" 'display this
Wait 2 'wait a moment


Goto Start

End

mfg

Stefan