Unverständliches UART Problem

Gast #3313950
Hallo allerseits,

ich habe ein komisches Problem mit meinem UART und zwar habe ich 
folgenden Code:
1
void initUART(void)
2
{
3
  UBRRH = 0x00;
4
  UBRRL = 51; // 9600 baud
5
    
6
  UCSRB |= (1<<TXEN);
7
  UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //8bit Daten, 1 Stopbit 
8
}
9

10

11

12

13
int main(void)
14
{
15
    DDRD = 0xFF;
16
  
17
    initUART();
18
  
19
    while(1)
20
    {
21
     
22
      while ( !( UCSRA & (1<<UDRE)) )
23
      ;
24
  
25
       UDR = 'A';
26
    }
27
}
Meiner Auffassung nach sollte der µC (atmega8 @ 8Mhz externes Quarz) bis 
in alle Tage A senden.
Was allerdings am PC ankommt ist ein Zeichen mit dem Wert 0x05.

Wenn ich die while-Schleife welche darauf warten soll das der 
Eingangspuffer bereit ist durch ein einfaches _delay(100) ersetze 
funktioniert alles wunderbar.

Hat da jemand eine Idee was hier nicht stimmt ?

MfG.
Gast
Bei nur einem Stopbit würde ich mich nicht wundern, wenn sich der 
empfangende UART bei dauerfeuer ein und des selben Zeichens auf einen 
falschen Frame synchronisiert. Stelle mal auf dem µC 1,5 Stoppbits ein. 
Das sollte helfen. Oder mach noch ne kleine Pause, bevor wieder was 
versendet wird.
Gast
Danke schonmal für die Hilfe.

Ich habe es jetzt mit zwei Stoppbits versucht allerdings ohne Erfolg.

Mit einer kleinen Pause (so um die 10ms) funktioniert es immer (egal ob 
1 oder 2 Stoppbits).


Jetzt ist mir aber nicht mehr so wirklich ersichtlich wofür man 
überhaupt noch das Statusregister ausliest (    while ( !( UCSRA & 
(1<<UDRE)) ) ), wenn man eh eine Zeit lang warten muss bis man wieder 
senden kann.


MfG.
basterlein schrieb:

> (1<<UDRE)) ) ), wenn man eh eine Zeit lang warten muss bis man wieder
> senden kann.

Das Problem ist nicht dauernd, sondern das erste Byte.

Wie gehst du vor?
Läuft dein Terminalprogramm bereits, wenn du den AVR loslegen lässt?

Ohne eine längere Pause ist ein später zugeschalteter Empfänger (das 
Terminalprogramm) nicht in der lage sich eindeutig in die Serielle 
Kommunikation einzuklinken.
Steht die Synchronisierung erst mal, dann ist das Problem keines mehr.

Es ist wie in eine Telefonverbindung, in der du dich als Zuhörer 
einklinkst. Spricht der Sprecher ohne Luft zu holen, hast du kaum eine 
Chance was zu verstehen. Erst eine Pause an einem Satzende ermöglicht 
dir den nächsten Satzanfang eindeutig zu erkennen. Und ab da läuft dann 
alles wie geschmiert.
Gast
Bis jetzt war es so dass der AVR schon fleißig am Senden war bevor ich 
das Terminalprogramm gestartet habe.
Wenn ich es andersrum mache funktioniert alles wie es soll.

Vielen dank ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.