Gast
#5372277
Hallo, Obwohl ähnliche Beiträge schon recht viele rumgeistern komme ich mit der Programmierung der UART nicht weiter. Ich habe diese früher bereits erfolgreich mit AVR Studio 4 verwendet für ein Debug-Log am PC (serielles Terminal). Nun benötige ich das selbe mit Atmel Studio 7. Mein erstes Problem ist, dass hier irgendwie der OnBoard Oszillator des STK500 nicht mehr konfiguriert werden kann. Ist das korrekt oder irgendwie möglich? Habe also mit einem Oszi die derzeitige Frequenz am XT1 Pin gemessen (ca. 3.84MHZ). Diese auch in meiner Software konfiguriert. Auch mit einem separaten Quarz (4MHZ) hatte ich keinen Erfolg. Habe auch das mit Oszi kontrolliert. Jumper waren korrekt gesetzt. Takt stimmte. Das eigentliche Problem ist nun, dass ich per UART am seriellen Terminal nur Blödsinn bekomme. Langsam bin ich am verzweifeln. Die Terminaleinstellungen scheinen nicht das Problem zu sein. Hab das mehrmals gecheckt. Habe auch verschiedenste Baudraten probiert. Hoffe jemand hat einen Tipp. Der relevante Code: #include <avr/io.h> /* UART-Init: Berechnung des Wertes für das Baudratenregister aus Taktrate und gewünschter Baudrate */ #ifndef F_CPU /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann F_CPU im Makefile definiert werden, eine nochmalige Definition hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch #ifndef/#endif Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio verwendet wird und dort eine andere, nicht zur Hardware passende Taktrate eingestellt ist: Dann wird die folgende Definition nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) von AVRStudio - daher Ausgabe einer Warnung falls F_CPU noch nicht definiert: */ #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten // Ohne ergeben sich unten Fehler in der Berechnung #endif #define BAUD 300UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch! #endif void uart_init(void) { UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 } int main(void) { uart_init(); while(1) { while (!(UCSRA & (1<<UDRE))) {} UDR = 'a'; } return 0; } Lg Lukas

