www.mikrocontroller.net

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


Autor: MeisterPez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!!

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: MeisterPez (Gast)
Datum:

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

Autor: SiO2 (Gast)
Datum:

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

Autor: MeisterPez (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das tut er...

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.