Forum: Compiler & IDEs Daten splitten für 7 Segment


von Segmenter (Gast)


Lesenswert?

Hallo Leute,

vielleicht hat einer ne Idee, die besser ist als meine...

Ich hab daten in nem Int.
Diese will ich so aufsplitten, dass ichs an 7 Segment Anzeigen anzeigen 
kann.

zB.
1
int a = 1234;
2
char ausgabe[4];
3
4
// Irgendwie umwandeln fuer das Char

das Ergebnis soll dann sein:
ausgabe[0] ist 4
...
ausgabe[3] ist 1

hat jemand eine Idee wie ich das geil machen kann?
Mir fällt eign nur ein mit Modulo zu arbeiten.

Also zB.
1
ausgabe[0] = a%10;

Danke!

von Max D. (max_d)


Lesenswert?

Also wenn du schon dabei bist, dann speicher gleich in deinem Array die 
Segmente ab. Dann musst du die nurnoch auf den Port kopieren

von Segmenter (Gast)


Lesenswert?

Hallo,

danke schonmal für die Antwort.
Mal abgesehen davon, dass ich nicht ganz verstehe wie du das mit der 
Umsetzung meinst ist das nicht notwendig.

Ich steuere über SPI einen Led Treiber an, der die Segmente ansteuert.

Dafür habe ich mir gedacht, dass ich die einzelnen Zahlen/Buchstaben 
(ist nämlich eign ne 14 Segmentanzeige, nur zur Einfachheit hier 7) mit 
#define in der richtigen Bitfolge definiere und dann mit ner Prüfung
1
switch ausgabe[i]
2
case '1': data=0b00101100; break;
3
//usw...

an den Treiber weitergebe...

Leider fällt mir auch hier nichts eleganteres ein...

von Bin2BCD (Gast)


Lesenswert?

Segmenter schrieb:
>
> vielleicht hat einer ne Idee, die besser ist als meine...
> hat jemand eine Idee wie ich das geil machen kann?
> Mir fällt eign nur ein mit Modulo zu arbeiten.
>
Wenn du kompliziert statt effizient bevorzugst
kannst es mit Modulo versuchen.
Ansonsten ist
http://en.wikipedia.org/wiki/Double_dabble
erste Wahl.

von Max D. (max_d)


Lesenswert?

Segmenter schrieb:
> Hallo,
>
> danke schonmal für die Antwort.
> Mal abgesehen davon, dass ich nicht ganz verstehe wie du das mit der
> Umsetzung meinst ist das nicht notwendig.
>
> Ich steuere über SPI einen Led Treiber an, der die Segmente ansteuert.
>
> Dafür habe ich mir gedacht, dass ich die einzelnen Zahlen/Buchstaben
> (ist nämlich eign ne 14 Segmentanzeige, nur zur Einfachheit hier 7) mit
> #define in der richtigen Bitfolge definiere und dann mit ner Prüfung
> switch ausgabe[i]
> case '1': data=0b00101100; break;
> //usw...

Also ob das bei 14 Segmenten lohnt kann ich nicht sagen, aber wenn man 
das "klassisch" (mit multiplexing) dann lagert man in dem Array direkt 
die Segmente ein und muss die nicht bei jedem Zyklus neu berechnen.

von Peter D. (peda)


Lesenswert?

Segmenter schrieb:
> Mir fällt eign nur ein mit Modulo zu arbeiten.

Warum nicht?
1
int a = 1234;
2
char ausgabe[4];
3
4
for( uint8_t i = 0; i < sizeof(ausgabe); i++ ){
5
  ausgabe[i] = a % 10;
6
  a /= 10;
7
}

von Karl H. (kbuchegg)


Lesenswert?

Segmenter schrieb:

> Leider fällt mir auch hier nichts eleganteres ein...
1
uint8_t Muster[10] = { .. ,           // 0
2
                       0b00101100,    // 1
3
                       ..,            // 2
4
                       .....
5
                       ..             // 9
6
                     }

und dann eben (Anleihe an PeDa)
1
int a = 1234;
2
char ausgabe[4];
3
4
for( uint8_t i = 0; i < sizeof(ausgabe); i++ ){
5
  ausgabe[i] = Muster[ a % 10 ];
6
  a /= 10;
7
}

Ausgabe enthält dann schon das jeweilige Muster, dass du an deinen 
Treiber geben musst.

: Bearbeitet durch User
von Linksammler (Gast)


Lesenswert?

Karl Heinz schrieb:
> ausgabe[i] = Muster[ a % 10 ];
>   a /= 10

in der stdlib.h gibt's ne Funktion "div", die beides gleichzeitig 
berechnet.
also in etwa:
1
  div_t r=div(a,10);
2
  ausgabe[i] = Muster[ r.rem ];
3
  a=r.quot;

Aber ob das schneller ist?

von Peter D. (peda)


Lesenswert?

Linksammler schrieb:
> Aber ob das schneller ist?

Wenn man sich mal überlegt, wie schnell ein Mensch Zahlen überhaupt 
ablesen kann.
Dann muß man natürlich die Umwandlungsroutine auf den letzten CPU-Zyklus 
optimieren.

Ich mach da meistens noch eine Wartezeit rein, damit nur max 2..5 
Werte/s angezeigt werden. Das ist ergonomischer.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Ich  würde rein interessehalber gerne mal wissen wozu das ganze dann am 
Ende dienen soll. Offensichtlich ist das allen anderen klar...

von m.n. (Gast)


Lesenswert?

Thomas Holmes schrieb:
> Ich  würde rein interessehalber gerne mal wissen wozu das ganze
> dann am
> Ende dienen soll. Offensichtlich ist das allen anderen klar...

Das steht doch oben: es sollen 14-Segment-Anzeigen mit 7-Segmenten 
angesteuert werden. Zudem soll das Programm auch geil sein und dient 
ggf. als Rechtschreibübung für den TO.
Daß die ganze Geschichte ein uralter Hut ist, ist dabei unerheblich.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Ist "Geil" ne neue Optimierungsstufe beim GCC?

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.