IO-Warrior 56 und MCP42xxx
Moderator: Guido Körber
IO-Warrior 56 und MCP42xxx
Hi,
kenne mich mit SPI nicht aus und möchte am IO-Warrior 56 den Chip von Microchip MCP 42xxx verwenden. Dabei handelt es sich um 2 einstellbare Poties.
Irgentwie komme ich mit der Ansteuerung in Delphi nicht klar. Finde auch keine ausführliche Beschreibung dadrüber.
Würde mich über Hilfe sehr freuen.
Gruss Jan
kenne mich mit SPI nicht aus und möchte am IO-Warrior 56 den Chip von Microchip MCP 42xxx verwenden. Dabei handelt es sich um 2 einstellbare Poties.
Irgentwie komme ich mit der Ansteuerung in Delphi nicht klar. Finde auch keine ausführliche Beschreibung dadrüber.
Würde mich über Hilfe sehr freuen.
Gruss Jan
Hätte gerne eine detailierte Beschreibung, welche Einstellungen ich vornehmen muss. Irgentwie läuft es so nicht. Habe auch nach dem Beispiel das Programm entwickelt.
Vielleicht muss ich nach weiteren Unterlagen für das IC suchen und komme so weiter.
Ein entsprechender Link würde mir sehr helfen.
Gruss Jan
Vielleicht muss ich nach weiteren Unterlagen für das IC suchen und komme so weiter.
Ein entsprechender Link würde mir sehr helfen.
Gruss Jan
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Also den ersten Wert gibt er jetzt richtig aus. Danach soll über mein Programm aber laufend neue Werte eingestellt werden . Dies funktioniert nicht.
Beim Start werden die Werte ausgegeben
Report.ReportID := $08; //SPI-Mode
Report.Bytes[0] := $01; //Enable SPI-Mode
Report.Bytes[1] := $03; // mode MSB first, CPOL, CPHA
Report.Bytes[2] := $04; // Takt kann zwischen 12MHz und 93,75 kHz eingestellt werden. Wert + 1 ist der Teiler für die 24MHz
Dann folgt die Schleife mit
Report.ReportID := $09; // write SPI
Report.Bytes[0] := $02; // Zähler für Werte
Report.Bytes[1] := $02; //flags for IOW56
Report.Bytes[2] := $13; // Kommando für die Poties
Report.Bytes[3] := ByteWert; // Wert für den Widerstand
Die Schleife wird über eine Zeitschleife immer wieder aufgerufen.
Ist so zu erkennen, wo mein Fehler ist?
Gruss jan
Beim Start werden die Werte ausgegeben
Report.ReportID := $08; //SPI-Mode
Report.Bytes[0] := $01; //Enable SPI-Mode
Report.Bytes[1] := $03; // mode MSB first, CPOL, CPHA
Report.Bytes[2] := $04; // Takt kann zwischen 12MHz und 93,75 kHz eingestellt werden. Wert + 1 ist der Teiler für die 24MHz
Dann folgt die Schleife mit
Report.ReportID := $09; // write SPI
Report.Bytes[0] := $02; // Zähler für Werte
Report.Bytes[1] := $02; //flags for IOW56
Report.Bytes[2] := $13; // Kommando für die Poties
Report.Bytes[3] := ByteWert; // Wert für den Widerstand
Die Schleife wird über eine Zeitschleife immer wieder aufgerufen.
Ist so zu erkennen, wo mein Fehler ist?
Gruss jan
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Habe den Kondensator eingebaut. Keine Veränderung, nur eine genauere Fehleranalyse.
Langsamere Taktfrequenz hatte keinen Erfolg.
Folgendes Vorgehen hat zum Teilerfolg "geführt":
IOW initialisieren, Wert übergeben, Initialisierung aufheben
5 sec. warten und dann von vorne.
Dies ging so 5-6 mal gut und dann Stand das Programm. Das Programm lief im Debugger-Modus von Delphi 2005. Kann es auch an Delphi 2005 liegen?
Gruss Jan
Langsamere Taktfrequenz hatte keinen Erfolg.
Folgendes Vorgehen hat zum Teilerfolg "geführt":
IOW initialisieren, Wert übergeben, Initialisierung aufheben
5 sec. warten und dann von vorne.
Dies ging so 5-6 mal gut und dann Stand das Programm. Das Programm lief im Debugger-Modus von Delphi 2005. Kann es auch an Delphi 2005 liegen?
Gruss Jan
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Habe die aktuellste dll eingespielt, um diese Fehlrequelle auszuschließen.
Hier kommt der Quelltext:
Die Initialisierung:
LoadIowKitAPI;
IOWSPI := IowKitOpenDevice;
Pid := IowKitGetProductId(IOWSPI);
// Prüfen, ob passende Karte dran ist
if IOWSPI <> nil then if Pid = IOWKIT_PID_IOW56 then begin
// Karte entsprechend einstellen
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $08; //SPI-Mode
Report.Bytes[0] := $01; //Enable SPI-Mode
Report.Bytes[1] := $03; // mode MSB first, CPOL, CPHA
Report.Bytes[2] := $04; // Takt kann zwischen 12MHz und 93,75 kHz eingestellt werden. Wert + 1 ist der Teiler für die 24MHz
// occasional corrupt data
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
Die Schleife:
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $09; // write SPI
Report.Bytes[0] := $02; // Zähler für Werte
Report.Bytes[1] := $00; //flags for IOW56
Report.Bytes[2] := $13; // Kommando für die Poties
Report.Bytes[3] := ByteWert; // Wert für den Widerstand
if IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE) = IOWKIT56_SPECIAL_REPORT_SIZE then begin
// Daten schreiben
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
und die Deinitialisierung:
GSVrelease(ComPort);
if IOWSPI <> nil then begin
// disable SPI
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $08;
Report.Bytes[0] := $00; // disable SPI
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
IowKitCloseDevice(IOWSPI);
UnloadIowKitAPI;
Vielleicht hilft es so weiter. Zu erst wird die Initialisierung aufgerufen und dann in der Schleife über einen Timer die Werte übertragen und am Ende die Deinitialisierung, um alles sauber zu verlassen.
Hier kommt der Quelltext:
Die Initialisierung:
LoadIowKitAPI;
IOWSPI := IowKitOpenDevice;
Pid := IowKitGetProductId(IOWSPI);
// Prüfen, ob passende Karte dran ist
if IOWSPI <> nil then if Pid = IOWKIT_PID_IOW56 then begin
// Karte entsprechend einstellen
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $08; //SPI-Mode
Report.Bytes[0] := $01; //Enable SPI-Mode
Report.Bytes[1] := $03; // mode MSB first, CPOL, CPHA
Report.Bytes[2] := $04; // Takt kann zwischen 12MHz und 93,75 kHz eingestellt werden. Wert + 1 ist der Teiler für die 24MHz
// occasional corrupt data
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
Die Schleife:
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $09; // write SPI
Report.Bytes[0] := $02; // Zähler für Werte
Report.Bytes[1] := $00; //flags for IOW56
Report.Bytes[2] := $13; // Kommando für die Poties
Report.Bytes[3] := ByteWert; // Wert für den Widerstand
if IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE) = IOWKIT56_SPECIAL_REPORT_SIZE then begin
// Daten schreiben
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
und die Deinitialisierung:
GSVrelease(ComPort);
if IOWSPI <> nil then begin
// disable SPI
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $08;
Report.Bytes[0] := $00; // disable SPI
IowKitWrite(IOWSPI, IOW_PIPE_SPECIAL_MODE, @Report, IOWKIT56_SPECIAL_REPORT_SIZE);
end;
IowKitCloseDevice(IOWSPI);
UnloadIowKitAPI;
Vielleicht hilft es so weiter. Zu erst wird die Initialisierung aufgerufen und dann in der Schleife über einen Timer die Werte übertragen und am Ende die Deinitialisierung, um alles sauber zu verlassen.
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm