Attiny45 Dateneingabe über RS232 komisch

OP #5057467
Lesenswert?

Hallo zusammen,
ich kappier da mal wieder was nicht!
Ich habe nen Attiny45 mit Half-Duplex UART (von Nerd Ralph -> 
http://nerdralph.blogspot.de/2014/01/avr-half-duplex-software-uart.html?m=1) 
per RS232/USB-Converter an WinXP gehängt.
Schaltung und Beispielcode habe ich, so wie im Blog, übernommen.
Pin-Nummer habe ich in der "BasicSerial3.S" auf PB 4 gestellt.

Hier mein Problem:
Wenn ich mit 'serOut' einen Textstring ans Hyperterminal schicke, kommt 
dieser problemlos und korrekt an. Auch mit 'TxByte(97)' erscheint ein 
"a" im Terminal. Alles soweit OK.
ABER: Wenn ich mit dem AVR mit RxByte() ein Zeichen lese, enthält die 
Variable nicht den, der Taste zugehörigen, ASCII-Code.
Bei Tastendruck "f" steht in der gelesenen Variable '198', der 
ASCII-Code wäre aber '102'.
Führe ich bei Tasteneingabe 'if(variable==198) TxByte(102);' aus, wird 
dann auch die korrekte Taste "f" angezeigt.

Ich habe im Hyperterminal sämtliche Einstellungen durch.
Im AVR das Fusebit CKDIV8 ist deaktiviert
Baudrate ist für COM2 und im Hyperterminal auf 115200 Baud 81N 
eingestellt.
Hatte auch schon vermutet, dass das Byte vom AVR 'falschrum' gelesen 
wird, aber auch das verdrehen der Bitfolge im Byte hats nicht gebracht!

Und ja, das Tastaturlayout im WinXp ist auf 'Deutsch' eingestellt. Alle 
sonstigen Programme etc. nehmen die Eingaben korrekt an...

Kann man da doch noch was umstellen?
Hat da jemand nen Tipp für mich?
Suchmaschine hat mir bisher nicht helfen können!

Gruss Armin
#5057626
Lesenswert?

Armin R. schrieb:
> Müsste die Ausgabe vom AVR ins Hyperterminal dann aber nicht auch
> spinnen?!?
nein, deine Sende/Empfangsroutinen sind ja nicht symetrisch, vor allem 
wird die Empfangsroutine einen Jitter haben

> Das Ergebnis in der Variable ist ja auch immer das gleiche.
> Geht das nur mit Quarz?
Eigentlich ja, du bist da der tausendste der das erleben muss

>Ich müsste nämlich alle übrigen Pins haben, also
> eigentlich kein Platz fürn Quarz...
Du kannst zum Einstellen die Bitbreite eines vom PC gesendeten Bytes 
messen und die Delays in deinen Routinen entsprechend anpassen wie es 
z.B. PeDa in seinem Bootloader macht
OP #5058609
Lesenswert?

Ging leider doch erst Nachmittags...
Habe mir ein paar Beiträge zu PeDas Bootloader mal angeschaut. Ist ja 
schon etwas umfangreicher!

Hab mich dann mal an die Einstellungen in der "BasicSerial3.h" 
rangetraut, Zwecks Timingkorrektur.

Erstmal hatte ich die Baudrate auf 9600 Baud gesetzt. AVR Studio bzw der 
Errortext in der "BasicSerial3.h" meinte aber, die Baudrate sei zu 
niedrig. Mit mindestens 38400 Baud gings dann, allerdings immer noch mit 
sporadischen Übertragungsfehlern.

Die endgültig funktionierende Lösung steht auch in der "BasicSerial3.h"!
Ich habe in der Definition von 'RXDELAY' den Wert '+1.5' auf '+2.5' 
erhöht, um das Empfangs-Delay zu erhöhen.
Damit funkioniert die Übertragung sogar mit 115200 Baud tadellos!

Also ist es tatsächlich, wie von euch direkt erkannt, ein Timingproblem 
gewesen.
Vielen Dank für eure Tipps!
OP #5061405
Lesenswert?

So,
hat zwar was länger gedauert, aber wie angedroht jetzt nochmal eine 
Erfahrung meinerseits:

Hab jetztl noch 3 weitere Tiny45 mit dem Programm gefüttert und CKDIV8 
deaktiviert. Läuft einwandfrei mit den internen 8Mhz und 230400Baud und 
den Delays RX+4 und TX+3. Kleinere Delays ergeben Fehler...

Ein Mega32 läuft auch mit internen 8Mhz bei 230400 problemlos, CLKDIV8 
natürlich deaktiviert. Allerdings kann ich da die Delays beide wieder 
auf den ursprünglichen +1,5 belassen :-)

Gruss Armin

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren