Jango
17.09.2006, 15: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
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