PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Optische Maus mit PAN101 IC verwenden



Jango
17.09.2006, 14:50
Hallo Leute.

Ich beschreibe hier kurz, wie ich die Platine einer optische Maus mit dem PAN101 IC an meinem ATMEGA angeschlossen habe um später damit Wegmessungen durchzuführen.

Grund, warum ich dafür einen Thread eröffne ist u.a., dass im Thread
https://www.roboternetz.de/phpBB2/viewtopic.php?t=22353 im AVR-C Forum danach gefragt wurde und dass beim c't Bot zwar ein Sensor einer optischen Maus verwendet wird, dieser aber nicht der PAN101 ist.

Wenn man sich die Platine der Maus ansieht, findet man leicht die Anschlüsse für PS/2 VCC, GND, Data und Clock. VCC und GND kann man mit den 5V/GND des AVR verbinden. die Data und Clock sind allerdings für das PS/2 Protokoll und für uns nicht geeignet.

Daten und Clockleitung des PAN101 liegen auf Pin 19 und 18 und sind leider auf der Mausplatine auf Masse gelegt. Daher musste ich die Verbindungen mit einem kleinen Trennschleifer trennen und danach zwei separate Kabel anlöten.

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1098

Die fertige Robomausplatine mit Stiftleiste sieht man hier.

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1097

Die Data und SCK Ausgänge habe ich mit PinD5 und 6 am AVR verbunden, was allerdings nur für das beigefügt BASCOM Programm eine Rolle spielt.

Wichtig ist, sich genau an das Protokoll im Datenblatt zu halten, da habe ich einige erfolglose Versuche hinter mich bringen müssen.

Bei Fragen und natürlich auch Anregungen und Kritik habe ich ein offenes Ohr.



$regfile = "m32def.dat"
$crystal = 8000000

' [LCD Code , Init, etc. entfernt..]

Sda Alias Portd.5
Sck Alias Portd.6
Sdapin Alias Pind.5
Sckpin Alias Pind.6

Dim B As Byte
Dim Bb As Byte
Dim Ix As Integer
Dim Iy As Integer

Dim I As Byte

Declare Sub Maus_sens_writebyte(bdata As Byte)
Declare Function Maus_sens_readbyte()as Byte
Declare Sub Maus_sens_write(adr As Byte , Bdata As Byte)
Declare Function Maus_sens_read(byval Adr As Byte) As Byte

Config Sdapin = Output
Config Sckpin = Output
Sda = 1
'Sck = 1

Do
B = Maus_sens_read(2)

If B.7 = 1 Then
Bb = Maus_sens_read(3)
Ix = Bb
If Bb.7 = 1 Then
Bb.7 = 0
Ix = Bb - 128

End If
Bb = Maus_sens_read(4)
Iy = Bb
If Bb.7 = 1 Then
Bb.7 = 0
Iy = Bb - 128
End If
Locate 2 , 1
Lcd B ; "-- X:" ; Ix ; " Y:" ; Iy ; " "

'Waitms 50
End If
Loop

End


' Hilfsfunktionen für 2 Draht

' Uebertraegt ein Byte an den Sensor
Sub Maus_sens_writebyte(bdata As Byte)

Config Sdapin = Output

'Daten rausschreiben
For I = 7 To 0 Step -1
Sck = 0

Sda = Bdata.i
Sck = 1
Waitus 1


Next I

Sda = 1 ' high z-state
Sck = 0
End Sub


'Liest ein Byte vom Sensor
Function Maus_sens_readbyte()as Byte
Dim Bdata As Byte

Bdata = 0

Config Sdapin = Input

For I = 7 To 0 Step -1

Sck = 1

Waitus 1
Bdata.i = Sdapin
Sck = 0

Next I

Maus_sens_readbyte = Bdata

End Function


'Uebertraegt ein write-Kommando an den Sensor
Sub Maus_sens_write(byte Adr , Dim Bdata As Byte)
Adr.7 = 1
Call Maus_sens_writebyte(adr)
Call Maus_sens_writebyte(bdata)

Waitus 4
End Sub



'Schickt ein Lesekommando an den Sensor
'und liest ein Byte zurueck
Function Maus_sens_read(dim Adr As Byte) As Byte

Call Maus_sens_writebyte(adr)

Waitms 4

Maus_sens_read = Maus_sens_readbyte()

End Function



Und hier noch die Ausgabe auf dem LCD beim Verschieben der Maus nach "rechts vorne".

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1099

Javik
18.09.2006, 14:20
Hi,

Also ich hab jetzt mal versucht das ganze nach C umzusetzen aber das haut noch nicht so richtig hin...
Was ich bei deinem Programm noch nicht so versteh sind die Wartezeiten.
du sagst man muss sich exakt an die Vorgaben aus dem Datenblatt halten, aber im Datenblatt steht drin, dass man bei nem SCK Impuls immer mindestens 3µs warten soll! du wartest eine?
sind das doch Erfahrungswerte?
kannst du vlt mal irgend einen Befehl senden und mir sagen, der ein Sichtbares Resultat bringt? (zB das rote LED ausgeht?) damit ich besser herausfinden kann wann das senden Funktioniert!
Ich glaube so ein Befehl müsste zB der Power down Modus oder der power Save modus sein. kannst du mal ausprobieren ob man da dann eine Änderung bemerkt?
Bin wieter dran, aber bis jetzt siehts so aus als hätte ich ziemliche timing Probleme!

noch ne andere Frage: was hat es sich mit diesem HI-Z State auf sich?
Gruß Javik

teran42
18.09.2006, 14:48
Hi,

noch ne andere Frage: was hat es sich mit diesem HI-Z State auf sich?




High impedance
From Wikipedia, the free encyclopedia
A high impedance signal (also known as hi-Z, tri-stated, or floating) is a digital signal which is not being actively driven to a logical high or a logical low (hence "tri-stated"). A high-impedance signal can be seen as an open circuit (hence "floating") because connecting it to a circuit will not affect that circuit. On the contrary, connecting an actively driven signal to a high impedance signal will force the hi-Z signal to the same voltage level. Because of this, hi-Z pins are often used as input pins for ICs; they can be used to "read" the voltage of the attached signal without impacting that signal.
...

Zu gut Deutsch der Pin wartet darauf von aussen eine Spannung "aufgedrückt" zu bekommen.

Schau weiterhin mal in den Dokus der Atmel Chips unter den Ports nach, dort wir ziemlich gut beschrieben was die einzelnen Zustände für Auswirkungen auf den Chip haben (ist im Grundsatz übertragbar auf andere ICs).

Gruss

Javik
18.09.2006, 18:52
Danke! :)
dann hab ich das jetzt au mal verstanden ;)
also HI-Z ist quasi wenn ein PIN als Input definiert ist aber dabei der Interne PullUp deaktiviert ist.

Ich hab jetzt weitergemacht und kann nun auch schon Oh Wunder! die Register des PANs beschreiben :)
(kann zB den Chip in Power Down modus versetzten, das bemerkt man dann daran, dass die LED ausgeht^^)

Aber beim Auslesen der Register hab ich noch so meine Schwierigkeiten!
Ich bekomme leider nur die Dezimalwerte 0,1,32,33,48,49 wobei ich eigentlich fast immer die 48 ankommt.
das mekrwürdige is, wenn ich die X und Y register auslese ist deutlich zu bemerken, dass sich dier werte ändern je nach dem wie ich die Maus bewege, aber leider eben nur zwischen den oben gennanten werten.
hattest du sowas auch schon mal?

gruß Javik

Jango
18.09.2006, 18:59
Was ich bei deinem Programm noch nicht so versteh sind die Wartezeiten.
du sagst man muss sich exakt an die Vorgaben aus dem Datenblatt halten, aber im Datenblatt steht drin, dass man bei nem SCK Impuls immer mindestens 3µs warten soll! du wartest eine?
Die 3 µs muss man zwischen senden der Adresse und Empfang der Daten warten, aber nicht zwischen jedem Takt. Dort habe ich 1 µs gewählt, beim c't Bot verwenden sie (nicht PAN101, sondern ADS) glaube ich nur ein Assembler "NOP".


kannst du vlt mal irgend einen Befehl senden und mir sagen, der ein Sichtbares Resultat bringt? (zB das rote LED ausgeht?) damit ich besser herausfinden kann wann das senden Funktioniert!

Mit Call Maus_sens_write(5 , 60) (Wert 60 in Adresse 5) bekomme ich die Maus ("langsam") zu blinken.



noch ne andere Frage: was hat es sich mit diesem HI-Z State auf sich?
Ist quasi ein "dritter" Zustand eines Ports. Weder auf GND noch hochgezogen. Offen quasi.
Das war übrigens bei mir der letzte Knackpunkt und ich IMO noch wichtiger als ein exaktes Timining a la Datenblatt (ruhig zu lange warten).
In Bascom setzt man dazu den Pin auf Input und setzt ihn auf 1.

Gruß,
Jango

PS: Ich hänge im MOment noch an der Gesamtauswertung, also Absolut x/y auf 0, dann maus bewegen und wieder auf startpunkt, da komme ich leider nicht wieder auf 0. Kann sein dass ich den Chip nicht oft genug auslese oder sowas. Oder doch noch Timing Probleme habe.

Jango
18.09.2006, 19:03
Ups, da haben sich unsere Beiträge überschnitten



Aber beim Auslesen der Register hab ich noch so meine Schwierigkeiten!
Ich bekomme leider nur die Dezimalwerte 0,1,32,33,48,49 wobei ich eigentlich fast immer die 48 ankommt.
hattest du sowas auch schon mal?


Da habe ich auf Anhieb keine rechte Idee.
Evtl. liest du sie zu selten ein?!
Vielleicht würde der Code zur Analyse helfen..

Jango

PS: In der Funktion Function Maus_sens_read sollte statt dem Waitms 4 ein Waitus 4 stehen (µs und nicht Millisekunden)

Javik
18.09.2006, 20:03
Vielen Dank für deine Hilfe :) ich hab jetzt vorhin gerade selber nochn bisschen rumprobert und es auch rausgefunden :) (das mit den seltsamen Ausgabewerten war Seeehr dum von mir #-o )
den fertigen Code in C \:D/ findet, wer will, hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=212573#212573
getestet mit einem PAN3101 (kleinerer PAN101) weniger PINs kein Quadratur Output aber ansonsten ziemlich gleich.


PS: Ich hänge im MOment noch an der Gesamtauswertung, also Absolut x/y auf 0, dann maus bewegen und wieder auf startpunkt, da komme ich leider nicht wieder auf 0. Kann sein dass ich den Chip nicht oft genug auslese oder sowas. Oder doch noch Timing Probleme habe.

wie meinst du das?
willst du einen Nullpunkt definieren und dann von dem aus die Koordinaten auf der sich die Maus gerade befindet?
oder ist die Maus schon am Roboter dran und der soll sich wieder zum Nullpunkt bewegen?

Danke für die Inspiration durch deinen Code ;)
Grüße Javik

Reinald
20.09.2006, 21:20
Hallo,

ich habe im Wiki einen Artikel zum Thema

https://www.roboternetz.de/wissen/index.php/Maussensor

angefangen, bitte fügt doch eure Erkenntnisse dort mit ein!

Danke
Reinald

jilmerle
05.05.2011, 17:49
Hallo,
Ich habe die Auswertung über die Rs232 auselesen. Bei mir kommt immer der Wert -1 für die x und die y Position
Hat jemand eine Idee, woran das liegt.
Vielen Dank