Forum: Mikrocontroller und Digitale Elektronik UART-Problem


von Johannes Majer (Gast)


Angehängte Dateien:

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.

von Martin (Gast)


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

von Johannes Majer (Gast)


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

von Ralf (Gast)


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

von DerInder (Gast)


Lesenswert?

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

Gruß
-=jens=-

von Johannes Majer (Gast)


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

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.