Hallo Ich möchte einen Registerwert(8Bit) mit einer Kommazahl (z.B. 1,8) multiplizieren. erstens: ist dies überhaupt möglich, da gerundet werden müßte, weil in den Registern nur geradzahlige werte stehen? zweitens: wenn ja, wie liese sich dies dann verwirklichen? Danke schon mal Uli
Sprache ?? Prozessor/Controller ?? Variablen Typ des Kommawertes ?? ...????
also programmiere in assembler und verwende eine Atmel 4433 hatte mir so etwas vorgestellt: ADD Rd, Rr*1,8 leider weiß ich nicht was der assembler draus macht und ob es überhaubt geht
Kommazahlen sind recht aufwendig zu berechnen. Beispile zum Rechnen in asm gibt es bei Atmel aber auch mit der Suchfunktion. Floatinpoint (Fließkomma) Berechnungen sind recht aufwendig. Man kann allerdings unter umständen auch Fixpoint verwenden. Hab ich auch in C schon gemacht, weil Float eine Menge Programmcode und Rechenzeit braucht. Im grund multiplizierst du dan mit 18 anstelle von 1,8 und must anschließend das Komma selber setzen. Wenn du den Wertebereich entsprechend eingrenzen kannst, ist das eine Erleichterung. Ich würde aber für Kommazahlberechnung einfach eine Sprache wie C, Pascal oder im schlimmsten Fall Basic verwenden. Gruß Bernhard
Man kann in Assembler aber wunderbar mit gebrochenen Zahlen rechnen, d.h. Du rechnest einfach: X * 18 / 10. Aber dann solltest Du Dich erstmal mit Arithmetik >8 Bit beschäftigen, da bei größeren Rechnungen 8 Bit selten ausreichen. Ich rechne meistens mit 32 Bit, da der AVR ja schnell genug ist. Für meinen Frequenzmesser habe ich auch mal mit 56 Bit rechnen müssen, um den gesamten Frequenzbereich 50mHz...125MHz erfassen zu können. Das Rechnen im MC funktioniert ganz genau so, wie die schriftliche Addition, Multiplikation usw., wie man es in der Schule gelernt hat. Aber Du findest auch schon haufenweise fertigen Code im Web. Erst wenn man das Rechnen verstanden hat, macht die MC-Programmierung auch so richtig Spaß. Peter
Danke erst einmal, der grund für diese frage ist eigentlich folgender. Ich möchte eine Lampendimmung erzeugen. Ausgangsituation ist folgende. ich bekomme be jedem nulldurchgang der Netzphase einen Interupt (Int0). und ich habe im RAM 6 Werte(8Bit;0....255) für 6 Lampen gespeichert. Damit die lampe strom bekommt wird ein Triac mit vorgeschaltetem Optokoppler gezündet. Da der Triac ja einmal gezündet erst beim nächsten Nulldurchgang wieder sperrt muß bei einer dimmung die Einschaltzeit variieren. Bei 50Hz ist eine halbwelle 10ms. Lampe 100% an = 8Bit wert 255 usw. d.h. 10ms / 255 Werte = 39µs wenn ich jetzt aber den timer mit 256 vorteile erhalte ich einen Takt alle 32µs und um dies auszugleichen brauch ich eine multiplikative konstante von 1,22 Falls jetzt eine ganz andere bzw. einfacher Lösung zu diesem problem auftaucht bitte ich diese mir mitzuteilen Uli
Hallo Uli, Eine Lösung für das Problem mit 1.22 lautet: index: 0 1 2 3 4 5 6 7 val: 1 2 5 10 20 39 78 156 Diese Zahlenfolge stellt ein Zahlensystem dar. Die Eigenschaft jeder Zahl ist, daß sie größer als die Summe jeder vorangegangen Zahlen ist. Die Gesamtsumme beträgt 311 = 255*1.2 Um jetzt deinen 8-Bit Wert mit 1.2 zu multiplizieren, gehst Du folgendermaßen vor: Pseudocode: Summe = 0; für (i = 0 und i < 10) { Wenn Bit i im Wert gesetzt, dann Sume = Summe + val[i]; i = i+1 } Das ganze muss man dann noch in Assembler implementieren. Sollte nicht so schwer sein. Grüße Oliver
Ich würde schlichtweg die Anzahl der möglichen Helligkeitsstufen so wählen, daß ich einen geraden Wert herausbekomme. Ob es nun 255 oder 248 Helligkeitsstufen sind, merkt niemand.
Ich vermute mal du erwartest bei 8 Bit eingangswerten 0-255 eine lineare Änderungen der Helligkeit. Da weder Netzspannung (Sinus) noch die Helligkeitskennlie des Leuchtmittels linear sind, wirst du um den Einsatz einer LookUp-Tabelle nicht herumkommen. Ob diese nun 256 Werte zu 8 oder 16 Bit enthält ist von der erwünschten Genauigkeit abhängig.
Danke mikki für deine Idee, ja ich möchte eine lineare Änderung der Helligkeit. Wie meist du da smit einer LookUp Tabelle. Habe noch nie damit gearbeitet. Wie meinst du ist deine Idee dann umzusetzten? Uli
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.