- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Optische Maus mit PAN101 IC verwenden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.05.2005
    Beiträge
    42

    Optische Maus mit PAN101 IC verwenden

    Anzeige

    Powerstation Test
    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  

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.04.2004
    Ort
    München
    Alter
    36
    Beiträge
    288
    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
    Beschreibung meiner 8 Roboter unter: http://www.j-robotics.de

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2006
    Beiträge
    23
    Hi,
    Zitat Zitat von Javik
    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.04.2004
    Ort
    München
    Alter
    36
    Beiträge
    288
    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
    Beschreibung meiner 8 Roboter unter: http://www.j-robotics.de

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    14.05.2005
    Beiträge
    42
    Zitat Zitat von Javik
    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.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    14.05.2005
    Beiträge
    42
    Ups, da haben sich unsere Beiträge überschnitten

    Zitat Zitat von Javik
    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)

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.04.2004
    Ort
    München
    Alter
    36
    Beiträge
    288
    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 )
    den fertigen Code in C \/ findet, wer will, hier:
    https://www.roboternetz.de/phpBB2/vi...=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
    Beschreibung meiner 8 Roboter unter: http://www.j-robotics.de

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    31.08.2006
    Beiträge
    53
    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

  9. #9
    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

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad