Forum: Mikrocontroller und Digitale Elektronik Attiny45 Dateneingabe über RS232 komisch


von Armin R. (ironlayer)


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

von Walter S. (avatar)


Lesenswert?

läuft der Tiny mit einem Quarz?

von Armin R. (ironlayer)


Lesenswert?

Nein, mit internen 8MHz.

von Armin R. (ironlayer)


Lesenswert?

Die Ausgabe aufs Terminal funktioniert ja einwandfrei!
Nur die Tastatureingaben stimmen nicht und ich hab keine Ahnung wieso...

von Walter S. (avatar)


Lesenswert?

Armin R. schrieb:
> Nein, mit internen 8MHz.

keine gute Idee,
miss doch mal die Taktfrequenz

wenn du dir die Bitmuster deiner beiden Werte anschaust ist da einfach 
eine 0 eingeschoben, deutet sehr auf falschen Takt hin

von Armin R. (ironlayer)


Lesenswert?

Ok, stimmt.
Müsste die Ausgabe vom AVR ins Hyperterminal dann aber nicht auch 
spinnen?!?
Das Ergebnis in der Variable ist ja auch immer das gleiche.
Geht das nur mit Quarz? Ich müsste nämlich alle übrigen Pins haben, also 
eigentlich kein Platz fürn Quarz...

von Marco G. (grmg2010)


Lesenswert?

reduziere doch einmal zu Testzwecken die Baudrate auf 9600.tritt der 
Fehler nicht mehr auf weisst du das es an dr Baudrate liegt

: Bearbeitet durch User
von Armin R. (ironlayer)


Lesenswert?

Ah, ich Depp. Da hab ich tatsächlich nicht dran gedacht!

Werde ich morgen Früh direkt mal machen und berichten...hab jetzt schon 
alles aus gemacht.

Schonmal vielen Dank für die Tipps
und erstmal Gute Nacht!

von Walter S. (avatar)


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

von batman (Gast)


Lesenswert?

Man kann den internen RC-Taktgeber kalibrieren, so daß er in der 
Toleranz läuft. Mit einem Uhrensketch zu kontrollieren.

von Armin R. (ironlayer)


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!

von Armin R. (ironlayer)


Lesenswert?

Nachtrag:
Wenn ich TXDELAY auf '+3' und RXDELAY auf '+4' stelle, kann ich sogar 
auf 230400 Baud raufgehen.

von batman (Gast)


Lesenswert?

Schön, nur läufts so auf einem anderen t45 oder mit Quarz vielleicht 
nicht mehr.

von Armin R. (ironlayer)


Lesenswert?

Das mag sein. Habe ja nur meine "Erfahrung" teilen wollen.
Bei mir klappts jedenfalls so auf diesem Tiny.

Kann heut Abend mal nen anderen T45 füttern und sehen wie der damit 
umgeht ;-)

von Armin R. (ironlayer)


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

von Walter S. (avatar)


Lesenswert?

Armin R. schrieb:
> Ein Mega32 läuft auch mit internen 8Mhz bei 230400 problemlos

bei 5V und 20-25 Grad ..

allen die das nachmachen wollen empfehle ich die Diagramme
Calibrated 8 MHz RC Oscillator Frequency vs. Temperature
sowie
Calibrated 8 MHz RC Oscillator Frequency vs. Vcc
zu beachten

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.