www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Exponentialfunktion auf Atmega8535 sinnvoll?


Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,
Ich möchte Werte auf 6-Stellige 7 Segment displays ausgeben.
Bisher habe ich das ganze nur für Dezimal gemacht und anstatt einer 
schleife einfach nach einander 100000, 10000, 1000, 100, und 10 
abgezogen.
Da jetzt aber die noch Möglichkeit bestehen soll, die Basis zu wählen, 
(also hauptsächlich decimal oder hex, evtl oktal), dachte ich an eine 
schleife.
Ich würde also den Int-Wert in die einzelnen Ziffern zerlegen, indem ich 
vom Wert so lange (Basis exp(stelle)) abziehe bis die Zahl kleiner wird, 
dann kommt die nächste Ziffer dran.
Alternativ könnte ich drei if/else-Zweige machen und für die jeweilige 
Basis die Ziffern nach einander "Hard Coded" ermitteln.
Da der Controller noch ne Menge aderes zu tun hat frage ich mich, wie 
lange eine exp() ausführung dauert (denke das wird auch eine schleife 
sein oder?) oder ob ich bei der geringen Anwendungszahl lieber die drei 
Zweige nehme...kann man das so pauschal beantworten?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht auch einfacher, wenn du die Basis kennst kannst du einfach 
fortlaufend Multiplizieren:
x = basis
for i = 1 to 6
 Bestimme Stelle i mit x
 x = x * basis
end for
Ansosnten hängt das ganze auch davon ab ob der AVR ne HW Multiplizierer 
hat.

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry könntest Du den Codeschnipsel kurz erläutern? Ich steige grad gar 
nicht durch was da passieren soll bzw wo ich da die einzelnen Stellen 
rausbekomme. Ich schreibe übrigens in C.
Habe auch grade im Datenblatt nachgeschaut, der AVR hat diverse 
Multiplikations-Instructions im Arithmetik-Bereich, alle brauchen 2 
Clocks.

Edit: Habe grade gemerkt daß "Exponentialfunktion" der falsche Ausdruck 
ist für das was ich will.
Ich brauche dazu doch eher den math.h befehl pow(). Aber auch der wird 
wohl eine schleife von multiplikationen sein nehmen ich an...

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das jetzt erstmal so gelöst
for(i=5;i>=0;i--)
{
  int power = pow(base, i);//vergleichswert bilden (basis^i)
  dig = 0;       //dig zurücksetzen
  while(x > power)     //solange x größer ist als vergleichswert
  {
    x-= power;       //vergleichswert abziehen
    dig++;       //digit hochzählen
  }
  figure[i] = code[dig]     //stelle codiert abspeichern
}

In code[] stehen die binärcodes für die 7Seg zeichen von 0-F plus blanc 
und dec-point.
Der Variablen-name "power" passt mir noch nicht, wie nennt man denn 
sowas?
Für i brauche ich jetzt ein signed char, damit nach 0 die -1 kommt die 
dann kleiner ist als 0 und er die scleife abbricht, richtig?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phillip Hommel schrieb:
> Habe das jetzt erstmal so gelöst

pow ist eine ziemlich teure Funktion, die du nicht benutzen solltest, 
wenn du nicht musst.

Schau dir einfach mal die Datentypen dafür an. pow muss auch mit 
Gleitkommazahlen klarkommen.

zb. muss
   pow( 2.0, 0.5 );
die Wurzel berechnen aus 2.0 berechnen.

Das Ganze läuft daher über Logarithmen.

   a hoch b <==>  e hoch ( ln (a) * ln (b) )

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  digitFaktor = 1;
  for( i = 0; i < 6; ++i )
    digitFaktor *= base;

  for( i = 5; i >= 0; i-- )
  {
    dig = 0;       //dig zurücksetzen
    while( x > digitfaktor )
    {
      x -= digitFaktor; // vergleichswert abziehen
      dig++;            //digit hochzählen
    }
    digitFaktor /= base;

    figure[i] = code[dig]     //stelle codiert abspeichern
  }

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, Danke mal wieder für die Lösungen. Daß pow so viel Arbeitet hatte 
ich befürchtet, das mit dem digitfaktor macht ja dann das, was ich 
hinter pow erhofft hatte. Merci.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phillip Hommel schrieb:
> Sorry könntest Du den Codeschnipsel kurz erläutern? Ich steige grad gar
> nicht durch was da passieren soll bzw wo ich da die einzelnen Stellen
Karl heinz war schneller ;)

> Edit: Habe grade gemerkt daß "Exponentialfunktion" der falsche Ausdruck
Hab ich jezt mal stillschweigend eine Textersetzung gedanklich 
durchgeführt ;)

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist auch noch aufgefallen daß ich die Schleife
for( i = 5; i > 0; i-- ) //<-- Hier das >= zu > geändert
  {
    dig = 0;       //dig zurücksetzen
    while( x > digitfaktor )
    {
      x -= digitFaktor; // vergleichswert abziehen
      dig++;            //digit hochzählen
    }
    digitFaktor /= base;

    figure[i] = code[dig]     //stelle codiert abspeichern
  }


Nur bis Stelle 1 laufen lassen muß. Das was überbleibt sind ja schon die 
"Einer" (basis^0).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi .. schrieb:
> Phillip Hommel schrieb:
>> Sorry könntest Du den Codeschnipsel kurz erläutern? Ich steige grad gar
>> nicht durch was da passieren soll bzw wo ich da die einzelnen Stellen
> Karl heinz war schneller ;)

Aber ich glaube ich hab einen Fehler eingebaut

Das muss heißen
  digitFaktor = 1;
  for( i = 0; i < 5; ++i )
    digitFaktor *= base;

Also um 1 weniger als Stellen vorhanden sind.
Denn der unterste Stellenwertfaktor ist ja 1

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, der kleinste Wert ist ja Basis^0 und der wird ja vorher schon 
gesetzt.
Konnte es noch nicht testen da ich kein 7seg Hier habe aber werde mir 
morgen die einzelnen ziffern mal ausgeben lassen.
Das Programm schnurrt schon schön vor sich hin...

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.