Forum: Mikrocontroller und Digitale Elektronik Register mal Kommawert


von Uli (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

Sprache ??
Prozessor/Controller ??
Variablen Typ des Kommawertes ??
...????

von Uli (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Uli (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von thkais (Gast)


Lesenswert?

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.

von mikki merten (Gast)


Lesenswert?

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.

von Uli (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.