-
        

Ergebnis 1 bis 6 von 6

Thema: UART einstellung falsche baudrate???

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61

    UART einstellung falsche baudrate???

    Anzeige

    Hallo,

    ich möchte mit meinem ATmega169 Zeichen über die serielle
    Schnittstelle ausgeben. Ich will dazu 19200 als Baudrate einstellen,
    aber wenn ich mir die Zeichen am Terminal ansehe kommt nur
    Quatsch raus, außerdem sind die Bits am Oszy nur 400µs lang, also
    eine Baudrate von 2400.....

    Code:
    #define MYF_CPU 8000000UL
    #define BAUDRATE 19200UL
    #define MYUBRR MYF_CPU/16/BAUDRATE-1
    
    uint16_t ubrr = MYUBRR;
    
    
    static void initUSART(void)
    {
     
        UBRRH = (uint8_t) (ubrr>>8);
        UBRRL = (uint8_t) (ubrr);
     
        // UART start receiver and transmitter 
        // data mode 8N1, asynchronous 
        UCSRB = (1 << RXEN) | (1 << TXEN);
        UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
    
        // flush receive-buffer 
        do
        {
            UDR;
        }
        while (UCSRA & (1 << RXC));
    }
    
    
    static inline int sendChar (const uint8_t c)
    {
        // wait for UART -> ready 
        while (!(UCSRA & (1 << UDRE)))
            ;
    
        // write/send char 
        UDR = c;
    
        return 1;
    }
    Idee? Danke!

    RICOLA

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    23
    Beiträge
    98
    baudrate-1 bei #define MYUBRR MYF_CPU/16/BAUDRATE-1 muss in klammer oder ist das so gedacht, das zum schluss eins abgezogen wird?? Kenn mich nicht mit UART aus.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61
    so stehts im datenblatt, aber auch mit klammer selbes problem

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schau die mal da die Baudraten definition genau an ( das "L" bei "16" ist wichtig)

    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)

    die funktioniert definitiv (wenn die Quartzeinstellung/fuses stimmt, logo)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    Meine Formel für einen 8MHz-ATMega32:
    Code:
    #define BAUD 38400  // 38400 Baud
    #define UBRR_BAUD	((F_CPU/(16*BAUD))-1)
    Und das Init für 8n1:
    Code:
    	UBRRH = UBRR_BAUD >> 8;	// UART 38400 Baud
    	UBRRL = (uint8_t) UBRR_BAUD;
    	UCSRA = 0x00;
       UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
       UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    (angelehnt an die RP6-Lib)

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61
    hallo, danke, ich war zu doof das CKDIV8 fuse-bit rauszunehmen,
    da kann es nicht funktionieren! dank.

    gruß
    ricola

Berechtigungen

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