mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Multiplikation


Autor: Henning (Gast)
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

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

Autor: Egon (Gast)
Datum:

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

Autor: Profi (Gast)
Datum:

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

Autor: Egon (Gast)
Datum:

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

Autor: Bernd Schmidt (Gast)
Datum:

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

Autor: Henning (Gast)
Datum:

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

Autor: Henning (Gast)
Datum:

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

Autor: Profi (Gast)
Datum:

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

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.