PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann mir mal jemand dies erklären (I2C)-->



jok3r
28.03.2014, 17:39
Ich habe einen Absolutwertgeber AS5048B, den ich anfangs nicht anständig zum laufen bekommen habe .
Jetzt habe ich aus versehen die adresse 255 statt 254 ausgewählt und schon passen die Werte , es war also Zufall oder Glück. -> #include <Wire.h>

void setup()
{
Serial.begin(9600);
Wire.begin();
}

void loop()
{
Wire.beginTransmission(66);
Wire.write(255);
Wire.endTransmission();

Wire.requestFrom(66, 2);

if (2 <= Wire.available())
{
int pos = Wire.read();
pos = pos << 6;
pos |= Wire.read();
Serial.println(pos);
}

}

-> http://www1.futureelectronics.com/doc/AUSTRIAMICROSYSTEMS/AS5048DB.pdf

Die Adressen wo die Positionen gespeichert sind 254 255.....
genau in dieser Reihenfolge sollte man die doch abfragen ? Zumindestens habe ich das so verstanden! Ich frage aber jetzt als erstes die 255 ab und nach 255 wäre schluss ,aber dennoch passt die Auswertung . Schreib ich jetzt 254 rein , kommt wirres zeug dabei raus . Hab ich die Wire.hi falsch verstanden ?

Gruß Dominik

Sisor
28.03.2014, 18:48
Das MSB ist im Register 254, das LSB in 255. Lustig, dass erst der Inhalt des Register 254 zurückgegeben wird, wenn du Wire.write(255) schreibst.

PS: Es werden 2 Bits im Register 255 nicht genutzt. Es ist zwar wahrscheinlich, dass diese immer 0 sind, aber eben nur das.
Um sicher zu gehen:
...
pos = pos << 6;
pos |= Wire.read() & 63;
...

jok3r
28.03.2014, 19:50
ja genau 254 ist das MSB davon bin ich auch ausgegangen....also hat keiner eine Erklärung dafür ? Eine anständige Anleitung zu Wire.h find ich auch nicht , auf der arduino.cc Seite findet man nicht sehr viel dazu....

requestForm.() bedeutet ja für mich das erste ist die Adresse von der ich eine Antwort erwarte, das zweite die Anzahl der Bytes ... in meinem fall will ich 2 Bytes erhalten 254 und 255 .... Das überschneidet sich nur jetzt mit meinem Programm .Ich bin aber echt erstaunt wie genau diese Geber funktionieren bei 14 bit springt der Wert um -+2 rum.
Das verstehe ich nicht , was willst mir damit sagen ?
pos = pos << 6;
pos |= Wire.read() & 63;
Gruß

Sisor
28.03.2014, 20:05
Das verstehe ich nicht , was willst mir damit sagen ?
Sollten die beiden ungenutzten Bits des LSB gesetzt sein, würde das den Wert des Winkels verfälschen (erhöhen). Mit &63 löscht du diese und gehst so auf Nummer Sicher.

Mit Wire.write(255) sendest du einen Wert an einen anderen IC. Der interpretiert diesen Wert (irgendwie) und antwortet dann darauf. Wire.h hat darauf keinen Einfluss.

Mit Wire.requestFrom(66, 2) erfragst du 2 Byte vom IC auf Adresse 66. Welche Bytes dieser sendet, hängt wiederum vollständig vom IC ab, nicht von Wire.h.

jok3r
28.03.2014, 21:34
Das mit &63 versteh ich irgendwie nicht was soll das sein was macht diese &63 ?

Wire.write(255) damit setze ich den Pointer auf die Adresse 255 im Register des IC s ? Und dieser IC ist genau der wo in Wire.beginTransmission(GeberAddr[i]); steht ?.... sonst ergib das keinen Sinn ? Ich muss schon sagen das ist alles Neuland ... Ich muss feststellen der Arduino hängt sich mit der zeit auf , wenn er ständig werte ließt und sie dann am Display ausgibt .... Hat wer eine Ahnung ? Speicher voll ? Die Werte werden in Arrays geschrieben ...
Gruß

cdk
29.03.2014, 02:34
Das mit &63 versteh ich irgendwie nicht was soll das sein was macht diese &63 ? Das ist ein Logisch-Und mit den unteren 6 Bit (00111111b) und es stellt sicher daß die unerwünschten höheren Bits auch tatsächlich 0 bleiben. Logisch-Und läßt nur diejenigen Bits "durch", die mit 1 maskiert werden.
Das ist wichtig für die folgende Veroderung bei der 2. Wert-Abfrage. Sollten die ungültigen Bits als 1 angeliefert werden würden sie sonst ja den unteren Teil des bereits eingelesenen MSB wieder überschreiben.

Sisor
29.03.2014, 08:00
Rechnung zur Veranschaulichung:



10001011

135
Beispielwert



&00111111

&63
Maske



00001011

11
Ergebnis


Rot: ungenutze Bits



Ich muss feststellen der Arduino hängt sich mit der zeit auf , wenn er ständig werte ließt und sie dann am Display ausgibt ....
Probier mal das hier:
...
if (2 <= Wire.available())
{
int pos = Wire.read() << 6;
delay(1);
pos |= Wire.read() & 63;
Serial.println(pos);
}
...

jok3r
29.03.2014, 10:28
Guten Morgen, das mit der delay(1-10) ändert nichts . Das Problem liegt bei den Schrittmotoren, bzw bei der Ansteuerung wenn die Leistungselektronik aus ist gibts keine Probleme. Die induktive Koppelung ist anscheinend das Problem, die Abschirmung ist noch nicht perfekt ich werd mich mal darum kümmern. Gruß