Analog/Digital Wandler mit dem IO-Warrior

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

Moderator: Guido Körber

MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Analog/Digital Wandler mit dem IO-Warrior

Post by MagicMaster »

Hallo zusammen,

ich habe in meiner Schule ein Schaltung mit dem IO-Warrior 40 aufgebaut. Die Schaltung beinhaltet einen Analog-Digital Wandler. Die genaue Bausteinbezeichnung ist TLC548C. Das Datenblatt hänge ich als Link mit dran.

Link: http://crio.mib.infn.it/wig/electronics ... 20AtoD.pdf

So jetzt zu meinem Problem. Die Pinne I/O Clock, Data Out, und CS sind mit meinem IO-Warrior verbunden. Der Pin Analog-In, ist mit der Anschlussbuchse versehen und der Rest ist ja selbsterklärend.

So jetzt soll ich eine Software entwickeln, die mir das Ergebnis der Schaltung ausgeben soll....Also quasi das was an DATA OUT rauskommt. Leider habe ich keine Ahnung wie ich das Bewerkstelligen soll. Ich habe schon viele Sachen für den IO-Warrior programmiert, doch diesmal habe ich echt keine Ahnung wie ich das Anstellen soll.

Kann mir vielleicht jemand helfen......Hab kein Vorstellungsvermögen, wie ich die Daten von Data Out auslesen soll.


Vielen Dank schon mal im voraus.

PS: Wenn es hilft ich programmiere in C++
McMike
Posts: 24
Joined: Fri Feb 02, 2007 3:36 pm

Post by McMike »

Wenn ich das recht sehe sendet der seine Daten seriell. Immer wenn an CS, mit dem Querstrich drüber, low anliegt schickt er seine Daten mit dem Takt an I/O Clock auf Data out. Das könntest du an einem Pin des IOWarrior abfragen und detektieren. Problem: Die Abtastrate wird übelst schlecht sein, du kannst den IOW40 ja nur mit 125 Hz abfragen, das ist nicht grad sehr schnell und es gilt für optimale Bedingungen welche wohl nur selten vorliegen dürften. Aber gehen wir mal davon aus, dass das geht.Mit 125 Hz kannst du ihn abfragen, dann hast du aber erst ein Bit. Also die Zeit mit acht multiplizieren bist du schonmal bei 64 ms bist du den ersten Wert hast. Sinnvoll sind also schonmal nur Eingangssignale, deren Periodenlänge 128 ms (ca. 7.8 Hz) oder mehr (< 7.8 Hz) beträgt (Stichwort: Nyquistkriterium). Wenn dir das genügt ist es eigentlich ausreichend den entsprechenden Pin des Warriors mit Hilfe eines Timers auszulesen. So würde ich es denn dann machen.
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Die Abtastrate ist erstmal egal, da die Software nur dazu dienen soll, um zu prüfen ob alles richtig funktioniert.

Im Grunde soll für den Versuch eine Spannung zwischen 0 - 5 V angelegt. Die Software soll dann anzeigen, was für eine Spannung angelegt ist. Das Problem ist, das ich bisher immer nur Bytes geschrieben habe, um Pins zu steuern. Deshalb kann ich mir jetzt nicht wrklich vorstellen, wie ich daraus einen Wert ermitteln soll.

Ich bin derzeit noch Schüler in der ITA Ausbildung und habe noch diverse Pobleme mit Elektro^^

Mfg

MagicMaster
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Post by friend-of-rq »

Hallo MagicMaster,

Du must mit deinem Programm das CS und den Takt erzeugen,
den Dout nach jedem Takt einlesen ...

wenn Du einen IOW 24 oder 56 verwenden würdest,
könntest Du das mit der SPI Schnittstelle alles erledigen.
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Den IO-Warrior 24 könnte ich auch benutzen, das stellt kein Problem da, jedoch weiß ich gar nichts über die SPI Schnitstelle.

Jetzt ist die Frage was leicheter ist. Entweder mit dem 40 und ohne SPI oder mit dem 24 und erstmal über SPI klar werden.

Wenn ich den DOut auslesen möchte muss ich den Pin doch auf High setzten und dann mit dem Read Befehl auslesen.....oder irre ich mich da?


Mfg

MagicMaster
McMike
Posts: 24
Joined: Fri Feb 02, 2007 3:36 pm

Post by McMike »

Ich glaub, setzen muss man die nicht wenn man die von Aussen auf High oder Low zieht was Dout ja machen wuerde. Zumindest hab ich die nie gesetzt wenn ich sie als Eingaenge benutzt habe.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Eingangspins müssen beim IO-Warrior auf High gesetzt werden damit die von einem externen Treiber auf Low gezogen werden können.

Ansonsten ist es durchaus möglich die Signale "zu Fuß" zu erzeugen, der SPI eines IOW24 oder IOW56 wäre aber viel komfortabler um mit dem Chip zu reden. Alternativ könnte man einen A/D Wandler mit IIC nehmen, der ginge auch mit dem IOW40 direkt.
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Das heißt für mich ich müsste den Eingangspin auf High setzen.....Und dann den Eingangspin mit Read auslesen???

Ich glaube nicht das ich hier die SPI Schnitstelle verwenden werde, aber ich werde sie mir auf jeden Fall mal für spätere Programme anschauen.

Werd mich mal wieder an der Programmierung versuchen.

Vielen Dank für eure bisherige Hilfe

Mfg

MagicMaster
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Post by friend-of-rq »

Hallo MagicMaster,

für eine Sinnvolle Anwendung mach das aber keinen Sinn,

Du musst über 32 mal den Zustand der Ports wechseln und
dann noch den Dout einlesen (ReadNoBlocking) das dauert viel
zu lange und belastet nur unnötig deinen PC bzw. den USB ....

Bei I2C und einem LM75 brauchst Du nur einmal einlesen ...
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Hallo friend-of-rq,

danke dir für den Tipp. Leider kann ich die Schaltung nicht einfach umbauen, sodass ich einen LM75 benutzen könnte. Da macht die Schule klare Anweisungen :( . So wird mir vorerst nur die Möglichkeit bleiben, die Zustände der Ports zu ändern.

Momentan kämpfe ich damit den Zustand des Dout einzulesen...Aber iwie bekomme ich da immer 0. Komisch.....


Mfg

MagicMaster
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Hilfeeeeeeeeee........

Ich bekomme es einfach nicht hin. Der Report liefert mir immer eine 0 zurück obwohl 5V anliegen.

Mache ich beim einlesen was falsch??? Wie ich den IC Bedienen muss weiß ich ich glaube das ich mit dem Read Befehl was falsch mache.

Code: Select all

// Alle Ports auf Low setzen
                    IowBytes[0] = 0;
                    IowBytes[1] = 0;
                    IowWrite(IowHandle, IowBytes);
                    
                    
                    // Clock ausführen
                    
                    IowBytes[1] = 2;
                    IowWrite(IowHandle, IowBytes);
                    IowBytes[1] = 0;
                    IowWrite(IowHandle, IowBytes);
                    
                    // Dout High setzen
                    
                    IowBytes[0] = 2;
                    IowWrite(IowHandle, IowBytes);
                    
                    
                    //Auslesen
                    IOWKIT24_IO_REPORT IowReport;
                    IowKitRead(IowHandle, IOW_PIPE_IO_PINS, (PCHAR) &IowReport, IOWKIT24_IO_REPORT_SIZE);
                    
                    int test;
                    
                    
                    IowReport.Bytes[0] = test;
                    
                    cout << test;
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Post by friend-of-rq »

Hallo MagicMaster,

ich gehe davon aus Du hast an

P0.1 = DOUT
P1.1 = Clock

und wo ist CS angeschlossen ? .... ich gehe mal von P1.0 aus

Warum setzt Du den Port 0 auf NULL ... da ist doch dein Eingang

Ablauf-Beispiel:

.... PORTS vorbereiten
DAT[0] = 0 .... muss 0 sein
DAT[1] = 255 .... alle an Port 0 auf 1
DAT[2] = 1 .... CS auf 1 / clock auf 0
IowKitWrite( IowHandle, 0, DAT(0) , 3 )

.... INIT (CS auf null)
DAT[2] = 0 .... CS auf 0 / clock auf 0
IowKitWrite( IowHandle, 0, DAT(0) , 3 )

.... SCHLEIFE (TAKT und abfrage )

FOR n= 1 to 8

DAT[2] = 0 .... CS auf 0 / clock auf 0
IowKitWrite( IowHandle, 0, DAT(0) , 3 )

DAT[2] = 2 .... CS auf 0 / clock auf 1
IowKitWrite( IowHandle, 0, DAT(0) , 3 )

... abfrage der port um Dout einzulesen
DAT2[0] = 255
IowKitWrite( IowHandle, 1 , DAT2(0) , 8 )
IowKitRead ( IowHandle, 1 , DAT2(0) , 8 )
DAT2(0) = sollte 255 sein
DAT2(1) = daten von Port 0 wenn =0 dann Dout=0 / wenn =2 dann Dout=1
DAT2(2) = daten von Port 1

NEXT n

... ENDE
DAT[2]= 0 .... CS auf 0 / clock auf 0
IowKitWrite( IowHandle, 0, DAT(0) , 3 )
DAT[2] = 1 .... CS auf 1 / clock auf 0
IowKitWrite( IowHandle, 0, DAT(0) , 3 )


ich sagte ja ist aufwendig alles zu Fuss zu machen ....
MagicMaster
Posts: 14
Joined: Thu Feb 07, 2008 4:57 pm

Post by MagicMaster »

Danke dir für deine Hilfe...Ich werde es nochmals überarbeiten.....Ich melde mich wenn ich was neues raushabe.

Mfg

MagicMaster
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo,
obwohl ich den Willen alles über die IO-Pins machen zu wollen durchaus anerkenne, ist es in diesem Fall aber ehrlich nicht angebracht, weil zu kompliziert.

Da aber nur der IOW40 zur Verfügung steht, der leider keinen SPI-Mode kann, gebe ich dem Lehrer schon mal ne 6 weil er den Schüler mit einem Schraubendreher losschickt um einen Nagel in die Wand zu schlagen.

Auch der Code von "friend-of-rq" enthält Fehler (eine positive Flanke auf dem ClockSignal veranlasst den AD-Wandler schon das nächste Bit des Wertes zu übertragen, damit ist aber das MSB schon weg, das direkt nach dem Signal /CS auf dem Bus liegt).

Also (mein Tipp) für kleines Geld einen AD-Wandler PCF8591 http://www.nxp.com/acrobat_download/dat ... 8591_6.pdf
kaufen und was richtiges lernen (Verwendung des IIC-Bus).

Eberhard
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Post by friend-of-rq »

Hallo wayoda,

wenn es doch so gemacht werden soll ...
Na klar gibt es bessere Möglichkeiten, aber damit ist MagicMaster
auch nicht geholfen ...


Image

stimmt ... Du hast Recht ... die Daten müssen kurz vor der steigenden Flanke
geholt werden !

Ich hoffe MagicMaster kommt damit zurecht
Post Reply