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: