Zitat Zitat von wkrug Beitrag anzeigen
Probier mal pro sekunde nur 8 aufeinanderfolgende Messwerte aufzuaddieren und das Ergebnis duch 8 zu teilen.
Ich glaub, so etwas hab ich schon gemacht und verworfen. Bevor ich die Säge wieder anschmeiße und Meßreihen dazu aufnehme :meintest Du es so? ...

In einem Ringpuffer mit 8 Plätzen ( Middle( 8 ) ) werden 8 aufeinanderfolgende ICP Meßwerte, also der Abstand von einer Zündung zur anderen reihum abgespeichert.
Ist nach etwa einer Sekunde ein Update der Anzeige dran, wird der Mittelwert der letzten 8 Meßwerte gebildet und angezeigt. Siehe Code.

Code:
$regfile = "ATtiny2313.DAT"
$framesize = 24
$swstack = 24
$hwstack = 34
$crystal = 8000000
$baud = 57600
$lib "mcsbyteint.lbx"

Dim Icr_new As Word
Dim Icr_old As Word
Dim Icr_difference As Word
Dim Upmd As Dword
Dim Upm_o As Word
Dim Tov_count As Byte

Dim Middle(8) As Word
Dim Ar_idx As Byte
Dim Idx As Byte
Dim Diff As Dword
Dim Icp_alive As Byte
Dim Disp_upd As Byte
Dim Icp_events As Word

Print "Drehzahlmessung"

Tccr1b = Bits(cs11 , Ices1)                                 'prescaler = 8, input capture event on rising edge

On Timer1 Update_display
Enable Timer1

On Icp1 Get_icr
Enable Icp1

Enable Interrupts

Do
Loop

Get_icr:                                                    'called by an ICP event
   Incr Icp_events
   Icr_new = Icr1                                           'save ICR register
   Icr_difference = Icr_new - Icr_old
   Icr_old = Icr_new
   If Idx < 8 Then Incr Idx Else Idx = 1                    'value into 8 elements ring buffer
   Middle(idx) = Icr_difference                             'value into 8 elements ring buffer
   Icp_alive = 1
Return

Update_display:
  Incr Tov_count
  If Tov_count >= 15 Then                                   'display update in about 1s interval
    Incr Disp_upd                                           'sequence number for display update
     For Ar_idx = 1 To 8
       Diff = Middle(ar_idx) + Diff                         'add last 8 values before display upd
     Next
    Upmd = 480000000 / Diff                                 'calculate rpm 60.000.000/(diff/8)
    Upm_o = Upmd
    If Icp_alive = 0 Then Upm_o = 0
'Remark    Print "     " ; Chr(13) ; Upm_o ; Chr(13);
     Print Disp_upd ; ": " ; Upm_o ; "  " ; Icp_events
    Tov_count = 0
    Diff = 0
    Icp_alive = 0
    Icp_events = 0
  End If
  If Disp_upd = 60 Then Disp_upd = 0
Return