Hi, Palmer,

für meinen mega168 (beispielsweise) verwende ich folgenden Code in (m)einer header-Datei:

Code:
/* ============================================================================== */
/*	Initialisiere USART0 mit vorgegebener Baudrate		Neu am 07jan2008
	Zum Senden von Zeichen im Hauptprogramm entweder        nach doc2545, S179
	char irgendwas[] = "meintext";
	sendUSART(irgendwas);		oder direkt
	sendUSART("meinText");		verwenden.				  */
void init_USART0( unsigned int ubrr ) 
{ 					
    UBRR0H  =  (unsigned char)(ubrr>>8);      // Set baud rate
    UBRR0L  =  (unsigned char)ubrr;	 
    UCSR0B  =  (1<<RXEN0)|(1<<TXEN0); 	// Enable receiver and transmitter
    UCSR0C |=  (1<<UCSZ01)|(1<<UCSZ00);	// 8 Data, (async: UMSELnx empty, doc S193)
			//  no parity weil UPMn1:0 empty, 1 Stop, weil UPMn1:0 empty
}
/* ============================================================================== */
// ------------------------------------------------------------------ 
void sendchar(unsigned char c) 
{ 
   while(!(UCSR0A & (1<<UDRE0)))        //Warten, bis Senden möglich ist 
   { 
   } 
   UDR0 = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle 
} 
/* ============================================================================== */
void sendUSART(char *s)          //   *s funktiniert wie eine Art Array - auch bei 
        // einem String werden die Zeichen (char) einzeln ausgelesen - und auf die
        // Sendeschnittstelle übertragen 
{ 
   while(*s) 
   { 
   sendchar(*s); 
   s++; 
   } 
} 
/* ============================================================================== */
Im main werden diese Schnippsel wie folgt angesprochen (Nachtrag beachten!!):

Code:
#define MCU = AVR_ATmega168

//   Mit Quarz 20 Mhz-CPU 
#define F_CPU  20000000 
#define BAUD   56000 
#define MYUBRR (unsigned int)(F_CPU/16/BAUD-1)	//nach doc2545, S 179

/* ============================================================================== */
.
.
.
// hier folgen div. Initialisierungen sowie >>>>> hier Nachtrag!!!

    init_USART0(MYUBRR);  //USART0 initialisieren mit wählbarer Baudrate (s.o.)

// evtl. weitere Initialisierungen ....
Die Textausgabe geht - beispielsweise - so:

Code:
    sendUSART("FLEX168/20MHz mit SFH415-37,0kHz und SFH5110-36\r\n");
    sendUSART("Code irDMEm168-x24.c  27feb08 23:38ff");
Als Beispiel für eine Datenausgabe: den Wert mecho gebe ich damit so aus:

Code:
// Natürlich müssen die Variablen definiert werden - entweder lokal 
//   oder global (auch dies nur beispielhaft)

	uint8_t mecho = 50;
	char wortadc[10];


    mecho  = istaus / 10;
        
    utoa(mecho, wortadc, 10);
    sendUSART("\tAR \t");	//aktuellen Rampensteuerwert ausgeben
    sendUSART(wortadc);sendUSART("\r\n");	// Meldung ausgeben
Vielleicht hilft Dir dies etwas weiter. Für Deine Anwendung musst Du natürlich einmal den Prozessortakt anpassen, der Name des Prozessors gilt nur für meine Anwendung, dem von mir verwendeten Prozessortyp entsprechen die Kommentare/Hinweise auf die Dokumentationsstellen, und, ganz wichtig, Du musst die Baudrate einstellen, die Deinem Problem und Deiner Sende- und Empfangshardware entspricht. Aufpassen: Wenn Du keinen Quarz verwendest, oder - wie ich - einen, der nicht für USART-Zwecke optimiert ist (das sind dann ziemlich krumme Werte), kann beim Einstellen der Baudrate durch die Ganzzahligkeit des Wertes ein Fehler auftreten, der von der Hardware (beispielsweise Deiner RS232 am PC) nicht mehr verdaut wird. Dazu such mal ein bisschen nach den entsprechenden Fehlertabellen in Abhängigkeit vom Quarztakt.

Nachtrag am 10.03.08, 19:23 im Codestück "main". Sorry, hatte diese Initialisierung vergessen.