LED-Leiste mit switch-case

Gast #3213290
Hallo,
ich möchte auf einem Atmel-Controller die Temperatur über eine 8er 
LED-Leiste ausgeben.
Ich wollte die Temperatur (welcher °-Bereich wird später eingestellt) in 
Acht Bereiche einteilen und dann mit switch-case abarbeiten.
Irgendwie komme ich aber nicht mehr weiter. Ich weiss dass der Block mit 
den Defines noch nicht korrekt ist, es geht mir nur um die 
switch-case-Geschichte
Könnte das mal jemand durchchecken? Kann man das so gebrauchen? Oder ist 
das grob falsch? (syntaktische Fehler bitte verzeihen, ist noch in der 
Bastelphase).

Danke schonmal, ich verzweifle hier bald
1
#define Bereich_1 voltage_conversion <= 100mV;
2
#define Bereich_2 voltage_conversion <= 200mV;
3
#define Bereich_3 voltage_conversion <= 300mV;
4
#define Bereich_4 voltage_conversion <= 400mV;
5
#define Bereich_5 voltage_conversion <= 500mV;
6
#define Bereich_6 voltage_conversion <= 600mV;
7
#define Bereich_7 voltage_conversion <= 700mV;
8
#define Bereich_8 voltage_conversion <= 800mV;
9

10
void LED_Anzeige(uint16_t voltage)
11
{
12
  
13
  uint16_t voltage_conversion;
14
  
15
  Vref=5;
16
  
17
  voltage_conversion = (ADC_value*Vref)/1024;  //Datenblatt S.325
18
  
19
  
20
  switch (LED_Anzeige)
21
  {
22
    case Bereich_1:
23
      while(Bereich_1)          //Eine LED an
24
      {
25
        PORTD == 0x01;
26
        OSTimeDlyHMSM(0,0,1,0);      
27
      }
28
      break;
29
      
30
    case Bereich_2:
31
      while(Bereich_2)          //Zwei LEDs an
32
      {
33
        PORTD == 0x03;
34
        OSTimeDlyHMSM(0,0,1,0);
35
      }
36
      break;
37
      
38
    case Bereich_3:
39
      while(Bereich_3)          //Drei LEDs an
40
      {
41
        PORTD == 0x07;
42
        OSTimeDlyHMSM(0,0,1,0);
43
      }
44
      break;
45
      
46
    case Bereich_4:
47
      while(Bereich_4)          //Vier LEDs an
48
      {
49
        PORTD == 0x0F;
50
        OSTimeDlyHMSM(0,0,1,0);
51
      }
52
      break;
53
      
54
    case Bereich_5:
55
      while(Bereich_5)          //Fuenf LEDs an
56
      {
57
        PORTD == 0x1F;
58
        OSTimeDlyHMSM(0,0,1,0);
59
      }
60
      break;
61
      
62
    case Bereich_6:
63
      while(Bereich_6)          //Sechs LEDs an
64
      {
65
        PORTD == 0x3F;
66
        OSTimeDlyHMSM(0,0,1,0);
67
      }
68
      break;
69
      
70
    case Bereich_7:
71
      while(Bereich_7)          //Sieben LEDs an
72
      {  
73
        PORTD == 0x7F;
74
        OSTimeDlyHMSM(0,0,1,0);
75
      }
76
      break;
77
      
78
    case Bereich_8:
79
      while(Bereich_8)          //Acht LEDs an
80
      {
81
        PORTD == 0xFF;
82
        OSTimeDlyHMSM(0,0,1,0);
83
      }
84
      break;
85
      
86
  }
Gast
Danke für die schnelle Antwort.

Wenn ich die Bereiche bzw. Grenzspannungen vorher definiert habe, ist 
doch beim switch-case keine Ungleichung drin oder seh ich das irgendwie 
falsch?
Gast
Ok, das bedeutet also, wenn ich mit Grenzspannungen arbeiten will ist 
switch-case nicht möglich? Oder gibt es anstelle von #define eine 
bessere Möglichkeit?
Thomas schrieb:
> Ok, das bedeutet also, wenn ich mit Grenzspannungen arbeiten will ist
> switch-case nicht möglich?

Klar geht das. Man müsste nur die eigentliche Bereichsprüfung 
"auslagern" und einen dem gefundenen Bereich zugeordneten Index 
ermitteln, den man dann per switch auswerten könnte.

Aber bei einem derart simplen linearen Zusammenhang ist das alles 
komplett überflüssig. Man kann das Ganze auch mit nur einer Zeile Code 
erledigen.
Angenommen voltage_conversion ist in mV (was es bei dir nicht ist):
1
PORTD = (1 << (voltage_conversion/100)) - 1;
Gast
Naja es soll so simpel wie möglich sein. Ich möchte einfach nur abhängig 
von der Temperatur (also der Spannung in mV) 1 bis 8 LEDs leuchten 
lassen.
Ich dachte switch-case wäre das richtige Werkzeug dafür.

Wie müsste den der oben genannte Codeschnippsel eingebaut werden
 (PORTD = (1 << (voltage_conversion/100)) - 1;) ?
Gast
> Naja es soll so simpel wie möglich sein. Ich möchte einfach nur abhängig
> von der Temperatur (also der Spannung in mV) 1 bis 8 LEDs leuchten
> lassen.

Noch einfacher gehts nicht. Z.B. so:
1
[pseudocode]
2

3
uint8_t gibMichAnzahlOderAuchGleickBitPatternDerLedsDieWoLeuchtenSollen(T spannung)
4
{
5
    if (spannung < 42mV)
6
        return 1;
7
    if (spannung < 105mV)
8
        return 2;
9
    if (spannung < 170mV)
10
        return 3;
11
    [..]
12
    return uups;
13
}
14

15
void LED_Anzeige(uint16_t voltage)
16
{
17

18
    uint16_t voltage_conversion;
19
    Vref=5;
20
    voltage_conversion = (ADC_value*Vref)/1024;  //Datenblatt S.325
21

22
    uint8_t ui8AnzahlOderAuchGleickBitPatternDerLedsDieWoLeuchtenSollen = gibMichAnzahlOderAuchGleickBitPatternDerLedsDieWoLeuchtenSollen(voltage_conversion);
23

24
    tuWas(ui8AnzahlOderAuchGleickBitPatternDerLedsDieWoLeuchtenSollen);
25
[/pseudocode]
Thomas schrieb:
> Wie müsste den der oben genannte Codeschnippsel eingebaut werden
>  (PORTD = (1 << (voltage_conversion/100)) - 1;) ?

Was meinst du mit "einbauen"? Es "ersetzt" das komplette Geraffel.

Was nur zusätzlich noch fehlt, ist eine sinnvolle Vorbereitung von 
voltage_conversion. Die Formel dafür in deinem Code liefert nämlich kein 
wirklich sinnvolles Ergebnis.
Gast
Das klingt gut.
Dann verstehe ich die Bedeutung deiner Code-Zeile irgendwie falsch, 
könntest du mir die kurz erläutern?
Das mit der Formel ist mir bewusst und wird später geändert.
Es ist nur eine Weile her dass ich programmiert habe und ich quäl mich 
schon ewig mit diesem einfachen Problem...
Thomas schrieb:
> Dann verstehe ich die Bedeutung deiner Code-Zeile irgendwie falsch,
> könntest du mir die kurz erläutern?

Nö, denn so kompliziert ist die ja nun auch nicht. Sorry, aber wenn du 
die Zeile nicht selbst nachvollziehen kannst, dann fehlen dir eh ein 
paar Grundlagen, die du erst mal nachholen müsstest.


Übrigens müsstest du die Zeile ggf. auch noch ein wenig modifizieren. In 
ihrer jetzigen Form erzeugt sie ein Verhalten, wie ich es von einer 
Balkenanzeige mit 100mV-Schritten erwarten würde. Das weicht ein wenig 
davon ab, was du in deinem Pseudo-Code oben als beabsichtigtes Verhalten 
offenbart hast.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.