Forum: Mikrocontroller und Digitale Elektronik USART-Baudrate falsch


von M. M. (mamue110)


Angehängte Dateien:

Lesenswert?

Hi,

hab hier ein komisches USART-Problem.
Habe jetzt ermittelt dass die Baudrate um den Faktor 16 höher ist als 
die laut Formel gültige (bei definierten 1200Baud empfange ich die 
Zeichen am PC bei 19200Baud richtig), d.h. UBR_VAL ist um den Faktor 16 
zu niedrig.
Dieser Faktor schreit geradezu nach einem Konfigurationsproblem, jedoch 
konnte ich im Datenblatt nichts auffälliges finden und die Formel ist 
laut Datenbaltt für den asynchronen Betrieb richtig.


Prozessor:  ATMEGA32
Oszillator: Quarz mit 16MHZ
FUSE-Bits: siehe Screenshot
Code:
...
  #define F_CPU 16000000UL
...
#define BAUD 1200UL
#define UBR_VAL ((F_CPU/(16*BAUD))-1)
...
UCSRB|= (1<<RXEN)|(1<<TXEN);
UCSRC|= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH = UBR_VAL >> 8;
UBRRL = UBR_VAL & 0xFF;


Kann jemand den Fahler entdecken oder mich mit nem Tritt zum richtigen 
Beitrag befördern?

von D. W. (dave) Benutzerseite


Lesenswert?

Also der erste Fehler, den ich erkenne, ist dass du die |= zu = 
umwandeln solltest. Mit UCSRC |= machste nämlich nen Fehler (du liest 
UBRRH ein und setzt dann zusätzlich in diesem Wert die drei Bits).

Hast du diese Fuse-Bit Ansicht auch erst "geladen"? Also nach dem öffnen 
nen "Read"-Access durchgeführt?

Den richtigen Quarz drin?

Das richtige include für den Prozessor benutzt? Ist im Makefile auch m32 
angegeben?

von M. M. (mamue110)


Lesenswert?

...|= zu = -> hab ich korrigiert

Fuse-Bits wurden neu geladen, Quarz stimmt schon 
(Funk-AVR-Evaluations-Board von Pollin).

Mit m32 meinst du wahrscheinlich "MCU=atmega32". m32 bewirkt afaik dass 
das ganze in 32bit kompiliert wird.

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Der Atmega32 ist 8 bittig ! einseinseinself!!!
Das 32 im Namen steht afaik für 32k Flash

von holger (Gast)


Lesenswert?

>UBR_VAL ist um den Faktor 16 zu niedrig.

Da könnte man doch glatt vermuten das F_CPU irgendwo auf 1MHz
umdefiniert wird. Irgend welche Warnings beim compilieren?

von holger (Gast)


Lesenswert?

Oder ändere die Baudrate mal auf 2400 Baud.
Dann müsste sie bei dir auf 38400 Baud arbeiten.
Oder bewirkt die Änderung evtl. gar nichts?

von M. M. (mamue110)


Lesenswert?

Da hab ich wohl den Wald vor lauter Bäumen nicht mehr gesehen.
Ich mach ein #ifndef F_CPU (was ich hier nicht erwähnt habe), binde 
zuvor aber schon die delay.h ein, welche den Wert auf 1mhz setzt....

Danke für die Hilfe!

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.