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
- 
				Robert Marquardt
- 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));