Hi!
Folgender Aufbau habe ich:
Auf einem Atmel Evalution Board habe ich einen Atmega32.
Über Uart sende ich Daten vom Atmega zum PC. (Nicht Angeschlossen
sondern über den AZ-Delivery FT232-AZ USB zu TTL Serial Adapter für 3,3V
und 5V).
Leider bekomme ich auf dem PC (HTerm) falsche Bytes.
Die ersten beiden Bytes sind ok und dann wird die zweite Byte 5 Mal
widerholt.
Auch zeigt hTerm sporadisch an, dass es Fehler in der Übertragung für
manche Bytes gibt. Baudrate, Byte und Stoo Bit sind gleich angezeigt.
AtmegaNoob schrieb:> void uart_init(void)> 11{> 12 UCSRB = (1 << TXEN);> 13 UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);> 14 UBRRL=0x05; // Baudrate festlegen> 15 UBRRH=0x00; // Baudrate festlegen> 16}
Ein Blick in die Baudraten-Tabelle im Datenblatt bei 16 MHz verrät mir,
dass UBRR = 5 zu keiner typischen Baudrate passt, unabhängig davon wie
U2Xn gesetzt wurde. Für die auskommentierten 3.6864 MHz und passt UBBR =
5 bei U2Xn = 0 für die angegebenen 38k4. Fazit: Für das Eval-Board (das
wahrscheinlich mit 16 MHz laufen wird) wird der Baudratenfehler
schlichtweg zu groß sein.
AtmegaNoob schrieb:> Die ersten beiden Bytes sind ok und dann wird die zweite Byte 5 Mal> widerholt.
Das ist ja widerlich.
Hast du dir das Signal und das genaue Timing vom TX des ATmega mit Oszi
oder LA genau angesehen?
Wolfgang schrieb:> AtmegaNoob schrieb:>> Die ersten beiden Bytes sind ok und dann wird die zweite Byte 5 Mal>> widerholt.>> Das ist ja widerlich.> Hast du dir das Signal und das genaue Timing vom TX des ATmega mit Oszi> oder LA genau angesehen?
Also ich habe kein Oszi zu Hause.
Also beim C Code hsne ich bei hTerm eine Baudrate von 38400 angegeben.
Beim Assembler Code dem entsprechend 9600.
M. K. schrieb:> AtmegaNoob schrieb:>> void uart_init(void)>> 11{>> 12 UCSRB = (1 << TXEN);>> 13 UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);>> 14 UBRRL=0x05; // Baudrate festlegen>> 15 UBRRH=0x00; // Baudrate festlegen>> 16}>> Ein Blick in die Baudraten-Tabelle im Datenblatt bei 16 MHz verrät mir,> dass UBRR = 5 zu keiner typischen Baudrate passt, unabhängig davon wie> U2Xn gesetzt wurde. Für die auskommentierten 3.6864 MHz und passt UBBR => 5 bei U2Xn = 0 für die angegebenen 38k4. Fazit: Für das Eval-Board (das> wahrscheinlich mit 16 MHz laufen wird) wird der Baudratenfehler> schlichtweg zu groß sein.
Danke für den Hinweis.
Also auf dem Board ist ein 16 Mhz Verbaut.
Werde ich korrigieren und testen wenn ich wieder zu Hause bin.
AtmegaNoob schrieb:> //#define CR "\0\r\n"
Auch, wenn es auskommentiert ist: Bitte denk über diese Zeile noch
einmal intensiv nach. Die NULL am Ende des Strings setzt der Compiler
automatisch. Am Anfang des Strings bewirkt sie ein vorzeitiges Ende.
>> Mal zum Testen in Assembler probiert> Und läuft das oder nicht?
Nein, natürlich nicht: das zweite 'out SPL, temp' (in Zeile 33) muss
'out UBRRL,temp' heißen.
S. Landolt schrieb:>>> Mal zum Testen in Assembler probiert>> Und läuft das oder nicht?>> Nein, natürlich nicht: das zweite 'out SPL, temp' (in Zeile 33) muss> 'out UBRRL,temp' heißen.
Vielen Dank.
Mit folgendem (korrigiertem) Code erhalte ich nur lauter "0" angezeigt.
(Config in hterm: 8 Data, 2 Stop, 9600 Baud)
1
;
2
; Laboraufgabe 4 - (UART).asm
3
;
4
5
.include "m32def.inc"
6
7
.def temp = r16 ; Register für kleine Arbeiten
8
.def zeichen = r17 ; in diesem Register wird das Zeichen an die Ausgabefunktion übergeben
> erhalte ich nur lauter "0" angezeigt
Tja - bei mir hier läuft "Test!" den Monitor hinunter; (der
Zwillingsbruder) ATmega16 mit direkter Verbindung zum PC.
Damke für die schnelle Antwort!
Liegt es vllt an (meiner) Verbindung vom Board (/Atmega) über den
Adapter zum PC ? (Adapter->Board: GND->Pin 39, 5V ->Pin 40, TX/RX->Pin
26/27)
Irdendwie kommt es mir gerade so vor, dass ich für das Offensichtliche
zu blind bin duck und weg
Danke
Korrektur: das muss ein Zwischenstand sein, es entspricht meinem neuen
File, mit Ausnahme dieser einen beschriebenen Zeile (und natürlich dem
RAMEND (da ATmega16)).
AtmegaNoob schrieb:> Liegt es vllt an (meiner) Verbindung vom Board (/Atmega) über den> Adapter zum PC ?
Nimm einen Logik Analysator oder ein Oszilloskop und guck dir an, was
dein ATmega rausgibt.
Dann ist der Adapter und die PC-Software raus - zwei Baustelle weniger.
AtmegaNoob schrieb:> Also ich habe kein Oszi zu Hause.
Beschaff dir eines. Denn nur mit einem Oszilloskop kannst du die
Qualität des Signals bezüglich Pegel, Flankensteilheit, Überschwinger,
Timing und Ströungen beurteilen. Wenn das alles passt, dann kann man
im Protokoll weitersuchen.
Es ist mir ein völliges Rätsel, wie man serielle Busse ohne Oszilloskop
anständig zum Laufen bekommen will.
AtmegaNoob schrieb:> Auf einem Atmel Evalution Board
Welches "Board" von den vielen, die es gibt? Und wie ist das versorgt?
Lothar M. schrieb:> Es ist mir ein völliges Rätsel, wie man serielle Busse ohne Oszilloskop> anständig zum Laufen bekommen will.
Wie hat man es uns bei der BW beigebracht? Nur ein nicht abgegebener
Schuss kann nicht treffen...ich glaube der ein und andere hat dieses
Prinzip verinnerlicht und adaptiert es auf alles, was ihm zwischen die
Finger kommt. Ich verstehe auch nicht, wie man ohne Oszi bei sowas
wirklich effektiv weiter kommen will. In meinen Augen ist das zum Teil
viel Stochern im Nebel in der Hoffnung mal nen Treffer zu landen.
Lothar M. schrieb:> Welches "Board" von den vielen, die es gibt? Und wie ist das versorgt?
Das frage ich mich schon lange Zeit, und hinzu kommt die Aussage
AtmegaNoob schrieb:> Adapter->Board: GND->Pin 39, 5V ->Pin 40, TX/RX->Pin 26/27
die zu "bezweifeln" ist. Ist denn Pin 39 ein echter bzw.
zulässiger Ground-Anschluss?
Wenn wir den TO dann endlich dazu bewegt haben ein Oszilloskop
zu kaufen oder wenigstens auszuleihen kommt dann eventell noch
die Aussage "ich habe alles mit dem Logikanalysator überprüft".
Nein, es muss ein Oszilloskop sein um den Spannungsverlauf
erkennen zu können.
Dann gibt es noch Zweifel ob es hier mit rechten Dingen zugeht:
AtmegaNoob schrieb:> Adapter->Board: ........., 5V ->Pin 40, ........
Der VCC-Pin des FT232-Moduls hat - duch Jumper wählbar - entweder
3.3 oder 5V zu bieten. Das ist ein Ausgang, eine kleine
Quelle mit der man externe Controller versorgen kann. Werden
diese 5V an eine andere 5V-Quelle angeschlossen kommt es zu
einem Kampf der Giganten mit unvorhersehbaren Ausgang.
Merke: Ein FT232-Modul braucht keine Versorgung von aussen,
daher kann / sollte man den Vcc-Pin unbeschaltet lassen. Und
ein wie auch immer geartetes Eval-Board wird auch seine eigene
Versorgung mitbringen, einer von beiden Versorgern wird
zumindest irritiert reagieren können.
Was auch immer an der Hardware fehlerhaft sein mag oder nicht - mit dem
gestern abend gezeigten HEX-File läuft die UART mit 1.0 MBd, das kann
nichts werden.