Forum: Mikrocontroller und Digitale Elektronik USART - Problem


von Mr. D (Gast)


Lesenswert?

Ich habe schon sehr viele Stunden an dieser Usart Verbundung verbracht 
und bin immer noch nicht weitergekommen.

Transmitter: Atmega128, 16Mhz externer Quarzoszillator.

Receiver: Atmega128, 16Mhz externer Quarzoszillator

Beide befinden sich auf einzelnen Leiterplatten.
Die USART Verbindung erfolgt über ein Flachbandkabel, somit sind die RX, 
TX Ports direkt miteinander verbunden. Masse wird auch über das 
Falchbandkabel geführt.

Teil des Programms der Senders:
1
void initSendUART( unsigned int ubrr )
2
{
3
/* Set baud rate */
4
UBRR0H = (unsigned char)(ubrr>>8);
5
UBRR0L = (unsigned char)ubrr;
6
7
8
UCSR0B |= (1<<TXEN0);              /* Enabletransmitter */
9
10
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); /* Set frame format: 8data, 1stop bit */
11
}
12
13
14
void uart_putchar(unsigned char c)
15
{
16
    while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
17
    {
18
    }                             
19
 
20
    UDR0 = c;                      /* sende Zeichen */
21
    
22
}


Das Programm des Empfängers:
1
void initReceiveUART( unsigned int ubrr )
2
{
3
/* Set baud rate */
4
UBRR0H = (unsigned char)(ubrr>>8);
5
UBRR0L = (unsigned char)ubrr;
6
7
UCSR0B |= (1<<RXEN0);  /* Enable receiver */
8
9
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);  /* Set frame format: 8data, 1stop bit */
10
}
11
12
//**** Funktion zum empfangen einzelner Zeichen
13
14
15
uint8_t uart_getc(void)
16
{
17
18
    while (!(UCSR0A & (1<<RXC0)))   // warten bis Zeichen verfuegbar
19
    {
20
    }
21
    return UDR0;                   // Zeichen aus UDR an Aufrufer zurueckgeben
22
}


Das Problem besteht darin, dass ich irgendwelche Werte empfange.

von Jim M. (turboj)


Lesenswert?

> [...] Usart Verbundung [...]

Asynchroner UART? Ich las jedenfalls nix von Clock.

> Das Problem besteht darin, dass ich irgendwelche Werte empfange.

Dann würde Ich dreimal die Baudraten überprüfen, die müssen 
übereinstimmen. Was auch gerne vergessen wird sind die Clock Fuses (z.B. 
intern/ div8). Wenn die MCU Clock schon nicht stimmt dann auch die 
Baudrate.

von Thomas E. (thomase)


Lesenswert?

Atmega128-Alarmglocke:
ATmega103 Compatibility Mode Selected by a Fuse
Werkseinstellung ist Atmega103!!!

Die taktrelevanten Fuses sind natürlich auch immer wieder gern genommene 
Fehlerquellen.
mfg.

von Mr. D (Gast)


Lesenswert?

Danke für den Rat mit den Fuses, was muss ich da genau einstellen?
Was ist die MCU Clock?

Die ATmega103 Compatibility Mode habe ich schon vorher deaktiviert, hat 
auch lange gedauert.

Es ist ein asynchroner uart. Die Baudrate stelle ich dann später im 
Programm ein. Mein Wert ist 51 den ich an das UBRR Regsiter übergebe.

von Thomas B. (nichtessbar)


Lesenswert?

Ausgekreuzt hast du oder? Also TX vom Sender uC auf RX vom Empfänger und 
RX vom Sender auf TX vom Empfänger?

Wobei wenn nicht ausgekreuzt solltest du eh gar keine Zeichen 
empfangen...

von h_ (Gast)


Lesenswert?

Wenn die Leitungen nicht gekreuzt sind und keine Pullups oder -downs 
drin sind, kann er Zufall empfangen, da die Leitungen auf keinem 
definierten Pegel liegen.
Der Code sieht ok aus.

von Stefan E. (sternst)


Lesenswert?

Thomas Bergmüller schrieb:
Wobei wenn nicht ausgekreuzt solltest du eh gar keine Zeichen
> empfangen...

Sehe ich anders. Es sind dann nämlich zwei hochohmige Eingänge 
miteinander verbunden. Ohne Pull-Up kann er da sehr wohl etwas 
empfangen.

von Mr. D (Gast)


Lesenswert?

Beim Stk500 sehe ich nichts bei den fuses was mit dem Usart zu tun haben 
sollte. Ich aknn die Redister setzen, aber das steht ja im Programm.
Wenn ich das Osszi snschließe sehe ich wie Daten gesendet werden.
Wenn jemand ein fuktionierendes Usart programm hätte un des postet währe 
ich sehr dankbar.

von Mr. D (Gast)


Lesenswert?

Es war wirklich das auskreuzen, hab total darauf vergessen.

Danke

von Mr. D (Gast)


Lesenswert?

Wie war das mit den Pull-ups gemeint?

von Thomas B. (nichtessbar)


Lesenswert?

Wenn zwei hochohmige Eingänge miteinander verbunden sind, ist kein 
Treiber auf der Leitung, sprich es sorgt niemand dafür dass ein 
bestimmter Pegel anliegt. Die Leitungen hängen "in der Luft" und machen 
was sie wollen, sind da also sehr empfindlich gegenüber kleinsten 
Störungen von außen. Kann unter Umständen sein dass es reicht mit der 
Hand über die Leitungen zu fahren und du empfängst Zeichen, da dein 
eigenes elektrisches Feld (Statik) reicht um auf der Leitung 
entsprechende Reaktionen hervorzurufen. Einfach mal ausprobieren, vorher 
glaubt mans nicht ;)

Pullups sorgen dafür, dass wenn beide auf Eingang geschaltet sind 
(hochohmig), der Bus auf einem stabilen high-Pegel(=idle Pegel der UART) 
ist. Kommt bei seriellen End-to-End Verbindungen wie du sie hast 
eigentlich selten vor, da bei solchen Verbindungen immer TxD mit RxD 
verbunden miteinander sind, und der TxD somit immer den Pegel vorgibt. 
Speziell bei Bussystemen, wo alle Teilnehmer wenn sie gerade nichts 
senden lesen, ist aber so eine Widerstandsschaltung zum festlegen der 
Buspegel wenn nix passiert unerlässlich.

von Mr. D (Gast)


Lesenswert?

Ich bin über die Leitungen mit der Hand gefahren wenn nichts gesendet 
wurde und es hat sich wirklich was getan.
Somit soll ich jetzt je einen 10k Widerstand an Tx und Rx gegen Vdd 
schalten?
Bei mir wird ständig gesendet.

von Thomas B. (nichtessbar)


Lesenswert?

Jo machts auf alle Fälle stabiler, es fließt halt mehr Strom dann wenn 
der Treiber auf 0 (GND) zieht (VDD / 10k). Eigentlich sollte bei den 
meisten Prozessoren der Treiber (TX) wenn aktiviert allerdings dafür 
sorgen dass die Leitungen a bisserl stabiler sind.

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.