![]() |
[µC] Spannung von 0-5V mit 8 LEDs darstellen
Moin,
ich habe als Aufgabe, die über einen A/D-Wandler eingelesene Spannung mithilfe von 8 LEDs als Balkenanzeige darzustellen. Testen kann ich es erst am Dienstag, doch ich würde gerne etwas zur Umsetzung wissen. Vorweg die Erklärungen zu meinem Code: ad_res: Ergebnis des A/D-Wandlers (Werte 0-1023 oder 1024) P2: 16-Bit-Port, an dessen Bits 0-7 die LEDs angeschlossen sind. Die linken 8 Bits (9-15) dürfen nicht verändert werden, daher die Bitmaske).
Code:
Meine Theorie dahinter ist folgende:
void show_visual_current(unsigned int ad_res)
{ P2 = P2 | ~((P2 |= 0x00FF) >> (ad_res / 128)); } ad_res/128 ist der Spannungsabstand von einer LED zur nächsten. Um diesen Wert werden 8 Einsen nach rechts verschoben und das ganze nach dem Invertieren dem Port 2 zugewiesen. Ob das mit obigem Code auch tatsächlich gemacht wird, sei mal dahingestellt, doch das werde ich dann testen. Unser Professor meinte jedoch, man soll Gleitkommadivisionen möglichst vermeiden, da die Berechnungen auf einem µC sehr langsam ablaufen. Durch eine Zehnerpotenz zu teilen ginge jedoch recht schnell, da man die Zahlen vor der Berechnung einfach um einen Faktor (10, 100, ...) vergrößern kann, um mit ganzen Zahlen rechnen zu können, aber wie macht man das in meinem Fall? Da teile ich durch 128. Grüße, Matze |
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Code:
(128 ist ja praktischerweise eine 2er-Potenz :-))
(ad_res / 128) == (ad_res >> 7)
btw: ich denke, Deine "Formel" kann nicht funktionieren - sobald die Leds einmal an sind, werden die nie mehr ausgeschalten werden (OR), zumal es vermutlich noch ein Syntax-Fehler hat (|=) mein Vorschlag:
Code:
void show_visual_current(unsigned int ad_res)
{ if (ad_res > 0) P2 = (P2 & 0x0FF00) | (0x00FF >> (7 - (ad_res >> 7))); else P2 = (P2 & 0x0FF00); } |
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Hallo,
Tatsache, das mit dem Verschieben geht, danke. Ich frage mich zwar grad, wieso das funktioniert, aber es haut wirklich immer hin. :gruebel: Mein Prof. hat auch irgendwas von den 7 Stellen angesprochen, die man verschieben könnte, nur wusste ich nicht, wieso er das vorgeschlagen hat. *g* Stimmt |= ist natürlich Quatsch an dieser Stelle. Und du schreibst "7 - ...", damit man nicht mehr invertieren muss, vermute ich. Das lasse ich mir mal durch den Kopf gehen. :) Grüße Edit: Das blöde ist, dass ich nun eine neue Überlegung habe:
Code:
aber das Zeugs so komplex ist, dass man das ohne es zu testen kaum überprüfen kann.
P2 = (P2 & 0xFF00) | ((0x00FF << (7 - (ad_res >> 7))) & 0x00FF);
|
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Zitat:
kleine Optimierung:
Code:
bei 128er-Schritten gibt es 8 Eingangszustände (der AD-Wandler wird kaum jemals 1024 liefern), die LEDs unterstützen aber 9 (keine an bis 8 an) => ein Eingangszustand "halbiert" ergibt 9 Eingangszustände
void show_visual_current(unsigned int ad_res)
{ if (ad_res < 64) { P2 = (P2 & 0x0FF00); } else if (ad_res >= 960) // 1024 - 64 P2 = (P2 & 0x0FF00) | 0x000FF; } else { P2 = (P2 & 0x0FF00) | (0x00FF >> (7 - ((ad_res - 64) >> 7))); } } |
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Das wird ja immer lustiger. *g*
Wenn ich das richtig sehe, setzt du hier zuerst die rechten 8 Bits auf 0 und ver-orderst diese mit 256 (8 Einsen). Somit setzt du insgesamt die rechten 8 Bits auf 1 und die linken 8 bleiben so (mehr als 16 Bit kann der Prozessor übrigens nicht, daher reichen hier 4 Hex-Ziffern)
Code:
Könnte man das nicht auch einfacher schreiben als
P2 = (P2 & 0x0FF00) | 0x000FF;
Code:
Grüße
P2 |= 0x00FF;
|
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Zitat:
meine vorherige Lösung in Kurz: :-)
Code:
void show_visual_current(unsigned int ad_res)
{ P2 = (P2 & 0x0FF00) | (0x00FF >> (8 - ((ad_res + 64) >> 7))); } |
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Danke. Deinen aktuellen Vorschlag und meine Überlegung aus Beitrag #3 werde ich am Dienstag testen. Vermutlich werde ich dann berichten, dass dein Code funktioniert und meiner nicht, aber das sehe ich dann ja. :)
|
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Zitat:
... beginnt der Balken auf der anderen Seite ... werden nie alle LEDs ausgeschalten sein |
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Zitat:
Zitat:
|
Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
Mal ne andere Frage:
Code:
Müsste es nicht
void show_visual_current(unsigned int ad_res)
Code:
heißen? ;)
void show_visual_voltage(unsigned int ad_res)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz