-
        

Ergebnis 1 bis 9 von 9

Thema: UART Bautraten Register beschreiben?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52

    UART Bautraten Register beschreiben?

    Anzeige

    Hallo,
    ich habe einen ATmega16 und möchte mit dem UART an mein Computer Daten senden.
    Wie schreibe ich die Baudrate in das Register?
    Im Datenblatt sehe ich nur das UBRRL und das ist für das LowByte.
    Wie teile ich das denn mit dem "outp()" auf?
    Vielen dank im vorraus!!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    Man kann direkt das UBRR-Register mit 16bit Werten
    beschreiben:

    UBRR = F_CPU / (BAUD_RATE * 16L) - 1;

    Dann brauchst du nur noch F_CPU als deine Quarzfrequenz
    und BUAD_RATE als deine Gewünschte baudrate definieren und
    der Präprozessor berechnet die Richtigen Einstellungen.

    EDIT:
    Hier ist es auch noch mal genau beschrieben:
    http://www.mikrocontroller.net/wiki/...orial#Der_UART

    EDIT2:
    outp sollte man nicht mehr verwenden, ist in der aktuellen Version der avr-libc (1.2) entfernt wurden. Man kann die Register wie Variablen direkt beschreiben.
    Open Minds. Open Sources. Open Future

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52
    jo danke,
    also irgendwie gibt es das register UBRR nicht.
    Code:
    #include <avr/io.h>
    #include <avr/iom16.h>
    #define F_CPU 8000000     
    #define BAUD_RATE 9600 
    int main (void)
    {
    UCSRB=0x04; //outp ((1 << TXEN), UCSRB);
    UBRR = F_CPU / (BAUD_RATE * 16L) - 1; 
    }
    Das funzt nicht.
    Der Compiler kennt das Register nicht.
    Es steht ja auch nicht im Datenblatt. mmmh

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52
    Ups die Antwort steht ja in deinem Link.
    Ok danke

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    Was mir nch aufällt ist, dass du die io16m.h manuell eingebunden hast.
    Es reicht aber wenn du die io.h einbindest, die ioXX.h wird automatisch
    eingebunden, je nachdem was du im Makefile eingestellt hasst.
    Open Minds. Open Sources. Open Future

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52
    Also ich habe jetzt das hier aus deinem Link geklaut.
    Code:
    #include <avr/io.h>
    #define F_CPU 8000000     
    #define BAUD_RATE 9600 
    #define F_OSC 3686400           /* Oszillator-Frequenz in Hz */
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16)-1)
    
    int main (void)
    {
    UCSRB=0x04; 
    UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
    UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
    while (!(UCSRA & (1<<UDRE)));                
    UDR = 'x';
    
    }
    das sind die Fehler:
    UART2.c:10: warning: integer overflow in expression
    UART2.c:11: warning: integer overflow in expression

    Ich habe kein Plan, wieso da stag overflow stattfindet.
    UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OS C)>>;
    Ich weiß auch nich so recht was da gemacht wird.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52
    Ok,
    wer lesen kann ist im Vorteil:
    Code:
    #include <avr/io.h>
    #define F_CPU 8000000     
    #define F_OSC 3686400           /* Oszillator-Frequenz in Hz */
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16)-1)
    typedef union {
            uint16_t i16;
            struct {
                    uint8_t i8l;
                    uint8_t i8h;
            };
    } convert16to8;
    
    
    int main (void)
    {
    UCSRB=0x04;
    
    convert16to8 baud;
    baud.i16 = F_CPU / (UART_BAUD_RATE * 16L) -1;
    UBRRH = baud.i8h;
    UBRRL = baud.i8l;
    
    //UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
    //UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
    while (!(UCSRA & (1<<UDRE)));                 
    UDR = 'x';
    
    }
    Sorry, ich war etwas voreilig beim posten.
    Danke für alles!!!

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Hi,

    du brauchst es gar nicht so kompiliziert zu machen:

    Code:
     #include <avr/io.h>
    #define F_CPU 3686400L    /* Oszillator-Frequenz in Hz */
    #define BAUD_RATE 9600L
    #define UART_BAUD_RATE 9600
    #define UART_BAUD      ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
    
    int main (void)
    {
    UCSRB=0x04;
    UBRRH=(uint8_t) (UART_BAUD>>8);
    UBRRL=(uint8_t) (UART_BAUD & 0x00ff);
    while (!(UCSRA & (1<<UDRE)));               
         UDR = 'x';
    }
    F_CPU wird übrigens seit dem neusten WinAVR Release im Makefile definiert. Dann braucht man es nicht mehr im Hauptprogramm zu tun...

    MfG Kjion

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Is absolut richtig, ich schreib aber (wenn geht)
    registerH = HIGH(Value)
    registerL = LOW(Value)
    das spart Hirn, find' ich. Ich will das aber keinem einreden
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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