Forum: Mikrocontroller und Digitale Elektronik Bascom: Größte Zahl in einem Array finden


von Christoph (Gast)


Lesenswert?

Habe leider keine Ahnung wie ich in einer Ansammlung von Zahlen, die bei 
einer Analogspannungsmessung entstehen die größte und kleinste Zahl 
finde. Welche Bascom-Befehle verwendet man da?

von Franz josef V. (advors)


Lesenswert?

Schau mal bei den Befehlen MIN und MAX nach. Diese arbeiten auch bei 
Arrays.

Josef

von Netbird (Gast)


Lesenswert?

Einige Programmzeilen lösen das Problem.
Nehmen wir an, dass die ADC-Werte zwischen 0 und 1024 schwanken (10Bit) 
und Du den aktuellen Wert in der Variablen wert ablegst.

mini=1024: maxi=0   'min
DO
  wert=adc(...)   'je nach Aufbau
  IF wert>maxi THEN maxi=wert
  IF wert<mini THEN mini=wert
LOOP ...

Wenn Du die Werte in einem Array abgelegt hast, ähnliches Vorgehen: 
Diesmal statt DO..LOOP eine FOR..NEXT Konstrktion und statt wert die 
Array-Variable nehmen, z.B. messwert(i).

von Kopfschüttler (Gast)


Lesenswert?

@Netbird (Gast):

Dein Kot ist ziemlich sinnfrei:

> Nehmen wir an, dass die ADC-Werte zwischen 0 und 1024 schwanken
1
mini=1024: maxi=0   'min
2
DO
3
  wert=adc(...)   'je nach Aufbau
4
  IF wert>maxi THEN maxi=wert
5
  IF wert<mini THEN mini=wert
6
LOOP ...

Die Variablen 'mini' und 'maxi' verden NIE verändert
und stehen IMMER auf der Anfangsinitialisierung.

Ist es denn wirklich zuviel verlangt nochmals VOR dem posten
das eigene Posting auf SINNHAFTIGKEIT zu überprüfen?

Kopfschüttelnd ...

von crazy horse (Gast)


Lesenswert?

jetzt muss ich aber mal den Kopf schütteln über den Kopfschüttler - ich 
kann da keinen prinzipiellen Fehler sehen, mal abgesehen von 
Basic-Syntax, das kann ich nicht beurteilen.
Sinngemäss genauso mach ich es auch, allerdings füttere ich min und max 
direkt  nach jeder Wandlung.

struct {
uint16 A2D_Buffer[4096];
uint16 Min;
uint16 Max;} SampleBuffer[2];

So kann ich direkt nach Abschluss des samplings min und max beurteilen, 
spart insgesamt Zeit.

von Karl H. (kbuchegg)


Lesenswert?

Kopfschüttler wrote:
> @Netbird (Gast):
>
> Dein Kot ist ziemlich sinnfrei:
>
>> Nehmen wir an, dass die ADC-Werte zwischen 0 und 1024 schwanken
>
>
1
> mini=1024: maxi=0   'min
2
> DO
3
>   wert=adc(...)   'je nach Aufbau
4
>   IF wert>maxi THEN maxi=wert
5
>   IF wert<mini THEN mini=wert
6
> LOOP ...
7
>
>
> Die Variablen 'mini' und 'maxi' verden NIE verändert
> und stehen IMMER auf der Anfangsinitialisierung.
>
> Ist es denn wirklich zuviel verlangt nochmals VOR dem posten
> das eigene Posting auf SINNHAFTIGKEIT zu überprüfen?

Ich kenn das:
Manchmal bellt man einfach den falschen Baum an, wie die Amerikaner
so schön sagen. Insbesonders wenn man dem Originalautor mangelnde
Sorgfalt vorwirft, wirkt das besonders lustig, wenn der Original-
autor absolut recht hat und der Antwortende sich verhaut hat.

In diesem Sinne: Kehre vor deiner eigenen Tür.

von Jörg B. (manos)


Lesenswert?

Er bezieht sich wahrschinlich auf die Zeile:

1
wert=adc(...)  'je nach Aufbau

die in der DO LOOP Schleife ohne Indexänderung immer gleich bleibt. 
Gemeint war mit dieser Zeile aber bestimmt nur "hier kommt jetzt der 
neue Wert in die Variable 'wert'" - darum steht hier ja auch "je nach 
Aufbau"...

Man darf nicht immer alles so wörtlich nehmen...

Außerdem sollte man schon - wenn man jemanden Fehler vorwirft - auch 
darauf hinweise wo derjenige zu suchen hat. Wäre konstruktiver...

von STK500-Besitzer (Gast)


Lesenswert?

>Er bezieht sich wahrschinlich auf die Zeile:

>wert=adc(...)  'je nach Aufbau

Mit der darauffolgenden Abfragenreihe werden auf jeden Fall Minima und 
Maxima gefunden. Danach kann man "wert" auch noch in ein Array 
schreiben...
Sofern "adc(...)" den "aktuellen" ADC-Wert zurückliefert funktioniert 
der Spaß auch ohne explizites Array.
Das Problem ist wohl eher, dass "mini" irgendwann gleich 0 und "maxi" 
irgendwann gleich 1023 ist. Das wären aber Werte, die man vorhersagen 
könnte...

von Jörg B. (manos)


Lesenswert?

Im Prinzip fehlt auch noch die Abbruchbedingung. FOR NEXT wäre 
wahrscheinlich der bessere Ansatz.

Hab grade gesehen, LOOP hat normalerweise auch eine Abbruchbedingung - 
kann man also auch nehmen...

von Andreas K. (oldcoolman)


Lesenswert?

Hallo Kopfschüttel

erstens hat netbird recht.
und zweitens hat er hinter loop ein paar pünktchen gemacht.

und noch zusätzlich auf die Änderung Richtung Array und
For ..Next hingewiesen.

ich stimme Herrn Buchegger vollkommen zu

Gruß an alle

Andi

von Netbird (Gast)


Lesenswert?

Hallo,

danke an alle, die mitdenken können/wollen!

Meine Zeilen sollen dem Frager zeigen, wie er vorgehen kann. Ob/ wann/ 
wie er seine Schleife abbricht, muss er wissen und in sein Programm 
einbauen. Dass er ggf. mini, maxi neu initialisieren muss, wenn's weiter 
gehen soll, ebenso.

Der einzige "Fehler", den ich gemacht habe -SHAME ON ME- ist, dass der 
ADC-Wert in Bascom gelesen wird mit GETADC(..), im Zweifel nachsehen in 
der Hilfe!!!

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.