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
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
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
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
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
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)?
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
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??
@spess53: ja das mit dem b und d stimmt. Von wo weisst du das? Und hast du mir einen Lösungsvorschlag? Danke LG Johannes
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
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
@ 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
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
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.
@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 )
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.