- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: Auslesen der Bewegungsinformationen des Maussensor ADNS-3060

  1. #1

    Auslesen der Bewegungsinformationen des Maussensor ADNS-3060

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi!

    Vielleicht kann einer von euch, der Erfahrung mit ADNS-Sensoren hat, mir helfen. Bei dieser Sache komme ich echt nicht weiter!

    Ich habe eine Platine mit dem ADNS-3060 entwickelt und kann soweit damit auf alle Register des Sensors zugreifen. Dummerweise bereiten mir die wichtigsten Register Motion, dx und dy Probleme, während sich die restlichen Register problemlos auslesen lassen. Das sieht folgendermaßen aus:

    Bei dem ersten Auslesen des Motion-Registers erhalte ich immer Datenmüll, erfolgt danach sofort ein zweites Auslesen so sind die Werte korrekt. Mit zweimal auslesen könnte ich ansich noch leben, nur hat das zur Folge, dass dann die Register dx und dy nur noch Müll zurückliefern. Diese können aber nur unmittelbar nach dem Motion-Register gelesen werden. Ich benötige allerdings wirklich die Werte alle drei Register.

    Eine Alternative dazu ist das Motion Burst - Register, dieses erweist sich aber als noch problematischer, da nach Anfrage die Register Motion, dx und dy ( natürlich fehlerhaft ) sowie SQUAL, Shutter upper, shutter lower und Maximum Pixel ( alle einwandfrei ) nicht komplett die gewünschten Werte liefern.

    Hat einer von euch vielleicht ne Idee woran das liegen könnte?

    Die Datenübertragung über SPI läuft bei ca. 200 kHz und müsste somit im grünen Bereich liegen. Dazu muss ich allerdings sagen, das ich die SPI-Funktionen zu Fuß geschrieben habe.

    Erste Versuche mit Latenzzeiten zwischen Anfrage und Antwort haben mich leider auch noch nicht weiter gebracht.

    Ich wäre euch für jede Hilfe echt dankbar. Alles was euch einfällt könnte mir vielleicht weiterhelfen.

    Cu
    lindwurm

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    hallo,
    ich habe das spi-protokoll auch zu fuß programmiert, es ist nicht das problem. kannst du den code posten? vielleicht kann man dort etwas sehen. es liegt in jedem fall auf der hand, dass der fehler in deinen schreib- und leseroutinen liegt. hast du daran gedacht, das msb der übertragung zu ändern? du weißt vielleicht, dass das msb beim schreiben an den chip einen anderen wert haben muss, als beim lesen, oder? ist nur so eine idee! es kann viele ursachen haben.

    wie gesagt, könntest du etwas mehr infos geben?

    ruppi

  3. #3
    Hallo,

    erstmal danke für Deine schnelle Antwort!
    Hier jetzt mal der Code für eine Leseoperation:

    unsigned char read ( unsigned char sc)
    {
    unsigned char i, k, k1, k2, rc, wait;

    GIE = FALSE;
    //ncs = 0;
    for (i = 0; i < 8; i++)
    {
    if (sc & 0x80)
    sdo = 1;
    else
    sdo = 0;

    sc <<= 1;
    sck = 1;
    for (k = 0; k < 5; k++)
    ;
    sck = 0;
    }
    GIE = TRUE;
    sdo = 0;

    for (wait = 0; wait < 20; wait++); //tsrad Zeitverzoegerung

    GIE = FALSE;

    rc = 0;

    for (i = 0; i < 8; i++)
    {
    sck = 1;
    for (k1 = 0; k1 < 2; k1++);
    rc <<= 1;
    if (sdi)
    rc |= 0x01;
    sck = 0;
    for (k2 = 0; k2 < 30; k2++);
    }
    GIE = TRUE;
    //ncs =1;
    return(rc);
    }

    Das sollte allerdings nicht der Grund für das Problem sein, da hiermit die anderen Register in der Regel fehlerfrei gelesen werden können, aber man kann ja nie wissen. Delays funktionieren noch nicht korrekt, daher die leeren for-Schleifen.
    Das mit dem MSB versteht sich ja von selbst, es wäre auch keinen Antwort zurückgekommen, wenn ich es für eine Leseoperation falsch gesetzt hätte.

    Du hast das Thema auch in Deiner Diplomarbeit gehabt, oder? Hast Du den Bewegungsregistern irgendeine "besondere Behandlung" zukommen lassen?


    Cu
    lindwurm

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    Hallo,
    der code ist für mich schlecht nachvollziehbar, es kommt noch hinzu, dass ich nicht in C programmiere. vielleicht hilft folgendes, denn so habe ich es gemacht (man beachte genau die reihenfolge beim setzen und rücksetzen von dem clock-ausgang).

    in einer art basic würde das auslesen eines registers etwa so aussehen:

    function read_register(Regi As byte) As byte
    chipSelect=0

    Regi &= 127 //muss beim Lesen immer 0 Sein
    for i = 7 To 0 Step -1
    Sclock=0
    mosi = Regi && 2^i
    Sclock=1
    next i

    //hier kurze pause einbauen
    '-------------------------------------------

    'Registerinhalt lesen
    value = 0
    for i = 7 To 0
    Sclock=0
    Sclock=1
    If miso = 1 Then value += 2^i
    next i

    chipSelect=1
    return value

    du kannst das auf deinen quellcode sicher besser übertragen als ich...

    die bewegungsregister werden nicht anderes ausgelesen. dort überträgt man die addresse &H50 für das motion register, wartet mindestens 75µs und taktet dann 52 bits aus dem sensor.
    noch eine wichtige sache: wenn scheinbar nur die bewegungsregister falsch sind, könnte das auch an der umrechnung liegen. die bewegungswerte streuen ja zwischen -128 und 127. ist deine umrechnung korrekt bzw. hast du das bedacht? probier doch erstmal das maximumpixel-register zu lesen. an diesem kann man schön die funktion testen, denn dies register enthält ja den wert des hellsten pixel des bildes. wenn du mit einer lampe auf den sensor leuchtest, muss dieser wert sofort steigen. er kann maximal 63 (6 bit) betragen. wenn das nicht klappt, stimmt die leseroutine noch nicht.
    ist jetzt vielleicht keine große hilfe, aber das kriegen wir hin!

    ruppi

  5. #5
    Hallo,

    vielen Dank, Dein Code hat mich auf etwas aufmerksam gemacht! Nachdem ich nochmal mit der Wartezeit über chip select experimentiert hatte, funktionierte es auf einmal. Anscheinend hatte ich selbige vorher nie ausreichend groß genug eingestellt.

    Kommt es bei Dir eigentlich auch mal vor, dass der Sensor ( bei mir allerdings selten ) beim Lesen eines Registers den Wert des davor gelesen nochmal liefert?

    Gruß
    lindwurm

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.03.2005
    Ort
    OWL
    Beiträge
    216
    hallo!
    sorry, dass ich jetzt erst antworte. dieses problem tritt bei mir nie ein, ich kann mir auch nicht erklären, wie das passieren kann.

    ruppi

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad