Hi,
ich will am mega128 beide UART Schnittstellen verwenden - und schaffe es einfach nicht diese zum laufen zu bringen.
Zuerst habe ich es mit der Library von Peter Fleury versucht, danach mit der AVRlib von Procyon - beides ohne Erfolg.
Dann habe ich das Datenblatt herausgesucht, und selber einige Funktionen programmiert (ich brauche einstweilen nur mal eine sende-Funktion):
Mit einem Debugger habe ich herausgefunden, dass das Programm in der while Schleife der Funktion UART0_putc() hängen bleibt.Code:#include<avr/io.h> #include<util/delay.h> #include<avr/interrupt.h> #defineF_CPU16000000 voidUART0_putc(unsignedchardata) { /* Wait for empty transmit buffer */ while(!(UCSR0A&(1<<UDRE0))); /* Put data into buffer, sends the data */ UDR0=data; } voidUART1_putc(unsignedchardata) { /* Wait for empty transmit buffer */ while(!(UCSR1A&(1<<UDRE1))); /* Put data into buffer, sends the data */ UDR1=data; } voidUART0_init() { /* - Baudrate: 19200 - Parity: None - Asynchron - 8 Bit Data - 1 Stop Bit - Rx und Tx enabled */ //Configure UART0 UCSR0A= (0<<U2X0)|// dont use double UART speed mode (0<<MPCM0);// Dont use Multi-procesor communication mode UCSR0B= (0<<RXCIE0)|// Dont enable RX complete interrupt (0<<TXCIE0)|// Dont enable TX complete interrupt (0<<UDRIE0)|// Dont enable data register empty interrupt (1<<RXEN0)|// Enable receiver. (1<<TXEN0)|// Enable transmitter. (0<<UCSZ02);// Use 8 bit character size UCSR0C= (0<<UMSEL0)|// Use asynchronous mode (0<<UPM01)|// No parity check (0<<UPM00)|// No parity check (0<<USBS0)|// Use one stop bit (1<<UCSZ01)|// Use 8 bit character size (1<<UCSZ00);// Use 8 bit character size //Baudrate 19200 @16MHz UBRR0H=0; UBRR0L=51; } voidUART1_init() { /* - Baudrate: 19200 - Parity: None - Asynchron - 8 Bit Data - 1 Stop Bit - Rx und Tx enabled */ UCSR1A=0b00000000; UCSR1B=0b00011000; UCSR1C=0b00000110; //Baudrate UBRR1H=0; UBRR1L=51; } intmain(void) { // PORT D DDRD&=~(1<<2);// RX0 DDRD|=(1<<3);// TX0 // PORT E DDRE&=~(1<<0);// RX1 DDRE|=(1<<1);// TX1 sei(); UART0_init(); UART1_init(); while(1) { UART0_putc('A'); UART1_putc('B'); _delay_ms(100); } }// ENDE main
Anscheinend wird der Ausgangspuffer nicht geleert. Am Oszi habe ich mir den TXD Pin angeschaut - da ist nichts hinausgekommen.
Das Bit UDRE0 wird auch nicht mehr auf 1 gesetzt, weil der Ausgangspuffer noch nicht geleert ist.
Aber woran liegt das? Mir fällt nichts ein was ich dagegen tun kann...
Gibt es irgendwo noch ein Bit, das ich setzen muss, damit die UART Schnittstellen aktiviert werden? Ich habe im Datenblatt nichts dazu gefunden.
Ich bin für jeden Tipp dankbar!
lg
Christoph
Lesezeichen