www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Prozentrechnung mit Mikrocontroller


Autor: Ronny Schulz (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Markus K. (markus-)
Datum:

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

Autor: Ronny Schulz (Gast)
Datum:

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

Autor: Markus K. (markus-)
Datum:

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

Autor: unknown (Gast)
Datum:

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

Autor: Freak5 (Gast)
Datum:

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

Autor: ??? (Gast)
Datum:

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

Autor: mc.emi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lösung 1 und 2 = dreisatz:

150 -> 180
50  -> x

x = 180*50/150

Autor: mc.emi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähmm, meinte:

180 -> 150
50  -> x

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

Autor: Ronny Schulz (Gast)
Datum:

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

Autor: Markus K. (markus-)
Datum:

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

Autor: sackgesicht (Gast)
Datum:

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

Autor: Freak5 (Gast)
Datum:

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

Autor: Freak5 (Gast)
Datum:

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

Autor: Marko (Gast)
Datum:

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

Autor: Freak5 (Gast)
Datum:

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

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ich auch mal, daher sprech ich
aus Erfahrung ;o)

Autor: gerd (Gast)
Datum:

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

Autor: Prost (Gast)
Datum:

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

Autor: Ralf B. (Gast)
Datum:

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

Autor: Prost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
THX ?

Autor: Zimmi (Gast)
Datum:

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

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christoph Kessler (Gast)
Datum:

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

Autor: Philipp Sªsse (Gast)
Datum:

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

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.