Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: I2C_LCD - bitte um Hilfe Kategorie: Programmierung Basic (von Robby - 10.01.2009 17:29)
 Als Antwort auf Re: I2C_LCD - bitte um Hilfe von Jens - 10.01.2009 11:03
> Hallo Robby!
>
> Anbei dass Listing meiner LCD-Display Ansteuerung. Du musst nur die Ports vom PCF anpassen, dann kannst Du die Routine auch für Deine Zwecke verwenden.
>
> Viel Erfolg...
> LG Jens
>
>
> ' ---------------------------------------------------------------------------
> ' --- 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 "om.def"            ' Betriebssystem Daten der Open-Micro laden
> 'include "omid.def"         ' Betriebssystem Daten der Open-Midi laden
> ' ---------------------------------------------------------------------------
>
> ' --- 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
> define iii        byte[5]   ' Index für die Tabele
> ' --- 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
> ' ---------------------------------------------------------------------------
>
>
> ' ---------------------------------------------------------------------------
> ' Die I2C-Routinen einbinden
> ' ---------------------------------------------------------------------------
> INCLUDE "om_i2c.pro"
>
> ' ---------------------------------------------------------------------------
> ' Die Firmware-Routinen einbinden
> ' ---------------------------------------------------------------------------
> INCLUDE "om_fw.pro"

Hallo Jens,
erst mal vielen lieben Dank für die superschnelle Hilfe.

Aber leider will es nicht funktionieren, irdendwas mache ich noch falsch.
Technisch ist das LCD i.O. - an der C-Micro läuft es.
An deinem Proggi habe ich die Ports entspechend dem Datenblatt geändert :

' --- definition der Variablen ----------------------------------------------
define PCF_Daten  byte[1]   ' Datensatz der zum PCF8574 übertragen wird
define LCD_RS      bit[6]   ' PCF8574 Port6     org bit1
define LCD_R_W     bit[5]   ' PCF8574 Port5     org bit2
define LCD_Enabel  bit[7]   ' PCF8574 Port7     org bit3
define LCD_Licht   bit[8]   ' PCF8574 Port8     org bit4
define LCD_D4      bit[1]   ' PCF8574 Port1     org bit5
define LCD_D5      bit[2]   ' PCF8574 Port2     org bit6
define LCD_D6      bit[3]   ' PCF8574 Port3     org bit7
define LCD_D7      bit[4]   ' PCF8574 Port4     org bit8

Die Adresse 64 stimmt, es sind alle Jumper gesteckt.

In der OM_I2C.pro habe ich die Ports geändert :

' --- Portdefinitionen ------------------------------------------------------

DEFINE SCL bPTB0        'PTB0  = PORT[9]
DEFINE SDA bPTB1        'PTB1  = PORT[10]
DEFINE I2CPORT PTA      'PORTA = BYTEPORT[1]
DEFINE I2CDDR DDRA      'DDRA  = BYTEPORT[1]

Das Einzige was sich tut, im Terminalproggi kommen wirre Zeichen und [I/O_ERR] an.
SCL und SDA sind high ( 4,51 Volt) und es tut sich da auch nichts, oder mein Messgerät ist zu lahm.

Irgendwie verliere ich wohl dabei noch meine letzten 3 Haare :-) .

Grüße, Robby und vielen Dank noch mal.

 Antwort schreiben

Bisherige Antworten:

Re: I2C_LCD - bitte um Hilfe (von Robby - 10.01.2009 19:58)