-         

Ergebnis 1 bis 10 von 10

Thema: Baudrate für UART angeben.

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419

    Baudrate für UART angeben.

    Anzeige

    Hallo,
    Wie kann ich für einen Atmega 32 die Baudrate über UBBR angeben?
    UBBR = 6; geht nicht.

    mfg
    crabtack

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Da gibt's ellenlange Tabellen im DataShit für den 32-er.
    Hast du da schon mal einen Blick drauf geworfen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Re: Baudrate für UART angeben.

    Zitat Zitat von crabtack
    ... UBBR = 6; geht nicht ...
    Geht nicht, gibts nicht. ABER das gibt z.B. irgendetwas bei 178 kBd *ggggg*. Siehe:

    ............

    Und zu Roberts Rat kann ich ausser "klar, was sonst" nur (wie schon sooo oft) grinsend sagen: Controller programmieren ohne Datenblatt ist eines der letzten Abenteuer unserer Tage.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Was genau geht an UBRR = 6 nicht?
    Also welcher Fehler tritt auf?
    Ansonsten meine ich, dass man die beiden Bytes des Registers getrennt schreiben muss bzw. sollte.

    So berechne ich die Baudrate immer, hat bisher für jeden AVR gepasst:
    Code:
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * baudrate) - 1);
    UBBRH = (uint8_t) (ubrr >> 8);
    UBBRL = (uint8_t) (ubrr);
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hallo, dnake erstmal.
    Es lag daran, dass es getrennt geschrieben werden muss.
    jetzt habe ich es mal mit makros (wenn sie denn so heißen) versucht.
    das klappt auch aleees aber es gibt ein problem.
    Das Zeichen wird nicht gesendet.
    die kontroll LED leuchtet auch nicht.
    Was kann da falsch sein?
    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    
    #ifndef F_CPU
    #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1000000"
    #define F_CPU 1000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                             
    #endif
    #define BAUD 9000UL      // Baudrate
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error die abudratenerrror ist zu stark;
    #endif  
    
    
    
    
    
    void main (void)
    {
    DDRC = 0xff; //nur für LED 
    
    UCSRB |= (1<<TXEN);                           // UART TX einschalten
    UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1  
    
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
    while (1)
    {
        if (!(UCSRA & (1<<UDRE)))  
        {
        
        PORTC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4);//Pins mit LED
    
        UDR = 'x';   
    	}                 
    
    
    }
    }
    mfg
    Olaf

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hallo,
    Weiß keiner, was da Falsch ist?

    Gruß
    Olaf

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    #define BAUD 9000UL // Baudrate
    9000 Baud? Ich glaube kaum, dass du diese Baudrate wirklich haben willst.

    Code:
        if (!(UCSRA & (1<<UDRE)))
           {
              PORTC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4);//Pins mit LED
          UDR = 'x';
            }
    Was hier steht, ist: "wenn KEIN Platz in UDR ist, dann schreibe 'x' hinein". Macht irgendwie keinen Sinn, oder?
    MfG
    Stefan

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hallo Stefan,
    danke erstmal jetzt leuchtet die LED.
    Also bei if (!(UCSRA & (0<<UDRE)))
    Oh ja, das Ausrufezeichen Grummel.

    Jedenfalls das Zeichen kommt noch immer Nicht bei hterm an.
    Wie du schon sagst wird es vermutlich an der Baudrate liegen.
    Aber welche wäre die Richtige?
    Aus den ganzen Tabellen im Netz werde ich einfach nicht schlau.
    Ich habe eienn Atmega mit Internem Oszi 1mhz.

    mfg
    Olaf

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    Für die serielle Schnittstelle solltest du auf jeden Fall einen externen Quarz hernehmen. Du kannst ja mal bei hterm show errors einschalten. Wenn da Fehler angezeigt werden, weist du schonmal, dass Signale ankommen. Sollte da nichts angezeigt werden, dann solltest du die Konfiguration nochmal überprüfen und die hardware. Wenn was angezeigt wird, dann würde ich einen externen Quarz probieren.

    Sollte auch das nicht klappen, kannst du ja mal zum Test einen erprobten Quellcode benutzen: http://www.mikrocontroller.net/artic...orial/Der_UART

    Der funktioniert sicherlich.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hallo Martin,
    Ich bekomme leider keine Fehler angezeigt.
    Den code benutze ich doch in leicht veränderter Version.

    Gruß
    Olaf

Berechtigungen

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