USART ATmega8515L

Gast #362310
Lesenswert?
• ▲
▼
Hallo,

wir haben folgendes Problem mit dem Senden von Daten vom o.g.
Controller auf einem STK500 an den PC (wir sind noch Anfänger in der
Thematik).

Wir gehen mal davon aus, daß alles richtig angeschlossen und richtig
gesteckt ist; es kommen ja teilweise Daten an, halt nur nie die
richtigen.

Zum ersten Testen haben wir nur eine printf-Anweisung in eine
Endlosschleife geschrieben und übers Terminal beobachtet, welches
Zeichen ankommt; es kamen zwar immer irgendwelche Hex-Zahlen, aber nie
die, die dem ASCII-Code der gesendeten Zeichen entsprochen haben.

Dann aus dem Handbuch einfach folgende zwei Zeilen rauskopiert:
while ( !( UCSRA & (1<<UDRE)) );
UDR = 'x';
aber dann kommt vom Compiler (CodeVision AVR) ständig die Meldung
"undefined symbol UDRE". Die zugehörigen Header-Dateien mega8515.h,
stdio und io.h sind eingebunden. Ebenso steht im compilierten asm-file
(wenn die fehlerhafte Zeile auskommentiert ist), als eine der ersten
Zeilen ".EQU UDRE=0x5", also sollte das Bit UDRE doch bekannt
sein...

Da wir in einigen Tutorials, Büchern und Google bislang erfolglos
nachgelesen/-gesucht haben, nun die Frage, was wir tun müssen, um
irgendein Zeichen korrekt angezeigt zu bekommen?
Gast #362312
Lesenswert?
• ▲
▼
Zumindest kommt nun die Fehlermeldung des Compilers nicht mehr.
Im Header-File stand nur "#define USART_UDRE 11", also wenn man UDRE
durch USART_UDRE ersetzt, funktioniert es ebenfalls; nun ist noch die
Frage, welches von den beiden richtig ist?

Allerdings haben wir jetzt auch wieder dasselbe Problem wie mit der
printf-Anweisung: im Terminal wird was angezeigt, aber nie das, was wir
erwarten. Wenn man im Terminal disconnected und anschließend wieder neu
verbindet, dann erscheint häufig eine andere Hex-Zahl, die wie gesagt
für uns in keiner offensichtlichen Verbindung zum gesendeten Zeichen
steht. Und wenn man dann im Terminal von CodeVision von hexadezimal auf
ASCII-Modus umschaltet, erscheint gar nichts mehr...
Gast #362314
Lesenswert?
• ▲
▼
Wir gehen davon aus...
Taktrate sind 4 MHz, für 9600 baud muss der Teiler ja 25 betragen und
das steht auch bei uns in UBRR

UCSRA=0x00;
UCSRB=0x18; // 0001 1000
UCSRC=0x86; // 1000 0110
UBRRH=0x00;
UBRRL=0x19; // 0001 1001
Gast #362320
Lesenswert?
• ▲
▼
Zur Erläuterung:
UCSRA ist am Anfang 0, d.h. "!(UCSRA)" ergibt 1 (logische Negierung),
also 0b00000001. "(1 << UDRE)" ist 0b00100000, also ergibt "!(UCSRA)
& (1 << UDRE)" immer 0. Die while-Schleife wird also nie ausgeführt,
solange UCSRA 0 ist.

Was so ne verrutschte Klammer doch alles bewirken kann...
Gast #362321
Lesenswert?
• ▲
▼
Ja vielen Dank, jetzt funktioniert's, die letzten 3 Beiträge waren dann
ausschlaggebend!! :)

Natürlich war die Klammer falsch, aber selbst nachdem wir das geändert
haben, hat es immer noch nicht funktioniert... Mit ner Taktrate von
3,6864 MHz funktioniert nun aber alles bestens!

Antwort schreiben

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.

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.