Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Messfehler beim Ultraschall-Modul HC-SR04 Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 20.02.2022 10:48)
 Als Antwort auf Messfehler beim Ultraschall-Modul HC-SR04 von Christian - 20.02.2022 10:05
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
Hallo Christian,

in diesem Fall liefert der Mittelwert kein brauchbares Ergebnis. Besser ist ein sogenanntes Medianfilter. Man sammelt zum Beispiel 5 Meßwerte in einem Array/Feld, sortiert es nach Größe und nimmt dann den mittleren Wert als Ergebnis. Dadurch werden Störungen herausgefiltert. Der "Ausrutscher" wandert durch die Sortierung an den Anfang oder an das Ende des Feldes.

Hier mal ein Demoprogramm zum Sortieren für die Open-Maxi. Es sollte auch auf der Open-Macro laufen. Für die kleinen OM-Controller Open-Micro, Open-Mini und Open-Midi muß im Sourcecode an jeder Stelle, an der WORD steht, BYTE verwendet werden. Es wird der sogenannte "Bubble Sort"-Algorithmus verwendet. Dieser Algorithmus ist nicht sehr schnell. Wenn das Feld bereits vorsortiert ist, bietet es sich an, den sogenannten "Insertion Sort" zu verwenden. Siehe Link unten. Ich werde dieses Demoprogramm zum Bubblesort in den nächsten Tagen noch einmal offiziell hier in unserem Forum veröffentlichen. Hier eine Vorabversion:

' ===========================================================================
' Demoprogramm: Die ANZAHL Elemente eines WORD-Feldes sortieren
' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 04. Februar 2022
' ===========================================================================

' Dieses Programm nutzt den BubbleSort-Algorithmus von der folgenden Webside:

' https://homepages.bluffton.edu/~nesterd/apps/SortingDemo.html

' Dieses Beispielprogramm demonstriert Zeiger, Felder und Arrays auf der OM.

' An dieser Stelle möchte ich mich bei Dirk von "das |_ Team" und bei Norbert
' für ihre Unterstützung bedanken. In Memoriam Norbert Klein.

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"               'Definitionen für die Open-Maxi

DIM bitarray  BYTE               'ein Bitarray
DIM debug     BIT[1] OF bitarray 'ist HIGH, wenn Debugging aktiv

DEFINE ANZAHL 8                  'Anzahl der Elemente des Feldes

DIM a,b,c,i,j BYTE               'temporäre Bytevariablen

DIM a0,a1,a2,a3,a4,a5,a6,a7 WORD 'WORD-Feld mit ANZAHL Elementen

DIM h  WORD                      'Hilfsvariable
DIM ^s WORD                      'Zeiger auf ein Word im USER-RAM
DIM ^d WORD                      'Zeiger auf ein Word im USER-RAM

' --- Hauptprogramm ---------------------------------------------------------

PrintSpc=ON    'Bei PRINT dezimale Zahlen mit führendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

' Titel:

PRINT
PRINT "Sortieren"
PRINT "========="

' Initialisierungen:

RANDOMIZE 64   'Zufallsgenerator initialisieren (z.B. RANDOMIZE TIMER)

debug=ON 'OFF  'Sortierschritte anzeigen

' Das Hauptprogramm:

s=^a0          'WORD-Feld mit Zufallswerten laden
FOR a=1 TO ANZAHL
  @s=RAND
  ADD s,1
NEXT a

?:?"Feldinhalt vor dem Sortieren:";
?a0;a1;a2;a3;a4;a5;a6;a7

IF debug THEN ?

BubbleSort     'Sortierung durchführen

?:?"Feldinhalt nach dem Sortieren:";
s=^a0
FOR a=1 TO ANZAHL
  ?@s;
  ADD s,1
NEXT a
?

?:?"Programmende."
END            'Zurück in den Hostmodus. Neustart mit RETURN-Taste.

' --- Subroutinen und Funktionen --------------------------------------------

' Das Feld a0,a1,a2,... sortieren. Es hat ANZAHL Elemente.

PROCEDURE BubbleSort 'COMPILE

  ' BubbleSort(size) {
  '    for (i=size-1; i > 0; i--)
  '    {
  '       for (j=0; j < i; j++)
  '       {
  '          if (a[j] > a[j+1])
  '             swap a[j] and a[j+1];
  '       }
  '    }
  ' }
  ' /* DONE */

  i=ANZAHL-1
  WHILE i>0
    s=^a0      'Zeiger mit USER-RAM-Adressen laden
    d=^a0+1
    j=0
    WHILE j<i
      IF @s > @d THEN
        IF debug THEN
          ?"Vertausche Element";j;" und";j+1;", also";@s;" und";@d;"."
        END IF
        h=@s   'Zwei Elemente des Feldes tauschen
        @s=@d
        @d=h
      END IF
      ADD s,1  'Zeiger inkrementieren
      ADD d,1
      ADD j,1
    WEND
    SUB i,1
  WEND

  RETURN
END PROCEDURE

' --- Programmende ---------------------------------------------------------


Viel Spaß und Erfolg mit den OM-Mikrocontrollern!

Dietmar

Passender Link: Sorting Demonstrations

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten:

Re: Messfehler beim Ultraschall-Modul HC-SR04 (von Christian - 20.02.2022 11:31)