Analog/Digital Wandler mit dem IO-Warrior
Moderator: Guido Körber
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
Analog/Digital Wandler mit dem IO-Warrior
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++
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++
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.
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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
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
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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
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
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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.
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.
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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
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
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
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 ...
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 ...
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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
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
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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.
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;
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
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 ....
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 ....
-
- Posts: 14
- Joined: Thu Feb 07, 2008 4:57 pm
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
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
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact: