ATMega8 USART geht nur bis 127

OP #330795
Lesenswert?

Hi.

Ich habe ein Programm geschrieben, welches ein ASCII-Zeichen mittels
der USART-Routine von Peter Fleury empfängt und als Hex-Zahl auf einem
Display ausgibt. Zudem sendet es empfangene Zeichen als Echo zurück.
Das komische ist nun, dass es das Zeichen zwar korrekt an HyperTerminal
zurücksendet, aber auf dem Display nur bis 127 (0x7F)[⌂] korrekt
anzeigt, bei 128 (0x80)[Ç] zeigt es 199 (0xC7)[Ã] an, bei 129 (0x81)[ü]
erscheint 252 (0xFC)[³] - darüber ist auch alles falsch. Hier ein
Screenshot wie ich Hyperterminal eingestellt habe. Hat jemand von euch
eine Idee woran das liegen könnte?

Vielen Dank,
Felix
Angehängte Dateien:
Gast #330798
Lesenswert?

@felix: vermutlich sagst du gleich "hab ich shcon 10fach gemacht"
....
aber trotzdem :-)

kontrolliert mal gaaaanz genau den Pegelwandler (verm. Max232) inkl.
der Aussenbeschaltung, Masse, etc...

Ich hab auch schon öfter solche komischen Phänomene mit der rs232
gehabt wenns mal schnell gehen sollte... war stets ne vergessene Masse
oder nen anderer Fehler in der Hardware


greetz
Danny
OP #330799
Lesenswert?

Danke, ja hab ich gemacht, mir ist aufgefallen, dass es 9,9 V statt 12
liefert, aber das dürfte eigentlich kein Problem sein. Das echo stimmt
ja auch, irgendwie muss der µC das Bit 7 versauen, aber richtig wieder
zurückgeben. Mein Display ist ein HD44780 kompatibles LCD, Umwandlung
nach Ascii mach ich folgendermaßen:

char buffer[9];     //Ausgabebuffer deklarieren
unsigned int c = uart_getc();
itoa(c,buffer,10);
lcd_writetext (buffer);

Liegt dort irgendwo der Fehler oder im 8-Bit Modus der
RS232-Schnittstelle?

Danke,
Felix
Gast #330801
Lesenswert?

Ich kenne leider die Lib von P.Fleury nicht, deshalb die Frage: Welcher
Rückgabetyp ist denn bei uart_getc() definiert? unsigned int scheint
mir für einen 8-Bit Wert Verschwendung, evtl. fehlt auch einfach nur
ein type-cast.
OP #330803
Lesenswert?

@Profi: Ja, da habe ich mir auch schon Gedanken gemacht. Habe aber alle
Einstellungen auf Standard.

@thkais: In der uart.h steht:
      extern unsigned int uart_getc(void);
Im low Byte gibt es das zuletzt empfangene Byte vom Ringpuffer zurück
und im High-Byte den letzten Empfangsfehler.

@kai: Ja, das kann scho sein. Allerdings gebe ich das Zeichen nicht als
ASCII-Zeichen aus sondern als Nummer. Die Konvertiereung erledigt
itoa(); Zum Eingeben verwende ich dann halt bspw. ALT+129. Somit kann
ich die Steuerbefehle viel einfacher halten. Was Ich damit bezwecken
will, ist dass ein anderer µC Befehle sendet und er einfach mit einer
switch(); Anweisung nachschaut, was er bei dieser Nummer tun soll.
Display und Hyperterminal dienen momentan nur zum debug während der
Entwicklung.


Vielen Dank euch allen,
Felix
Angehängte Dateien:
OP #330805
Lesenswert?

Danke für den Tipp! Damit gehts. Ich denke der Grund ist, dass man zwar
mit ALT+XYZ den ASCII Code eingibt, aber Hyperterminal das jeweilige
Zeichen als ANSI schickt, d.h. Code deckt sich nur in den ersten 128
Zeichen. Das kann man aber auch umstellen, werde ich vielleicht später
mal versuchen.

Nochmals Vielen Dank euch allen!

Felix

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