PCF 8591P HILFE!!

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Klute
Posts: 6
Joined: Sun Feb 19, 2006 3:28 pm

PCF 8591P HILFE!!

Post by Klute »

Hallo beisammen,

ich hab mich schonmal in dem Forum hier schlau gemacht und geschaut, wie ich den PCF 8591P ansteuern kann.
Ja also nach der Erkundungstour hatte ich einiges Material, welches ich nun Auswerten musste. Dabei ist mir aufgefallen, dass ich nix (gar nix) raff.

Gibt es zum Ansteuern solcher IC's irgendwelche Tutorials oder Beispiele am Besten in Delphi.
Ich wär euch sehr dankbar, wenn ihr mir da was habt, weil ich des als Seminararbeit für die Schule jetzt dann mal brauch.

THX,
Klute
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ich habe das Datenblatt PCF8591_6.pdf gefunden. Darauf beziehe ich mich jetzt.

Es ist ein A/D D/A WWandler mit 4 Inputkanaelen und einem Outputkanal. Das Interface ist IIC.

Damit ist das "IIC\Delphi\MAX127 DLL" Beispiel der beste Startpunkt.
Erst mal sollte man dieses Beispiel auf 4 Kanaele strippen und muss dann nur noch den Lesekern in der Methode KickerTimer anpassen.
Den Outputkanal unterschlage ich hier erst mal.

Die Kapitel 7.1 ff in PCF8591_6.pdf beschreiben was man schreiben muss.

Pro Kanal muss man erst mal drei Byte schreiben. Das erste Byte ist die Adresse. Fig. 4 sagt die Adresse ist $90 sofern man die Pins A2 bis A0 auf Gnd gelegt hat.

Es folgt das Control-Byte. Fig. 5 zeigt es. Erst mal 4 single-ended inputs und kein output einstellen. Autoincrement kann wohl aus bleiben.
Es ergibt sich also binaer 000000xx mit xx der Kanalnummer.

Das dritte Byte ist fuer den Outputkanal und bleibt unbenutzt, also 0.

Es folgt ein Lesezyklus fuer 2 Bytes. Im ersten Byte steht dann der Resultcode des letzten Lesezyklus und im zweiten Byte der aktuelle Wert.

Ganz sicher bin ich mir nicht das das alles richtig ist, denn dazu muss man experimentieren.

Code: Select all

    for I := 0 to 3 do
    begin
      FillChar(Report, SizeOf(Report), 0);
      Report.ReportID := $02; // ReportID IIC write request
      Report.Bytes[0] := $C3; // 3 bytes with IIC Start and Stop
      Report.Bytes[1] := $90; // PCF8591 address byte = ADR 0, write
      // PCF8591 control byte
      Report.Bytes[2] := $00 or I;
      Report.Bytes[3] := $00; // output channel unused for now
      IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
      // swallow ACK report
      IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));

      FillChar(Report, SizeOf(Report), 0);
      Report.ReportID := $03; // ReportID IIC read request
      Report.Bytes[0] := $02; // 2 bytes
      Report.Bytes[1] := $91; // PCF8591 address byte = ADR 0, read
      IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
      // read answer containing voltage value
      IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
Post Reply