Gast
#20315
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...
