PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe von Double Zahlen



moin
04.01.2006, 19:05
Hallo,
wie kann ich "Double" Zahlen mit print über uart ausgeben?
Die Ausgabe mit print funktioniert soweit. Nur bei Double Zahlen erhalte ich Unsinn.
Vielen Dank schonmal für die Hilfe.

Euer moin

PS.: Ich arbeite mit einem ATMEGA8 und der aktuellen Bascom-Version.

x-ryder
04.01.2006, 19:07
was meinst du denn mit doubles? single-typ? weil es doubles nich gibt in bascom, oder ist das neuerdings implementiert?

oe9vfj
04.01.2006, 21:44
Double ist seit über einem halben Jahr implementiert mitsamt allen trigonometrischen Funktionen.
Die Probleme mit der Ausgabe können an einem zu niedrigen Softstack oder FrameSize liegen.
Für die Umwandlung von Binary in ASCII müssen einige Daten auf diese Stacks gelegt werden.
Probier mal diese Werte zu erhöhen.

x-ryder
04.01.2006, 23:02
ihr meint mit double doch warscheinlich single oder? die trigonos hab ich nämlich schon längst drinne, welche version von bascom habt ihr denn?

Vitis
05.01.2006, 00:23
per fusing in string,
dann string ausgeben ... so würds ich machen
wenns direkt aufs terminal muss.
ansonsten zerlegen in byte, dann übertragen,
in der zielanwendung die bytes wieder zusammensetzen
und in singel zurück.

Rage_Empire
05.01.2006, 08:14
ich muß josef zustimmen. Bascom kann auch double verarbeiten, funktioniert glaub ich mit ner externen ASM-Routine, auf die Bascom zurückgreift.

moin
05.01.2006, 10:22
Ich habe das angehänge mit Double Zahlen ausprobiert. Es funktioniert perfekt :-)
Man muß nur den Stack und drastisch erhöhen - sonst rechnet er falsch ;-(( (Beispiel Ausgabe der Zahl 10 )
Der Nachteile ist, dass beim einem ATMEGA8 das Flash zu 47% mit diesem kleinen Programm ausgefüllt wird.

Hier das Programm:
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 1000000 '1000000
Dim A As Double , C As Double , X As Double , Y As Double , Z As Double
A = 1
C = 10
Y = 1000
X = 2000
Z = 10000

Print A
Print C
Print Y
Print X
Print Z
A = 1000
C = A / 3
Print C

A = 10
C = 0.3
Y = C * A
X = A / Y
Print A
Print C
Print X

X = Tan(x)
Print X

End



Hier die Antwort des Terminalprogramms:
1
10
1E3
2E3
10E3
333.333333333333
10
300E-3
3.33333333333333
194.1255059836E-3

oe9vfj
05.01.2006, 14:51
Die Routinen für DOUBLE-Berechnung sind keine triviale Angelegenheit. Da kommen schnell einige KB FLASH zusammen. Die Implementation von DOUBLE ist auch nicht auf vielen Compilern für die ATMEL-AVR zu finden.

Die Routinen sind, wie Rage_Empire schon gesagt hat in den Library DOUBLE.LBX und die trigonometrischen Funktionen in DOUBLE_TRIG.LBX enthalten.

Sofern die Genauigkeit von SINGLE genügt, kann man mit SINGLE anstatt DOUBLE einiges an FLASH und RAM sparen.

Rage_Empire
05.01.2006, 15:19
Aslo ich konnte bis jetzt noch alles in Singles überwältigen....von PID-Regler bis zu Frequenzberechnungen. Dabei ist das Ergebnis erstaunlich genau.
Was man ebenfalls bedenken sollte ist die Rechenzeit, die bei Singles und Doubbles drastisch erhöt wird. Denn von nix kommt nix.