-
        

Ergebnis 1 bis 7 von 7

Thema: Dringendes Problem mit USART+Baudrate!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    12.06.2007
    Beiträge
    42

    Dringendes Problem mit USART+Baudrate!

    Anzeige

    Hallo!

    Ich habe folgendes Problem:
    Ich möchte mit meinem tiny2313 die UART-Schnittstelle (nur TXD) nutzen.
    Der µc läuft dabei mit 8 MHz (CKSEL=1110 SUT=01), die Fuses sind korrekt
    gesetzt.
    Die Baudrate soll 9600 betragen (die kann ich ja frei wählen, richtig?).
    Aber egal, was ich versuche, es kommt nur Müll am Terminal an.

    Diese defines benutze ich:

    Code:
    #ifndef F_CPU
      #define F_CPU 8000000
    #endif
    #ifndef UART_BAUD_RATE
      #define UART_BAUD_RATE 9600
    #endif
    Mit der folgenden Formel soll die Baudrate gesetzt werden:

    Code:
    UBRRL = (F_CPU/(16 * baud)) - 1;
    Die ist doch richtig, oder?

    Mit einer direkten Zuweisung, dessen Wert ich dem Datenblatt entnommen
    habe, geht es auch nicht:

    Code:
    UBRRL=51;
    Was ist an der ganzen Geschichte falsch?? Ich habe alle möglichen Werte
    durchprobiert, aber immer kommt nur Buchstabensalat an, und dabei hab'
    ich gar keinen Hunger...

    Im Ernst, es wäre klasse, wenn jemand einen Tipp hätte. Ich bin am
    verzweifeln...

    MfG Matze

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Hast du bei den Fuses das CKDIV8 Bit umgestellt?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    12.06.2007
    Beiträge
    42
    CKDIV8 ist nicht gesetzt. Ist doch auch in Ordnung, oder? Sonst müsste ich ja F_CPU für die Berechnung durch 8 teilen, richtig?

    Ergänzung:
    ----------
    (Das hätte ich wohl direkt erwähnen sollen, auch wenn ich der Ansicht
    bin, dass das keinen Unterschied machen sollte.)

    Der µC befindet sich auf einer Platine in einem Scanner, nicht auf dem
    Testboard (STK500). Der Pin D0 ist nicht verbunden und somit frei für
    die USART-Nutzung. Ich habe mir von einem Arbeitskollegen ein Kabel an
    den Pin D0 löten lassen (untere Seite vom Sockel natürlich). Dieses
    Kabel steckt auf dem STK500 auf dem TXD-Pin.
    An dieser Vorgehensweise ist hoffentlich nichts auszusetzen, oder? Dass
    überhaupt Daten ankommen, ist für mich das Indiz dafür, dass die
    Kommunikation grundsätzlich klappt. Oder gibt es da noch etwas zu
    beachten?
    Übrigens, auf der Platine steckt ein 20 Mhz Quarz (Aufschrift AQ20.000).
    Dürfte doch aber irrelevant sein, da der tatsächliche Takt zählt, und der wird über die Fuses gesetzt, richtig?

    Ich habe bei der ganzen AVR-Geschichte noch nicht den Durchblick (bin neu in der Firma und habe vorher nur VB programmiert, von Elektrotechnik habe ich im Grunde keine Ahnung...). Deswegen bitte nicht böse sein, wenn ich etwas unbedarfte Fragen stelle.

    Gruß Matze

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Der Takt wird nicht über die Fuses gesetzt, der Oszillator wird mit den Fuses nur an den Quarz angepasst. Du musst schon die 20MHz nehmen für die Berechnung.
    Hubert

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    12.06.2007
    Beiträge
    42
    Ok, kannst du mir denn sagen, was dann noch falsch sein soll? Ich denke, die Berechnung der Baudrate ist richtig, und auch sonst sollte alles stimmen, oder?

    Code:
    #ifndef F_CPU
    	#define F_CPU 20000000UL
    #endif
    #ifndef UART_BAUD_RATE
    	#define UART_BAUD_RATE 9600UL
    #endif
    
    /***************/
    int main(void) {
    /***************/
    
      USART_init(UART_BAUD_RATE);
    
      for(;;) {
        USART_transmit('A');
        _delay_ms(10);
        _delay_ms(10);
        USART_transmit('B');
        _delay_ms(10);
        _delay_ms(10);
      }
    
    /***************/
    static void USART_init(unsigned int baud) {    //nochmal genau ansehen und schöner formulieren!
    /***************/
      UCSRA=0x00;
    
      UBRRL = (F_CPU/(16 * baud)) - 1;
      UBRRH=0x00;
    
      UCSRB = (1 << RXEN) | (1 << TXEN);
    }
    
    /***************/
    void USART_transmit(unsigned char cData) {  //sendet ein Zeichen ans Terminal
    /***************/
    	while( !(UCSRA & (1<<UDRE)) ) {
    		;//warten, bis der transmit buffer leer ist, so dass wieder übertragen werden kann
    	}
    	UDR = cData;
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    12.06.2007
    Beiträge
    42
    Bitte nicht auf fehlende Prototypen etc. achten, der Code war natürlich wesentlich größer und wurde von mir (mehr oder weniger) fachgerecht beschnitten! Es fehlt aber nichts, was für die Problematik relevant sein könnte.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    12.06.2007
    Beiträge
    42
    Ich habe die Lösung (dank Johannes auf mikrocontroller.net) gefunden!

    Auch wenn ich es nicht verstehe. Laut der Aussage von Johannes wird der selbst definierte Wert F_CPU von der Einstellung im AVR-Studio überschrieben, wenn vorhanden (Project->Configuration Options). So habe ich es zumindest verstanden.

    Das scheint wohl nicht ganz richtig zu sein, denn mit einem Eintrag in
    den Options läuft es plötzlich! Ich kannte diese Einstellung nicht,
    deswegen habe ich da auch nicht nach der Lösung gesucht. Und bislang
    habe ich immer mit internem Takt gearbeitet, da trat das Problem nicht
    auf.

    So kann's gehen, da sucht man Stunden vergebens nach der Lösung, und
    schließlich geht's nur um eine Kleinigkeit (mit fatalen Folgen).

    Jedenfalls nochmal Dankeschön an Johannes und alle anderen Meister der
    Geduld hier und auf mikrocontroller.net!

    Gruß Matze

Berechtigungen

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