Forum: Mikrocontroller und Digitale Elektronik Kleinste von 3 Variablen bestimmen


von Jörg (Gast)


Lesenswert?

Hallo Gemeinde!

Zwar bin ich in Sachen AVR Programmierung und Bascom noch Anfänger, 
allerdings habe ich (vor Jahren) schon Programme geschrieben. Allerdings 
stehe ich momentan total auf dem Schlauch... ;-)

Ich habe 3 Werte, die vom AD-Wandler eingelesen werden. Sie werden in 
die Variablen WERT1, WERT2 und WERT3 geschrieben. Nun möchte ich 
bestimmen, welcher der Werte der kleinste ist.
Allerdings verhaspel ich mich mit meinen "if" "then" "elseIf" usw. 
permanent (die Woche war wohl zu stressig...) smile

Ich habe jetzt folgendes "konstruiert":
1
if wert1 < wert2 then
2
    if wert1 < wert3 then
3
           Wert1 kleinster
4
    elseif
5
           wert3 kleinster
6
    endif
7
elseif wert3 < wert2 then
8
    wert3 kleinster
9
else
10
    wert2 kleinster
11
endif

Kann da mal jemand bitte drüber gucken? Jaja, ich weiß, was jetzt kommt: 
"Und was is, wenn zwei oder alle drei Werte gleich groß sind?" Das 
brauche ich hier nicht berücksichtigen, der Fall wird schon vorher durch 
Bildung eines Durchschittswertes und Vergleich mit diesem abgefangen...
Vielen Dank vorab für eure Hilfe!
Jörg

von Krapao (Gast)


Lesenswert?

kleinster = wert1
if kleinster > wert2 then kleinster = wert2
if kleinster > wert3 then kleinster = wert3
print kleinster

von sw1ft (Gast)


Lesenswert?

Krapao schrieb:
> kleinster = wert1
> if kleinster > wert2 then kleinster = wert2
> if kleinster > wert3 then kleinster = wert3
> print kleinster

Dabei musst du aber kleinster noch auf das maximum setzen am Anfang

von sw1ft (Gast)


Lesenswert?

Ok, nach nochmaligem lesen habe ich scheisse verzapft :)

von Jörg (Gast)


Lesenswert?

Das hätte mich ja jetzt echt gewundert, wenn's so einfach geht...
Jörg

von Udo S. (urschmitt)


Lesenswert?

Jörg schrieb:
> Das hätte mich ja jetzt echt gewundert, wenn's so einfach geht...
> Jörg

Probiers aus, es geht so einfach.

von Jörg (Gast)


Lesenswert?

Hmm, habe mir das ganze mal durchgelesen -- stimmt!
Allerdings fällt mir dabei auf, dass ich mich unklar ausgedrückt habe. 
Ich möchte nicht (nicht nur) wissen, welches der kleinste Wert ist, 
sondern auch in welcher Variable er steht; sprich: welcher meiner 
AD-Wandler-Eingänge hat denn den kleinsten Wert gemessen? Das bekomme 
ich aber auf diese Weise nicht raus, bzw nur mit nochmaligem 
vergleichen...

von D. I. (Gast)


Lesenswert?

dann nimm halt noch eine variable mit...

von Udo S. (urschmitt)


Lesenswert?

Jörg schrieb:
> Hmm, habe mir das ganze mal durchgelesen -- stimmt!
> Allerdings fällt mir dabei auf, dass ich mich unklar ausgedrückt habe.
> Ich möchte nicht (nicht nur) wissen, welches der kleinste Wert ist,
> sondern auch in welcher Variable er steht;

Das hat dein Code aber auch nicht gemacht.
Dann nimmst du halt noch ne Variable "adnummer" und setzt die analog zu 
kleinster erst auf 1 und falls die if Bedingung zutrifft auf 2 oder 3.
Das sind 3 zeilen mehr.

von Verwirrter Anfänger (Gast)


Lesenswert?

Krapao schrieb:
> kleinster = wert1
> if kleinster > wert2 then kleinster = wert2
> if kleinster > wert3 then kleinster = wert3
> print kleinster

wird zu:
1
uint16_t wert = wert1;
2
uint8_t index = 1;
3
if( wert2  < kleinster) {
4
  kleinster = wert2;
5
  index = 2;
6
}
7
if( wert3  < kleinster) {
8
  kleinster = wert3;
9
  index = 3;
10
}

von Udo S. (urschmitt)


Lesenswert?

...und schon kann wieder jemand copy und paste machen ohne selber 
nochmal denken zu müssen. Na ja nicht ganz da er es in basic braucht.

So fängts an und endet bei Guttenberg

von Jörg (Gast)


Lesenswert?

Nana, mal nicht so gehässig. Wir sind doch alle aus "Spass an der 
Freude" hier! Ich habe nicht nach einer fertigen Lösung gefragt, sondern 
nach Denkanstößen. Zugegeben: Bei so kleinen "Schnipseln" ist es 
sicherlich schwer, den "Denkanstoß" ohne Listing zu liefern...

Dennoch setzt man sich doch als Fragender mit der Materie auseinander 
und wird -- wenn man es ernst meint -- auch die aufgezeigte Lösung 
durchdenken, um den Gedankenweg zu verinnerlichen. Mir geht's nicht 
(nur) um das Lösen des Problems sondern auch und vor allem um das 
Verstehen der Materie. Ich betreibe die AVR-Programmierung als Hobby 
(okay, noch Anfänger, wie eingangs schon erwähnt) und brauche das nicht 
beruflich und auch nicht für irgendwelche Prüfungen oder Hausaufgaben.

Zurück zum Listing: Mein Code sehr wohl hat die Variable bestimmt, die 
den kleinsten Wert beinhaltet. Die Zeile
1
        wert1 kleinster

enthält kein "=" -- es geht hier nicht um die Zuweisung eines Wertes zu 
einer Variable namens "kleinster". Ich wollte hier nur zum Ausdruck 
bringen, dass ich hier weiß, Wert1 ist der kleinste. Hier wird der Code 
eingefügt, der in dem Fall ausgeführt werden soll (oder eine Sub 
aufgerufen oder so...). Okay, hätte ich auch dazuschreiben können.
Ist unter diesem Gesichtspunkt mein Weg so viel schlechter als der von 
euch vorgeschlagene?
Jörg

von Udo S. (urschmitt)


Lesenswert?

Jörg schrieb:
> Ist unter diesem Gesichtspunkt mein Weg so viel schlechter als der von
> euch vorgeschlagene?
Ohne deinen Code vollständig auf Richtigkeit geprüft zu haben:
Überlege dir mal wie dein Code bei 4 oder 5 Variablen aussehen würde und 
wie der von Krapao.

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:

> Zurück zum Listing: Mein Code sehr wohl hat die Variable bestimmt, die
> den kleinsten Wert beinhaltet. Die Zeile
>
>
1
        wert1 kleinster
>
> enthält kein "=" -- es geht hier nicht um die Zuweisung eines Wertes zu
> einer Variable namens "kleinster". Ich wollte hier nur zum Ausdruck
> bringen, dass ich hier weiß, Wert1 ist der kleinste. Hier wird der Code
> eingefügt, der in dem Fall ausgeführt werden soll (oder eine Sub
> aufgerufen oder so...). Okay, hätte ich auch dazuschreiben können.
> Ist unter diesem Gesichtspunkt mein Weg so viel schlechter als der von
> euch vorgeschlagene?

Kommt auf den auszuführenden Code an.

Ach noch zu überlegen: Bei dir kommt der Teil "Wert 3 ist kleinster" 2 
mal vor. Wenn da in beiden Fällen jeweils identischer Code auszuführen 
ist (was wohl anzunehmen ist), heißt das das du eine Code-Duplizierung 
betreibst. Und sowas ist immer schlecht, weil man Gefahr läuft bei 
Änderungen, die in beiden Fällen gemacht werden müssen, eine der beiden 
Stellen zu übersehen.

Aber verallgemeinere deine Lösung doch mal auf 4 Werte. :-)

von Udo S. (urschmitt)


Lesenswert?

Schneller :-)

Edit: Schau dir an wieviel Assemblerbefehle dein Code erzeugt und 
wieviel der von Krapao.
Und überlege dir wie einfach dein Code auf Fehlerfreiheit zu überprüfen 
ist und wie einfach der von Krapao.

von Krapao (Gast)


Lesenswert?

Das "Problem" ist, dass dein Code nur eine Art Pseudocode ist. Das 
Arbeiten mit dem schnell hingeschriebenen Ergebnis xyz kleinster 
bringt die Ineffizienz.

Für eine effiziente Lösung würde man die Werte in einem Array halten und 
dann mit einer Schleife darüberlaufen. Den Schleifenzähler des kleinsten 
Wertes merkt man sich als Ergebnis. Nach der Schleife nimmt man sich mit 
dem Merkwert den tatsächlichen Wert aus dem Array und macht was damit. 
Das ist dann ein Dreizeiler und kein if-then-elseif-endif Massaker.

Bei einer Handvoll Werten kann man die Schleifenlösung auch wie oben 
ausformulieren, um den Code bzgl. Ausführungsgeschwindigkeit zu 
optimieren. bei 42 Werten ist das eher kontraproduktiv weil es zu 
platzaufwändig ist.

von Jörg (Gast)


Lesenswert?

Okay, ihr habt mich überzeugt. Vor allem die Sache mit dem Array und der 
Schleife gefällt mir, an ein Array hatte ich zunächst gar nicht gedacht!

Wie gesagt, der Wert der Variable ist gar nicht interessant (oder nur 
sekundär) -- ich möchte (zunächst) nur wissen, welcher Eingang den 
nidrigsten Wert geliefert hat. Es geht dabei um die Messung von drei 
Strömen, die "eigentlich" gleich sein sollten. Wenn einer kleiner wird 
als die anderen, sollte die Schaltung Alarm schlagen...

Vielen Dank nochmals an alle, die Hinweise waren gut! Vor allem der mit 
dem Array! ;-)
Gruß, Jörg

von slow (Gast)


Lesenswert?

Diese Aufgabenstellung ist aber ganz anders, als von Dir bisher 
beschrieben.
Mit den Wandlern wirst Du nie exakt die gleichen Werte messen, so gibt 
Deine Software permanent Alarm.

Willst Du das so wirklich?

von Jobst M. (jobstens-de)


Lesenswert?

Jörg schrieb:
> Es geht dabei um die Messung von drei
> Strömen, die "eigentlich" gleich sein sollten. Wenn einer kleiner wird
> als die anderen, sollte die Schaltung Alarm schlagen...

- Die Werte in ein Array
- Array sortieren lassen
- Wenn (größter Wert - kleinster Wert) > tolerierte Abweichung dann 
Alarm


Gruß

Jobst

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.