IO-Warrior 56 und MCP42xxx

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

Moderator: Guido Körber

jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

IO-Warrior 56 und MCP42xxx

Post by jan138 »

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
Admin
Site Admin
Posts: 50
Joined: Tue Nov 25, 2003 10:05 pm

Post by Admin »

Application Note 4?

Da wird die Ansteuerung vom SPI beschrieben. Details sind natürlich dem jeweiligen Chip anzuüassen.
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

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
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Das Hauptproblem beim SPI ist es die richtige Kombination von CPOL und CPHA zu wählen, so dass die beiden Teile sich verstehen. Timingdiagramm im Datenblatt ansehen und mit der Beschreibung der SPI Funktion vergleichen.
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

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
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Knapp 5MHz Takt.

Wie lang sind denn die SPI Verbindungen? Und wie sieht die Stromversorgung für das Digitalpoti aus?
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

Ist alles auf dem Starterkit aufgebaut mit festen Leitungen verlötet. Könnte den Takt auch weiter runter setzen. Spannungsversorgung kommt auch vom USB-Anschluss.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Immer erst mal den niedrigsten Takt waehlen. Der USB begrenzt sowieso auf 1 ms pro Report und da ist der SPI-Takt kaum noch relevant.

Der MAX6675 (Thermometer) funktioniert bei 2 MBit nur noch in der Haelfte der Faelle. Bei 100 KBit immer.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Mit Stormversorgung meinte ich nicht nur wo her, sondern auch wie aufegbaut. Ist z.B. ein 100nF Kondensator direkt am Chip?
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

Werde die Taktrate mal ganz runter stellen und dann testen.

Im Chip ist kein Kondensator vorhanden. Werde ihn bei Gelegenheit einbauen und sehen, ob es dadran gelegen hat.

Vielen Dank für die Hilfe.

Gruss Jan
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

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
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ich bin recht sicher das die Probleme nicht am Iowkit API liegen. Delphi ist bestimmt unschuldig.
am besten mir mal die Sourcen schicken und ich werfe einen Blick drauf. Die Informationen sind doch ungenuegend. marquardt att codemercs dott com
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

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.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Bitte per email an marquardt att codemercs dott com das ganze Delphi-Projekt schicken, dann muss ich nicht ein neues basteln.
jan138
Posts: 28
Joined: Tue Feb 13, 2007 7:10 pm

Post by jan138 »

Vielen Dank für die Hilfe.

Erster Test war sehr erfolgreich. Werde es morgen in einem längeren Test noch überprüfen.

gruss Jan
Post Reply