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)