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
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
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...
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.
...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
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
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.
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. :-)
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.
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.
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
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?
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