PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kugelmaus Ps2 Protokol [Bascom]



D2zA
14.12.2009, 18:02
Hallo.
ich suche jetzt schon seid Stunden nach einer Lösung für mein Problem.
Ich weiß es gibt hunderte Threads über die Maussensoren hier im Forum, aber keiner hat mir wirklich weitergeholfen.

Folgendes Problem:

Ich habe eine alte Kugelmaus (Schaltplan im Anhang). Die Data Leitung habe ich am PortA.0 und die Clockleitung am PortA.1 angeschlossen.
Mit dem Ps2-Protokol bin ich vertraut.
Ich möchte das ganze in Bascom programmieren, da ich nur ein Rs232 Kabel habe ,um den Code auf den Chip zu laden.
Eine Assemblerlösung die ich in meinen Bascom Code integrieren kann wäre auch ok.

Also ich habe noch ein paar Anfangsschwierigkeiten.
Wenn ich jetzt alles Anschalte, müsste mir die Maus ausgeben, das der Selbsttest erfolgreich war und mir die Id durchgeben.
Wie kann ich die Daten die von der Maus gesendet werden anzeigen lassen?(Am besten code Beispiel)
Nun müsste die Maus sich ja im Ruhezustand befinden und darauf warten, das ich das Data reporting aktiviere. Wie kann ich das in Bascom machen? Und wie empfange ich dann die Daten, die die Maus mir zusendet?

Das hat doch bestimmt jemand schonmal in Bascom realisiert und kann mir vielleicht auf die Sprünge helfen?

Ich freue mich über jede Antwort.

Gruß D2zA

Netzman
15.12.2009, 10:31
Ich hab mal versucht das Protokoll für 2 Mäuse mit asynchronem Ablauf zu implementieren. Leider hatte ich immer sporadische Übertragungsfehler, ich denke es liegt an der Print-Ausgabe, habe das inzwischen nicht mehr weiter verfolgt. Mit einer Maus funktioniert es.
Vielleicht hilft der Code ja...

mfg

D2zA
15.12.2009, 20:58
Hallo,
vielen Dank für deinen Code, der wird sicherlich nützlich sein, ich werde mich gleich da mal reinarbeiten.


Gruß

D2zA
16.12.2009, 15:57
hallo,
ich habe eine Frage zu deinem Code, mir ist nämlich noch nicht genau klar, welche Rolle die Ticker spielen.

Du verwendest ja für eine Maus zwei Ticker:

Ticker_time(1) = 10 ' ~200µS, dev1 host start bit
Ticker_time(2) = 150 ' 10mS, update movement



Zu Timer 1:
Warum muss der Startbit timer 200µS betragen?
Könnte man den Timer auch durch ein Delay ersetzen, oder muss das Zeitinterfall genau 200µS betragen?

Zu Timer 2:
So wie ich das verstanden habe, bestimmt man damit das Zeitintervall, in dem die Maus abgefragt wird, ob sich was bewegt hat. Ist das Richtig?
Kann man den Timer beliebig verändern, oder durch waitms ersetzen?


Was ich auch noch nicht ganz verstehe ist die Funktion Ticker_Get_interrupt()

Was wird beispielsweise mit dem Befehl erreicht:
Ps2_tickerinterrupt = Ticker_get_interrupt()

Wird dort der Variabel Ps2_tickerinterrupt der aktuelle ticker interrupt zugewiesen, oder wird dort einfach der ticker abgearbeitet, sodass die gewünschte Zeit vergeht?



Vielen Dank schonmal.
Gruß D2zA

Netzman
16.12.2009, 23:04
Die Ticker sind einfach Software-Timer (läuft mit einem HW-Timer, kann aber bis zu 256 Zeiten messen).

Ticker_get_interrupt() verarbeitet die Softwaretimer Geschichte und gibt im Falle eines Interrupts dessen ID zurück mit der man dann weiter arbeiten kann, wenn kein Interrupt aufgetreten ist, wird 0 zurückgegeben.
Durch verändern von Ticker_Time(x) kannst du auch die Zeiten ändern.

Natürlich könntest du die ganze Tickersache durch Delays ersetzen, aber genau das wollte ich vermeiden: Delays sind einfach Schleifen die den Prozessor anhalten, mit den Tickern kann der Prozessor in den Pausen andere Sachen machen (essentiell bei der Verwendung von 2 Mäusen).

mfg

D2zA
18.12.2009, 10:53
Ok ich verstehe.
Was wird denn in der Ticker Service Interrupt Routine erledigt?

Ticker_isr:
$asm
push R25
push R24
IN R24, SREG
PUSH R24
$end Asm

Ticker_timer = Ticker_preload ' reset the timer register with calculated preload value
Ticker_newtick = True ' set flag
$asm
pop R24
Out Sreg , R24
POP R24
pop R25
$end Asm
Return

Netzman
18.12.2009, 11:23
Die Assembler-Teile sichern und stellen die verwendeten Register wieder her. Bascom erstellt normalerweise in den Interrupt-Routinen Code der alle Register sichert, da ich aber nur 3 brauche habe ich das selbst gemacht um das zu beschleunigen.
Dann wird noch das Timerregister mit dem berechneten Wert neu geladen damit das richtige Intervall erreicht wird. Zum Schluss wird noch das Flag gesetzt dass der Interrupt aufgetreten ist um dann in der Funktion Ticker_Get_Interrupt das zu bearbeiten. Das Flag und die Bearbeitung im Hauptprogramm hat den Sinn, die Interruptroutine, die ja das laufende Programm unerbricht, möglichst kurz zu halten.

mfg