PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD am I2C Bus ohne Erweiterungsplatine



Markus16
18.12.2007, 12:32
Hi,

Ich habe ein LCD, dass über den I2C bus gesteuert wird, an meinen Robby angeschloßen, doch dann musste ich leider feststellen, dass der einfache Robby ohne Erweiterungen keine Unterstützung für den I2C Bus bietet. Ich habe auch schon nach der emulierten Version des I2C Bus gesucht und bin fündig geworden, doch trotzdem konnte ich keine Erfolge erzielen.
Das LCD habe ich an SDA und SCL angeschloßen. Kann mir jemand bei der Software helfen? Ich suche Lösungsideen und/oder kleine Codeschnipsel:-)

Verzweifelte Grüße

Dirk
18.12.2007, 16:45
Hallo Markus16,

nicht verzweifeln ... ! O:)

Du kannst nur eine emulierte I2C-Version nehmen. Je nach dem, was die Software da vorsieht, must du 2 Ports des CCRP5 für den emulierten I2C-Bus nehmen. Es empfiehlt sich, Ports 9 und 10 dafür zu nehmen.
Die Software muss darauf dann abgestimmt sein.

An den Pins SCL und SDA kannst du nichts anschließen, weil die nur nutzbar sind, wenn du einen I2C-Treiber in die 256-Byte für Maschinensprache-Treiber laden würdest. Da drin ist aber der Treiber für den CCRP5.

Gruß Dirk

Markus16
18.12.2007, 17:27
Hallo Dirk,

vielen dank für die schnelle Hilfe. Warum kann ich denn die Pins SCL und SDA nicht benutzen? Auch nicht mit der emulierten Version des I2C Bus?

Mit Software abstimmen meinst du nur das ändern der Ports im Code oder? also nur die Zeile "define sda port[4] " in den gewünschten Port ändern? Und natürlich die Zeile für scl auch?

Also kann ich die Pins SCL und SDA eigentlich garnicht gebrauchen?

Viele Grüße Markus

Dirk
18.12.2007, 18:25
Hallo Markus16,

Genau: SCL und SDA der C-Control I kannst du mit einem emulierten I2C (in CCBASIC programmiert) nicht benutzen. Das geht nur mit einem Maschinensprachetreiber. Da ist aber der P5DRIV12.s19 drin und belegt den ganzen Platz.

Du must die von dir schon genannten Zeilen (define sda ... und define scl ...) so ändern, wie du den Bus anschließen willst.

Gruß Dirk

Markus16
18.12.2007, 18:40
Hallo Dirk,

Nochmals vielen Dank für die schnelle Hilfe und die Mühe.

Ich habe allerdings noch ein paar kleine Fragen zum Programmieren mit dem emulierten I2C Bus. Wie spreche ich das LCD genau an? Brauche ich dazu die Adresse des LCD? Wenn ja wo übergebe ich sie im Programm? Oder reicht das Aufrufen von "start_i2c"? Und wie genau funktioniert das Senden an das LCD? Einfach nur den Wert von "i2c_byte" ändern und "write_byte_i2c" aufrufen?

Viele Grüße Markus

Dirk
19.12.2007, 16:44
Hallo Markus16,

ich kenne die I2C-Routinen, die du gefunden hast, nicht genau.
Vielleicht kannst du sie oder den Link dazu einmal posten.

Gruß Dirk

Markus16
19.12.2007, 17:05
Halo Dirk,

den Quellcode hab ich hier im Board gefunden. Du kannst ihn im Downloadbereich ( Codeschnipsel / Quellcode -> Code für C-Control / M-Unit -> E-I2C SUBROUTINES v2.0 for CCIv1.1 & v2.0. ) herunterladen. Das senden der einzelnen Bytes habe ich mittlerweile verstanden und ich bin mir recht sicher das ich nur den Wert der Variable "i2c_byte" ändern muss. Ich versteh jedoch nicht wo und wie ich die Adresse des LCDs übergeben muss. Muss ich sie überhaupt übergeben?

Schonmal vielen Dank für deine Hilfe und Mühe

Viele Grüße Markus

Dirk
19.12.2007, 17:25
Hallo Markus16,

ja, du must nacheinander die Bytes senden, die dein I2C-LCD braucht. Da ist immer auch die Adresse des LCD dabei. Das kann dann z.B. so aussehen:
gosub I2CSTART
I2C_BYTE=&HC0:gosub I2CWBYTE 'Adresse C0
I2C_BYTE=0:gosub I2CWBYTE 'Register 0 lesen
gosub I2CSTOP

Hier wird HC0 (Adresse) und 0 gesendet. Bei deinem LCD sieht das sicher anders aus. Die Anleitung wird's sagen.

Gruß Dirk

Markus16
21.12.2007, 17:56
Hallo Dirk,

nochmals vielen Dank für die Hilfe.

Ich hab jedoch noch immer einige Probleme: Ich habe keine Informationen zu Steuerzeichen oder anderen Zeichen des LCDs gefunden. Weder im Internet noch in der Anleitung zum LCD. Und durch rumspielen habe ich auch nichts erreicht. Ich habe einige Bytes an das LCD gesendet, doch ohne jeglichen Erfolg.
Ich kenne jedoch schon die Adresse des LCDs.
Mein Code:

gosub start_i2c
I2C_BYTE=&H40:gosub write_byte_i2c
I2C_BYTE=4:gosub write_byte_i2c
gosub stop_i2c

Kann mir jemand helfen? Weiß jemand welche Bytes das LCD braucht/verwendet? Ich habe nur Tabellen zu anderen LCDs gefunden...

Viele Grüße Markus

Dirk
21.12.2007, 20:11
Hallo Markus16,

Ich habe keine Informationen zu Steuerzeichen oder anderen Zeichen des LCDs gefunden. Weder im Internet noch in der Anleitung zum LCD.
Da kann ich nicht helfen: Ich weiss nicht, welches I2C-LCD du hast. Du kannst da nur nach Anleitung gehen oder hier die genaue Bezeichnung des Displays posten.

Gruß Dirk

Markus16
21.12.2007, 20:54
Hallo Dirk,

In der Anleitung konnte ich ja leider nichts finden. Aber ich habe ein LCD-Modul (Artikel Nummer bei www.conrad.de: 198330). Ich weiß auch das ein IC (PCF8574T) als Steuereinheit für das LCD fungiert. Ansonsten habe ich eigentlich keine Informationen bzw. sonst habe ich keine entdeckt.

Viele Grüße Markus

Dirk
21.12.2007, 21:42
... ah, verstehe, das ist das LCD des C-Control-Systems.

Da kann ich nicht helfen! Da gibt es, soweit ich weiss, Treiber für die micro und Unit 1 2.0. Die sollen auf der CD sein. Bei der Micro lese ich, dass das Betriebssystem das I2C-LCD unterstützt.

Ich habe keine Ahnung, wie und ob man die Treiber für den CCRP5 nutzen könnte. Ich habe die CD auch nicht.
Vielleicht hat das hier jemand schon versucht.

Wird schwierig! Sorry ...

Gruß Dirk

Dirk
22.12.2007, 10:49
... Moment, habe da noch was gefunden, ist zwar in OCBASIC und nutzt Assembler-Routinen als I2C, aber das müßte an den CCRP5 mit E-I2C anzupassen sein.

Viel Erfolg!


' ---------------------------------------------------------------------------
' --- LCD-Display Ansteuerung über den I2C-Bus - für OCBASIC ----------------
' --- erstellt am 11.09.2005 von Jens Gürtler -------------------------------
' ---------------------------------------------------------------------------

' Hardware:
' I2C-Bus SCL an Port 5
' I2C_Bus SDA an Port 6
' 2 Zeilen LCD-Display mit I2C-Ansteuerung

' Software:
' Das Programm steuert ein 2 Zeilen LCD-Display über einen PCF8574 an. Wenn
' ein 1-Zeiliges oder 4-Zeiliges LCD-Display verwendet werden, dann muss die
' Display-Initialisierung dem Display entsprechend angepasst werden. Die
' I2C-Bus Routine arbeitet mit Assambler und ist damit sehr schnell. Es
' werden 40 Zeichen in ca. 0,1 Sekunden auf dem Display wiedergegeben. Der
' ACK vom "Slave" wird im Programm nicht ausgewertet. Wenn der PCF8574 nicht
' wie beschrieben mit dem Display verdrahtet ist, muss Bit1 bis Bit8
' entsprechend angepasst werden.

'--- PCF8574 Port Belegung an LCD-Display -----------------------------------
' Port1 = RS LCD-Display
' Port2 = R/W LCD-Display
' Port3 = Enabel LCD-Display
' Port4 = Hintergrundbeleuchtung LCD-Display
' Port5 = D4 LCD-Display
' Port6 = D5 LCD-Display
' Port7 = D6 LCD-Display
' Port8 = D7 LCD-Display

'--- ASSCII Zeichensatz - (in Dezimalzahlen) --------------------------------
' Sonderzeichen
' =32 !=33 "=34 #=35 $=36 %=37 &=38 '=39 (=40 )=41 *=42 +=43 ,=44
' -=45 .=46 :=58 ;=59 <=60 ==61 >=62 ?=63 @=64 [=91 ]=93 ^=94 _=95
' ä=225 ß=226 ö=239 ü=245
' Zahlen
' 0=48 1=49 2=50 3=51 4=52 5=53 6=54 7=55 8=56 9=57 /=47
' Großbuchstaben
' A=65 B=66 C=67 D=68 E=69 F=70 G=71 H=72 I=73 J=74 K=75 L=76 M=77
' N=78 O=79 P=80 Q=81 R=82 S=83 T=84 U=85 V=86 W=87 X=88 Y=89 Z=90
' Kleinbuchstaben
' a=97 b=98 c=99 d=100 e=101 f=102 g=103 h=104 i=105 j=106 k=107 l=108 m=109
' n=110 o=111 p=112 q=113 r=114 s=115 t=116 u=117 v=118 w=119 x=120 y=121 z=122

'--- LCD-Display Befehlssatz - (in Dezimalzahlen) ---------------------------
' Befehle
' 1 = CLS - Display löschen
' 12 = Cursor aus und blinken aus
' 13 = Cursor aus und blinken ein
' 14 = Cursor ein und blinken aus
' 15 = Cursor ein und blinken ein
' Cursor Position im Display
' 128 = Zeile 1, Position 1 >>> 147 = Zeile 1, Position 20
' 192 = Zeile 2, Position 1 >>> 211 = Zeile 2, Position 20
' ---------------------------------------------------------------------------

' --- Betriebssystem konfigurieren ------------------------------------------
include "om06.inc" ' Betriebssystem Daten laden
pullupa = &b00110000 ' Schaltet die internen Pull-Up-Widerstaende an
' Port 5 & 6 ein. Dadurch müssen keine Externen
' Widerstände an SDA und SCL angeschlossen werden.
' ---------------------------------------------------------------------------

' --- definition der Ports --------------------------------------------------
define SCL port[5] ' externe Pull-Up-Widerstaende sind nicht unbedingt
define SDA port[6] ' notwendig, wenn interne Pull-Ups aktiviert sind
' --- definition der Variablen ----------------------------------------------
define PCF_Daten byte[1] ' Datensatz der zum PCF8574 übertragen wird
define LCD_RS bit[1] ' PCF8574 Port1
define LCD_R_W bit[2] ' PCF8574 Port2
define LCD_Enabel bit[3] ' PCF8574 Port3
define LCD_Licht bit[4] ' PCF8574 Port4
define LCD_D4 bit[5] ' PCF8574 Port5
define LCD_D5 bit[6] ' PCF8574 Port6
define LCD_D6 bit[7] ' PCF8574 Port7
define LCD_D7 bit[8] ' PCF8574 Port8
' ---------------------------------------------------------------------------
define Daten byte[2] ' LCD-Display Zeichensatz und Cursor Position
define D_bit1 bit[9] ' Zeichensatz Bit1
define D_bit2 bit[10] ' Zeichensatz Bit2
define D_bit3 bit[11] ' Zeichensatz Bit3
define D_bit4 bit[12] ' Zeichensatz Bit4
define D_bit5 bit[13] ' Zeichensatz Bit5
define D_bit6 bit[14] ' Zeichensatz Bit6
define D_bit7 bit[15] ' Zeichensatz Bit7
define D_bit8 bit[16] ' Zeichensatz Bit8
' ---------------------------------------------------------------------------
define Adresse byte[3] ' I2C-Bus Adresse
define ACK byte[4] ' I2C-Bus "ACK" vom Slave
' --- Voreinstellung und Initialisierung ------------------------------------
gosub i2c_init ' Initialisirung I2C-Bus
Adresse = 64 ' I2C Adresse vom PCF8574
gosub Display_init ' LCD-Display Initialisieren
LCD_Licht = on ' Hintergrundbeleuchtung ein
Display_Befehl 12 ' Cursor aus und blinken aus
' ---------------------------------------------------------------------------


' ---------------------------------------------------------------------------
' --- Hauptprogramm ---------------------------------------------------------
' ---------------------------------------------------------------------------
#programm_anfang
Display_Befehl 1 ' CLS - Display löschen
pause 50 ' 1 Sekunde Pause
Display_Zeichen "I" ' Zeichen I auf das Display schreiben
Display_Zeichen "2" ' Zeichen 2 auf das Display schreiben
Display_Zeichen "C" ' Zeichen C auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "B" ' Zeichen B auf das Display schreiben
Display_Zeichen "u" ' Zeichen u auf das Display schreiben
Display_Zeichen "s" ' Zeichen s auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "L" ' Zeichen L auf das Display schreiben
Display_Zeichen "C" ' Zeichen C auf das Display schreiben
Display_Zeichen "D" ' Zeichen D auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "D" ' Zeichen D auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "s" ' Zeichen s auf das Display schreiben
Display_Zeichen "p" ' Zeichen p auf das Display schreiben
Display_Zeichen "l" ' Zeichen l auf das Display schreiben
Display_Zeichen "a" ' Zeichen a auf das Display schreiben
Display_Zeichen "y" ' Zeichen y auf das Display schreiben
' ---------------------------------------------------------------------------
Display_Befehl 192 ' Display auf Zeile 2 Position 0
Display_Zeichen "m" ' Zeichen m auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "t" ' Zeichen t auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "d" ' Zeichen d auf das Display schreiben
Display_Zeichen "e" ' Zeichen e auf das Display schreiben
Display_Zeichen "r" ' Zeichen r auf das Display schreiben
Display_Zeichen " " ' Zeichen auf das Display schreiben
Display_Zeichen "O" ' Zeichen O auf das Display schreiben
Display_Zeichen "p" ' Zeichen p auf das Display schreiben
Display_Zeichen "e" ' Zeichen e auf das Display schreiben
Display_Zeichen "n" ' Zeichen n auf das Display schreiben
Display_Zeichen "-" ' Zeichen - auf das Display schreiben
Display_Zeichen "M" ' Zeichen M auf das Display schreiben
Display_Zeichen "i" ' Zeichen i auf das Display schreiben
Display_Zeichen "c" ' Zeichen c auf das Display schreiben
Display_Zeichen "r" ' Zeichen r auf das Display schreiben
Display_Zeichen "o" ' Zeichen o auf das Display schreiben
pause 200 ' 4 Sekunden Pause
goto programm_anfang
' ---------------------------------------------------------------------------

end
' ---------------------------------------------------------------------------


' ---------------------------------------------------------------------------
' --- LCD-Display Routine ---------------------------------------------------
' ---------------------------------------------------------------------------
#Display_init
' --- Initialisierung für den 4-Bit Modus - 2 Zeilen, 5x7 Font --------------
' ---------------------------------------------------------------------------
' Befehl | RS | R/W | DB7 | DB6 | DB5 | DB4 | Bemerkung
' ---------------------------------------------------------------------------
' Fun. Set | 0 | 0 | 0 | 0 | 1 | 0 | 4-Bit Datenlänge einschalten
' ---------------------------------------------------------------------------
' Fun. Set | 0 | 0 | 0 | 0 | 1 | 0 | 4_Bit - 2-Zeiliges Display,
' | 0 | 0 | 1 | 0 | 0 | 0 | 5x7 Font
' ---------------------------------------------------------------------------
' Display | 0 | 0 | 0 | 0 | 0 | 0 | Display ein, Cursor ein,
' on/off | 0 | 0 | 1 | 1 | 1 | 1 | Cursor blinken
' ---------------------------------------------------------------------------
' Clear | 0 | 0 | 0 | 0 | 0 | 0 | Display löschen, Cursor auf
' Display | 0 | 0 | 0 | 0 | 0 | 1 | 1.Spalte von 1.Zeile
' ---------------------------------------------------------------------------
' Entry | 0 | 0 | 0 | 0 | 0 | 0 | Cursor Auto-Increment
' Mode Set | 0 | 0 | 0 | 1 | 1 | 0 |
' ---------------------------------------------------------------------------
Display_Befehl &b00000010 ' Enabel off und 4-Bit Datenlänge einschalten
Display_Befehl &b00101000 ' 4-Bit 2-Zeiliges Display
Display_Befehl &b00001111 ' Display ein, Cursor ein, blinken ein
Display_Befehl &b00000001 ' CLS - Display löschen
Display_Befehl &b00000110 ' Cursor Auto-Increment
return
' ---------------------------------------------------------------------------
#Display_Befehl ' Befehlsebene - Curser setzen
Daten = Pop ' Datenzuweisung vom Rechenstack
LCD_RS = off : LCD_R_W = off ' Register auf Befehlsebene setzen
goto Display_loop ' interner Sprungpunkt
' ---------------------------------------------------------------------------
#Display_Zeichen ' Zeichenebene - Daten anzeigen
Daten = Pop ' Datenzuweisung vom Rechenstack
LCD_RS = on : LCD_R_W = off ' Register auf Daten Anzeige setzen
' ---------------------------------------------------------------------------
#Display_loop ' Aufteilung von "Daten" in den 4-Bit Modus
gosub i2c_start ' I2C-Bus starten
ACK = i2c_write(adresse) ' Adresse senden, ACK empfangen
LCD_D4 = D_bit5 : LCD_D5 = D_bit6 : LCD_D6 = D_bit7 : LCD_D7 = D_bit8 ' Daten Zuweisung
gosub Display_Pulse ' I2C Pulse und Daten übertragen
LCD_D4 = D_bit1 : LCD_D5 = D_bit2 : LCD_D6 = D_bit3 : LCD_D7 = D_bit4 ' Daten Zuweisung
gosub Display_Pulse ' I2C Pulse und Daten übertragen
gosub i2c_stop ' I2C-Bus stoppen
return
' ---------------------------------------------------------------------------
#Display_Pulse ' I2C Pulse und Daten übertragen
LCD_Enabel = on ' Enable = High
ACK = i2c_write(PCF_Daten) ' PCF8574 Einstellung zum Display senden, ACK empfangen
LCD_Enabel = off ' Enable = Low
ACK = i2c_write(PCF_Daten) ' PCF8574 Eindtellung zum Display senden, ACK empfangen
return
' ---------------------------------------------------------------------------


' ---------------------------------------------------------------------------
' --- I2C-Routinen fuer 100 kHz Bustakt einbinden ---------------------------
' ---------------------------------------------------------------------------
include "om_i2c.inc"


Gruß Dirk