PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bootloader läuft, aber Baudrate im Hauptprogramm spinnt



Erdweg
19.02.2007, 10:42
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.

SprinterSB
19.02.2007, 12:27
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?

Erdweg
19.02.2007, 12:52
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.

SprinterSB
19.02.2007, 13:35
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.