www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART-Problem


Autor: Johannes Majer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
bin Anfänger und experimentiere zur Zeit mit dem Uart herum.
Wobei ich auf ein Problem gestossen bin, welches ich schon seit längerem 
versuche zu lösen.
Habe im Archiv leider auch keinen Lösungsansatz gefunden.

Eigentlich funktioniert das senden und auch das Empfangen ohne Probleme, 
jedoch wenn ich nach einem empfangenen Byte mehrere (z.B. 2 Byte) wieder 
an den PC zurücksenden möchte wird nur eines gesendet.

Kurze Beschreibung des angehängten Code's (sollte wenigstens so 
funktionieren):

Im Hauptprogramm werden alle benötigten EInstellungen gemacht 
(Interrupt-Bit's gesetzt) gemacht und danach in einer Endlosschleife 
verweilt.
Beim Empfang eines Bytes wird dieses in ein Register geschrieben (und 
zum testen) einmal inkrementiert, (zurück-)gesendet, gewartet bis 
versendet, noch einmal inkrementiert und dann noch einmal 
(zurück-)gesendet
So dass wenn ich z.B. im Terminalprogramm des Pc's den Wert 7 an den MC 
sende, zuerst 8 und anschließend 9 an den PC zurückgesendt wird. Sollte 
zumindest so sein.
Es wird aber nur einmal inkrementiert bzw. nur das erste inkrementierte 
Byte zurückgesendet. Kann mir hier jemand sagen was ich da falsch mache?

Wäre für jeden Tipp dankbar.

Danke Euch allen.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes!

Ich programmiere normalerweise C, aber ich habe mir dein Programm man 
angesehen.
Meine Erfahrungen mit Assembler sind nicht die Besten. Ich versuche 
jeoch, dir meine Gedanken mitzuteilen.
In der IRQ-Routine stehen folgende Befehle für das Senden:

warte1:
  sbis UCSRA,UDRE
    rjmp warte1
    out UDR, temp

Also sbis wartet anscheindend so lange bis man wieder senden darf. UDRE 
wird dann 1, wenn das Register leer ist.
Warum machst du dann eigentlich als nächstes eine Schleife mit
rjmp warte1? Der Prozessor kommt da doch nie wieder raus. Oder kann der 
sbis-Befehl die Schleife unterbrechen?
Lass mal einfach die Schleife weg. Der Prozessor weis ja sowieso nach 
dem sbis-Befehl, dass er senden darf.

Ich hoffe ich konnte dir helfen.

Tschüss!

Martin

Autor: Johannes Majer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,
Danke für Deine Antwort.
HAbe jetzt da Problem gelöst. Es lag an einer Einstellung in meinem 
Terminal-Program (ist von einer Buch-CD). Das hat einfach das 2. Byte 
verschluckt.
D.h. das Prog war soweit o.k. und Deine Vermutung dann wohl nicht 
richtig.

Noch zur Info:

"sbis UCSRA, UDRE" bedeutet: Springe falls Bit (UDRE) im Register UCSRA 
gesetzt ist. UDRE ist gesetzt wenn die Übertragung erfolgt und somit 
frei für die nächste Übertragung ist. "Springe" bedeutet hier den 
nächsten (EIn-Wort-)Befehl überspringen (hier also das (rjmp...).

Wenn das Bit also nicht gesetzt ist (und damit die Übertragung des 
aktuellen Bytes noch nicht abgeschlossen ist)
wird der Befehl rjmp.. ausgeführt und damit zurückgesprungen, solange 
bis das Bit gesetzt ist. Dann wird rjmp... übersprungen und der weitere 
Programmlauf ausgeführt.

Also korrekt.

Trotzdem noch mal Danke.

Johannes

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Johannes,

im Netz gibt es ein sehr gutes Terminal von Bray. Einfach mal googlen. 
Da hat man die Möglichkeit, sich die Daten als Hex-Werte oder Strings 
anzeigen zu lassen. Ansonsten ist es sehr übersichtlich und einfach zu 
bedienen. Hat natürlich auch noch weitere Funktionen. Vielleicht ist es 
was für dich..

Gruß,
Ralf

Autor: DerInder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
probier doch mal NetTerm, läuft bei mir auf allen Rechnern - von Win95 
bis XPpro.

Gruß
-=jens=-

Autor: Johannes Majer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,
danke für Eure Tipps zu den Tools. Habe Sie mir schon runtergeladen. 
Sehen echt vielversprechend aus.

So, und jetzt werden Daten ausgetauscht bis die Drähte glühen. ;-)

Nochmals Danke.

Gruß

Johannes


P.S. Absolut klasse Forum hier!!!

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.