Hallo,
wie oder wo liest Du das Ergebnis ab? Ich habe Dein Programm im Bascom Simulator laufen lassen. Dort kommt die erwartete 0 heraus.
Gruß
Searcher
Hallo,
ich habe mehrer Sensoren welche ich gern Filtern möchte. Um dieses Programmiertechnisch einfach zu lösen war mein Ansatz eine Function zu schreiben.
Das Ganze ist recht einfach gehalten aber funktioniert doch nicht
Die Sensoren haben 3 Achsen X Y Z und ich möchte jede Achse filtern.
Dazu habe ich 3 Funktionen angelegt
Leider rechnt er an zwei Stellen falsch
Der erste Filter wird noch richtig berechnet, der zweite und dritte dann nicht mehr!Code:$regfile = "m168def.dat" $crystal = 3686400 $baud = 115200 'Bootloader Baud = 115200 $hwstack = 96 $swstack = 96 $framesize = 96 '*** Dim Filter1 As Byte : Filter1 = 5 Dim Filter2 As Byte : Filter2 = 100 - Filter1 Dim Sensor_x As Integer : Sensor_x = 1050 Dim Sensor_y As Integer : Sensor_y = 2010 Dim Sensor_z As Integer : Sensor_z = 1895 Dim Ergebnis(3) As Integer Dim Temp(2) As Long '**** Declare Function Filter_x(byval Ergebnis() As Integer , Byval Sensor_x As Integer ) As Integer Declare Function Filter_y(byval Ergebnis() As Integer , Byval Sensor_y As Integer ) As Integer Declare Function Filter_z(byval Ergebnis() As Integer , Byval Sensor_z As Integer ) As Integer Do Ergebnis(1) = Filter_x(ergebnis(1) , Sensor_x ) Ergebnis(2) = Filter_y(ergebnis(2) , Sensor_y ) Ergebnis(3) = Filter_z(ergebnis(3) , Sensor_z) Print Ergebnis(1) Print Ergebnis(2) Print Ergebnis(3) Sensor_x = Sensor_x + 1 Sensor_y = Sensor_y + 2 Sensor_z = Sensor_z + 3 Loop Function Filter_x(byval Ergebnis() As Integer , Byval Sensor_x As Integer ) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_x * Filter1 Temp(2) = Ergebnis(1) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Filter_x = Filter_out End Function Function Filter_y(byval Ergebnis() As Integer , Byval Sensor_y As Integer ) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_y * Filter1 Temp(2) = Ergebnis(2) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Filter_y = Filter_out End Function Function Filter_z(byval Ergebnis() As Integer , Byval Sensor_z As Integer ) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_z * Filter1 Temp(2) = Ergebnis(3) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Filter_z = Filter_out End Function
Es kracht anbzw. beiCode:Temp(2) = Ergebnis(2) * Filter2Im ersten Durchlauf ist Ergenis(2) = 0 und Filter2 ist fix 95 somit sollte (0*95) 0 herrauskommenCode:Temp(2) = Ergebnis(3) * Filter2
Ausrechnen tut es aber 190950.
Kann mir dazu einer einen Tip geben warum, ich bin irgendwie blind.
Ich lass es auch nur im Simulator laufen und bei mir kommt nur murks raus.Das ist mein kompletter CodeCode:$regfile = "m168def.dat" $crystal = 3686400 $baud = 115200 'Bootloader Baud = 115200 $hwstack = 96 $swstack = 96 $framesize = 96 '*** Dim Filter1 As Byte : Filter1 = 5 Dim Filter2 As Byte : Filter2 = 100 - Filter1 Dim Sensor_x As Integer : Sensor_x = 1000 Dim Sensor_y As Integer : Sensor_y = 2000 Dim Sensor_z As Integer : Sensor_z = 3000 Dim Ergebnis(3) As Integer Dim Temp(2) As Long '**** Declare Function Filter_x(byval Ergebnis() As Integer , Byval Sensor_x As Integer) As Integer Declare Function Filter_y(byval Ergebnis() As Integer , Byval Sensor_y As Integer) As Integer Declare Function Filter_z(byval Ergebnis() As Integer , Byval Sensor_z As Integer) As Integer Do Ergebnis(1) = Filter_x(ergebnis(1) , Sensor_x) Ergebnis(2) = Filter_y(ergebnis(2) , Sensor_y) Ergebnis(3) = Filter_z(ergebnis(3) , Sensor_z) Print Sensor_x = Sensor_x + 1 Sensor_y = Sensor_y + 2 Sensor_z = Sensor_z + 3 Loop Function Filter_x(byval Ergebnis() As Integer , Byval Sensor_x As Integer) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_x * Filter1 Temp(2) = Ergebnis(1) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Print "Filter 1 Rohwert " ; Sensor_x ; " Temp(1) " ; Temp(1) ; " Temp(2) " ; Temp(2) ; " Filter_out " ; Filter_out Filter_x = Filter_out End Function Function Filter_y(byval Ergebnis() As Integer , Byval Sensor_y As Integer) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_y * Filter1 Temp(2) = Ergebnis(2) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Print "Filter 2 Rohwert " ; Sensor_x ; " Temp(1) " ; Temp(1) ; " Temp(2) " ; Temp(2) ; " Filter_out " ; Filter_out Filter_y = Filter_out End Function Function Filter_z(byval Ergebnis() As Integer , Byval Sensor_z As Integer) As Integer 'Local Temp(2) As Long Local Filter_out As Integer Temp(1) = Sensor_z * Filter1 Temp(2) = Ergebnis(3) * Filter2 Temp(2) = Temp(2) + Temp(1) Temp(1) = Temp(2) / 100 Filter_out = Temp(1) Print "Filter 3 Rohwert " ; Sensor_x ; " Temp(1) " ; Temp(1) ; " Temp(2) " ; Temp(2) ; " Filter_out " ; Filter_out Filter_z = Filter_out End Function
Das kommt als Ausgabe...Code:Filter 1 Rohwert 1000 Temp(1) 50 Temp(2) 5000 Filter_out 50 Filter 2 Rohwert 2000 Temp(1) 2000 Temp(2) 200000 Filter_out 2000 Filter 3 Rohwert 3000 Temp(1) 2050 Temp(2) 205000 Filter_out 2050 Filter 1 Rohwert 1001 Temp(1) 97 Temp(2) 9755 Filter_out 97 Filter 2 Rohwert 2002 Temp(1) 2002 Temp(2) 200200 Filter_out 2002 Filter 3 Rohwert 3003 Temp(1) 2052 Temp(2) 205205 Filter_out 2052 Filter 1 Rohwert 1002 Temp(1) 142 Temp(2) 14225 Filter_out 142 Filter 2 Rohwert 2004 Temp(1) 2004 Temp(2) 200400 Filter_out 2004 Filter 3 Rohwert 3006 Temp(1) 2054 Temp(2) 205410 Filter_out 2054
Ich benutze Bascom 2.0.8.0
Geändert von Glühlampe (16.01.2018 um 19:50 Uhr)
Hi,
seltsam. Ich habe 2.0.7.5 Demo Version und bekomme in dem UART0 Window mit dem gleichen Program:
Ich bin im Augenblick ratlos, woran das liegen kann Habe noch ein WINXP SP3 laufen. Mir fallen auch keine Einstellungen in der IDE ein, die da Einfluß haben könnten. Melde mich, wenn mir noch was einfällt.Code:Filter 1 Rohwert1000 Temp(1) 50 Temp(2) 5000 Filter_out 50 Filter 2 Rohwert1000 Temp(1) 100 Temp(2) 10000 Filter_out 100 Filter 3 Rohwert1000 Temp(1) 150 Temp(2) 15000 Filter_out 150 Filter 1 Rohwert1001 Temp(1) 97 Temp(2) 9755 Filter_out 97 Filter 2 Rohwert1001 Temp(1) 195 Temp(2) 19510 Filter_out 195 Filter 3 Rohwert1001 Temp(1) 292 Temp(2) 29265 Filter_out 292 Filter 1 Rohwert1002 Temp(1) 142 Temp(2) 14225 Filter_out 142 Filter 2 Rohwert1002 Temp(1) 285 Temp(2) 28545 Filter_out 285 Filter 3 Rohwert1002 Temp(1) 427 Temp(2) 42770 Filter_out 427
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Auch dein Bascom rechnet falsch
Alle 3 Filter bekommen die selben Werte, somit sollte auch 3x das Gleiche rauskommen.
STÖHN
Da brauch ich jetzt mehr Zeit
- - - Aktualisiert - - -
Die Sensorwerte waren unterschiedlich
Ich hab die mal alle auf 2000 geändert und bekomme:Code:Dim Sensor_x As Integer : Sensor_x = 1000 Dim Sensor_y As Integer : Sensor_y = 2000 Dim Sensor_z As Integer : Sensor_z = 3000
Immer noch falsch?Code:Filter 1 Rohwert2000 Temp(1) 100 Temp(2) 10000 Filter_out 100 Filter 2 Rohwert2000 Temp(1) 100 Temp(2) 10000 Filter_out 100 Filter 3 Rohwert2000 Temp(1) 100 Temp(2) 10000 Filter_out 100 Filter 1 Rohwert2001 Temp(1) 195 Temp(2) 19505 Filter_out 195 Filter 2 Rohwert2001 Temp(1) 195 Temp(2) 19510 Filter_out 195 Filter 3 Rohwert2001 Temp(1) 195 Temp(2) 19515 Filter_out 195 Filter 1 Rohwert2002 Temp(1) 285 Temp(2) 28535 Filter_out 285 Filter 2 Rohwert2002 Temp(1) 285 Temp(2) 28545 Filter_out 285 Filter 3 Rohwert2002 Temp(1) 285 Temp(2) 28555 Filter_out 285
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
gelöst, so geht es.
Declare Function Filter(byval Filter_wert As Integer , Byval Raw_data As Integer) As Integer
Ergebnis(1) = Filter(ergebnis(1) , Sensor_x)
Der Name in der Declartion darf nicht der gleiche sein wie im Funktionsaufruf.
So also nicht!
Declare Function Filter(byval ergebnis(1) As Integer , Byval Raw_data As Integer) As Integer
Ergebnis(1) = Filter(ergebnis(1) , Sensor_x)
Code:$regfile = "m168def.dat" $crystal = 3686400 $baud = 115200 'Bootloader Baud = 115200 $hwstack = 96 $swstack = 96 $framesize = 96 '*** Dim Filter1 As Byte : Filter1 = 5 Dim Filter2 As Byte : Filter2 = 100 - Filter1 Dim Sensor_x As Integer : Sensor_x = 1000 Dim Sensor_y As Integer : Sensor_y = 2000 Dim Sensor_z As Integer : Sensor_z = 3000 Dim Ergebnis(3) As Integer '**** Declare Function Filter(byval Filter_wert As Integer , Byval Raw_data As Integer) As Integer Do Ergebnis(1) = Filter(ergebnis(1) , Sensor_x) Ergebnis(2) = Filter(ergebnis(2) , Sensor_y) Ergebnis(3) = Filter(ergebnis(3) , Sensor_z) Print Sensor_x ; " " ; Sensor_y ; " " ; Sensor_z ; " * " ; Print Ergebnis(1) ; " " ; Ergebnis(2) ; " " ; Ergebnis(3) If Sensor_x < 2500 Then Sensor_x = Sensor_x + 11 Sensor_y = Sensor_y + 11 Sensor_z = Sensor_z + 11 End If Loop Function Filter(byval Filter_wert As Integer , Byval Raw_data As Integer) As Integer Local Temp1 As Long Local Temp2 As Long Temp1 = Raw_data * Filter1 Temp2 = Filter_wert * Filter2 Temp2 = Temp2 + Temp1 Temp1 = Temp2 / 100 Filter = Temp1 End Function
Lesezeichen