www.mikrocontroller.net

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


Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Sven, das hilft mir weiter!

Udo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.