Forum: Mikrocontroller und Digitale Elektronik Werte von ADC sortieren und Ausgang schalten


von Ron S. (bast-lwastl)


Lesenswert?

Hallo Forum,
ich lasse meinen Atmega 8, über drei ADC_Kanäle, die Werte von drei 
verschidenen analogen Spannungen in den Datentyp uint16_t speichern. Die 
Variablen haben die Namen rot, blau und grün.
Über einen Bubblesort lass ich den Atmega die Werte von klein nach groß 
sortieren. Um dann mit den sortierten Werten einzelne Ausgänge 
anzusteuern.

Nun zu meiner Frage. Kann ich über eine if Kontrollstruktur vergleichen 
welche Farbe die kleinste ist? Bzw. sortiert das Bubblesort mir nur die 
Werte und lässt die Bezeichnung eifach an der Adresse stehen wo ich sie 
hin geschrieben hab?
Ich hoffe ihr versteht die Frage. Vielleicht versteht man es mit dem 
Auszug meines Quelltextes besser.

      rot = ADC_Read(0);    // Messung an Kanal 0 in rot speichern
      blau = ADC_Read(1);    // Messung an Kanal 1 in blau speichern
      gruen = ADC_Read(2);    // Messung an Kanal 2 in gruen speichern


   /* das Array zum Sortieren */

   int sort_array[] = { rot, blau, gruen };
   int N = sizeof(sort_array)/sizeof(int);

   bubble(sort_array, 7);


  if ( sort_array[0] == blau) {
      PORTB = (1<<0) & (0xff);
     }

von Karl H. (kbuchegg)


Lesenswert?

1
if ( rot < blau )
2
  {
3
     // blau kann schon mal nicht das kleinste sein, denn rot ist kleiner
4
5
     if ( rot < grün )
6
     {
7
       // rot ist also kleiner als blau und kleiner als grün
8
       // da es sonst nichts mehr gibt, muss also rot die kleinste sein
9
     }
10
11
     else
12
     {
13
       // da rot kleiner als blau ist, und grün kleiner als rot
14
       // bleibt nur 1 SChluss: grün muss auch kleiner als blau sein
15
       // da grün kleiner als rot UND kleiner als blau ist, muss daher
16
       // grün die kleinste sein
17
     }
18
   }
19
20
   else
21
   {
22
     // blau ist schon mal kleiner oder zumindest gleich wie rot
23
     // was ist mit grün
24
25
     if( blau < grün )
26
     {
27
       // wenn blau kleiner als rot ist und auch noch kleiner als
28
       // grün, dann ist blau die kleinste
29
     }
30
     else
31
     {
32
       // blau ist nicht kleiner als grün.
33
       // Also muss grün kleiner als blau sein
34
       // -> grün ist die kleinste
35
     }
36
   }

Bei Gleichstand werden gewisse Farben präferiert. Schliesslich ist ja 
auch nicht definiert, welcher der 5-er in  rot:5, blau:5, grün: 5  der 
kleinere ist :-)

Bei 3 Werten kann man das noch ausprogrammieren. Bei 100 Werten geht das 
nicht mehr. Da benutzt man dann eine andere Technik.

von Ron S. (bast-lwastl)


Lesenswert?

Bei drei verschidenen Werten ist das mit if else ja noch möglich. Aber 
ich will das später mit nen anderen µC auf 7 verschidene Werte erhöhen.

Da wird es meiner Meinung relativ viel und unübersichtlich mit if else.

Daher das bubblesort. Nimmt der Sortierbefehl den Namen des uint- Wertes 
beim sortieren mit?

als Beispiel: rot = 2
              blau = 1
              gruen = 3
nach der Sortierung : bau = 1
                      rot = 2
                      gruen =3
oder setht dann da rot = 1
                   blau =2
                   gruen =3
Ich frage das, weil mir jemand sagte, dass der Sortierbefehl nur die 
Zahlen sortieren würde aber nicht den Namen Variable mit nimmt.

von Karl H. (kbuchegg)


Lesenswert?

Ron S. schrieb:
> Bei drei verschidenen Werten ist das mit if else ja noch möglich. Aber
> ich will das später mit nen anderen µC auf 7 verschidene Werte erhöhen.
>
> Da wird es meiner Meinung relativ viel und unübersichtlich mit if else.

da hast du nicht unrecht :-)

das macht man dann zb so (es gibt da mehrere Möglichkeiten).

Anstatt der Werte lässt du dir einen 'Index' entsprechend umsortieren.
Du nummerierst einfach die Werte durch.

      Deine Werte    Index

rot      25            1
grün     28            2
blau     17            3


Das Index-Array gibst du zum Sortieren. Aber anstelle dass du in der 
Vergleichsfunktion die beiden int-Zahlen i und j vergleichst, die du 
bekommst, basierst du deinen Vergleich auf Wert[i] und Wert[j].

D.h. die Sortierreihenfolge der 2-ten Spalte basiert auf den Werten der 
ersten Spalte. Als Ergebnis erhältst du

                       3
                       1
                       2

mit der Bedeutung: blau ist am kleinsten, danach kommt rot, gefolgt von 
grün.

von Ron S. (bast-lwastl)


Lesenswert?

also ich verusch mich grade daran, das umzusetzen was du geschrieben 
hast.
Ich versteh wie du das meinst. Aber irgendwie komm ich nicht weiter.
Muss ich das array so schr.:

int Farbe [3];

     Farbe [1] = rot;
     Farbe [2] = blau;
     Farbe [3] = gruen;
den Farben hab ich bereits Werte zu gewiesen.

oder muss ich im Array direkt den Wert zu weisen?

Oder ist das ganz und gar der falsche Ansatz?

von Karl H. (kbuchegg)


Lesenswert?

Ron S. schrieb:
> also ich verusch mich grade daran, das umzusetzen was du geschrieben
> hast.
> Ich versteh wie du das meinst. Aber irgendwie komm ich nicht weiter.
> Muss ich das array so schr.:
>
> int Farbe [3];
>
      Farbe [0] = 0;
      Farbe [1] = 1;
      Farbe [2] = 2;


Und jetzt sortierst du das Array Farbe, wobei du die kleiner-Beziehnung, 
welche die Sortierung steuern von sort_array abhängig machst
1
   ....
2
3
   // bubble sort
4
   sorted = false;
5
6
   while( ! sorted ) {
7
8
      sorted = true;
9
10
      for( i = 0; i < N-1; i++ )
11
      {
12
        // AChtung jetzt kommts!
13
        if( sort_array[ Farbe[i] ] < sort_array[ Farbe[i+1] ] )
14
        {
15
          tmp = Farbe[i];
16
          Farbe[i] = Farbe[i+1];
17
          Farbe[i+1] = tmp;
18
19
          sorted = false;
20
        }
21
      }
22
    }
23
24
    // In Farbe stehen die Nummern der Farben in der richtigen Reihenfolge
25
    // 0 = rot, 1 = blau, 2 = grüen
26
    //
27
    // dies deshalb, weil du in dieser Reihenfolge dein sort_array
28
    // int sort_array[] = { rot, blau, gruen };
29
    // angefüllt hast.
30
    // ist also Farbe[0] gleich 2, dann ist grün die kleinste

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.