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
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
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;
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.