Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [µC] Spannung von 0-5V mit 8 LEDs darstellen (https://www.delphipraxis.net/112782-%5B%B5c%5D-spannung-von-0-5v-mit-8-leds-darstellen.html)

Matze 27. Apr 2008 08:26


[µ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:
void show_visual_current(unsigned int ad_res)
{
   P2 = P2 | ~((P2 |= 0x00FF) >> (ad_res / 128));
}
Meine Theorie dahinter ist folgende:
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

Basilikum 27. Apr 2008 09:11

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Code:
(ad_res / 128) == (ad_res >> 7)
(128 ist ja praktischerweise eine 2er-Potenz :-))

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);
}

Matze 27. Apr 2008 09:39

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:
P2 = (P2 & 0xFF00) | ((0x00FF << (7 - (ad_res >> 7))) & 0x00FF);
aber das Zeugs so komplex ist, dass man das ohne es zu testen kaum überprüfen kann.

Basilikum 27. Apr 2008 09:56

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Zitat:

Zitat von Matze
Und du schreibst "7 - ...", damit man nicht mehr invertieren muss, vermute ich.

genau

kleine Optimierung:
Code:
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)));
  }
}
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

Matze 27. Apr 2008 10:04

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:
P2 = (P2 & 0x0FF00) | 0x000FF;
Könnte man das nicht auch einfacher schreiben als

Code:
P2 |= 0x00FF;
Grüße

Basilikum 27. Apr 2008 10:08

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Zitat:

Zitat von Matze
Könnte man das nicht auch einfacher schreiben als

Code:
P2 |= 0x00FF;

da hast Du natürlich recht...

meine vorherige Lösung in Kurz: :-)
Code:
void show_visual_current(unsigned int ad_res)
{
  P2 = (P2 & 0x0FF00) | (0x00FF >> (8 - ((ad_res + 64) >> 7)));
}

Matze 27. Apr 2008 10:13

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. :)

Basilikum 27. Apr 2008 10:21

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Zitat:

Zitat von Matze
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. :)

Deine Lösung aus #3 wird schon funktionieren, allerdings... :-)
... beginnt der Balken auf der anderen Seite
... werden nie alle LEDs ausgeschalten sein

Matze 27. Apr 2008 10:25

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Zitat:

Zitat von Basilikum
allerdings... :-)
... beginnt der Balken auf der anderen Seite

Sicher? Ich dachte nun die geniale Idee zu haben, das ganze anstatt nach recht nach links zu schieben um dem entgegenzuwirken. :stupid:

Zitat:

Zitat von Basilikum
... werden nie alle LEDs ausgeschalten sein

Stimmt, den Wert 1023 kann der A/D-Wandler wirklich nicht liefern. Im letzten Versuch gab die Messung, dass die Spannung von 0 bis 4,8x Volt reicht.

Torpedo 27. Apr 2008 12:14

Re: [µC] Spannung von 0-5V mit 8 LEDs darstellen
 
Mal ne andere Frage:
Code:
void show_visual_current(unsigned int ad_res)
Müsste es nicht

Code:
void show_visual_voltage(unsigned int ad_res)
heißen? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz