PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Function - liefert falsche Werte



Glühlampe
16.01.2018, 14:53
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


$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


Der erste Filter wird noch richtig berechnet, der zweite und dritte dann nicht mehr!
Es kracht:strom an
Temp(2) = Ergebnis(2) * Filter2 bzw. bei
Temp(2) = Ergebnis(3) * Filter2
Im ersten Durchlauf ist Ergenis(2) = 0 und Filter2 ist fix 95 somit sollte (0*95) 0 herrauskommen :rolleyes:
Ausrechnen tut es aber 190950.:confused:

Kann mir dazu einer einen Tip geben warum, ich bin irgendwie blind.

Searcher
16.01.2018, 16:34
Im ersten Durchlauf ist Ergenis(2) = 0 und Filter2 ist fix 95 somit sollte (0*95) 0 herrauskommen :rolleyes:
Ausrechnen tut es aber 190950.:confused:

Kann mir dazu einer einen Tip geben warum, ich bin irgendwie blind.

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

Glühlampe
16.01.2018, 18:41
Ich lass es auch nur im Simulator laufen und bei mir kommt nur murks raus.

$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 ist mein kompletter 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

Das kommt als Ausgabe...
Ich benutze Bascom 2.0.8.0

Searcher
16.01.2018, 19:05
Das kommt als Ausgabe...
Ich benutze Bascom 2.0.8.0

Hi,
seltsam. Ich habe 2.0.7.5 Demo Version und bekomme in dem UART0 Window mit dem gleichen Program:


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


Ich bin im Augenblick ratlos, woran das liegen kann:confused: 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.

Gruß
Searcher

Glühlampe
16.01.2018, 19:13
Auch dein Bascom rechnet falsch :-)
Alle 3 Filter bekommen die selben Werte, somit sollte auch 3x das Gleiche rauskommen.

Searcher
16.01.2018, 19:35
STÖHN :(
Da brauch ich jetzt mehr Zeit :-)

- - - Aktualisiert - - -


Auch dein Bascom rechnet falsch :-)
Alle 3 Filter bekommen die selben Werte, somit sollte auch 3x das Gleiche rauskommen.

Die Sensorwerte waren unterschiedlich


Dim Sensor_x As Integer : Sensor_x = 1000
Dim Sensor_y As Integer : Sensor_y = 2000
Dim Sensor_z As Integer : Sensor_z = 3000


Ich hab die mal alle auf 2000 geändert und bekomme:


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


Immer noch falsch?

Glühlampe
16.01.2018, 20:06
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)



$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