Autor Beitrag
comes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Do 26.12.02 22:17 
Hi leute!

Bei mir gab es vom weihnachtsmann was ganz tolles!
Nen I²C BUS. Leider sind da nur blöde PASCAL codes und C Codes dazu. Da mein Pascal und mein C nicht so super toll sind und mein delphi sich damit noch nicht auseinander gesetzt hat, will ich hier mal nachfragen ob hier jemand ahnung von I²C hat? Das ganze gibt es bei ELV zukaufen.
das ganze geht über den RCF8574 baustein. und geht über ein standart LCD-Display (z.b. LCD 162C von displaytech).

Währe super junges, wenn ihr mir irgendwie helfen könnt!


machts gut jungs
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: Fr 27.12.02 01:41 
Hallo,

zu nächst einmal vermute ich, dass es sich um der PCF 8574 :wink: von Philips handelt, also ein 8 Bit biderektionaler I2C I/O Baustein von Philips. An diesem ist das LCD angedrahtet.

Wie Du bemerkt hast ist ein Pascal Beispiel dabei. Da Delphi auf Pascal basiert dürfte es ein einfaches sein diesen Code umzusetzten.

Wahrscheinlich brauchst Du nur die IO-Zugriffe umzusetzen, je nach dem wie das Modul an den PC angedrahtet wird.

Matthias
comes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Fr 27.12.02 11:01 
hi!

Danke erstmal für die antwort! ja, der pcf8574 is von philips. An der ganzen geschichte hängt das komplette I²C PC interface dran.

Ich brauch jedoch ne übersetzung von dem pascal code, der dem delphi code sehr ähnlich ist. Jedoch mangelt es bei mir an der Pascal erfahrung und delphierfahrung speziell auf dieses problem.

pcf8574.pas (treiber für den pcf8574)
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
{**************************************************************************}
{ ELV-IIC-Routinen fr das 8 Bit-I/O-Board       Dateiname : PCF8574.PAS   }
{                                                                          }
{ letzte Žnderung: 01.04.96 durch H. Hotze                                 }
{                                                                          }
{ (c) ELV UK LTD                                                           }
{**************************************************************************}

Unit PCF8574;

Interface

const PCF8574_WRITE  = 64;
      PCF8574_READ   = 65;
      PCF8574A_WRITE = 112;
      PCF8574A_READ  = 113;

{**************************************************************************}

Function iic_sende_pcf8574 (adr : byte; data : byte) : boolean;
{ Ausgabe eines Bytes "data" an den PCF 8574 mit der Adresse "adr"
  Eingabe  : data : 0..255
             adr  : 0..7  A0..A3 des PCF
  Rckgabe : 0 : kein ACK vom Slave empfangen --> šbertragungsfehler
             1 : ACK vom Slave empfangen --> šbertragung ok
}


Function iic_sende_pcf8574a (adr : byte; data : byte) : boolean;
{ Ausgabe eines Bytes "data" an den PCF 8574A mit der Adresse "adr"
  Eingabe  : data : 0..255
             adr  : 0..7  A0..A3 des PCF
  Rckgabe : 0 : kein ACK vom Slave empfangen --> šbertragungsfehler
             1 : ACK vom Slave empfangen --> šbertragung ok
}


Function iic_lese_pcf8574 (adr : byte; var data : byte) : boolean;
{ Einlesen eines Bytes "data" vom PCF 8574 mit der Adresse "adr"
  Eingabe  : adr  : 0..7  A0..A3 des PCF
  Rckgabe : data : 0..255 gelesenes Byte
                0 : kein ACK vom Slave empfangen --> šbertragungsfehler
                1 : ACK vom Slave empfangen --> šbertragung ok   }


Function iic_lese_pcf8574a (adr : byte; var data : byte) : boolean;
{ Einlesen eines Bytes "data" vom PCF 8574 mit der Adresse "adr"
  Eingabe  : adr  : 0..7  A0..A3 des PCF
  Rckgabe : data : 0..255 gelesenes Byte
                0 : kein ACK vom Slave empfangen --> šbertragungsfehler
                1 : ACK vom Slave empfangen --> šbertragung ok   }




Implementation

uses  CRT, DOS, IIC;


{**************************************************************************}


Function iic_sende_pcf8574 (adr : byte; data : byte) : boolean;
{ Ausgabe eines Bytes "data" an den PCF 8574 mit der Adresse "adr"
  Eingabe  : data : 0..255
             adr  : 0..7  A0..A3 des PCF
  Rckgabe : 0 : kein ACK vom Slave empfangen --> šbertragungsfehler
             1 : ACK vom Slave empfangen --> šbertragung ok
}
var ret : boolean;
begin
  iic_start;
  ret := iic_sende_byte (PCF8574_WRITE + adr*2 );
  if ret then
  begin
    ret := iic_sende_byte (data);
    if ret then iic_stop;
  end;
  iic_sende_pcf8574 := ret;
end;


Function iic_sende_pcf8574a (adr : byte; data : byte) : boolean;
{ Ausgabe eines Bytes "data" an den PCF 8574A mit der Adresse "adr"
  Eingabe  : data : 0..255
             adr  : 0..7  A0..A3 des PCF
  Rckgabe : 0 : kein ACK vom Slave empfangen --> šbertragungsfehler
             1 : ACK vom Slave empfangen --> šbertragung ok
}
var ret : boolean;
begin
  iic_start;
  ret := iic_sende_byte (PCF8574A_WRITE + adr*2 );
  if ret then
  begin
    ret := iic_sende_byte (data);
    if ret then iic_stop;
  end;
  iic_sende_pcf8574a := ret;
end;


Function iic_lese_pcf8574 (adr : byte; var data : byte) : boolean;
{ Einlesen eines Bytes "data" vom PCF 8574 mit der Adresse "adr"
  Eingabe  : adr  : 0..7  A0..A3 des PCF
  Rckgabe : data : 0..255 gelesenes Byte
                0 : kein ACK vom Slave empfangen --> šbertragungsfehler
                1 : ACK vom Slave empfangen --> šbertragung ok   }
var ret : boolean;
begin
  iic_start;
  ret := iic_sende_byte (PCF8574_READ + adr*2 );
  if ret then
  begin
    data := iic_lese_byte (false);
    iic_stop;
  end else data := 0;
  iic_lese_pcf8574 := ret;
end;


Function iic_lese_pcf8574a (adr : byte; var data : byte) : boolean;
{ Einlesen eines Bytes "data" vom PCF 8574 mit der Adresse "adr"
  Eingabe  : adr  : 0..7  A0..A3 des PCF
  Rckgabe : data : 0..255 gelesenes Byte
                0 : kein ACK vom Slave empfangen --> šbertragungsfehler
                1 : ACK vom Slave empfangen --> šbertragung ok   }
var ret : boolean;
begin
  iic_start;
  ret := iic_sende_byte (PCF8574A_READ + adr*2 );
  if ret then
  begin
    data := iic_lese_byte (false);
    iic_stop;
  end else data := 0;
  iic_lese_pcf8574a := ret;
end;


Begin

End.


iic_lcd.pas
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
{**************************************************************************}
{ ELV-IIC-Routinen fr das IIC-LCD-Board       Dateiname : IIC_LCD.PAS     }
{                                                                          }
{ letzte Žnderung: 04.04.97 durch H. Hotze                                 }
{                                                                          }
{ (c) ELV UK LTD                                                           }
{**************************************************************************}

Unit IIC_LCD;

Interface

type    lcd_zeile = string[64];

const   LCD_ADR_WR      = 64;  (* Adresse fr den IO-Baustein PCF 8574 *)
        LCD_ADR_RD      = 65;
{
        LCD_ADR_WR      = 112; (* Adresse fr den IO-Baustein PCF 8574A *)
        LCD_ADR_RD      = 113;
}

        (* allgemeine Definitionen *)
        LOESCHEN        = 1;    (* Display l”schen                   *)
        CURSOR_0        = 2;    (* Cursor auf 0                      *)

        (* Cursor-inc/dec  Anzeige schieben ein/aus               *)
        DEC_NO_SHIFT    = 4;    (* Cursor dec Anzeige nicht schieben *)
        INC_NO_SHIFT    = 6;    (* Cursor inc Anzeige nicht schieben *)
        DEC_SHIFT       = 5;    (* Cursor dec Anzeige schieben       *)
        INC_SHIFT       = 7;    (* Cursor inc Anzeige schieben       *)

        (* Anzeige ein/aus  Cursor ein/aus/blinkend               *)
        DISPLAY_AUS     = 8;    (* Anzeige aus                       *)
        CURSOR_AUS      = $c;   (* Anzeige An Cursor aus             *)
        CURSOR_AN       = $e;   (* Anzeige an Cursor an              *)
        CURSOR_BLINK    = $f;   (* Anzeige an Cursor blinken         *)

        (* Cursor/Anzeige nach links/rechts schieben              *)
        DISP_LINKS      = $18;  (* Anzeige nach links schieben       *)
        DISP_RECHTS     = $1c;  (* Anzeige nach rechts schieben      *)
        CURSOR_LINKS    = $10;  (* Cursor nach links schieben        *)
        CURSOR_RECHTS   = $14;  (* Cursor nach rechts schieben       *)

        (* 4/8bit-Interface  1/2 Zeilen Anzeige  5x10/5x7 Punkte  *)
        BIT4_ZEIL1_5x7  = $20;  (* 4 Bit 1 Zeile  5x7 Zeichen        *)
        BIT4_ZEIL1_5x10 = $24;  (* 4 Bit 1 Zeile  5x10 Zeichen       *)
        BIT4_ZEIL2_5x7  = $28;  (* 4 Bit 2 Zeile  5x7 Zeichen        *)
        BIT4_ZEIL2_5x10 = $2c;  (* 4 Bit 2 Zeile  5x10 Zeichen       *)
        BIT8_ZEIL1_5x7  = $30;  (* 8 Bit 1 Zeile  5x7 Zeichen        *)
        BIT8_ZEIL1_5x10 = $34;  (* 8 Bit 1 Zeile  5x10 Zeichen       *)
        BIT8_ZEIL2_5x7  = $38;  (* 8 Bit 2 Zeile  5x7 Zeichen        *)
        BIT8_ZEIL2_5x10 = $3c;  (* 8 Bit 2 Zeile  5x10 Zeichen       *)

        SET_CG = $40;           (* Adresse des Zeichensatzes setzen (6 Bit) *)
        SET_DD = $80;           (* Adresse des DatenRAM's setzen (7 Bit)    *)

        (* Definition der Steuerleitungen     *)
        LED  = 1;  (* D0 0 : LED-Hintergrundbeleuchtng ein  *)
        RS   = 2;  (* D1 Registerauswahl *)
        EN   = 4;  (* D2 Enable          *)
        READ = 8;  (* D3 Schreiben/lesen *)


Function lcd_sende_befehl (adr : byte; befehl : byte) : boolean;
{******************************************************************/
/* Befehl in das Befehlsregister der LCD-Anzeige schreiben        */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        befehl  : Befehlsbyte                               */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}


Function lcd_sende_daten (adr : byte; daten : byte) : boolean;
{******************************************************************/
/* Daten in das Datenregister der LCD-Anzeige schreiben           */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        daten   : Datenbyte                                 */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}


Function lcd_sende_string (adr : byte; str : lcd_zeile) : boolean;
{******************************************************************/
/* String in das Datenregister schreiben.                         */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        str     : String mit max. 64 Zeichen                */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}


Function lcd_x_y (adr : byte; x : byte; y : byte; cl : byte) : boolean;
{******************************************************************/
/* Curser auf die ang Position x/y setzen und event. ab der       */
/* Position Zeichen l”schen                                       */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        x       : 0..63 x-Position des Cursors              */
/*            y       : 0 : 1. Zeile                              */
/*                      1 : 2. Zeile                              */
/*            cl      : 0..   Zeichen ab der Curserpos. l”schen   */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}


Function lcd_init (adr : byte; mode : byte) : boolean;
{******************************************************************/
/* Initialisierung der LCD-Anzeige                                */
/* šbergeben wir der Anzeigenmode z.B. lcd_init (BIT8_ZEIL2_5x7); */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*            mode    : LCD-MODE-Byte                             */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}


Function lcd_beleuchtung (adr : byte; led : boolean) : boolean;
{******************************************************************/
/* LCD-Hintergrungbeleuchtung schalten                            */
/* Eingabe  : adr         : 0..3  IIC-Adresse des PCF8574         */
/*        led : false : Beleuchtung ein                       */
/*                  true  : Beleuchtung aus                       */
/* Rckgabe : false       : šbertragungsfehler                    */
/*            true        : šbertragung ok                        */
/******************************************************************}



{**************************************************************************}


Implementation

uses  CRT, DOS, IIC;

var   merker     : byte;


{**************************************************************************}


Function lcd_sende_befehl (adr : byte; befehl : byte) : boolean;
{******************************************************************/
/* Befehl in das Befehlsregister der LCD-Anzeige schreiben        */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        befehl  : Befehlsbyte                               */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}
var ret : boolean;
begin
  delay (1);
  iic_start;
  ret := iic_sende_byte (LCD_ADR_WR + adr*2 ); { IO-Slave-Adresse }

  merker := merker AND 1;                      { D1..D7 l”schen }
  merker := merker OR (befehl AND 240);        { oberes Nibble  }

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
  if ret then ret := iic_sende_byte (merker);

  delay (1);
  merker := merker AND 1;                      { D1..D7 l”schen }
  merker := merker OR (befehl SHL 4);          { unteres Nibble }

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
  if ret then ret := iic_sende_byte (merker);

  if ret then iic_stop;
  lcd_sende_befehl := ret;
end;


Function lcd_sende_daten (adr : byte; daten : byte) : boolean;
{******************************************************************/
/* Daten in das Datenregister der LCD-Anzeige schreiben           */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        daten   : Datenbyte                                 */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}
var ret : boolean;
begin
  delay (1);
  iic_start;
  ret := iic_sende_byte (LCD_ADR_WR + adr*2 ); { IO-Slave-Adresse }

  merker := merker AND 1;                      { D1..D7 l”schen }
  merker := merker OR (daten AND 240) OR RS;   { oberes Nibble  }

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
  if ret then ret := iic_sende_byte (merker);

  delay (1);
  merker := merker AND 1;                      { D1..D7 l”schen }
  merker := merker OR (daten SHL 4) OR RS;     { unteres Nibble }

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
  if ret then ret := iic_sende_byte (merker);

  if ret then iic_stop;
  lcd_sende_daten := ret;
end;


Function lcd_sende_string (adr : byte; str : lcd_zeile) : boolean;
{******************************************************************/
/* String in das Datenregister schreiben.                         */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        str     : String mit max. 64 Zeichen                */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}
var ret : boolean;
    z   : byte;
begin
  delay (1);
  iic_start;
  ret := iic_sende_byte (LCD_ADR_WR + adr*2 ); { IO-Slave-Adresse }

  if (length(str) > 0) then                    { alle Zeichen ausgeben }
  begin
    for z:=1 to length(str) do
    begin
      merker := merker AND 1;                          { D1..D7 l”schen }
      merker := merker OR (ord(str[z]) AND 240) OR RS; { oberes Nibble  }

      if ret then ret := iic_sende_byte (merker);
      if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
      if ret then ret := iic_sende_byte (merker);

      delay (1);
      merker := merker AND 1;                          { D1..D7 l”schen }
      merker := merker OR (ord(str[z]) SHL 4) OR RS;   { unteres Nibble }

      if ret then ret := iic_sende_byte (merker);
      if ret then ret := iic_sende_byte (merker OR EN); { Ausgabe }
      if ret then ret := iic_sende_byte (merker);
    end;
  end;
  if ret then iic_stop;
  lcd_sende_string := ret;
end;


Function lcd_x_y (adr : byte; x : byte; y : byte; cl : byte) : boolean;
{******************************************************************/
/* Curser auf die ang Position x/y setzen und event. ab der       */
/* Position Zeichen l”schen                                       */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*        x       : 0..63 x-Position des Cursors              */
/*            y       : 0 : 1. Zeile                              */
/*                      1 : 2. Zeile                              */
/*            cl      : 0..   Zeichen ab der Curserpos. l”schen   */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}
var ret : boolean;
begin
  if (y<>0) then x := x + $40;                  { Adresse berechnen }

  ret :=  lcd_sende_befehl (adr, SET_DD OR x);  { Zeiger setzen }

  if (cl<>0) then { Zeichen l”schen ? }
  begin
    while (cl<>0) do
    begin
      if (ret) then ret := lcd_sende_daten (adr,32); { Zeichen l”schen }
    end;
    if (ret) then ret := lcd_sende_befehl (adr, SET_DD OR x); { Ziger zurcksetzen }
  end;
  lcd_x_y := ret;
end;


Function lcd_init (adr : byte; mode : byte) : boolean;
{******************************************************************/
/* Initialisierung der LCD-Anzeige                                */
/* šbergeben wir der Anzeigenmode z.B. lcd_init (BIT8_ZEIL2_5x7); */
/* Eingabe  : adr     : 0..3  IIC-Adresse des PCF8574             */
/*            mode    : LCD-MODE-Byte                             */
/* Rckgabe : false   : šbertragungsfehler                        */
/*            true    : šbertragung ok                            */
/******************************************************************}
var ret : boolean;
begin
  delay (15);    { min. 25ms warten nach dem Anlegen der Versorgungsspannung }

  iic_start;
  ret := iic_sende_byte (LCD_ADR_WR + adr*2 ); { IO-Slave-Adresse }

  merker := merker AND 1;                      { D1..D7 l”schen }
  merker := merker OR 48;

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN);
  if ret then ret := iic_sende_byte (merker);

  delay (5); { min. 4,1ms warten }

  if ret then ret := iic_sende_byte (merker OR EN);
  if ret then ret := iic_sende_byte (merker);

  delay (1); { min. 100us warten }

  if ret then ret := iic_sende_byte (merker OR EN);
  if ret then ret := iic_sende_byte (merker);

  delay (1); { min. 100us warten }

  merker := merker AND 1; { D1..D7 l”schen }
  merker := merker OR 32;

  if ret then ret := iic_sende_byte (merker);
  if ret then ret := iic_sende_byte (merker OR EN);
  if ret then ret := iic_sende_byte (merker);

  iic_stop;

  if (ret) then ret := lcd_sende_befehl (adr, mode);         { Mode setzen }
  if (ret) then ret := lcd_sende_befehl (adr, DISPLAY_AUS);  { Anzeige aus }
  if (ret) then ret := lcd_sende_befehl (adr, LOESCHEN);     { Anzeige l”schen}
  { Cursor aus, Anzeige nicht schieben }
  if (ret) then ret := lcd_sende_befehl (adr, INC_NO_SHIFT);
  { Cursor aus, Anzeige an }
  if (ret) then ret := lcd_sende_befehl (adr, CURSOR_AUS);

  lcd_init := ret;
end;


Function lcd_beleuchtung (adr : byte; led : boolean) : boolean;
{******************************************************************/
/* LCD-Hintergrungbeleuchtung schalten                            */
/* Eingabe  : adr         : 0..3  IIC-Adresse des PCF8574         */
/*        led : false : Beleuchtung ein                       */
/*                  true  : Beleuchtung aus                       */
/* Rckgabe : false       : šbertragungsfehler                    */
/*            true        : šbertragung ok                        */
/******************************************************************}
var ret : boolean;
begin

  if (led) then merker := merker AND 254 { Beleuchtung ein --> D0 auf 0 }
  else          merker := merker OR  1;  { Beleuchtung aus --> D0 auf 1 }
  iic_start;
  ret := iic_sende_byte (LCD_ADR_WR + adr*2 ); { IO-Slave-Adresse }
  if ret then ret := iic_sende_byte (merker);
  if ret then iic_stop;

  lcd_beleuchtung := ret;
end;


Begin

End.


iic.pas
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
{**************************************************************************}
{ ELV-IIC-PC-Interface V1.0     08.02.96    Dateiname : IIC.PAS            }
{                                                                          }
{ letzte Žnderung: 01.04.96 durch H. Hotze                                 }
{                                                                          }
{ (c) ELV UK LTD                                                           }
{**************************************************************************}

Unit IIC;

Interface

{**************************************************************************}

Procedure SDA_HIGH;
{ SDA-Leitung auf High }


Procedure SDA_LOW;
{ SDA-Leitung auf Low }


Function LESE_SDA : boolean;
{ auslesen der SDA-Leitung }
{ 0 : Low   1 : High       }


Procedure SCL_HIGH;
{ SCL-Leitung auf High }


Procedure SCL_LOW;
{ SCL-Leitung aus Low }


Function LESE_INT : boolean;
{ Prft, ob die INT-LEitung aktiviert ist                   }
{ 0 : kein Interrupt   1 : Interrupt aktiv (Signal auf Low) }


Function LESE_SCL : boolean;
{ auslesen der SCL-Leitung }
{ 0 : Low   1 : High }


Function INIT_IIC (port_nr : byte) : word;
{ IIC2 Initialisieren                  }
{ Eingabe :  0 : an LPT1..3 suchen       }
{            1 : LPT 1                   }
{            2 : LPT 2                   }
{            3 : LPT 3                   }
{ Rckgabe : Basisadresse des LPT-Portes }
{            0 : IIC 2 nicht gefunden  }


Procedure DEINIT_IIC;
{ alte Portzust„nde wieder hersellen }


Procedure set_port_delay (b : byte);
{ Wartezeit fr den Zugriff auf den Parallel-Port setzen }


{***********************}
{ IIC-Bus Grundroutinen }
{***********************}
Procedure iic_start;
{ IIC-Startbit senden }


Procedure iic_stop;
{ IIC-Stopbit senden }


Function iic_lese_byte (ack : boolean) : byte;
{ Byte ber den IIC-Bus lesen }
{ ist das ack-Flag gesetzt, so wird ein ACK-Flag gesendet }
{ Zurckgegeben wird das empfangene Byte }


Function iic_sende_byte (data : byte) : boolean;
{ Es wird ein Byte ber den IIC Bus gesendet und anschlie0end ein   }
{ ACK vom Slave erwartet. Es wird 1 zurckgegeben, wenn ein ACK vom }
{ Slave empfangen wurde.                                            }




{************************************************************************}



Implementation

uses  CRT, DOS;

var   portadresse : word; { Portadresse des LPT-Portes }
      port_delay  : byte;
      datenmerker : byte;


{**********************************}
{ Routinen zur Hardwareansteuerung }
{**********************************}

procedure warte_port;
var t     : byte;
    dummy : byte;
begin
  t := port_delay;
  while (t>0) do
  begin
    dec (t);
    dummy := port[portadresse];
  end;
end;


Procedure SDA_HIGH;
{ SDA-Leitung auf High }
begin
  datenmerker := datenmerker AND 253;  { D1 l”schen --> SDA high}
  port [portadresse] := datenmerker;
  warte_port;
end;


Procedure SDA_LOW;
{ SDA-Leitung auf Low }
Begin
  datenmerker := datenmerker OR 2;  { D1 setzen --> SDA low}
  port [portadresse] := datenmerker;
  warte_port;
End;


Function LESE_SDA : boolean;
{ auslesen der SDA-Leitung }
{ 0 : Low   1 : High       }
begin
  if port[portadresse + 1] AND 64 <> 0 then LESE_SDA := false
    else                                    LESE_SDA := true;
End;


Procedure SCL_HIGH;
{ SCL-Leitung auf High }
Begin
  datenmerker := datenmerker AND 254;  { D0 l”schen --> SCL high}
  port [portadresse] := datenmerker;
  warte_port;
End;


Procedure SCL_LOW;
{ SCL-Leitung aus Low }
Begin
  datenmerker := datenmerker OR 1;  { D0 setzen --> SCL low}
  port [portadresse] := datenmerker;
  warte_port;
End;


Function LESE_INT : boolean;
{ Prft, ob die INT-LEitung aktiviert ist                   }
{ 0 : kein Interrupt   1 : Interrupt aktiv (Signal auf Low) }
begin
  if port[portadresse + 1] AND 32 <> 0 then LESE_INT := true
    else                                    LESE_INT := false;
End;


Function LESE_SCL : boolean;
{ auslesen der SCL-Leitung }
{ 0 : Low   1 : High }
Begin
  if port[portadresse + 1] AND 8 <> 0 then LESE_SCL := false
    else                                   LESE_SCL := true;
End;


Function IIC_OK : boolean;
{ prft, ob der LAP95 am LPT-Port angeschlossen ist }
var ok : boolean;
begin
  ok := true;

  { BUSY muá High Pegel fhren }
  if (port[portadresse+1] and 128) <> 0 then ok:=false;
  if ok  then { Rckmeldung der /SLCT-Leitung ber die ONLINE-Leitung prfen }
  begin
    port [portadresse+2] := 12; { /SLCT = LOW }
    warte_port;
    if (port[portadresse+1] and 16) = 0 then ok := false; { ONLINE-Leitung prfen }
    if ok then
    begin
      port [portadresse+2] := 4; { /SLCT = HIGH }
      warte_port;
      if (port[portadresse+1] and 16) <> 0 then { ONLINE-Leitung prfen }
      begin
        ok := false;
        port [portadresse+2] := 12; { alte Portzust„nde herstellen }
      end;
    end;
  end;
  if ok then
  begin
    port[portadresse] := 0; { SDA und SCL auf High, D0 und D1 auf Low }
    datenmerker       := 0;
  end;
  IIC_OK := ok;
end;


Function INIT_IIC (port_nr : byte) : word;
{ IIC2 Initialisieren                  }
{ Eingabe :  0 : an LPT1..3 suchen       }
{            1 : LPT 1                   }
{            2 : LPT 2                   }
{            3 : LPT 3                   }
{ Rckgabe : Basisadresse des LPT-Portes }
{            0 : IIC 2 nicht gefunden  }
var ok          : boolean;

begin
  ok := false;
  portadresse := 0;
  if port_nr=0 then { automatisch suchen }
  begin
    Portadresse := memw[$40:$8]; (* Adresse von LPT 1 *)
    if (portadresse <> 0) then
    begin
      if IIC_OK then ok:=true;
    end;
    if not ok then
    begin
      Portadresse := memw[$40:$A]; (* Adresse von LPT 2 *)
      if (portadresse <> 0) then
      begin
        if IIC_OK then ok:=true;
      end;
    end;
    if not ok then
    begin
      Portadresse := memw[$40:$C];
      if (portadresse <> 0) then  (* Adresse von LPT 3 *)
      begin
        if IIC_OK then ok:=true;
      end;
    end;
  end else  { an vorgegebenen Port suchen }
  begin
    case port_nr of
      1 : portadresse:=memw[$40:$8]; (* Adr. von LPT 1 *)
      2 : portadresse:=memw[$40:$A]; (* Adr. von LPT 2 *)
      3 : portadresse:=memw[$40:$C]; (* Adr. von LPT 3 *)
    end;
    if portadresse<>0 then
    begin
      if IIC_OK then ok:=true;
    end;
  end;
  if not ok then portadresse:=0;
  INIT_IIC := portadresse;
end;



Procedure DEINIT_IIC;
{ alte Portzust„nde wieder hersellen }
begin
  port [portadresse+2] := 12;
  port [portadresse]   := 0;
end;


Procedure set_port_delay (b : byte);
{ Wartezeit fr den Zugriff auf den Parallel-Port setzen }
begin
  port_delay := b;
end;


{***********************}
{ IIC-Bus Grundroutinen }
{***********************}

Procedure iic_start;
{ IIC-Startbit senden }
begin
  SDA_HIGH;   { Datenleitung auf High }
  SCL_HIGH;   { Taktleitung auf High  }
  while not LESE_SCL do;  { warten bis Takt high  }
  warte_port; { warten }
  SDA_LOW;    { Datenleitung auf LOW  }
  warte_port; { warten }
  SCL_LOW;    { Taktleitung auf LOW   }
end;


Procedure iic_stop;
{ IIC-Stopbit senden }
begin
  SDA_LOW;    { Datenleitung auf Low }
  SCL_HIGH;   { Taktleitung auf High }
  while not LESE_SCL do;  { waretn bis Takt high }
  warte_port; { warten }
  SDA_HIGH;   { Datenleitung auf High  }
end;


Function iic_lese_byte (ack : boolean) : byte;
{ Byte ber den IIC-Bus lesen }
{ ist das ack-Flag gesetzt, so wird ein ACK-Flag gesendet }
{ Zurckgegeben wird das empfangene Byte }
var ret : byte;
    t   : byte;
begin
  SDA_HIGH;                 { Datenleitung auf High }
  ret := 0;                  { Byte l”schen }
  for t:=0 to 7 do
  begin
    SCL_HIGH;               { Taktleitung auf High }
    while not LESE_SCL do;              { warten bis Takt high }
    ret := ret shl 1;       { nach links schieben  }
    if LESE_SDA then ret := ret or 1; { Bit in Datenbate kopieren }
    SCL_LOW;                { Taktleitung auf Low }
  end;
  if ack then SDA_LOW       { ACK }
     else     SDA_HIGH;
  SCL_HIGH;                 { Taktleitung auf High }
  while not LESE_SCL do;   { warten bis Takt auf high }
  warte_port;               { warten }
  SCL_LOW;                  { Taktleitung auf low }
  SDA_HIGH;                 { Datenleitung auf low }
  iic_lese_byte := ret;
end;



Function iic_sende_byte (data : byte) : boolean;
{ Es wird ein Byte ber den IIC Bus gesendet und anschlie0end ein   }
{ ACK vom Slave erwartet. Es wird 1 zurckgegeben, wenn ein ACK vom }
{ Slave empfangen wurde.                                            }
var maske : byte;
begin
  maske := 128;
  while maske <> 0 do
  begin
    if (data and maske) <> 0 then SDA_HIGH
      else                        SDA_LOW;
    SCL_HIGH;
    while not LESE_SCL do;
    maske := maske div 2;
    SCL_LOW;
  end;
  warte_port;
  SDA_HIGH;
  SCL_HIGH;
  while not LESE_SCL do;
  if LESE_SDA then iic_sende_byte := false
    else           iic_sende_byte := true;
  SCL_LOW;
end;



Begin

End.


das sind die 3 dateien die ich übersetzt nach delphi brauche. Währe nett, wenn mir hier jemand helfen könnte bzw. nen anfang machen könnte.
danke schonmal jungs.[/quote]
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.12.02 11:34 
Die Dateien sind soweit alle zu compilieren. Du mußt halt nur die Unist die eingefügt werden durch die von Delphi ersetzen und gegebenenfalls den ein oder anderen Befehl noch anpassen.
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: Fr 27.12.02 17:24 
Hallo,

ich hab mir auch mal den Code angeschaut. Die Units CRT und DOS kannst Du getrost streichen, die gibt es nicht mehr unter Delphi. Sie enthalten die Befehle wie Port und Delay.

Genau diese beiden Befehle sind das Problem. Den Befehl Deley kannst Du durch Sleep ersetzen.

Die Zugriffe auf die IO's über den Befehl Port[Adr]) gibt es unter den 32 Bit Systemen nicht mehr. Hier musst Du Assambler Commandos verwenden (W95, W98) oder einen Treiber (W2K, WXP). Such mal in diesem Forum, diese Probleme hatten auch schon andere und Du findest hier bestimmt eine Menge Lösungen.

ciao
Matthias
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.12.02 18:37 
Allerdings, wenn ich mich nicht irre, kannst Du das ganze als Windows-Programm machen, wenn Du noch Delphi 1 hast. Ich glaube dort gibt es den Befehl Port noch. Bin mir aber nicht sicher.
comes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Fr 27.12.02 23:20 
Ach jungs, wenn ich euch net hätte! Danke bis dahin!

Eben der Befehl Port hat mich abgeschreckt. die sache mit dem delay is klar mit sleep zumachen is aber auch anders zulösen.
Währe super, wenn mir mal jemand nen passenden asm code oder nen treiber für die geschichte hier reinsetzten könnte. sollte ich vorher was finden, setzt ich es der vollständigkeitshalber hier rein. damit auch die anderen user, wenn jemand so verückt ist und sich mit i²c auseinander setzen will, hier alles soweit finden. Danke jungs, und guten rutsch ins neue jahr!

wünscht jeremias
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 29.12.02 10:37 
Guten Morgen,

Schaue Dir mal diesen Thread an, vielleicht hilft der Dir ja weiter.
comes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 40



BeitragVerfasst: Do 02.01.03 21:33 
Titel: ich brauch schon wieder eure hilfe!
Hi leute!

erstmal ein gesundes und erfolgreiches jahr 2003!

----

nun aber zurück zum I²C-BUS.
ich hab mir den oben stehenden thread angeschaut und das ganze mal bissl rumprobiert. da ich aber leider keine ahnung von asm habe komm ich a) mit dem teil net besonders klar (währe net wenn mir mal jemand erklärt, was wo genau passiert) und b) hab ich probleme das teil anzupassen. da ja über das porout bereits ein bit übergeben wird. irgendwie hab ich da probs. BITTE leute, zeigt mir mal jemand ein einer textzeile des obenstehenden codes, wie ich das einpasse bzw. anpasse?!

danke!