- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 2 von 2

Thema: AVR-Studio Baudrate berechnen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    AVR-Studio Baudrate berechnen

    Anzeige

    Praxistest und DIY Projekte
    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:
    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

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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.
    MfG
    Stefan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress