Forum: Mikrocontroller und Digitale Elektronik Unverständliches UART Problem


von basterlein (Gast)


Lesenswert?

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.

von Klugscheißer (Gast)


Lesenswert?

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.

von basterlein (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von basterlein (Gast)


Lesenswert?

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 ;-)

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.