Hallo! Ich versuche gerade mit einem ATMega8 eine serielle Maus nachzubilden. Nur irgendwie funktioniert das ganze nicht so. Der Mauszeiger bewegt sich sporadisch, aber nicht so wie ich es eigentlich erwarte. der code ist im anhang, das mausprotokoll kann man leicht im internet finden. hat jemand eine idee wo mein denkfehler liegt? ich hoffe ihr könnt mir helfen!
an int0 hängt über eine kleine schaltung aus diode und widerstand rts. dass der rechner die maus als solche erkennt, muss ja sobald rts 1 ist, ein M gesendet werden. aber erkannt wird mein uC ja. sonst würde sich der zeiger garnicht bewegen.
Was mir an deinem Code nicht gefällt: Du bläst da Full-Speed Bytes raus, ohne Rücksicht auf Verluste. So schnell kann doch kein Mensch eine Maus bewegen, wie du die RS232 dicht machst. Das weiß auch der Empfänger und versucht meistens hintereinander eintreffende Mausbewegungen zu einer einzigen zusammen zu fassen um nicht wegen jeder Kleinigkeit im Betriebssystem eine komplette Kette an Nachrichten bis rauf zum Benutzerprogramm auszulösen. Wenn du deine Maus schnell hin und her bewegst, siehst du auch, dass der Cursor irgendwann anfängt in größeren Sprüngen sich zu bewegen. Probier doch mal nach einerm Datenpaket eine Pause einzulegen.
die bytes werden ja nur gesendet, wenn einer der vier kontakte geschlossen ist. aber das mit der pause klingt sinnvoll. wieviel wäre denn angebracht?
saftpresse schrieb: > die bytes werden ja nur gesendet, wenn einer der vier kontakte > geschlossen ist. aber das mit der pause klingt sinnvoll. wieviel wäre > denn angebracht? Keine Ahnung, probier einfach mal. Lieber länger als zu kurz. Kürzer kann man immer gehen. Ich würde einfach mal mit 1 Sekunde anfangen (oder was man eben billig mit ein paar ineinander geschachtelten Registerschleifen bekommt, die Zeit an sich ist ja nicht wichtig. Größenordnungsmässig 1 Sekunde). Wenn der Cursor jede Sekunde um 1 Pixel nach rechts hoppelt, sieht man das ja schon. Es geht ja nur darum, erst mal abzuklären ob das auch wirklich das Problem ist. Bis jetzt ist es ja mehr eine Hypothese :-)
zb so
1 | ldi r21, $FF |
2 | wait0: ldi r20, $FF |
3 | wait1: dec r20 |
4 | brnz wait1 |
5 | dec r21 |
6 | brnz wair0 |
bei Bedarf dann eben nochmal mit r22 eine Schleife aussen rum legen. Und wenn das nicht reicht noch ein mit r23, solange bis du mit deiner Taktfrequenz auf irgendwas bei 1 Sekunde kommst. Oder in die innerste Schleife einen nop einfügen. Hauptsache es braucht Takte und wird oft ausgeführt.
danke! brachte aber leider keine änderung :( wenn man die daten mitschneidet, kann man sehen, dass irgendwas definitiv nicht stimmt. die bytefolge ist immer gleich: 0000: M 4D 077 115 01001101 0001: _ 5F 095 137 01011111 0002: ? 3F 063 077 00111111 0003: ? 3F 063 077 00111111 0004: _ 5F 095 137 01011111 0005: ? 3F 063 077 00111111 0006: ? 3F 063 077 00111111 0007: _ 5F 095 137 01011111 0008: ? 3F 063 077 00111111 0009: ? 3F 063 077 00111111 0010: _ 5F 095 137 01011111 0011: ? 3F 063 077 00111111 0012: ? 3F 063 077 00111111 0013: _ 5F 095 137 01011111 0014: ? 3F 063 077 00111111 0015: ? 3F 063 077 00111111 ...
ah, ich bin doch ein depp :D natürlich kann es nicht gehen, wenn man mittels sbr immer nur einzelne bits setzt. irgendwann hat man natürlich 0b1111111 und es geht nicht weiter. richtig ist natürlich ldi :D
saftpresse schrieb: > danke! brachte aber leider keine änderung :( > wenn man die daten mitschneidet, kann man sehen, dass irgendwas > definitiv nicht stimmt. die bytefolge ist immer gleich: Das würde man allerdings an einer Mausschnittstelle erwarten. Nur: Was wird da eigentlich übertragen sbr mausbyte1, 0b1000000 Ich denke nicht, dass das das ist was du willst. sbr bedeutet 'Set Bit In Register' Ich denke allerdings du wolltest hier Load Register with value ldi mausbyte1, 0b1000000 sinngemäss auch bei allen anderen.
ich war schneller ;) aber ja, das war der fehler. leichtsinn... aus sbr wird ldi und schon funktionierts, auch ohne schleife. danke!!
saftpresse schrieb: > ich war schneller ;) > aber ja, das war der fehler. leichtsinn... > > aus sbr wird ldi und schon funktionierts, auch ohne schleife. danke!! Gut zu wissen. Also darf man da ruhig volle Kanne reinröhren. (So ist mir auch geholfen. Danke)
scheinbar. solange der controller es gebacken kriegt. aber das wird ja mit TXC überprüft
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.