Bqudrqteneinstellung

Gast #302687
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
Gast #302688
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
Gast #302689
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
Gast #302690
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren