Forum: Mikrocontroller und Digitale Elektronik Bqudrqteneinstellung


von Johannes (Gast)


Lesenswert?

Hallo,

ich verwende fuer die Einstellung der Baudrate immer das Beispiel aus
dem AVR-GCC Tutorial:

  #ifndef F_CPU
  #define F_CPU 3686400           /* Oszillator-Frequenz in Hz */
  #endif
  #define UART_BAUD_RATE 9600
  #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_CPU)/((UART_BAUD_RATE)*16L)-1)

Frage: Was ist F_OSC? bzw muesste in der letzten Zeile nicht beidemale
F_OSC oder beidemale F_CPU stehen?


Bei der Initialisierung schreibe ich:
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);

Ich verwende also nur F_CPU. Ich bin kein SPeziqlist mit den #defines
und sonstigen PräProz Direktiven...
Bitte um kurze Aufklaerung wieso es trotzdem funktioniert.

mg,
Johannes

von peter dannegger (Gast)


Lesenswert?

In der Tat müssen in Macros die Parameterliste und die verwendeten
Parameter gleich heißen und sollten nicht wie andere Symbole heißen.

In dem Fall gehts trotzdem gut, da ein globaler Parameter genau so
heißt, wie der im Macro verwendete.
Der dem Macro übergebene Parameter wird ignoriert.


Peter

von Johannes (Gast)


Lesenswert?

Aha,

habs mir fast gedacht... vielleicht unternimmt verbessert ihr das dann
im AVR-GCC Tutorial. Ich habs gerade versucht, aber da kam irgendein
Databank error mit irgendwelchen technical problems...

richtig heisst es also:
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
((F_OSC)/((UART_BAUD_RATE)*16L)-1)

mg,
Johannes

von Michael (Gast)


Lesenswert?

Wenn jetzt wieder jemand meint, daß eine 'gerade' Quarzfrequenz (8,
12, 16,... MHz) zu 'schlechten' Baudraten führt, liegt es daran, daß
dieses Makro nicht rundet.
Mein Vorschlag:

void set_baudrate(long bd)
{
long temp;
  temp=((CPU_CLOCK/16/(bd/10)+5)/10) - 1;  /* runden !!! */
  UBRR0L=temp%256;
  UBRR0H=temp/256;
}

P.S.: ich weiß, daß man bei geschickterer Formulierung 3 Bits sparen
kann.

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.