PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR-Studio Baudrate berechnen



Marten83
11.05.2009, 20:14
Hallo Zusammen!

Ich habe folgendes Problem:

Ich versuche mich gerade am USART eines Mega32 und habe Probleme beim kompilieren.

Folgender Fehler wird ausgegeben:
avr-gcc.exe -mmcu=atmega32 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT usart.o -MF dep/usart.o.d -c ../usart.c
../usart.c:10:8: error: division by zero in #if
../usart.c:10:8: error: division by zero in #if
../usart.c:11:6: error: #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
make: *** [usart.o] Error 1
Build failed with 3 errors and 0 warnings...


Dazu folgender code:

#include "usart.h"
#include <avr/io.h>

void usart_init(unsigned long baudrate)
{
#define UBRR_VAL ((F_CPU+baudrate*8)/(baudrate*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/baudrate) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;

UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE); //aktivieren des Empfängers und Senders und Interrupt für Empfänger

UCSRC = (1<<UCSZ0) | (1<<UCSZ1); //8,N,1
}

int usart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}

UDR = c; /* sende Zeichen */
return 0;
}

void usart_puts(char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
usart_putc(*s);
s++;
}
}

Woran kann das liegen?

MfG, Marten83

sternst
11.05.2009, 21:35
Das liegt daran, dass du versuchst den Präprozessor mit Laufzeitdaten zu füttern. Du musst dich schon entscheiden: Entweder den UBBR-Wert zur Laufzeit berechen, oder beim Compilieren (dann dürfen da natürlich keine Laufzeitvariablen drin enthalten sein). Bei einer Laufzeitberechnung geht die Überprüfung des Wertes beim Compilieren natürlich nicht.