| Autor |
Beitrag |
comes
      
Beiträge: 40
|
Verfasst: 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
      
Beiträge: 121
|
Verfasst: Fr 27.12.02 01:41
Hallo,
zu nächst einmal vermute ich, dass es sich um der PCF 8574  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 
      
Beiträge: 40
|
Verfasst: 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)
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
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
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
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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
      
Beiträge: 121
|
Verfasst: 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
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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 
      
Beiträge: 40
|
Verfasst: 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
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 29.12.02 10:37
Guten Morgen,
Schaue Dir mal diesen Thread an, vielleicht hilft der Dir ja weiter.
|
|
comes 
      
Beiträge: 40
|
Verfasst: 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!
|
|
|