Forum: Mikrocontroller und Digitale Elektronik Problem mit Multiplikation


von Henning (Gast)


Lesenswert?

hi! also ich lese mit nem atmega16 (programmiert per bascom ;) ) einen
ad wandler kanal aus und muss diesen um einen sinnigen wert auf einem
lcd display darzustellen ja umrechnen.

der a/d wandler wert liegt ja als binärwert vor?!
und ich brauche es halt als normalen zahlenwert mit entsprechendem
umrechnungfaktor (wegen ad eben usw.)
der umrechnungsfaktor wäre ->   * 0.48828125

habe folgende codeschnippsel ausgetestet...

nr 1#
endwert = getadc(0) * 0.48828125

nr #2
binarwert = Getadc(0)
endwert = Binval(binarwert) * 0.48828125

und denn eben -> Lcd "Wert: " ; endwert

aber er zeigt mir immer 0 :(
der wert vom direkt auf das lcd gelegten binärwert ist 25, also sollte
die rechnung irgendwas um 12,20703125 bringen. oder so =D

von Philipp B. (philipp_burch)


Lesenswert?

Hi,

auf welchen Bereich willst du den ADC denn skalieren? Wenn es z.B.
0-100% sein sollen, dann ist das ja im Grunde eine Division durch 1024
und anschliessende Multiplikation mit 100. So wird das aber relativ
schwierig, daher solltest du die Sache umdrehen: Erst mit 100
multiplizieren (mul-Befehl) und dann durch 1024 dividieren, was
eigentlich dem entspricht, einfach das unterste Byte wegzulassen und
den Rest um zwei Bits nach rechts zu schieben (lsr, bzw. ror).

von Egon (Gast)


Lesenswert?

'endwert' ist vermutlich int16, und der Multiplikator wird als 0
interpretiert, sodass das Ergebnis auch 0 ist.
Wenn Du 'float' rechnen willst, mußt Du dies dem Compiler mitteilen:
cast verwenden.

von Profi (Gast)


Lesenswert?

Henning verwendet Bascom, kann man damit auch casten?

Am besten, Du verwendest FixedPoint-Arithmetik.
D.h. du multiplizierst den ADC-Wert 25 mit 48828125 -> 1220703125
und schmuggelst auf dem Display nach 12 ein Komma rein: 12,20703125

Bei geringerer Genauigkeit, dafür Integer und schneller:
25*488=12200   -> 12,200

siehe Threads Rechnen mit AVR
http://www.mikrocontroller.net/forum/read-1-343046.html
und Multiplikation
http://www.mikrocontroller.net/forum/read-1-288423.html

Hättest Du mir der Suche auch leicht selbst finden können.

von Egon (Gast)


Lesenswert?

Henning spielt Bass in einer Combo ?
In Basic gibt es doch auch Unterschiede in den Variablen, weiß nur
nicht mehr, wie die heißen.

von Bernd Schmidt (Gast)


Lesenswert?

probier mal

dim f as single
f = GetAdc(0)
f = f* 0.44444

usw

Bascom castet nicht richtig automatisch. Leider gibt es auch keine
Warnmeldung.

von Henning (Gast)


Lesenswert?

hallo bernd, das geht schonmal net... dann kommt "source variable does
not matsch target variable"

@profi: danke für die links, werde mich mal versuchen aber irgendwie
will der avr mal wieder net so wie ich das will... :(

von Henning (Gast)


Lesenswert?

also ich weiss nicht warum aber irgendwie bringt die multiplikation mit
488 einen wert von -321.
versteh nur ich das nicht??

von Profi (Gast)


Lesenswert?

ich kenn zwar bascom überhaupt nicht, aber versuche:
dim a,b,c as "unsigned 16 bit" <-- weiß nicht, wie das in Bascom
heißt
a=25
b=488
c=a*b
print a,b,c

Ergebnis sollte 25 488 12200 sein

Dann würde ich c in ein String umwandeln, die ersten beiden Buchstaben
des Strings (12), dann ein Komma und die letzten drei Buchstaben des
Strings (200) ausgeben.

Wenn das mal klappt, können wir überlegen, ob und wie man die letzte
Umwandlung in maschinennahen Befehlen oder Assembler hinkriegen kann
(wenn's zeitkritisch ist).

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.