Ich weiss, dass das Thema schon öffter angesprochen wurde aber eigentlich funktioniert mein USAR aber eben noch lange nicht 100% und ich weiss nicht warum? #define F_CPU 4000000 /* 4Mhz */ #define UART_BAUD_RATE 9600 /* 9600 baud */ // Berechnung des Inhalts des UBBR-Registers #define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1) void USART_Init(void) { // Set baud rate //UBRRH = 0; //UBRRL = 12; // Enable receiver and transmitter and Interrupts UCSRB = (1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN); // Set frame format: 8data, 1stop bit,no parity UCSRC = (1<<URSEL)|(3<<UCSZ0); UBRRL = (unsigned char) UART_BAUD_SELECT; } Das Ergebnis kann ma im Dateianhang sehen. Das ist nichts wildes aber mit dem ATmega16 funktioniert das einwandfrei. Die auskommentierte Variante ergibt das gleiche Resultat. Ich würde mich über jede Hilfe freuen, Danke!
sieht schwer nach unterschiedliche Frequenz aus von der MCU hast du einen QUARZ Dran oder nutzt du den internen RC Oszilator??? Such mal nach der LIB von Peter Flury.. mit der bin ich bisher immer sehr gut gefahren Gruss Jens
Ich benutze die interne Clock aber vielleicht sollte ich das mal mit einem externem Quarz versuchen
@Peter: Ich glaube nicht, daß es daran liegt, denn: #define UART_BAUD_RATE 9600 /* 9600 baud */ #define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1) Der Wert 9600 wird mit einem long int (16L) multipliziert, und dadurch implizit zuerst auf long int promotet. Das Ergebnis ist ebenfalls long int. Ob 9600 oder 9600L macht also keinen Unterschied. Abgesehen davon empfängt er ja eine Reihe richtiger Zeichen, wäre die Berechnung hier schon so katastrophal falsch, käme vermutlich nichtmal ein Mucks raus (bzw. kein lesbarer). Es wird ja auch nur einmal berechnet, vom Präprozessor, und landet direkt als Zahl im Code. Das kann also nicht (alleine) für einen geht-geht-nicht-Fehler zur Laufzeit verantwortlich sein.
//*****************************INI UART 9800 Baud********************************************** void Ini_Uart(void) { // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; } //*****************************Zeichen senden*************************************************** void Put_char(char data) { while ( ! ( UCSRA & (1 << UDRE) ) ) ; //warten, bis Sender leer ist UDR = data; } //****************************Text aus Flashtabelle ausgeben***************************************** void Text_Uart(char flash *Table) { char Loop,Dat; while (1) { Dat = *Table++; //char aus Tabelle holen if (Dat == 0) break; Put_char(Dat) ; } } //********************************************************************** ********************** Läuft mit internem Quarz 8 Mhz sehr gut. Masseprobleme beachten ! SG Josef
erst UBRRH und dann UBRRL übergeben...Zumidest ist das bei den Megas, die ich bisher verwendet habe so. (Warum weiß ich jetzt auch nicht mehr; liegt aber am UBRRH-Register).
So, wie es ausschaut, ist es das erste Zeichen, das immer wieder verstümmelt wird. Wird dieser Text jedesmal nach Reset gesendet? Also hast Du jedesmal Reset ausgelöst? Dann könnte es daran liegen, daß der Uart kurz nach dem Reset noch nicht definiert ist, der TXD dadurch floatet und irgendeinen Mist ausgibt und dadurch dem PC ein Startbit vorgaukelt. Das ist eine Hardware-Sache - abhängig vom µC, dem RS-232-Wandler, Leiterbahnen, Mondphase etc... Wenn Du nach der Initialisierung des UART eine Verzögerungsschleife von min. der Dauer eines Bytes einfügst, sollte das Problem verschwunden sein.
Hi, danke für eure Hilfe, es hat wohl an der internen Clock gelegen. Ich habe jetzt ein externes Quarz angeschlossen und das Ergebnis könnt ihr jetzt im Anhang sehen. Da ich vorher ein 4433 auf dem Board hatte und der eben eine externe Clock benötigt war es kein Problem. Ich habe nicht geglaubt, dass es daran liegen könnte. Diese Lösung gefällt mir nicht aber ich habe mir heute so wie so zwei neue Atmega8 bestellt. Wie kann ich eigentlich mit Hyperterminal Zeichen an den Atmel senden? Muss ich das über eine Datei machen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.