[Xcode] Pins ganz simpel auf 0/1 setzen

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

Moderator: Guido Körber

mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

[Xcode] Pins ganz simpel auf 0/1 setzen

Post by mz »

Hallo,
ich versuche gerade mit c + Xcode eine(!) LED ein und aus zu schalten.

bis IOWarriorIsPresent geht mein Code ja.
Aber wie setz ich bitte den Pin auf 1 und nachher wieder auf 0?
Sorry aber ich versteh die SDK nicht ganz. Bin auch ganz frisch in c.

Ich würde gerne IOWarriorWriteToInterface benutzen.
Aber ich schaff es einfach nicht die LED an Pin 0 auf 1 zu setzen. bzw auf 0.

Mit dem IOWarriorProber krieg ich die Pins auf 1 und wieder auf 0.
Aber mit einem simplen Code ... geht das nicht.

Wie mach ich das?

Danke :)
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Die Pins werden nicht einzeln angesprochen, es wird immer der Status für alle Pins gleichzeitg übertragen.
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Ok, das hab ich mir schon fast gedacht.
Aber wie bitte setz ich denn jetzt z.B. Pin 1 auf 1, Pin 2 auf 1 und Pin 3 auf 0? Der Rest auch auf 0.
Tut mir echt leid wenn ich sowas hier frage, aber ich komme nicht weiter.

*edit*

Ich verstehe die Doku die im SDK enhalten ist nicht ganz.
Sei es die HTML Form oder die lib.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Mit IOWarriorWriteInterface0 mal vier Bytes voller Nullen senden?
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Naja ...

Code: Select all

		const int data = 3 * 8 + 6;        // set P3.6 to 1
		IOWarriorWriteInterface0 (&data);

		int read;
		IOWarriorReadInterface0 (&read);
		printf ("Read: %d\n", read);

		sleep ( 1 );

		int test = 64;	// set all Pins to 0
		IOWarriorWriteInterface0 (&test);
Geht auch nur "halber".

wenn ich an P3.6 eine LED hänge blinkt die schön. Nur leider ist das auch bei P3.1, P3.2 usw.
Wie ich auf die komischen Zahlen komme?
-> http://salomon-freising.de/iow/iow_tuto ... l#beispiel
(Ja, ist kein Mac OS X... aber ich hab einfach kA wie ich das anstellen soll)

Kann mir denn niemand einen Code Snippet geben der ganz einfach
  • P0.0 = 1
    P0.1 = 1
    P0.2 = 0
    ...
    P1.0 = 0
    P1.1 = 1
    ...
setzt? Ich will das alles mit Xcode erstellen. Also unter Mac OS X.
Oder "gut" erklären damit ich das mal richtig verstehe.
Ich will mit den IO-Warrior eigentlich mal viele Servos ansteuern (ja, mit Relais usw., bin ja gelernter Industrieelektroniker) und nicht einfach in den Schrank legen.

Ich bin echt langsam am verzeifeln.
Nicht lachen, ich probier echt alles aus z.B.

Code: Select all

int data = 01010101010101010101010101010101;
IOWarriorWriteInterface0 (&data);
Ich dachte so kann ich P0.0 = 0, P0.1 = 1 usw setzen. War wohl nicht so.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Also hier scheint grundsätzliches Unverständnis der Zahlensysteme und deren Verwendung in Programmiersprachen vorzuliegen.

Das 3*8+6 gibt die BITNUMMER des Pins an an dem die LED hängt. Übertragen werden muss natürlich die Bitmaske und zwar für alle 32 Pins. Wenn man also einen Wert mit vielen Nullen drin an den IO-Warrior schreibt muss man sich nicht wundern, wenn viele LEDs angehen. Um nur die LED an P3.6 anzusteuern schreibt man 0xBFFFFFFF.
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Guido Körber wrote:Also hier scheint grundsätzliches Unverständnis der Zahlensysteme und deren Verwendung in Programmiersprachen vorzuliegen.
Leider, so etwas hab ich bis jetzt noch nie gebraucht.

Wie kommst du von der Bitnummer auf die Bitmaske?
Mir ist schon klar, dass ich mit einem Write Befehl alle Pins auf einmal setze. Aber wie geb ich das an damit P0.1 = 0, P0.2 = 1 usw ... ist?
0xBFFFFFFF ist ein schöner Hex wert. Als Dez sieht der auch toll aus. Nur leider hab ich echt keine Ahnung wie du auf diese Zahl kommst.
Leider hat man meine Frage noch immer nicht richtig beantwortet.

Ich finde bei Google leider keine Infos darüber.
In meinem C++ Buch steht auch nichts davon.
Also wo sonst die Fragen stellen wenn nicht hier?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Px.y => ~(1 << (x*8 + y))
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Ok ich hab grad einiges getestet und es ist beschissen.

Code: Select all

int data = 0xBFFFFFFF;
IOWarriorWriteInterface0 (&data);
Omg ... toll ... der setzt den Pin auf 5V und etliche andere auch.

Das ist doch voll bescheuert wenn ich den Pin setze und die anderen machen was sie wollen?

Ich will doch nicht mehr wie ein Code Snippet das alle Pins schreibt. Ich bitte darum!
Es muss doch möglich sein mit einem Write Befehl die Pins so zu setzen wie ich will. (sonst kommt es irgendwann zu ungewollten fehlern wenn vll 5 Servos loslaufen bzw +- auf -+ kommt ...)

1. Write Befehl soll die Pins so setzen:
P0.1 = 1, P0.2 = 0, P0.3 = 0, P0.4 = 1 ... usw
(egal was nun kommt, ich muss nur den anfang verstehen! aber es soll irgendwie mit 0 und 1 weitergehen.)

2. Write Befehl soll die Pins so setzen:
P0.1 = 0, P0.2 = 1, P0.3 = 1, P0.4 = 0 ... usw
(also genau anders wie Befehl Nr.1)

Mit SPS geht das doch auch :-)
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Noch einen Beitrag in dieser Ausdrucksweise und es gibt einen Verweis aus dem Forum.

Der Aufruf zum Schreiben der Daten ist völlig richtig. Hatte den Bytesex verdreht, richtig ist: 0xFFFFFFBF.
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Ist es überhaupt möglich die Ausgänge gleichzeitig so zu setzen wie ich das will (siehe oben)?
Meine Frage wird ja immer überlesen.
Ich weiss nicht weiter und deswegen frage ich die Entwickler.

Code: Select all

int data = 0xFFFFFFBF;
IOWarriorWriteInterface0 (&data);
setzt den Pin 3.6 auf High.

- Wie krieg ich den Pin 3.6 wieder auf Low?
- Wie setze ich andere Pins gleichzeitig mit dem Write Befehl? (1. Write aufrufen und dabei alle Pins ändern) Array - pro Pin ein Array[...]? Ist das überhaupt möglich?
Robert Marquardt wrote:Px.y => ~(1 << (x*8 + y))
Passt dann auch nicht mehr.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Der beim Write übergebene Wert wird direkt auf die Ports geschrieben. Es gibt keine Befehle oder sowas um einzelne der Pins zu setzen.

Also: 0X00000000 schreiben setzt alle Pins auf Null
0xFFFFFFFF setzt alle Pins auf 1.

Beliebige Kombinationen sind möglich (na gut, 4.294.967.296 Möglichkeiten).
mz
Posts: 9
Joined: Tue May 10, 2005 5:53 pm

Post by mz »

Verstehe. Langsam wirds :-) Ein paar Fragen sind aber noch offen.
Guido Körber wrote:Es gibt keine Befehle oder sowas um einzelne der Pins zu setzen.

Beliebige Kombinationen sind möglich (na gut, 4.294.967.296 Möglichkeiten).
Dann kann ich also pro Write Befehl alle Pins nach belieben ändern.

- Wie setzt sich z.B. FFFFFFBF zusammen? (Kombination Nr. 4.294.967.231)
- Wir haben P3.6 auf High mit FFFFFFBF gesetzt, der soll nun aber wieder auf Low (nicht mit 0X00000000, das ist so unschön). Wie stell ich das an?

Tut mir echt leid falls ich nerv ...
alex_fhf
Posts: 12
Joined: Mon Nov 07, 2005 3:51 pm
Location: Rietheim

Post by alex_fhf »

FFFF FBFF setzt sich also wie folgt zusammen:

Byte 0 FF
Byte 1 FB Port 3 -> 1111 1011 -> 1-5 + 7-8 = 1 -> 6 = 0
Byte 2 FF
Byte 3 FF

Jetzt ... wenn Sie hingehen und ...

FB | FF (Bitweises Oder) vollziehen, dann kommen wir zu folgender Operation:

FB: 1111 1011
|
FF: 1111 1111
= 1111 1111 -> Pin 3.6 = 1 (wie die anderen auch).


Ich empfehle hier einen Blick zu M&T C & C++ Referenz (5,--) oder jedes andere Hochschullehrbuch, Vorlesungsskript (falls eine Universität in der Nähe Ihres Wohnorts.).

Mfg

Alex
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Abgesehen von den verrutschten Daten stimmt das so.
Post Reply