-
        

Ergebnis 1 bis 8 von 8

Thema: Kann mir mal jemand dies erklären (I2C)-->

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49

    Kann mir mal jemand dies erklären (I2C)-->

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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/do...S/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

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    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;
    ...
    Geändert von Sisor (28.03.2014 um 20:32 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    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ß

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Zitat Zitat von jok3r Beitrag anzeigen
    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.
    Geändert von Sisor (28.03.2014 um 21:11 Uhr)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    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ß

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    16.02.2014
    Ort
    bei Karlsruhe
    Beiträge
    74
    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.
    Geändert von cdk (29.03.2014 um 03:48 Uhr)

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    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:
    Code:
    ...
    if (2 <= Wire.available())
    {
      int pos = Wire.read() << 6;
      delay(1);
      pos |= Wire.read() & 63;
      Serial.println(pos);
    }
    ...
    Geändert von Sisor (29.03.2014 um 10:37 Uhr)

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    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ß

Ähnliche Themen

  1. Kann mir jemand den Zweck des Transistors erklären?
    Von Gast12345 im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 31.03.2009, 21:01
  2. Kann mir bitte jemand diesen Code erklären?
    Von meddie im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 5
    Letzter Beitrag: 11.08.2006, 11:40
  3. Kann mir jemand den folgenden Code erklären?
    Von FiTus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 23.06.2006, 08:18
  4. kann mir jemand rand() erklären
    Von slaud im Forum C - Programmierung (GCC u.a.)
    Antworten: 20
    Letzter Beitrag: 14.11.2005, 16:29
  5. Timer & CO??? kannst mir jemand mal GENAU erklären??
    Von raptor_79 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 17.03.2005, 19:35

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •