Hi, Palmer,
für meinen mega168 (beispielsweise) verwende ich folgenden Code in (m)einer header-Datei:
Im main werden diese Schnippsel wie folgt angesprochen (Nachtrag beachten!!):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++; } } /* ============================================================================== */
Die Textausgabe geht - beispielsweise - so: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 ....
Als Beispiel für eine Datenausgabe: den Wert mecho gebe ich damit so aus:Code:sendUSART("FLEX168/20MHz mit SFH415-37,0kHz und SFH5110-36\r\n"); sendUSART("Code irDMEm168-x24.c 27feb08 23:38ff");
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.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
Nachtrag am 10.03.08, 19:23 im Codestück "main". Sorry, hatte diese Initialisierung vergessen.







Zitieren

Lesezeichen