Forum: Mikrocontroller und Digitale Elektronik LED-Leiste mit switch-case


von Thomas (Gast)


Lesenswert?

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
  }

: Verschoben durch Moderator
von Dumdi D. (dumdidum)


Lesenswert?

Thomas schrieb:
> Kann man das so gebrauchen? Oder ist
> das grob falsch?

Leider letzteres. Switch-case kann keine Ungleichungen. Mach einfach 8 
if Abfragen hintereinander.

von Thomas (Gast)


Lesenswert?

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?

von Dumdi D. (dumdidum)


Lesenswert?

#define  ist eine einfache Textersetzung. Du koenntest den Text auch per 
copy und paste einfuegen.

von Thomas (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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;

von Pfitsche (Gast)


Lesenswert?

Vielleicht ist ein anderer Ansatz sinnvoll.

z.B. etwas mehr Mathematik : Modulo ?

von Thomas (Gast)


Lesenswert?

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

von g457 (Gast)


Lesenswert?

> 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]

von Stefan E. (sternst)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

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.