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 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...
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?
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).
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
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.
Lesezeichen