mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register mal Kommawert


Autor: Uli (Gast)
Datum:

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

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sprache ??
Prozessor/Controller ??
Variablen Typ des Kommawertes ??
...????

Autor: Uli (Gast)
Datum:

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

Autor: BernhardT (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Uli (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: mikki merten (Gast)
Datum:

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

Autor: Uli (Gast)
Datum:

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

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.