Bei dir fehlen die Klammern.
http://www.mikrocontroller.net/artic...orial/Der_UART
"
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{ }
UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
"
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
Bei dir fehlen die Klammern.
http://www.mikrocontroller.net/artic...orial/Der_UART
"
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{ }
UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
"
[X] <-- Nail here for new Monitor
Er verwendet ein ; nach der While-Schleife und benötigt deshalb hier keine {}
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Stimmt das fehlt auch noch, aber er hat ja schon mit UART0 Probleme.
Ich würde nochmal den UART aufbauen wie im Turorial, auch mit der Berechnung für den Bautratenfehler, dazu mal mit Bautrate 9600 anfangen und bei Funktion Schritt für Schritt in Richtung deines Wunsch-Uarts gehen.
Nachdem dann ein UART funktioniert, verdoppelst die Funktionen und passt sie auf den zweiten UART an, auch da die Berechnung und Initialisierungen etc..
[X] <-- Nail here for new Monitor
Irre ich mich oder gibt das irgendetwas über 39 kBd ? statt der von Dir angestrebten 19200 ?... [/CODE] ... UBRR1L=51 ... [/CODE]
Ich rechne üblicherweise so :
Nur gaaanz nebenbei ... die Orgie mit den vielen 0-ZuweisungenCode:UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; // Enable receiver and transmitter
ist überflüssig/sehr ungewöhnlich. WENN Du die Bits löschen willst (weil sie "irgendjemand-irgendwo" gesetzt hat - nach nem Reset sind die sowieso "0"), dann eher inCode:(0<<RXCIE0)|// Dont enable RX complete interrupt ...
der Art: "TCCR2A &= ~(1<<WGM21);"
Viel Erfolg
Ciao sagt der JoeamBerg
Hi,
vielen Dank für eure Antworten. Ich habe alles ausprobiert was ihr vorgeschlagen habt, aber das hat das Problem nicht gelöst.
Nach einigen Stunden Zeitverschwendung bin ich aber trotzdem draufgekommen: Es gibt ein Fusebit, das den "ATmega103 compatibilitymode" aktiviert. Dieses ist standardmäßig gesetzt. Dadurch hat der mega128 nur eine UART Schnittstelle, und wenn man wie ich beide konfiguriert, funktioniert gar keine...
Ist ja nett dass es diese Fuse gibt, aber WARUM VERDAMMT AKTIVIERT ATMEL DIESEN COMPATIBILITY MODE STANDARDMÄSSIG??? Wen interessiert der mega103...
Naja, danke für die Hilfe.
lg
Christoph
Lesezeichen