mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik serielle Maus nachbilden


Autor: saftpresse (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast du da mit dem Interrupt vor?
Wie ist der verabelt?

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay. blöde frage, aber wie mach ich solch eine schleife?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zb so
       ldi   r21, $FF
wait0: ldi   r20, $FF
wait1: dec   r20
       brnz  wait1
       dec   r21
       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.

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
...

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich war schneller ;)
aber ja, das war der fehler. leichtsinn...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: saftpresse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
scheinbar. solange der controller es gebacken kriegt. aber das wird ja 
mit TXC überprüft

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.