- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: Function - liefert falsche Werte

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.06.2011
    Beiträge
    5

    Function - liefert falsche Werte

    Anzeige

    Powerstation Test
    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

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

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Glühlampe Beitrag anzeigen
    Im ersten Durchlauf ist Ergenis(2) = 0 und Filter2 ist fix 95 somit sollte (0*95) 0 herrauskommen
    Ausrechnen tut es aber 190950.

    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
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.06.2011
    Beiträge
    5
    Ich lass es auch nur im Simulator laufen und bei mir kommt nur murks raus.
    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
    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

    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
    Geändert von Glühlampe (16.01.2018 um 19:50 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    Zitat Zitat von Glühlampe Beitrag anzeigen
    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:
    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
    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.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.06.2011
    Beiträge
    5
    Auch dein Bascom rechnet falsch
    Alle 3 Filter bekommen die selben Werte, somit sollte auch 3x das Gleiche rauskommen.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.702
    Blog-Einträge
    133
    STÖHN
    Da brauch ich jetzt mehr Zeit

    - - - Aktualisiert - - -

    Zitat Zitat von Glühlampe Beitrag anzeigen
    Auch dein Bascom rechnet falsch
    Alle 3 Filter bekommen die selben Werte, somit sollte auch 3x das Gleiche rauskommen.
    Die Sensorwerte waren unterschiedlich
    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
    Ich hab die mal alle auf 2000 geändert und bekomme:
    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
    Immer noch falsch?
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    30.06.2011
    Beiträge
    5
    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

Ähnliche Themen

  1. DCF 77 liefert seltsame Werte
    Von Goldenflash im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 08.08.2011, 09:44
  2. ITG3200 an AVR liefert keine Werte
    Von robert_s im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 27.07.2011, 16:12
  3. ADS830 liefert komische werte
    Von robodriver im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 05.09.2007, 19:20
  4. Devantech SRF 10 US liefert seltsame Werte, kaputt?
    Von ACU im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 17.02.2007, 21:50
  5. PIC liefert keine genauen werte
    Von Mad Max im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 04.08.2006, 21:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus