Forum: Mikrocontroller und Digitale Elektronik UART- Senden Hui, Empfangen Pfui


von MeisterPez (Gast)


Lesenswert?

Hi leute!
Ich habe hier eine kleine Schaltung, in der mein AVR (ein ATMEGA8515) 
über einen MAX485 mit einem anderen Gerät kommunizieren soll.

Zu aller erst:
Die Hardware ist vollkommen OK. Ich habe ein Programm von einem Kollegen 
auf den AVR gespielt, dass vollkommen einwandfrei über den UART 
kommuniziert.

Mein Problem:
Mein eigener Code funktioniert nicht so ganz. Gesendete Daten kommen 
zwar am anderen Gerät an, aber ich empfange nichts.

Hier der Code zum initialisieren:


INITIALISIERUNG:

// Die beiden Datenleitungen des MAX händen an PortD0 und D1, die 
Richtungsleitung ist an C0
// Port-Richtungen setzen
DDRA = 0xFF;
DDRB = 0x00;
DDRC = 0x00;
DDRD = 0x00;

// UART initialisieren
UCSRB = (1 << RXEN) | (1 << TXEN);    // Enable transmit and recieve
UCSRC |= (1<<URSEL)|(3<<UCSZ0);      // Asynchron 8N1

UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );




DAS SENDEN UND EMPFANGEN:

UCSRA = (1 << RXC) | (1 << TXC);  // Clear TXC and RXC


blinkSomeCrazyLEDs();  // 5 Sek blinken um anzuzeigen, dass es los geht


// ----- SENDEN -------

// MAX auf senden
PORTC &= ~(1 << PINC0); // C0 auf 1

while (!(UCSRA & (1<<UDRE)));  // Warte bis bereit zum senden
UDR = 201;      // Sende byte "201"

while(!(UCSRA&(1<<TXC)));    // warte bis gesendet wurde
UCSRA = (1 << RXC) | (1 << TXC);  // Lösche alle input/output bits mit 1


// ----- EMPFANGEN-------

// MAX auf empfangen
PORTC |=  (1 << PINC0); // C0 auf 0

while (!(UCSRA & (1<<RXC)));  // warte bis byte reingekommen ist
char temp = UDR;    // lese byte aus

blinkSomeCrazyLEDs();  // 5 Sek blinken um anzuzeigen, dass wir fertig 
sind



WAS PASSIERT:
Wie gesagt kommt das gesendete byte 201 problemlos an. Danach hängt sich 
das programm aber in der empfangs-endlosschleife auf ("while (!(UCSRA & 
(1<<RXC)));").
Das heißt also, dass der UART nichts empfängt.
Dabei ist da ganz sicher eine antwort, die nur irgendwie nicht 
ankommt... :-(
Und das Problem muss in dem code oben liegen, das es ja mit einem 
anderen Programm (an das ich leider nicht rankomme) funktioniert.

hat jemand eine Idee?
danke!!!!!

von unbeschreiblicher Rahul (Gast)


Lesenswert?

>// MAX auf empfangen
>PORTC |=  (1 << PINC0); // C0 auf 0
>// MAX auf senden
>PORTC &= ~(1 << PINC0); // C0 auf 1

Kommentare passen nicht zum Code. Die sind vertauscht.
Braucht der MAX nicht ein High zum Senden? Dann wären die auch noch 
vertauscht...

von MeisterPez (Gast)


Lesenswert?

So falsch kann das aber nicht sein, das Senden klappt ja wunderbar...

von SiO2 (Gast)


Lesenswert?

Und den richtigen Pegel bzw. Signal am Max (zum AVR) kommt auch an?

von MeisterPez (Gast)


Lesenswert?

Ja, das tut er...

von Sonic (Gast)


Lesenswert?

>// UART initialisieren
>UCSRB = (1 << RXEN) | (1 << TXEN);    // Enable transmit and recieve
>UCSRC |= (1<<URSEL)|(3<<UCSZ0);      // Asynchron 8N1

>UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
>UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );




>DAS SENDEN UND EMPFANGEN:

>UCSRA = (1 << RXC) | (1 << TXC);  // Clear TXC and RXC

Das Beschreiben der Register UCSRC, UBRRH und UCSRA kannst du weglassen.
Ich weiß nicht in welchem Tutorial das steht, aber es kommen immerwieder 
Codeschnipsel dieser Art.

>UART_BAUD_RATE, F_CPU
sind diese Konstanten (richtig) definiert? Als 'UL' (unsigned long)
Rechne das doch mal lieber von Hand aus und schreib's direkt rein.

von unbeschreiblicher Rahul (Gast)


Lesenswert?

>Das Beschreiben der Register UCSRC, UBRRH und UCSRA kannst du weglassen.
>Ich weiß nicht in welchem Tutorial das steht, aber es kommen immerwieder
>Codeschnipsel dieser Art.

Es gibt AVR, bei denen sich UBRRH und UBRRL die Speicheradresse teilen. 
Welche das sind, müsste ich jetzt nachgucken.
Die haben dann kein UBSEL-Bit...

UCSRA braucht man aber wirklich nicht beschreiben.

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
Noch kein Account? Hier anmelden.