Hallo, ich versuche schon länger den USART vom ATmega128 zum senden zu überreden, leider nur mit mäßigem Erfolg. In der Grundlegenden Struktur ist ja nicht viel falsch zu machen: ------------schnipp------------ // usart outp((1<<RXEN)|(1<<TXEN), UCSR0B); outp(0x00, UBRR0H); outp(0x19, UBRR0L); outp(0x90, UDR0); ------------schnipp------------ Ich bin eigentlich auf 9600 Baud aus, leider spielt der AVR nicht mit. Das ganze steckt im Moment auf dem STK300, auf dem Board ist ein Quarz mit dubiöser Aufschrift, "8.0000". Nun funktioniert leider keine denkbare einstellung des UBRR0L registers! Es kommen bestenfalls falsche Werte an, aber niemals 90h! Um das ganze gleich nochmal vollkommen durchzutesten hab ich folgendes gemacht: ------------schnipp------------ // ================================================================ // Includes // ================================================================ #include <io.h> #include <iom128.h> #include <signal.h> #include <sig-avr.h> #include <interrupt.h> // ================================================================ // Definitions // ================================================================ #define CPU_CLOCK 4000000 // 4MHz #define UART_BAUD_RATE 9600 // 9600BPS // ================================================================ // Functions // ================================================================ // ================================================================ // Variables // ================================================================ // ================================================================ // Interrupts // ================================================================ /*SIGNAL (SIG_INTERRUPT0) { outp(0x42, UDR0); } SIGNAL (SIG_INTERRUPT1) { outp(0x41, UDR0); }*/ // ================================================================ // Main Program // ================================================================ int main(void) { // init ports outp(0xFF, DDRB); outp(0x00, DDRD); // interrupts outp((1<<INT0)|(1<<INT1), EIMSK); outp((1<<ISC00)|(1<<ISC10), MCUCR); // usart outp((1<<RXEN)|(1<<TXEN), UCSR0B); //outp(0x00, UBRR0H); //outp(0x19, UBRR0L); sei(); outp(0xFF, PORTB); unsigned char lo, hi; unsigned char i, j, k; for (hi = 0; hi < 255; hi++) { for (lo = 0; lo < 255; lo++) { outp(hi, UBRR0H); outp(lo, UBRR0L); for (i = 0; i < 255; i++) for (j = 0; j < 80; j++) k++; outp(0x90, UDR0); } } outp(0x00, PORTB); for (;;) { } return 0; } ------------schnipp------------ Leider kommt nicht ein einziges mal 90h an, da ist was faul... Irgendwie sehe ich aber keine Fehler, alle möglichen Werte für die Baud-Select Register sind ja durchgekaut, trotzdem gehts nicht...
Hast Du denn auch die Fuses des Mega128 so umprogrammiert, das der externe Quarz auch verwendet wird? Im Lieferzustand läuft der mit einem internen Oszillator mit ca 1MHz. Da kannst Du lange rumexperimentieren.
Wie gesagt, es handelt sich um das STK300 mit diesen, mehr oder eher weniger tollen, Adapter für den Chip - also Fabrikneu ist er nicht. Die Fuses sahen eigentlich Ok aus, nach einen weiteren Blick ins Datenblatt kann ich das auch nur bestätigen. CKOPT = 1 CKSEL0 = 0 CKSEL1 = 1 CKSEL2 = 1 CKSEL3 = 1 SUT0 = 0 SUT1 = 1 Ich bin mir bei der Quarzfrequenz allerdings auch nicht ganz sicher, 8MHz können es eigentlich nicht sein, denn der ATmega103 läuft ja nur mit max. 6MHz!
Jetzt wirds noch besser.. Ich habe in mein STK300 ein 11.0592MHz Quarz eingelötet der auch wunderbar schwingt, nun schreibe ich folgendes in die Register: outp(0x00, UBRR0H); outp( 71, UBRR0L); Damit sollte der UART auf 9600 eingestellt sein, aber nichts ist, das Terminalprogramm liefert " ". Ich weiss mir nichtmehr zu helfe, ist der ATmega128 hinüber? Timer/Counter, TWI und SPI sind übrigens in Ordnung, deswegen wundert mich das doch etwas...
Hallo, ich hatte auch mal Probleme mit der USART - mittlerweile gehts, wenn du willst kann ich dir mal ein Beispielprogramm von mir posten.... Im Anhang findest du meine Lockbit Konfiguration - keine Garantie (wenn dein MC hernach nicht mhr reagiert - bei mir gehts auf jeden Fall...) Dene Lockbits sind genau andersrum als die Hackerl, die ich in ony Prog gesetzt habe ( Hakerl entspricht einer 0???) Viel Erfolg!!! mfg
hHabe auch zurzeit so ein ähnliches Problem. @ Christian könntest du bitte dein Bsp. posten?
Hoffentlich funktionierts so auch tatsächlich - bei mir im kompletten Programm eingebaut gehts auf jeden Fall... mfg #include <io.h> #include <interrupt.h> #include <sig-avr.h> unsigned char recval; SIGNAL(SIG_UART1_TRANS) { /* character of string to uart */ outp(100, UDR1); //sendet 100 zur USART } SIGNAL(SIG_UART1_RECV) { recval = inp (UDR1); /* read data from uart buffer */ } int main(void) { /* init the uart for receiving and transmitting of data */ outp((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN),UCSR1B); outp(103, UBRR1L); /* init speed @ 16Mhz 9600baud*/ sei(); /* enable interrupts */ outp(100, UDR1); for(;;){} }
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.