Forum: Compiler & IDEs UART - Senden


von Kiwi (Gast)


Angehängte Dateien:

Lesenswert?

Moin Leute!
Ich hab da ein kleines Problem beim Senden von Daten mit Hilfe der UART
bei einem ATmega8 - Controller. In diesem ganz einfachen BSP soll in
Anlehnung an das Tutorial einfach die BIN-Zahl 0b00000000 an den PC
gesendet werden. Im Anhang befindet sich das C-Program, indem auf
Tastendruck das Zeichen übersendet werden soll. Die Gesendeten Daten
werden mit HTerm empfangen. Leider erhalte ich immer wieder falsche
Zeichen (statt der binären 0b00000000 immer wieder 0b11111011 bzw.
0b11111010). Trotz langen durchsuchen der Foren und lesen des Tutorials
konnte ich nichts hilfreiches finden.

Über eine schnelle Hilfe würde ich mich freuen!

Was ich schon getan habe:
* int./ext. Clock mit FuseBit setzen/ansteuern
* Baudraten variiren

von Falk Willberg (Gast)


Lesenswert?

Das sieht fast invertiert aus. Wie kommst Du vom Controller zum
seriellen Port des PC?

von Kiwi (Gast)


Lesenswert?

Mit Hilfe eines MAX232 und eines Modem-Kabels, wie es ja auch im
Tutorial beschreiben wird. Tja.... invertiert ist es ja leider nicht,
daran hab ich auch schon gedacht.

Wenn noch jemand ne Idee hat immer her damit.... sitze hier schon fast
den ganzen Tag und zerbreche mir den Kopf. Bin für jede Hilfe und
Anregung dankbar!!!

von pebisoft (Gast)


Lesenswert?

winavr-c kennt kein biteingabe sondern nur hex.
wenn du dieses eingeben tust "0x00000000" also ein "x" statt ein
"b", meckert der compiler auch nicht und er setzt eine hexzahl.
dieses "b" wertet er auch als hexeingabe.
mfg pebisoft

von Kiwi (Gast)


Lesenswert?

Meines Wissens nach ist das vom Comiler bzw. im zweifelsfall von der
Version des verwendeten WinAVRs abhängig. Hab aber auch schon
verschiedene Eingabemöglichkeiten ausprobier (binär, dezimal, hex,
ASCII) aber nix führte zum Erfolg.

Mir würde es auch helfen, wenn jemand bestätigen könnte, dass der
Quellcode funktioniert. Somit wüsste ich, dass ich hier nicht mehr auf
Fehlersuche gehen muss.

von Andreas W. (Gast)


Lesenswert?

Probiers mal mit:
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

URSEL muss immer gesetzt sein wenn du in UCSRC schreiben willst. Sonst
schreibst du in UBRRH.

von Kiwi (Gast)


Lesenswert?

SUPER SACHE!!!!! Das war es! Vielen Dank!

Ich hatte das zwar im Datenblatt gelesen, ging aber immer davon aus,
dass wenn ich URSEL einmal setze es auch gesetzt bleibt. Und wenn ich
ehrlich bin, so sehe ich den Unterschied der beiden Codefragmente auch
nicht wirklich. Ich dachte immer, die von Andreas benutze schreibweise
wäre nur eine Kurzform von der meinigen. Könnte mich in dieser hinsicht
jemand vielleicht noch etwas mehr beleuchten????

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> URSEL muss immer gesetzt sein wenn du in UCSRC schreiben willst.
Sonst
> schreibst du in UBRRH.

Für die Standardversion "8n1" kann man sich es auch komplett sparen,
UCSRC anzufassen, die Voreinstellung ist just diese.

von Andreas W. (Gast)


Lesenswert?

Bei deiner Variante schreibst du ja nacheinander. Du musst aber bei
jedem schreiben in UCSRC auch URSEL setzen.

Gehen würde auch:
  UCSRC |= (1 << UCSZ1) | (1<<URSEL);
  UCSRC |= (1 << UCSZ0) | (1<<URSEL);

von Kiwi (Gast)


Lesenswert?

Aha! Das muss ich mir dann jetzt mal merken. Danke! Ihr habt mir sehr
gut weitergeholfen.

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.