Forum: Mikrocontroller und Digitale Elektronik Prozentrechnung mit Mikrocontroller


von Ronny Schulz (Gast)


Lesenswert?

Ich würde gerne mit einem ATtiny13 ein wenig mit Prozenten rumrechnen.
Grudsätzlich ist ja Prozentrechnung Multiplikation, die die AVRs
allerdings nicht unterstützen. Wie kann ich folgendes ideal
nachbilden:

Ich habe eine feste Basis von 100%, die den Wert 180 trägt. Dann habe
ich einen gemessenen Wert, der größer oder kleiner als 180 sein kann.
Als Beispiel ist der Wert nur 150 und liegt somit 20% unter dem Wert
von 180.

Aber wie bekomme ich diese Prozente mit dem AVR ausgrechnet und vor
allen möchte ich als Ergebnis dessen wieder ein anderes Register, was
meinetwegen 50 beinhaltet um 20% erhöhen oder erniedrigen, je nachdem,
was das Ergebnis oben ist.

Könnte mir da jemand gedanklich helfen?

von A.K. (Gast)


Lesenswert?

Jeder Prozessor kann multiplizieren und dividieren. Bei manchen ist das
im Befehlssatz schon drin, die übrigen machen es per Software.

von Markus K. (markus-)


Lesenswert?

Lösung 1: Nimm einen größeren AVR, die haben einen Multiplier.
Lösung 2: Multiplikation nachbilden:
http://www.avr-asm-tutorial.net/avr_de/rechnen/multiplikation.html

von Ronny Schulz (Gast)


Lesenswert?

Danke! So richtig bekomme ich das geistig noch immer nicht sortiert. Mir
ist das Grundprinzip klar. Aber wie ich das direkt umsetze noch nicht.
Vor allem weil ich ja nicht nur multipliziere. Im Prinzip sind meherre
Schritte nötig:

1. Von Wert 1 und 2 den prozentualen Unterschied ermitteln.
2. Den prozentualen Unterschied auf Wert 3 anwenden.

von Markus K. (markus-)


Lesenswert?

Ich gebe zu, ich hatte Deinen Text nur halb gelesen.

Lösung 1 erweitert: Nimm einen größeren AVR, der mehr Resourcen hat.
Damit kannst Du Dir nämlich den Einsatz einer Hochsprache erlauben und
kannst dort sowas in der Art schreiben:
Verhältnis = Wert / Basis

Lösung 2 erweitert:
Division findest Du hier:
http://www.avr-asm-tutorial.net/avr_de/rechnen/division.html

von unknown (Gast)


Lesenswert?

also auch wenn ich gerade schon ein paar glässchen wein hatte:
1. dezimale prozentrechnung üben...
wenn 180 deine basis ist, und du 150 davon erreicht hast, dann sind das
keine 20%. das sind genau 83,3% und liegt somit 16,7% unter dem wert
2.schreib dir mal auf wie du es von hand ausrechnen würdest. genau das
gleiche wirst du mit dem avr machen. also eine mul und eine div methode
und dann ab damit.
du wirst dir überlegen müssen ob 180 eine so geeignete basis ist. evtl
eher alles mit 5n multiplizieren um einer kommageschichte aus dem weg
zu gehen
also zB 5*180 =100%, 9=1%-> 5*150/9= 83Rest3
bei der addition:
50=100%, 50*(100+20)%/100%=60
wie im wirklichen leben auch ;)

von Freak5 (Gast)


Lesenswert?

Recht lustig. Zuerst habe ich von diesem Thread nichts verstanden, weil
ich oben Potenzrechnung gelesen habe. Ich habe mir so wie so schon
gefragt, wie man soetwas wie logarythmus und Potenzrechnung in ASM
macht. Wie geht das eigentlich?
In der Schule haben wir das noch nie gemacht. Dafür gab es immer einen
Taschenrechner.

von ??? (Gast)


Lesenswert?

Logarithmus geht zB mit ner Tabelle und ev. Interpolieren. Oder aber mit
Viel Multiplikation. ...also Laaangsam. Wobei mann dann sicher
optimieren kann. Da gibts ja zB. Algorithmen um ne DFT mit
Fixkommazahlen mit 2*Mul und etwas Schieben zu machen.

von mc.emi (Gast)


Lesenswert?

lösung 1 und 2 = dreisatz:

150 -> 180
50  -> x

x = 180*50/150

von mc.emi (Gast)


Lesenswert?

ähmm, meinte:

180 -> 150
50  -> x

ergo: x = 150*50/180 (das obere wäre umgekehrt proportional)

von Ronny Schulz (Gast)


Lesenswert?

Stimmt da hatte ich wohl einen Gedankenfehler bezüglich der 20%. :) Ich
glaube das lässt sich doch nicht so einfach realisieren, wie ich das
gerade sehe. Die Genauigkeit ist dann nicht unbedingtd as gelbe vom
Ei.

Der bessere AVR kommt ohnehin nicht in Frage, weil es gerade darum geht
so einen ollen popligen mit 8 Pin zu nehmen, wovon ich 6 Pin als I/O
benötige.

von Markus K. (markus-)


Lesenswert?

Es gibt ja aber AVRs mit mehr Speicher in diesem Gehäuse (leider nicht
mit Multiplizierer), z.B. ATTiny25/45/85. In Bascom braucht
floating-Point-Unterstützung ca. 1,5KB Speicher. Das ist zuviel für
einen Tiny13.

Außerdem solltest Du Dir Fixkommaarithmetik anschauen.

von sackgesicht (Gast)


Lesenswert?

> In der Schule haben wir das noch nie gemacht. Dafür gab es immer einen
Taschenrechner.

Dann ist das keine Schule, in die du gehst!

von Freak5 (Gast)


Lesenswert?

Naja ich glaube im Lehrbuch ist das auch nicht enthalten( meine ich
wenigstens ). Ich habe aber noch eine Formelsammlung von 1968 und eine
von ~1900. In denen sind jeweils Tabellen dafür enthalten.
Nur wie man diese Zahlen berechnen kann, weiß ich nicht.

von Freak5 (Gast)


Lesenswert?

P.S.: http://de.wikipedia.org/wiki/Logarithmus
Ich habe es mir einfach selbst herausgesucht. Dort steht ein Beispiel,
wie der Logarithmus errechnet werden kann.

von Marko (Gast)


Lesenswert?

geht bestimmt auf Gynasium,
dort wird dann integriert, differenziert etc.
aber was MwSt von 16 auf 18% bedeut ist
neblig ... (laut sw-rt) = weniger bezahlen für was auch immer
und wie auch immer ;o)

von Freak5 (Gast)


Lesenswert?

@Marko: Das hört sich an, als hättest du nicht integriert und
differenziert.
Außerdem bin ich mir sicher, dass jeder Mensch weiß, was 16% und 18%
genau sind. Zu unterstellen, dass Menschen auf dem Gymnasium dümmer
sind finde ich nicht gut.

von Marko (Gast)


Lesenswert?

hab ich auch mal, daher sprech ich
aus Erfahrung ;o)

von gerd (Gast)


Lesenswert?

Also, teilen durch 180 mag ich eigentlich gar nicht. Ich würde die Zahl
mit 36409 malnehmen ( = 65536 * 100 / 180) und dann die beiden letzten
Bytes wegstreichen. Dann ist das schon fertig. Fehler <0,00275%. Mir
täte es meistens reichen.
Wenn es dann noch eine Dezimalstelle sein darf: vor dem Abschneiden
zwei mal links schieben, sich selber addieren und das Ganze noch mal
linksschieben.
Wer das geschwindigkeits- und resourcenmäßig mit einer Hochsprache
toppt, kriegt einen Preis. Bis jetzt ist der auf meiner Webseite
ausgeschriebene Preis noch hängig.

Wozu braucht man in der Realität (nicht in der Schule!) eigentlich
Logarithmen? Wenn mir das jemand plausibel machen kann, schreibe ich
einen Algorithmus fuer achtbittige Zweierlogarithmen.

mfg
gerd

von Prost (Gast)


Lesenswert?

ihr seit ja alle besoffen !! LOL
65536 (16 bit = 2 Byte !?) streicht da mal die letzten byte weg?
wasn da noch übrig?

scheen a´md noch

von Ralf B. (Gast)


Lesenswert?

Zitat:
Also, teilen durch 180 mag ich eigentlich gar nicht. Ich würde die
Zahl
mit 36409 malnehmen ( = 65536 * 100 / 180) und dann die beiden letzten
Bytes wegstreichen. Dann ist das schon fertig. Fehler <0,00275%. Mir
täte es meistens reichen.

Der Tiny 13 unterstützt aber wie gesagt nunmal keine Hardware
Multiplikation / Division (wenn man mal von diversen Links / Rechts
Schiebeaktionen absieht).

Aber mal abgesehen davon stellen sich mir die folgenden Fragen:

1. Ist die besagte 180 nen Fixwert der sich nie ändert ?
2. Wie genau muss es denn sein ?
3. Wie schnell muss es sein ?
4. Wie erfolgt die Ausgabe.

Anschliessend könnte man sich Gedanken über eine sinnvolle Lösung
machen ....

Ach ja, ich bitte die Posts meines Vorgängers zu entschuldigen .. er
hatte wohl nen Glas Wein zuviel.


Grüße

Ralf B.

von Prost (Gast)


Lesenswert?

THX ?

von Zimmi (Gast)


Lesenswert?

Hiho,
armes Deutschland kann ich da nur sagen. Wo liegt eigentlich Pisa?
Nix fuer ungut...

von Alex Trusk (Gast)


Lesenswert?


von Christoph Kessler (Gast)


Lesenswert?

@gerd
Den Logarithmus braucht man immer, wenn man linear aufgenommene
Messwerte in einer Dezibel-Skala darstellen will. Geht das eigentlich
in Assembler schneller, wenn man den "ld" benutzt? Die Umrechnung in
den Zehnerlogarithmus ist ja nur eine Skalierung. In Wikipedia sind nur
der log10 und ln als Reihenentwicklung beschrieben.
Die Multiplikation mit 36409 scheint mir auch der einfachste Weg zu
sein, man kann doch mit Links-Schieben und passendem Aufaddieren
schnell mit einer Konstanten multiplizieren.

von Philipp Sªsse (Gast)


Lesenswert?

Zurück zur Frage (und einer Antwort, wie man so etwas locker in einem
tiny13 macht):

ich gehe mal mangels genauerer Vorgaben davon aus, daß der Meßwert in
einer-Schritten vorliegt und damit die Abweichung auf volle Prozent
gerundet werden darf (sonst Erweiterung für halbe Prozente selbst
ergänzen). Also:

1. Meßwert minus 180 rechnen. Falls negativ, das minus darstellen und
die Zahl negieren (beim Beispiel 150 kommt also -30 heraus, das Minus
wird hingemalt und wir rechnen mit 30 weiter)

2. Die Abweichung zwei mal nach links schieben und zu sich selbst
addieren, dann noch 4 dazu (beim Beispiel 120 + 30 + 4 = 154) [Falls
der Wertebereich von 130 bis 230 ausreicht, reicht sogar ein
8-Bit-Register an dieser Stelle]

3. In einer Schleife zählen, wie oft man vom Ergebnis 9 abziehen kann,
ohne daß die Zahl negativ wird (ist hier 17 mal der Fall. Als Ergebnis
kommt also -17% heraus. [Wenn das Ergebnis dezimal ausgegeben werden
soll, lohnt es sich, erst durch Abziehen von 90 die Zehnerstelle zu
bestimmen.]

4. Das Ergebnis von oben einmal nach rechts schieben (durch zwei
teilen) und zur 50 addieren/von dieser subtrahieren.


So einfach kann man es sich machen.

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.