Forum: Mikrocontroller und Digitale Elektronik serielle Maus nachbilden


von saftpresse (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

Was hast du da mit dem Interrupt vor?
Wie ist der verabelt?

von saftpresse (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von saftpresse (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von saftpresse (Gast)


Lesenswert?

okay. blöde frage, aber wie mach ich solch eine schleife?

von Karl H. (kbuchegg)


Lesenswert?

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.

von saftpresse (Gast)


Lesenswert?

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

von saftpresse (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von saftpresse (Gast)


Lesenswert?

ich war schneller ;)
aber ja, das war der fehler. leichtsinn...

aus sbr wird ldi und schon funktionierts, auch ohne schleife. danke!!

von Karl H. (kbuchegg)


Lesenswert?

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)

von saftpresse (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.