Hallo zusammen,
ich habe folgendes Problem:
Ich sende Zeichen vom Computer zum ATMEGA8 und der uC sendet diese
gleich zurueck (via Interrupt). Das klappt soweit ganz gut, ausser das
der uC manchmal die Zeichen nicht sofort wieder zuruecksendet, sondern
ich erst wieder Zeichen senden muss, welche er mir dann mit den
vorherigen Zeichen zurueckgibt.
Meine Vermutung ist, dass die Zeichen manchmal im Transmit Shift
Register haengen bleiben (wie gross ist das eigentlich?).
Wenn ich nun nach dem Einlesen ins UDR einige Zeit warte (=mehr als 100
Zyklen ... genau weiss ich das Momentan nict), dann tritt das Problem
nicht auf. Ich verwende einen Baudratenquarz mit 7372800Hz und das
STK500-Board. Programmierung in ASM.
Kann mir da jemand vielleicht weiterhelfen?
Der Code ist in gekuerzter Fassung folgender (volle Version im Anhang):
Hi
Das Datenregister UDR ist gepuffert. D.h. 'sbis UCSRA,UDRE' testet ob
der Puffer frei ist, nicht ob das Byte gesendet wurde. Wenn du sicher
sein willt, das das Byte gesendet wurde musst du 'TXC' abfragen ->
'sbis UCSRA,TXC'.
MfG Spess
Wenn UDRE gesetzt ist, kann man auch in das Transmit-Register schreiben.
Der Schreibvorgang auf UDR triggert in jedem Fall die Ausgabe.
Schlechtestenfalls kommen halt 2 Bytes direkt nacheinander. Dabei kann
es aber nicht zu Aussetzern kommen. Ich vermute das Problem eher auf
PC-Seite und dessen Pufferbehandlung. Wenn Du kannst, prüfen den TXD-Pin
mal mit einem Oszilloskop. Bin fast 100%-ig sicher, daß der Controller
immer sendet.
spess53 wrote:
> Hi>> Das Datenregister UDR ist gepuffert. D.h. 'sbis UCSRA,UDRE' testet ob> der Puffer frei ist, nicht ob das Byte gesendet wurde. Wenn du sicher> sein willt, das das Byte gesendet wurde musst du 'TXC' abfragen ->> 'sbis UCSRA,TXC'.
Ich habe das mal ausprobiert und direkt nach dem schreiben in UDR 'sbis
UCSRA,TXC' als Schleife eingesetzt. Gleiches Resultat (wenn ich das
testweise davor mache, dann bleibt er in eine Endlosschleife haengen)!
Oder wo wuerde man die Abfrage sonst hinmachen?
Gruss,
Parvis
> Wenn UDRE gesetzt ist, kann man auch in das Transmit-Register schreiben.> Der Schreibvorgang auf UDR triggert in jedem Fall die Ausgabe.> Schlechtestenfalls kommen halt 2 Bytes direkt nacheinander. Dabei kann> es aber nicht zu Aussetzern kommen. Ich vermute das Problem eher auf> PC-Seite und dessen Pufferbehandlung. Wenn Du kannst, prüfen den TXD-Pin> mal mit einem Oszilloskop. Bin fast 100%-ig sicher, daß der Controller> immer sendet.
Meinst Du, dass das im Empfangs-Puffer vom Computer ist oder der
Computer es noch nicht angenommen und es deshalb beim uC haengen
bleibt?? Dann duerfte aber eigentlich der TXC im UCSRA nicht geloescht
werden, oder? Leider habe ich gerade kein Oszi zur Hand. Gebe es denn
noch eine andere Moeglichkeit das zu testen??? Welche Variablen koennte
ich denn noch testen? Eins ist sicher, der uC empfaengt alle Daten (mit
via LCD-Display nachgeprueft) und bleibt auch soweit in keiner Schleife
haengen.
Gruss,
PArvis