PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : variable umwandeln



franzl
26.08.2006, 16:54
hallo,
ich würde gerne meinen wert vom analogeingang messen und per rs232 an den pc senden leider weiß ich nicht wie ich den binären code in einen ascII code umwandeln soll das ist doch notwendig oder.
mfg franzl

teslanikola
26.08.2006, 17:29
die Umwandlung ist notwendig, sonst bekommste aum RS232 nur die Binärwerte, und das ist eher ned gut.

Die umwnadlung von Binär in ASCII ist eigentlich recht simpel, du musst deine Binärrzahl erst in eine BCD zahl verwandeln, und dann diese in eine ASCII:



;
; Bin2ToAsc
; =========
; wandelt eine 16-Bit-Binärzahl in eine fünfstellige ASCII-
; kodierte Dezimalzahl um, Zeiger zeigt auf die erste signi-
; fikante Ziffer der Zahl, und gibt Anzahl der Ziffern zu-
; rück
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf Anfang
; der Zahl (5 Stellen erforderlich, auch bei kleineren Zah-
; len!)
; Rückkehr: Z zeigt auf erste signifikante Ziffer der ASCII-
; kodierten Zahl, rBin2L enthält Länge der Zahl (1..5)
; Benutzte Register: rBin1H:L (bleibt erhalten), rBin2H:L
; (wird überschrieben), rmp
; Aufgerufene Unterroutinen: Bin2ToBcd5, Bin2ToAsc5
;
Bin2ToAsc:
rcall Bin2ToAsc5 ; Wandle Binärzahl in ASCII
ldi rmp,6 ; Zähler auf 6
mov rBin2L,rmp
Bin2ToAsca:
dec rBin2L ; verringere Zähler
ld rmp,z+ ; Lese Zeichen und erhöhe Zeiger
cpi rmp,' ' ; war Leerzeichen?
breq Bin2ToAsca ; Nein, war nicht
sbiw ZL,1 ; ein Zeichen rückwärts
ret ; fertig

;
; Bin2ToBcd5
; ==========
; wandelt 16-Bit-Binärzahl in 5-stellige BCD-Zahl um
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf die
; erste Stelle der BCD-kodierten Resultats
; Stellen: Die BCD-Zahl hat exakt 5 gültige Stellen.
; Rückkehr: Z zeigt auf die höchste BCD-Stelle
; Benötigte Register: rBin1H:L (wird erhalten), rBin2H:L
; (wird nicht wieder hergestellt), rmp
; Aufgerufene Unterroutinen: Bin2ToDigit
;
Bin2ToBcd5:
push rBin1H ; Rette Inhalt der Register rBin1H:L
push rBin1L
ldi rmp,HIGH(10000) ; Lade 10.000 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(10000)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen
ldi rmp,HIGH(1000) ; Lade 1.000 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(1000)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 4.Stelle durch Abziehen
ldi rmp,HIGH(100) ; Lade 100 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(100)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 3.Stelle durch Abziehen
ldi rmp,HIGH(10) ; Lade 10 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(10)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 2.Stelle durch Abziehen
st z,rBin1L ; Rest sind Einer
sbiw ZL,4 ; Setze Zeiger Z auf 5.Stelle (erste Ziffer)
pop rBin1L ; Stelle den Originalwert wieder her
pop rBin1H
ret ; und kehre zurück