Forum: Mikrocontroller und Digitale Elektronik Dezimalausgabe über UART an Terminal


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo,

ich möchte über UDR den Dezimal - bzw. Hexwert an das Terminal ausgeben.

Was ist zu tun, damit der Inhalt des Registers "dezimal" als Dezimalzahl 
und auch als HEXWERT auf dem Terminal dargerstellt werden.

Momentan wird der Inhalt der Registers "dezimal" als "X" dargestellt.

loop:
ldi   dezimal,88        ; ascii "X"
rcall   outdezimal

ldi     zeichen, '6'        ; Zahl 6
rcall   outzeichen

rjmp  loop

outdezimal:
  sbis    UCSRA,UDRE
  rjmp    outdezimal
     out     UDR,dezimal
  ret

outzeichen:
      sbis    UCSRA,UDRE
     rjmp    outzeichen
      out     UDR, zeichen
  ret

Danke für jede Hilfe!

Udo

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Ich kann leider kein AVR Assembler, aber auf PICs ist es auch nicht viel 
anders.

Du musst zuerst das Byte umrechnen in drei einzelne Bytes. Jeweils eins 
für die 100er, 10er und Einer Stelle. Das machst du über eine Routine, 
in welcher du zuerst immer 100 subtrahierst und du dir die Anzahl der 
Durchläufe merkst bis es einen Überlauf gibt. Danach mit dem Rest das 
selbe für die 10er. Die Einer bleiben übrig. Wenn du dann die drei Bytes 
hast, addierst du zu jedem Byte Hex 30 dazu (oder dez. 48) um die binäre 
Zahl in ein ASCII Zeichen zu wandeln. Nun kannst du die drei ASCII 
Zeichen senden und es sollte der richtige Wert am Terminal ankommen.

Sven

von Der M. (steinadler)


Lesenswert?

Für die Hexadezimal-Ausgabe:

Als erstes baust du dir eine Funktion, die eine Zahl (0-15) als Hex 
ausgibt. Also wenn kleiner 10, dann '0' dazuaddieren, ansonsten ein 'A' 
dazuaddieren.

Für den Hex-Wert nimmst du das obere Nibble deines Wertes und schiebst 
das Ergebnis 4 Stellen nach rechts. Diesen Wert gibst du dann aus.
Anschließend machst du dasselbe nochmal mit dem unteren Nibble.

Für Dezimal:

Zähler = 0;
Wert >= 100 ? Wert-100; Zähler+1; Zeile wiederholen;
Zähler ausgeben;
Zähler rücksetzen;
Wert >= 10 ? Wert-10; Zähler+1; Zeile wiederholen;
Zähler ausgeben;
Zähler rücksetzen;
Wert >= 0 ? Wert-1; Zähler+1; Zeile wiederholen;
Zähler ausgeben;

von Peter D. (peda)


Lesenswert?


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo Sven, Micha und Peter,

ihr kennt Euch wohl gut aus. Danke für Eure Antwort.

Habe noch eine abschließende Frage:

Ich schreibe zurzeit Software-PWM mit 8 Kanälen. Möchte gerne die 
Inhalte aller Register überprüfen, ob die auch sauber incrementiert bzw. 
decrementiert werden. Das passiert ca. 2 mal pro Sekunde.

Der Zusammenhang zwischen Registerinhalt und Terminalprogramm ist mir 
nicht ganz klar.

Das Terminalprogramm übernimmt aus UDR zunächst den binären Wert und 
rechnet intern auf Ascii um und stellt dieses Zeichen auf dem Bildschirm 
dar oder?

Und jetzt verliere ich den Faden:

Der binäre Wert wird mit BCD32b.asm in 4 Bytes  zunächst als  ascii in 
r17,r18,r19,r20 abgelegt. Dann wird dieser ascii-wert dem 
Terminalprogramm vorgelegt - als Zeichenkette? -, dass diese Werte 
klaglos bearbeitet und dann das Ergebnis auf dem Monitor ausgibt. Quasi 
macht er eine "ascii-ascii" Wandlung oder?

Er wandelt er einen "vermeintlichen Binärwert" in einen Asciiwert um.

Stimmt das so oder verwechsel ich Birnen mit Äpfeln?

Habt ihr einen Link, der mir diesen Vorgang "UDR-Terminal" genauer 
erklärt?

Udo

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Klingt etwas chaotisch deine Gedankengänge...

Ein Terminalprogramm auf dem PC zeigt dir nur ASCII-Zeichen an, welche 
es empfängt. Und es sendet auch nur ASCII Zeichen. Wenn du also willst, 
dass auf deinem PC Bildschirm ein 'A' angezeigt wird, dann muss dein µC 
eine dezimale 65 oder eine hexadezimale 0x41 oder eben ein Zeichen 'A' 
senden, damit auf deinem PC dieses 'A' angezeigt wird. Das 
Terminalprogramm rechnet da nichts um. Es zeigt dir einfach nur das an, 
was du sendest. Wenn du das dezimale Äquivalent eines Bytes zum 
PC-Terminalprogramm senden willst, dann musst du das Byte in seine drei 
dezimalen Stellen zerlegen  (000-255) und die Werte in ASCII umrechnen. 
Dann sendest du die drei Bytes zum Terminalprogramm und dort werden sie 
dann einfach nur noch angezeigt.

Eine Umrechnung in HEX erfolgt genau so. Du zerlegst das Byte in zwei 
Halbbyte und rechnest die Zahlenwerte der beiden Halbbytes (00-15) um in 
die entsprechenden ASCII-Zeichen ('0' -'F'). Achte bitte auf meine 
Schreibweise. Ich schreibe Zeichen bewusst in Hochkomma, weil dies 
ausdrückt das ein ASCII -Zeichen gemeint ist und nicht eine Dezimalzahl 
oder eine Hexadezimalzahl.

Aslo, wie gesagt ein PC-Terminalprogramm rechnet nichts um. Es zeigt 
einfach nur die ASCII Zeichen an, welche der µC sendet. Sendest du 
Steuerzeichen dann kommt oft Müll an oder es piept der PC Lautsprecher 
wenn du z.Bsp eine dezimale 7 sendest. Schau dir die ASCII Tabelle an, 
dann wird es eventuell klarer.

Sven

von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Danke Sven, das hilft mir weiter!

Udo

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.