- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Bootloader läuft, aber Baudrate im Hauptprogramm spinnt

  1. #1

    Bootloader läuft, aber Baudrate im Hauptprogramm spinnt

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe ein Problem mit dem ich als Anfänger nicht mehr klar komme und auch keine Lösung im Forum gefunden habe. Also ich habe mir einen Booloader von Megaload installiert der auch super funktioniert. Nur habe ich jetzt leider das Problem das wenn ich mein altes Programm in den mega32 hochlade die UART Kommunikation nicht mehr so funktioniert wie vor dem Bootloader. Und zwar habe ich das seltsame Phänomen das die Baudrate in meinem Programme immer die Hälfte von der des Bootloaders beträgt. Wenn es die gleiche wäre könnte ich das ja verstehen aber so? Ich habe schon versucht die UART initialisieren meines Programmes zu ändern (könnten ja Einstellungen vom Bootloader zurück bleiben), aber bis jetzt ohne Erfolg.


    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif

    #define BAUD 38400UL
    #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)

    // USART initialisieren
    void uart_init(void)
    {

    // alles zurück setzten (war ein Versuch)
    delay_ms(10);
    UCSRB = (0<<RXEN)|(0<<TXEN);
    UBRRH = (unsigned char) (0);
    UBRRL = (unsigned char) (0);
    delay_ms(10);

    // Baudrate einstellen ( Normaler Modus )
    UBRRH = (unsigned char) (UBRR_BAUD>>8/);
    UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);

    // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

    }


    Hoffentlich fällt einem was ein

    Gruss
    Dirk

    Kleiner Nachtrag wenn ich 76800 als Baudrate einstelle bekomme ich 38400 raus.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Vielleicht den Receiver/Transmitter erst dann aktivieren, wenn die Konfiguration fertig ist und nicht irgendwo mitten drin.

    Nach der Umstellung (evtl. zusätzlich vorher) ein Flush des Receive-Buffer (siehe Datenblatt oder Wiki).

    Verwendet der Bootloader das U2X? Vielleicht gibt's da ja ein Erratum?
    Disclaimer: none. Sue me.

  3. #3
    Hallo SprinterSB,

    ich habe mir mal den Code aus dem Wiki vorgenommen und kriege leider das gleiche Ergebnis. 19200 Baud sind fest eingestellt (mit Berechnung das gleiche) und 9600 Baud kommen raus. Die Initialisierung des UART rufe ich vor jedem Sendevorgang auf und ob ich den UART mit RXEN am Ende oder am Anfang einschalte macht leider keinen Unterschied. Das der Bootloader einen Fehler hat habe ich auch erst gedacht und mir deshalb einen Megaload Nachbau in GCC installiert mit gleichem Ergebnis.

    Bin etwas ratlos :(.

    /* USART-Init 19200 Baud bei 16MHz für Mega32 */

    uint8_t sreg = SREG;

    UBRRH = 0; // Highbyte ist 0
    UBRRL = 51; // Lowbyte ist 51 ( dezimal )

    // Interrupts kurz deaktivieren
    cli();

    // UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren
    // Data mode 8N1, asynchron
    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
    do
    {
    // UDR auslesen (Wert wird nicht verwendet)
    UDR;
    }
    while (UCSRA & (1 << RXC));

    // Rücksetzen von Receive und Transmit Complete-Flags
    UCSRA = (1 << RXC) | (1 << TXC);

    // Global Interrupt-Flag wieder herstellen
    SREG = sreg;


    Das seltsame ist, stelle ich die doppelte Baudrate ein von der die ich eigentlich will, funktioniert die Sache super.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Kann sein, daß der Bootloader an der F_CPU dreht? Durch Ändern von Prescalern oder so? Würd mich zwar wundern...

    Am ehesten würd ich vermuten, daß was mit der F_CPU nicht stimmt: ihre Definition oder Fuse-Bits oder so.
    Disclaimer: none. Sue me.

Berechtigungen

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

Labornetzteil AliExpress