PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7-Segment-Stellen berechnen



Powell
30.05.2011, 19:01
Hallo zusammen,

bin gerade an einem Programm für eine 5-Stellige 7-Segmentanzeige.

Ich frage mich nun wie man das am effektivsten in Code umsetzen kann. Und zwar sieht das folgendermaßen aus:

Der Wertebereich liegt zwischen 0 und 99999. Mein Controller kennt 5 Variablen von 0-9 die für die jeweilige Stelle stehen, es gilt nun diese 0 - 99999 in die entsprechenden Zehnerstellen aufzusplitten und an die Variablen zu übergeben.
Man könnte zwar 10 If schleifen pro stelle nehmen um jede Stelle einzeln zu ermitteln, allerdings ist mein Speicher dann ruck zuck voll.

Gibt es denn nicht da irgendeinen weg über Bitoperationen die Stellen einfacher zu berechnen? Vllt. hat jemand schon mal sowas gemacht...

Vitis
30.05.2011, 19:11
hmmm ... Du kannst die Zahl ja in einen String überführen und dann einfach
den String Zeichen für Zeichen durch gehen, dann brauchst Du die Auswertung nur einmal und eine Schleife.
Den ASCII jedes Zeichens in Zahl zurückverwandeln geht einfach per Subtraktion.

lokirobotics
30.05.2011, 21:24
Ich würd das ganze wie folgt machen:
Ermitteln der Stelle x : Division durch 10^x
Ermitteln des Restes : Wert mod 10^x

Das ganze kannst du in einer Schleife abarbeiten.
Pseudocode:

input = 995;
Anzahl_Stellen = 3;
i = Anzahl Stellen - 1;
while i>-1 do
{
Wert = input / 10^i;
Ausgeben(Wert,i);
input = input mod 10^i;
i--;
}


Die Funktion Ausgeben gibt ein Digit an einer bestimmten Stelle aus.
Das wäre dann ja nur noch eine simple Encoder-Funktion, die das entsprechende Anzeigemodul ansteuert.

Besserwessi
30.05.2011, 22:01
Ausdrücke wie 10^i sollte man unbedingt vermeiden. Es gibt da im Prinzip 2 Möglichkeiten:
1) Man fängt vorne an und zieht in einer Schleife so oft Zahlen wie 1000 ab, bis man unter 1000 kommt. Bei 5 Stellen sind das dann ggf. halt while Schleifen. Das ist zwar nicht elegant, geht aber recht schnell, auch mit einem 8 Bit µC.

2) Man fängt hinten an, so ähnlich wie es oben wohl gemeinst war: Teilen durch 10 mit merken des Restes. Vielfach gibt es dazu eine Spezielle Funktion. Der Rest ist dann die hintere Stelle. Das Wiederholt man bis man bei 0 angekommen ist. Das ist bei den meisten µC nicht ganz so schnell, aber dafür recht kurz. Wenn man die Routine für das Teilen in ASM schreibt ist das Verfahren auch recht schnell, weil man halt eine spezielle Routine für das Teilen durch eine 8 Bit Zahl nutzen kann, das ist auf eine 8 Bit µC deutlich schneller als die volle 32 Bit Arithmetik die die meisten Compiler da nutzen.

lokirobotics
30.05.2011, 23:06
Ich hab nie gesagt, dass ein Ausdruck wie 10^i in der Implementierung benutzt werden soll. Das ist Pseudocode!
Der Threadersteller wird am besten wissen, wie er die Sachen dann umzusetzen hat. Wenn die Anzeige nur einmal in der Sekunde aktualisiert werden muss und ansonsten auch nur wenig gerechnet wird, dann wäre das Ausrechnen von 10^i nicht kritisch, weil dann eh genug Rechenzeit vorhanden ist. Dann muss man nicht solche Verrenkungen machen. Wenn es wahnsinnig schnell sein muss, wäre eine Lookup-Table wahrscheinlich das beste. Da wir diese Details aber nicht kennen, hat es mir gereicht, einfach 10^i zu schreiben. Ich denke, jeder weiß, was damit gemeint ist.

PICture
30.05.2011, 23:23
Hallo!

Ich kenne zwar Cäh gar nicht, aber am einfachsten wäre Zahl in Sting umzuwandeln und einzelne Zeichen aus dem String an Anzeige übergeben (z.B. durch "look-up table"). ;)

Powell
31.05.2011, 00:12
Hi Leute,

vielen Dank für die Tips!

Ich hab es erstmal mit der String-Methode versucht und das hat auf anhieb funktioniert, die Speicherbelegung ist akzeptabel und die Rechenzeit ebenfalls, also ich denke es sollte damit erst mal hinhauen!

Besserwessi
31.05.2011, 00:12
In C gibt funktionen wie Itoa() um Integer in einen String zu wandeln.