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.
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
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 .... }
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.