Hex-File aus AVR Studio - UART - Problem

Hallo

Folgendes Problem:
Wollte zu Testzwecken im AVR Studio 6 ein Programm für einen ATmega328 schreiben, welches einfach im Halbsekundentakt einen
char sendet. Dazu habe ich das generierte HEX-File mit dem X-Loader auf einen Arduino Uno übertragen.
Problem: Ich initialisiere den UART mit einer Baudrate von 9600. Damit ich aber den entsprechenden char richtig empfange, muss
ich am seriellen Monitor, welcher bei der Arduino IDE dabei ist, 19200 Baud einstellen. Wo liegt das Problem?

#define F_CPU 16000000UL

#define FOSC 16000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1


#include <avr/io.h>
#include <util/delay.h>

void USART_Transmit( char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)) )
	;
	/* Put data into buffer, sends the data */
	UDR0 = data;
}

void USART_Init( unsigned int ubrr)
{
	/*Set baud rate */
	UBRR0H = (unsigned char)(ubrr>>8);
	UBRR0L = (unsigned char)ubrr;
	/*Enable receiver and transmitter */
	UCSR0B = (1<<RXEN0)|(1<<TXEN0);
	/* Set frame format: 8data, 1stop bit */
	UCSR0C = 0;
	UCSR0C = (3<<UCSZ00);
}

int main(void)
{
	USART_Init(MYUBRR);
	
    while(1)
    {
        USART_Transmit('A');
		USART_Transmit('\n');
		//USART_Transmit('\n');
		_delay_ms(500);
    }
}

Danke schon mal für eure Hilfe

Baudrate müssen an beiden Schnittstellen identisch sein.

Arduino nutzt soweit ich weiß nur 1 StopBit und kein ParityBit. Alternativ anstatt der Arduino IDE müsstest du dann ein Programm wie Putty nutzten, bei dem du das einstellen kannst.

/* Set frame format: 8data, 2stop bit */

elfriso27:
Wo liegt das Problem?

Der Controller, auf den Du das HEX-File hochgeladen hast, taktet nicht mit 16 MHz, sondern nur mit 8 MHz.

Also entweder hast Du einen 8 MHz Schwingquartz verbaut, oder die Fuses am Controller auf internen Takt gesetzt.

Hallo.
Ich habe keinen Controller verbaut sondern benutze ein Arduino UNO Board. Auf diesem ist ein 16MHz Quarz verbaut. Taktet dieser dann nicht mit 16MHz?

Wenn ich FOSC auf 32000000 einstelle funktioniert alles bei 9200 BAUD. Wenn ich das Ganze auf meinem DUEMILANOVE versuche funktioniert alles richtig wenn ich 16000000. Was ist bei meinem UNO faul?

elfriso27:
Ich habe keinen Controller verbaut sondern benutze ein Arduino UNO Board. Auf diesem ist ein 16MHz Quarz verbaut. Taktet dieser dann nicht mit 16MHz?

Hast Du vielleicht mal einen ISP oder "Arduino as ISP" an dem Board drangehabt und mit der Funktion "Bootloader installieren" herumgespielt, während die Boardeinstellung nicht UNO war, sondern irgendwas anderes?

elfriso27:
Wenn ich das Ganze auf meinem DUEMILANOVE versuche funktioniert alles richtig

D.h. dieselbe HEX-Datei läuft unterschiedlich, wenn Du sie mal auf einen Duemilanove und mal auf einen UNO hochlädst, habe ich das so richtig verstanden?

Und wie sieht es mit dem Timing aus, Du hast ein "_delay_ms(500);" im Programm, läuft das denn mit der richtigen Geschwindigkeit, also exakt 2 mal pro Sekunde (oder zum mitzählen besser: 20 mal in 10 Sekunden)? Oder läuft das auch falsch, also halb oder doppelt so schnell wie es soll?

Ja das ist ja das verwunderliche. Ich habe F_CPU als 16000000UL definiert. Wenn ich nun einen Pin im Sekundentakt eine LED ansteuern lasse, so blinkt diese auch "wirklich" im Sekundentakt. Jedoch stimmt es nicht für die Berechnung der Baudrate. Bin wirlich ratlos.

Bist du sicher dass der Baudraten Code korrekt ist?

Das hier sieht etwas seltsam aus:

UCSR0C = (3<<UCSZ00);

Normalerweise ist das 1 << Bit Konstrukt dazu das entsprechende Bit zu setzen. Wenn zwei Bits setzen will macht man das zweimal und verordert. Sowie bei UCSR0B. Hier wird aber 11 genommen und dann um die Nummer des UCSZ00 Bits nach links geschoben. Das ist nicht wirklich sinnvoll.

Andererseits ist das Format und hat nichts mit der Baudrate zu tun...

elfriso27:
Ja das ist ja das verwunderliche. Ich habe F_CPU als 16000000UL definiert.

Die Frage ist: Wo hast Du es definiert?
Nur im Quelltext?

Oder als Präprozessor-Symbol in den Einstellungen für Dein Projekt?

Schau mal diese Seite unter "Defining a Preprocessor Symbol"
http://extremeelectronics.co.in/lfrm8/Help/AS6.htm

Hast Du das gemacht und ist in Deinem Projekt wirklich F_CPU definiert?
(Und nicht nur im Quelltext Deiner Datei.)