Forum: Mikrocontroller und Digitale Elektronik 8-Bit Binärwert zu 7-Segment mit Microcontroller


von Julian F. (yokurt)


Lesenswert?

Guten Tag,

Zur Situation: Ich besitze ein Radar Evaluation Board / Atmel AVR 
Atmega1284P mit dem Radarsensor REB165 von Weidmannelektronik. Ich messe 
mit dem Board/Sensor die Geschwindigkeit von Eisläufern/Eishockeypucks. 
Letzteres muss sich noch beweisen lassen :D. Ich möchte die 
Geschwindigkeit, die als 8-Bit Wert (0 - 255 Kmh), über einen Digitalen 
Pin D3 kommt, weiterverarbeiten.
Einmal soll der Wert zu 3 x 7-Segment anzeige gebracht werden.
Zweitens soll der Wert über einen ESP32 per Wlan/Webserver die Daten an 
meinen Laptop schicken.

Denn ESP32 und das versenden ist noch in den Wolken, da ich leider noch 
nicht mal mit dem 8-Bit Wert zurecht komme. Man ließt hier häufig von 
8-Bit/BCD/Dezimal/7-Segment, doch leider immer nur ohne Microcontroller 
oder mit bestimmten Lösungen.

Nun zur Frage:
Wie verarbeite ich den 8-Bit Wert am kostengünstigsten zu den 
Segmentanzeigen. Kann ich z.B. den ESP32 hier mitverwenden?

Selbst recherchiert komme ich zu keinem Ergebnis, da ich recht neu im 
mC-Business bin. Ich bin im 2ten Jahr meiner Technikerschule und lerne 
gerade erst die Grundkenntnisse mit Atmel Stuidio 7.

von bom (Gast)


Lesenswert?

Du teilst 247kmh durch 100 und bekommst die 2:

int kmg = 247;
int stelle100er = kmh / 100;

Du teilst 247 durch 100, nimmst aber den Rest, dann hast Du 47:

int stelle10erUndEiner = kmh % 100;

stelle10erUndEiner ist jetzt 47.

int stelle10er = stelle10erUndEiner / 10;
int stelle1er = stelle10erUndEiner % 10;

Jetzt hast Du 3 Variablen:

stelle100er = 2;
stelle10er = 4;
stelle1er = 7

von bom (Gast)


Lesenswert?

Um jetzt von de 4 auf die 7segemnt Darstellung zu kommen, würde ich eine 
Tabelle benutzten.

Nummeriere die 7 Dezimalstellen. So zum Beispiel: 
https://i2.wp.com/www.bergziege-owl.de/wp-content/uploads/2011/04/Segmentanzeige-7.jpg

Dann würde ich die Binärdarstellung wählen. In C geht das mit 0b voran.

0b11111111 = 0xFF = 255;

Bei der "8" leuchten alle 7 Segmente. Die Binärdarstellung wäre also:
0b01111111
Bei der "1" leuchten nur die Segmente b und c. Die Binärdarstellung wäre 
also:
0b00000110


Tabelle:
const unsigned char Segmenttabelle = {
0b01111111, // die 0
0b00000110, // die 1

....

}

von Maxim B. (max182)


Lesenswert?

Hallo,
hier gibt es zwei Möglichkeiten.
Eine ist, mit / und %, aber mit AVR geht das ziemlich lange.
Zweite ist mit add und inc, das geht um mehrfaches schneller.

als Beispiel, was ich selbst für Timer benutze:
1
#define ZIF_LEER_CODE  11 
2
3
unsigned char indikator_ind_puff[IND_RASR_MAX] = {0,0,0,0}; 
4
5
void indikator_schreib_ind_puff(unsigned char a,unsigned char b,unsigned char c,unsigned char d){ 
6
  indikator_ind_puff[0] = a;
7
  indikator_ind_puff[1] = b;
8
  indikator_ind_puff[2] = c;
9
  indikator_ind_puff[3] = d;
10
} 
11
12
void indikator_sekdec(signed int sekunden){  
13
14
  unsigned char a=0,b=0,c=0;
15
16
  while(sekunden >= 600){
17
    sekunden -= 600;
18
    a++;
19
  }
20
  while(sekunden >= 60){
21
    sekunden -= 60;
22
    b++;
23
  }
24
  while(sekunden >= 10){
25
    sekunden -= 10;
26
    c++;
27
  }
28
29
  
30
  if (!a) a = ZIF_LEER_CODE;
31
32
  indikator_schreib_ind_puff(a,b,c,(unsigned char)sekunden);
33
}

Hier wird int 0...5999 in Minuten und Sekunden konvertiert und in Puffer 
geschrieben. Du kannst das für deine Zwecke anpassen.

Eine andere Funktion wird die einzenle dezimale Ziffern aus dem Puffer 
lesen, in 7-segment-Code konvertieren und auf LED ausgeben.

: Bearbeitet durch User
von georg (Gast)


Lesenswert?

Julian F. schrieb:
> Wie verarbeite ich den 8-Bit Wert am kostengünstigsten zu den
> Segmentanzeigen

Microcontroller haben heute meistens recht viel Programmspeicher, daher 
kann man das in diesem Fall auch mit einer Tabelle lösen: die müsste 256 
Einträge mit je 3 Bytes haben, wäre also 768 Bytes gross. Man schreibt 
einfach für jeden Eintrag von 0..255 die Segmentmuster der 3 Anzeigen 
rein.

Bleibt die Aufgabe, die 3 x 7 Bit an die Anzeige zu bringen, das ist 
natürlich am einfachsten, wenn der Controller genügend I/O-Pins hat.

Georg

von Wolfgang (Gast)


Lesenswert?

Maxim B. schrieb:
> Eine ist, mit / und %, aber mit AVR geht das ziemlich lange.

"ziemlich lange" in Bezug auf was?

Hier dürfte doch wohl der menschliche Beobachter, der das Display 
abliest, der langsamste Teil der Verarbeitungskette sein - so schnell 
ist der ATmega alle mal.

von Maxim B. (max182)


Lesenswert?

Wolfgang schrieb:
> "ziemlich lange" in Bezug auf was?
>
> Hier dürfte doch wohl der menschliche Beobachter, der das Display
> abliest, der langsamste Teil der Verarbeitungskette sein - so schnell
> ist der ATmega alle mal.

Wenn außer Umrechnen noch viel anderes zu tun ist, dann hat es Sinn, so 
zweitrangige Operationen möglichst schnell und sparsam zu machen.

Außerdem: wozu langsam, wenn es viel schneller geht?

Wenn du mal beide Varianten mit Simulator ausprobierst, wirst du das 
selber sehen.

Als typische Beispiel: du hast SystemTik = 1 ms. Am besten sollten alle 
Routinen zusammen schneller als 1 ms gehen... Außer Bin in Dec umrechnen 
gibt es noch eigentlich etwas, wozu das alles wirklich dient. Und das 
sollte alles noch gemacht werden!

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

georg schrieb:
> Microcontroller haben heute meistens recht viel Programmspeicher, daher
> kann man das in diesem Fall auch mit einer Tabelle lösen: die müsste 256
> Einträge mit je 3 Bytes haben, wäre also 768 Bytes gross. Man schreibt
> einfach für jeden Eintrag von 0..255 die Segmentmuster der 3 Anzeigen
> rein.

Für 8 bit wäre das wohl eine Lösung. Aber wenn es einmal mehr wird? 10 
bit? 16 bit? Am besten findet man eine Lösung, die mit minimalen 
Anpassungen für alles dienen könnte.

> Bleibt die Aufgabe, die 3 x 7 Bit an die Anzeige zu bringen, das ist
> natürlich am einfachsten, wenn der Controller genügend I/O-Pins hat.

Am einfachsten geht es mit Multiplex. Deine Variante: 21 Widerstand. 
Multiplex: 7 (oder 8). Dazu viel einfachere Leiterplatte.

Und noch eins: wenn AVR wirklich zu schnell für eine bestimmte Aufgabe 
ist, hat es sowieso wenig Sinn, unnötig komplizierte Berechnungen zu 
machen. Viel besser wäre, F_CPU zu senken und somit auch Verbrauch von 
Kontroller. Auch wenn Arduino schon eingelöteten Quarz 16 MHz hat: es 
gibt CLKPR.

: Bearbeitet durch User
von Maxim B. (max182)


Angehängte Dateien:

Lesenswert?

Als eine mögliche Lösung für Indikator und Tasten, die sehr gut 
funktioniert:

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.