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?
Jeder Prozessor kann multiplizieren und dividieren. Bei manchen ist das im Befehlssatz schon drin, die übrigen machen es per Software.
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
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.
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
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 ;)
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.
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.
lösung 1 und 2 = dreisatz: 150 -> 180 50 -> x x = 180*50/150
ähmm, meinte: 180 -> 150 50 -> x ergo: x = 150*50/180 (das obere wäre umgekehrt proportional)
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.
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.
> 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!
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.
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.
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)
@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.
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
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
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.
Hiho, armes Deutschland kann ich da nur sagen. Wo liegt eigentlich Pisa? Nix fuer ungut...
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.