UART in Atmel Studio Programmiert. Macht Probleme komische Zeichen kommen zurück

Hallo,
Ich hätte da ein Problem, und zwar: Habe ich in Atmel Studio ein kleines Programm geschrieben das eine “8” per USART sendet. Nur mein Problem ist dort kommt keine 8 zurück sondern ein kleines Rechteck. Ich versuche denn Fehler bereits seit 4 Tagen zu finden vergeblich.
Ich nutze als Programmer denn Arduino UNO. Und flash über AVRdude in Atmel Studio mein Chip. Diese Command Zeile wird ausgeführt:

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe -u -v -patmega328p -carduino -PCOM6 -b115200 -Uflash:w:"$(ProjectDir)Debug$(TargetName).hex":i -C"C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf"

Ich nutze ein 16 Mhz Externen Quarz auf dem Atmega328p ist der Arduino Bootloader drauf. Wenn ich in Atmel Studio die Freuqenz auf 8 Mhz festlege und auch ein 8 mhz quarz dran hänge dann es hochladen will sagt Avrdude 10 mal “not in sync”. Ich kann nur 16 Mhz verwenden will aber eigentlich 8 mhz nur benutzen.
Hier der USART Code:

#define F_CPU 16000000UL

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

#define BAUD 9600
#define UDR_Value ((F_CPU / 16 / BAUD) - 1)

int main(void){
	UBRR0H = (UDR_Value>> 8);
	UBRR0L = UDR_Value;
	
	UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
	UCSR0B = (1<<RXEN0) | (1<<TXEN0);
	
    while (1) {
       UDR0 = '8';
       _delay_ms(900);
    }
}

In jeden X-beliebigen Terminal Programm(Arduino Serial Montior, TeraTerm, HTerm) kommt immer nur dieses Zeichen(Hochgelandes Bild)

Zum “Empfangen” des Singal nutze ich ein USB zu TTL Apdater. Ich habe bereits zwei ausprobiert. Immer das gleiche Zeichen. Ich bin mir eigentlich zu 99,9 % sicher das es irgendwo in Arduino ein Problem gibt: Bootloader, Programmer …

Kann mir da einer helfen?

Schon mal in deinem Terminal-Programm die Baudrate geändert ( 4800 oder 19200 )?

Schon mal mit Arduino probiert? (wir sind hier übrigens nicht im atmel-Forum, sondern im Arduino-Forum)

void setup() { Serial.begin(9600); }
void loop() {
   const char c = '8';
   Serial.write(c);
   delay(900);
}

michael_x: Schon mal in deinem Terminal-Programm die Baudrate geändert ( 4800 oder 19200 )?

Schon mal mit Arduino probiert? (wir sind hier übrigens nicht im atmel-Forum, sondern im Arduino-Forum)

void setup() { Serial.begin(9600); }
void loop() {
   const char c = '8';
   Serial.write(c);
   delay(900);
}

Ja ich habe es in der Arduino IDE gestartet. Funktioniert dort ohne Probleme. Die acht kommt an. Ich habe ehr das gefühl das der Bootloader bzw die Fuses da probleme machen

Hardcore-Programmierer setzen ein Bit mehr als du

   ; Frame-Format: 8 Bit
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp

und berechnen das UBR Register geringfügig anders

UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)

auch dort

Den Hinweis dort

Genaueres über die UART-Register findet man im Datenblatt des Controllers.

gebe ich einfach mal so weiter.

xJan45x: Hier der USART Code:

Wenn ich denselben von Dir geposteten Code in die Arduino-IDE kopiere und das programm mit der IDE kompiliere und auf ein UNO R3 kompatibles Board hochlade und die Ausgabe im seriellen Monitor betrachte, dann funktioniert das Programm augenscheinlich völlig fehlerfrei.

Wenn das bei Dir nicht der Fall ist, dann hast Du möglicherweise ein für 8 MHz kompiliertes Programm auf eine mit 16 MHz laufende Hardware hochgeladen. Oder umgekehrt. Oder Du hast sonstigen Bockmist mit Deiner Hardware gebaut.

Nimm ein UNO-Board und die Arduino-IDE, dann funktioniert das Programm auch!

Die Bootloader der Arduino-Boards sind übrigens immer für eine spezifische Taktrate kompiliert.

D.h., auf einem mit 16 MHz laufenden Arduino-Board muss auch ein 16 MHz Bootloader drauf sein, damit der "Upload mit Bootloader" funktioniert, und auf einem mit 8 MHz laufenden Arduino-Board muss ein 8 MHz Bootloader drauf sein.

Im Fall von unsinnigen Kombinationen, wie z.B.: - auf dem Controller ist ein 16 MHz Bootloader drauf - der Controller wird aber tatsächlich nur mit 8 MHz getaktet kannst Du mit Bootloader nix hochladen, sondern dann brauchst Du einen ISP-Programmer für den ISP-Programmieranschluss und kannst ein Programm nur über den ISP-Anschluss flashen.

Und danach läuft das Programm womöglich bei eingestellten 9600 Baud dann tatsächlich nur mit 4800 Baud, d.h. der serielle Monitor müsste auf 4800 statt 9600 eingestell werden, um mit der Hälfte des korrekten Controller-Takts über Serial zu empfangen.

mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART: URSEL (Register Select)

Dieses Bit selektiert die Auswahl des UCSRC- bzw. des UBRRH Registers. Beim Lesen von UCSRC wird es als 1 gelesen. Beim Schreiben auf UCSRC muss es auf 1 gesetzt werden.

Achtung: Manche Prozessoren verfügen über dieses Bit, andere wiederrum nicht. Was hat es damit auf sich? Um Zugriffsadressen einzusparen, wurde von Atmel ein etwas seltsamer Weg gewählt. Das UCSRC Register und das High-Byte des Baudratenregisters teilen sich dieselbe Registeradresse! Um der Hardware mitzuteilen, welche Bedeutung ein zugewiesener Wert haben soll, entweder neue Belegung des Baudratenregisters oder eben Konfiguration des UCSRC Registers, dient dieses Bit. Ist es nicht gesetzt, dann wird eine Zuweisung immer als Zuweisung an das High-Byte des Baudratenregisters angesehen, selbst wenn das so nicht beabsichtigt war. Nur dann wenn dieses Bit gesetzt ist, dann wird eine Zuweisung auch tatsächlich als eine Zuweisung an das UCSRC Register gewertet und die Konfiguration verändert. Lässt man das Bit irrtümlich weg, dann verursacht eine Zuweisung an UCSRC eine Veränderung der Baudrateneinstellung!

Könnte das auch bei dir ein Problem sein? Mal unabhängig von jurs' "Bockmist" Anmerkung ;)

funktioniert nun.

Musste denn “Double Transmittion Speed” aktivieren mit

	if(USE_2X) {
		UCSR0A |= (1<<U2X0);
		}else{
		UCSR0A &= ~(1<<U2X0);
	}

und die Datei “util/setbaud.h” includieren.

Das define gehört übrigends nicht in deine main.c! Entweder in eine global.h, main.h oder was auch immer, die in allen Libs, die dies brauchen, eingebunden werden.

Besser aber noch direkt unter Toolchain und dann Symbols. Sollte abre auch in jedem besseren Buch so zu finden sein.