Hi,

ich hoffe, ich oute mich mit meinem ersten Posting nicht gleich als Volldödel



ich bin was Mikrocontroller angeht ein blutiger Anfänger und hänge jetzt schon bei diesem Anfangsproblem fest und komme ohne Hilfe nicht weiter.

Aaaalso, hier die Beschreibung meines kleinen "Problemchen"

Ich habe mir von Reichelt das Entwicklerboard STK500 besorgt und mit einem Atmega32 bestückt.

Programmierumgebung ist AVR Studio 4 und WinAVR (beides frisch runter geladen), ich programmiere in C (ich versuch´s).

Ich stelle über das Terminalprogramm TerraTerm die Verbindung her und möchte ein Zeichen, welches ich an den AVR sende einfach nur zurück gesendet und auf der Terminalschirm dargestellt haben, mehr nicht. Leider klappt´s nicht.

Port A ist als Ausgang definiert, an dem LED´s hängen.

Grundsätzlich funktioniert die Kommunikation irgendwie schon, d.h. ich kann senden, der AVR empfängt was und schickt auch was zurück.
Allerdings nur, wenn ich im Terminalprogramm eine wesentlich geringere Baudrate (=1200) einstelle als eigentlich laut Programm vorgesehen (=9600). Komischerweise werden die nebeneinanderliegenden Tasten "n", "m", ";", ".""-",die Tasten "h", "j", "k","l" und noch einige andereTasten dann richtig zurück gesendet, der Rest aber nicht, z.B. für ein"b" bekomme ich ein "z" zurück geliefert.

Wo ich mir jetzt überhaupt nicht sicher bin, ist die Frage, ob die Initialisierung des UART so richtig ist, oder ob da noch was fehlt und ob der Programmablauf so funktionieren kann.

Könnte jemand mal ein Auge aufs Programm werfen?

Besten Dank im Voraus und ein schönes Wochenende!

Gruß
Leuchtturm

Code:
#include <avr/io.h>

/* CPU Frequenz */
#define F_CPU 3686400L

/* UART Baud Rate */
#define UART_BAUD_RATE  9600L

/* USART Registerdefinitionen*/
#define UBRRL   _SFR_IO8(0x09)
#define UCSRB   _SFR_IO8(0x0A)
#define UCSRA   _SFR_IO8(0x0B)
#define UDR     _SFR_IO8(0x0C)
#define UBRRH   _SFR_IO8(0x20)
#define UCSRC   UBRRH
#define URSEL   7

void uart_init(void)
{
	uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU/(16*UART_BAUD_RATE) - 1);
	UBRRH = (uint8_t) (ubrr>>8);
	UBRRL = (uint8_t) (ubrr);

    UCSRB |= ( 1 << RXEN )| ( 1 << TXEN );  //Receive/transmit enablen
	UCSRC =(1<<URSEL) |(1<<UCSZ1)|(1<<UCSZ0); //Frame 8/N/1
}
 
int main()
{
	unsigned char test;
	DDRA = 0xff;

	uart_init();

	while(1)
	{
		while (!(UCSRA & (1<<RXC)));  // warten bis Zeichen verfuegbar
	
		test=(unsigned char)UDR;
		PORTA=test;
		
		while (!(UCSRA & (1<<UDRE)));  // warten bis UDR bereit für neuen Wert
		
		UDR=test;
	}
	return 0;
}