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.

Bild hier  

Die fertige Robomausplatine mit Stiftleiste sieht man hier.

Bild hier  

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.

Code:
$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".

Bild hier