Forum: Mikrocontroller und Digitale Elektronik Kleinsten Wert finden, Variablen vergleichen und auswerten


von Matze (Gast)


Lesenswert?

Hallo,

Sitze grade vor einem unverständlichen Problem:

Von 4 Double-Variablen soll die kleinste gefunden werden.
Wenn die andrern Varaiblen um > 0,2 größer sind soll eine Aktion 
ausgeführt werden.

Es kommt jedoch überall # raus.
-->Dass sollte eigentlich garnicht möglich sein.

Seht ihr den Fehler?
1
void autobalance(uint8_t ueb)
2
{
3
  if (ueb==0)  //Automatisches balancing
4
  {
5
    //Finden der kleinsten Spannung
6
    uint8_t spg_klein=0;
7
    if ((spg1<spg2) && (spg1<spg3) && (spg1<spg4))
8
    {
9
      spg_klein=spg1;
10
    }
11
    else if ((spg2<spg1) && (spg2<spg3) && (spg2<spg4))
12
    {
13
      spg_klein=spg2;
14
    }
15
    else if ((spg3<spg1) && (spg3<spg2) && (spg3<spg4))
16
    {
17
      spg_klein=spg3;
18
    }
19
    else
20
    {
21
      spg_klein=spg4;
22
    }
23
    //----------Ein/Abschalten der Balancing R's
24
    if (spg1>(spg_klein+0.2))
25
    {
26
      zeile1[6]='#';
27
      balance(0,1);
28
    }
29
    else
30
    {
31
      zeile1[6]=' ';
32
      balance(0,0);
33
    }
34
    if (spg2>(spg_klein+0.2))
35
    {
36
      zeile1[14]='#';
37
      balance(1,1);
38
    }
39
    else
40
    {
41
      zeile1[14]=' ';
42
      balance(1,0);
43
    }
44
    if (spg3>(spg_klein+0.2))
45
    {
46
      zeile2[6]='#';
47
      balance(2,1);
48
    }
49
    else
50
    {
51
      zeile2[6]=' ';
52
      balance(2,0);
53
    }
54
    if (spg4>(spg_klein+0.2))
55
    {
56
      zeile2[14]='#';
57
      balance(3,1);
58
    }
59
    else
60
    {
61
      zeile2[14]=' ';
62
      balance(3,0);
63
    }
64
  }
65
}

von Edi R. (edi_r)


Lesenswert?

Was mir aufgefallen ist: spg1 bis spg4 sollen double-Variablen sein, 
aber spg_klein ist ein uint8_t.

von Matze (Gast)


Lesenswert?

Edi R. schrieb:
> Was mir aufgefallen ist: spg1 bis spg4 sollen double-Variablen sein,
> aber spg_klein ist ein uint8_t.

Stimmt Danke.

Doch nun wird die größte als kleinste erkannt!
Alle kleineren haben ein '#'

von Loddar (Gast)


Lesenswert?

Matze schrieb:
> Doch nun wird die größte als kleinste erkannt!
> Alle kleineren haben ein '#'

beschreib doch mal den Fehler:
welche Werte haben die Spannungen und was wird ausgegeben und was ist an 
der Ausgabe falsch

von Matze (Gast)


Lesenswert?

Es geht um ein Balancing-System, dabei soll die höchste Spannung nur 
0,2V größer als die anderen sein.

-->Im Bedarfsfall wird ein Parallelwiderstand geschaltet.
-->Dann soll dies durch ein '#' auf dem Display angezeigt werden.

Spg 1 = 7,88V
Spg 2 = 6,36V
Spg 3 = 6,52V
Spg 4 = 6,11V

Aktuell werden alle Spannungen außer Spg 1 mit '#' angezeigt und 
entladen.

Habe die Spannungen nun in ein Array gepackt, doch am Problem ändert 
sich nichts.
1
void autobalance(uint8_t ueb)
2
{
3
  if (ueb==0)  //Automatisches balancing
4
  {
5
    double spg_klein=100;
6
    for (int i=0;i<4;i++)
7
    {
8
      if (spg[i]<spg_klein)
9
      {
10
        spg_klein=spg[i];
11
      }
12
    }
13
14
    //----------Ein/Abschalten der Balancing R's
15
    if (spg[0]>(spg_klein+0.2))
16
    {
17
      zeile1[6]='#';
18
      balance(0,1);
19
    }
20
    else
21
    {
22
      zeile1[6]=' ';
23
      balance(0,0);
24
    }
25
    if (spg[1]>(spg_klein+0.2))
26
    {
27
      zeile1[14]='#';
28
      balance(1,1);
29
    }
30
    else
31
    {
32
      zeile1[14]=' ';
33
      balance(1,0);
34
    }
35
    if (spg[2]>(spg_klein+0.2))
36
    {
37
      zeile2[6]='#';
38
      balance(2,1);
39
    }
40
    else
41
    {
42
      zeile2[6]=' ';
43
      balance(2,0);
44
    }
45
    if (spg[3]>(spg_klein+0.2))
46
    {
47
      zeile2[14]='#';
48
      balance(3,1);
49
    }
50
    else
51
    {
52
      zeile2[14]=' ';
53
      balance(3,0);
54
    }
55
  }
56
}

von Loddar (Gast)


Lesenswert?

Matze schrieb:
> Es geht um ein Balancing-System, dabei soll die höchste Spannung nur
> 0,2V größer als die anderen sein.

und warum suchst du dann nach der kleinsten Spannung?

von Matze (Gast)


Lesenswert?

Loddar schrieb:
> Matze schrieb:
>> Es geht um ein Balancing-System, dabei soll die höchste Spannung nur
>> 0,2V größer als die anderen sein.
>
> und warum suchst du dann nach der kleinsten Spannung?

Hab's falsch formuliert,
Es soll die kleinste Spannung ermittelt werden.
Alle anderen Spannungen sollen so geregent werden, dass sie maximal 0,2V 
größer sind.

von Loddar (Gast)


Lesenswert?

Matze schrieb:
> if (spg[0]>(spg_klein+0.2))
>     {
>       zeile1[6]='#';
>       balance(0,1);
>     }
>     else
>     {
>       zeile1[6]=' ';
>       balance(0,0);
>     }

ändere das doch Mal in

 if ( spg[0]==spg_klein )
       zeile1[6]='#';
     else
       zeile1[6]=' ';

usw.
um zu kontrollieren was als kleinste Spannung gefunden wird,
Programmieren besteht zu einem großen Teil in systematischer Fehlersuche 
...

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.