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 19:58)
 Als Antwort auf Re: I2C_LCD - bitte um Hilfe von Robby - 10.01.2009 17:29
> > 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.

Nachtrag : Hallo Jens,

ich habe jetzt mein Hardwarezeugs umgelötet und die vorgegebenen Ports für SCL und SDA benutzt.
Was soll ich sagen - ich bin begeistert - es funzt bestens. Ich muss dann wohl sicherlich in der OM_IIC.PRO noch was ändern um auf meine Ports zu kommen.
Wenn dir noch was auffällt kannst du es ja mitteilen, ich wäre dankbar.

Auf alle Fälle recht vielen Dank für deine schnelle Hilfe.
MfG, Robby.

 Antwort schreiben

Bisherige Antworten: