Forum: Mikrocontroller und Digitale Elektronik Atmega8 Uart


von iikuu (Gast)


Angehängte Dateien:

Lesenswert?

Hi zusammen

ich habe ein Problem mit meiner UART-Kommunikation.

Die Daten meines Boards:
8MHZ Quarz
Atmega8

Verbindung zum PC über Serial-to-USB Converter
Linux Betreibssystem

Zu meinem Problem:
ich habe mir ein Assembler Programm erstellt mit Hilfe des 
UART-Tutorials hier von der Website (im Anhang). Das Programm und die 
Kommunikation läuft auch soweit. Das Programm empfängt ein Zeichen und 
sollte dann einen Port setzen oder löschen. Zum Debuggen sendet es aber 
das gleiche Zeichen wieder zurück. Nun ist es aber so, dass nicht immer 
die Gleichen Zeichen zurückkommen, wie ich gesendet habe. Für bestimmte 
Zeichen funktioniert es (eine Auswahl):
w -> w
r -> r
z -> z
o -> o
Für einen bestimmen Zeichensatz funktioniert es aber nicht (eine 
Auswahl):
u -> w
i -> o
d -> f
h -> n

Im Moment habe ich keine Ahnung, an was es liegen könnte. Im Forum wird 
häufig eine falsche Baudrate als Grund angegeben. Meiner Meinung nach 
sollte sich 9600Baud und 8MHz aber vertragen (Datenblatt!). Weiter ist 
es auch komisch, dass immer die gleichen Zeichen falsch ankommen.

Ich habe auch schon ein C Programm erstellt, bei diesem habe ich das 
gleiche Problem, dort ist es aber z.T. noch extremer, sprich es kommen 
noch mehr Zeichen falsch an.

Danke für eure Hilfe

Gruss Johannes

von spess53 (Gast)


Lesenswert?

Hi

> Meiner Meinung nach
>sollte sich 9600Baud und 8MHz aber vertragen (Datenblatt!).

Wenn es ein Quarz und nicht der interne RC-Oszillator ist, ja.

MfG Spess

von iikuu (Gast)


Lesenswert?

High Fuse Bit ist: 11011001
Low Fuse Bit ist: 11101111

LG

von spess53 (Gast)


Lesenswert?

Hi

>High Fuse Bit ist: 11011001
>Low Fuse Bit ist: 11101111

Sollen wir die jetzt auseinandedröseln? Ausserdem solltest du wissen, ob 
in deiner Schaltung ein Quarz ist.

MfG Spess

von Johannes W. (iikuu)


Lesenswert?

Also in meiner Schaltung ist natürlich ein Quarz 
(Olimex-Experimentierboard für 28-Pin Atmega8).

CKSEL ist : 1111 (wobei 1 für Programmed)

Ausserdem muss ich noch anfügen, dass die übertragung vom IC zum PC 
einwandfrei funktioniert, wenn ich die ganze Zeit 'Test!' übertrage (ein 
Beispiel aus dem Uart-Tutorial auf dieser Seite).

LG

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 8MHZ Quarz
> .equ F_CPU = 4000000

Kannst du das erklären?

von Johannes W. (iikuu)


Lesenswert?

uuups, dass kommt vom ständigen, herumprobieren.

Das sollte eigentlich 8000000 sein. Nun ist das nicht das zentrale 
Problem. Denn es ist zwar jetzt besser, nicht mehr so viele Buchstaben 
kommen falsch an, jedoch immer noch ein paar, z.B. das a wird zum q und 
das c wird zum s.

Weiter hatte ich das genau gleiche Problem mit anderen Programmen, bei 
welchen die Frequenz richtig war (c und assembler).

Aber danke für diesen Hinweis!

LG Johannes

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mal dir die Bitmuster auf und schaue ob immer ein bestimmtes Bit falsch 
ist. Denk dran, bei RS232 kommt das LSB zuerst und das MSB zuletzt. 
Dahinter ggf. Parität und 1 oder mehrere Stoppbits. Prüfe, ob du bei PC 
und µC Parität und Stoppbits identisch eingestellt hast. Wenn nicht kann 
es sein, dass die zum Zeichen gezählt werden.

Du kannst beim µC auch Frameerrors abfragen und eine DebugLED schalten, 
wenn ein Fehler passiert ist.

Von der Hardware her ist alles OK? GND nicht vergessen? 
Abblockkondensator am TTL-RS232-Pegelwandler, falls solcher verwendet 
wird? Wenn TTL-USB-Serial-Adapter - arbeitet der mit gleichem Pegel wie 
dein AVR (5V/3.3V Logik)?

von spess53 (Gast)


Lesenswert?

Hi

>z.B. das a wird zum q und das c wird zum s.

Das ist definitiv ein Baudraten-Problem. Stoppbit wird als Bit7 
empfangen.
Wird vielleicht auch b zu r oder d zu t?

MfG Spess

von gtf (Gast)


Lesenswert?

Hallo Johannes,
überprüfe doch mal bitte wie am µController so auch am PC
die RS232 Einstellungen.
1)  Paritätsprüfung
2)  Stoppbits
3)  Frameformat

Ja und die Zeile USART Double speed
    sbi      UCSRA, U2X
sollte dass nicht
    cbi      UCSRA, U2X
heissen??

von Johannes W. (iikuu)


Lesenswert?

@spess53: ja das mit dem b und d stimmt. Von wo weisst du das? Und hast 
du mir einen Lösungsvorschlag?

Danke

LG Johannes

von Johannes W. (iikuu)


Lesenswert?

nachtrag:

ich habe jetzt gerade
sbi      UCSRA, U2X
 in
cbi      UCSRA, U2X
 umgewandelt, und es funktioniert einwandfrei.

Danke viel mal für die vielen Antworten.

Ich hätte dazu noch eine Frage: ist U2X standardmässig gesetzt?

LG Johannes

von spess53 (Gast)


Lesenswert?

HI

>@spess53: ja das mit dem b und d stimmt.

Erstmal muss ich eine Aussage zurücknehmen: bei diesen Zeichen liegt der 
Unterschied nicht in Bit7 sondern in Bit4.

>Von wo weisst du das?

Sieh dir mal eine ASCII-Tabelle an. Dann weißt du es auch.

> Und hast du mir einen Lösungsvorschlag?

Habe gerade gesehen, das du sie gefunden hast.

>Ich hätte dazu noch eine Frage: ist U2X standardmässig gesetzt?

Nein.

MfG Spess

von gtf (Gast)


Lesenswert?

@ Johannes W
ich finde deine Baudratenberechnungen echt spitze.
 Diese Zeilen werde ich wohl übernehmen.
 An der Stelle wo bei dir das Frameformat festgelegt wird, verliert man 
leicht den Überblick.
Ich bevorzuge eine aus meiner Sicht transparentere Schreibweise.
  ; Frame-Format: 8 Bit
1
Ldi     temp, (0<<RXC)|(0<<TXC)|(0<<UDRE)|(0<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<<MPCM)
2
Out  UCSRA, temp
3
4
Ldi  temp, (1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8)|(0<<TXB8)
5
out  UCSRB, temp
6
7
ldi  temp, (1<<URSEL)|(0<<UMSEL)|(1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL)
8
out   UCSRC, temp

U2X ist bei defaul 0.

Gruß gtf

von spess53 (Gast)


Lesenswert?

Hi

>Ich bevorzuge eine aus meiner Sicht transparentere Schreibweise.

>Ldi     temp, 
(0<<RXC)|(0<<TXC)|(0<<UDRE)|(0<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<<MPCM)

Findest du es wirklich sinnvoll, Bits, die als 'Read Only' deklariert 
sind, zu beschreiben?

MfG Spess

von gtf (Gast)


Lesenswert?

spess53 schrieb:
> Findest du es wirklich sinnvoll, Bits, die als 'Read Only' deklariert
> sind, zu beschreiben?

Bei einem Mega8 ist es vielleicht nicht so sinnvoll, denn da kann man 
die einzelnen UCSRA Flags via SBI/CBI erreichen.
Aber bei einem Mega168 haste keine andere Wahl, da geht nur STS/LDS.

von Johannes W. (iikuu)


Lesenswert?

@gtf: also die Berechnung ist nicht von mir, sondern auch hier aus dem 
Tutorial, welches sehr hilfreich ist (was ich einfach anfügen muss :D )

von Grrr (Gast)


Lesenswert?

gtf schrieb:
> Bei einem Mega8 ist es vielleicht nicht so sinnvoll, denn da kann man
> die einzelnen UCSRA Flags via SBI/CBI erreichen.
> Aber bei einem Mega168 haste keine andere Wahl, da geht nur STS/LDS.

Seufz.

von spess53 (Gast)


Lesenswert?

Hi

>Aber bei einem Mega168 haste keine andere Wahl, da geht nur STS/LDS.

OK. Das ist in dem Fall unvermeidlich. Allerdings verstehe ich trotzdem 
nicht, was an einem '|(0<<FE)' transparent ist'. Ein 'Or' mit Null ist 
sinnlos.

MfG Spess

von gtf (Gast)


Lesenswert?

spess53 schrieb:
> OK. Das ist in dem Fall unvermeidlich. Allerdings verstehe ich trotzdem
> nicht, was an einem '|(0<<FE)' transparent ist'. Ein 'Or' mit Null ist
> sinnlos.

Stimmt!
Ist Gewohnheitssache.
Zuerst kopiere ich die einzelnen Flags aus der PDF(datasheet) ins AVR 
Studio
Mache draus den folgenden Salat:
[avrasm]
Ldi  temp, 
(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0<<RXB8 
)|(0<<TXB8)
out  UCSRB, temp
[avrasm]
Und setzte nur die benötigten flags.
Steht mal ein neues Projekt an, so kopiere ich einfach die gesamte Zeile 
und ändere nur noch die Einsen und Nullen.

Gute Nacht!

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.