PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auslesen der Bewegungsinformationen des Maussensor ADNS-3060



lindwurm
26.10.2006, 09:13
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

Ruppi
26.10.2006, 15:57
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

lindwurm
27.10.2006, 08:18
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

Ruppi
27.10.2006, 18:42
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

lindwurm
03.11.2006, 07:04
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

Ruppi
05.11.2006, 16:55
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