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
PCF 8591P HILFE!!
Moderator: Guido Körber
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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.
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));