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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.