Hatte mich ein wenig gespielt, mit Testumgebung:
Code:
$Regfile = "m32def.dat"
$Crystal = 4000000
$hwstack = 32
$swstack = 8
$framesize = 24

'(
Isr_int0:
If Channel > 0 And Channel < 6 Then
  Empf(channel) = Timer0
End If
Timer0 = 6
Incr Channel
Return
')

Dim tmp as Byte

Dim Empf(5) As Word
Dim Channel As Byte
Dim Empf_tmp As Word

Do
  channel = 0
    For tmp = 0 To 7
      TCNT0 = 255 - tmp
        Gosub Isr_int0
    Next tmp
Loop


Isr_int0:                                                   ' cycles in range: 53, out of range: 29
!PUSH    R16
!IN      R16,       SREG
!PUSH    R16
!LDS     R16,       {channel}
!DEC     R16
!CPI     R16,       5
!BRCC    NotInRange
!PUSH    R17
!PUSH    XL
!PUSH    XH
LoadAdr Empf(1) , X
!MOV     R17,       R16
!LSL     R17
!ADD     XL,        R17
!CLR     R17
!ADC     XH,        R17
!IN      R17,       TCNT0
!ST      X+,        R17
!CLR     R17
!ST      X,         R17
!POP     XH
!POP     XL
!POP     R17
!NotInRange:
!INC     R16
!INC     R16
!STS     {channel}, R16
!LDI     R16,       6
!OUT     TCNT0,     R16
!POP     R16
!OUT     SREG,      R16
!POP     R16
Return

'(
Isr_int0:                                                   ' cycles in range: 51, out of range: 30
!PUSH    R16
!IN      R16,       SREG
!PUSH    R16
!LDS     R16,       {channel}
!DEC     R16
!CPI     R16,       5
!BRCC    NotInRange
!PUSH    R17
!PUSH    XL
!PUSH    XH
LoadAdr Empf(1) , X
!CLR     R17
!LSL     R16
!ADD     XL,        R16
!ADC     XH,        R17
!IN      R16,       TCNT0
!ST      X+,        R16
!ST      X,         R17
!POP     XH
!POP     XL
!POP     R17
!NotInRange:
!LDS     R16,       {channel}
!INC     R16
!STS     {channel}, R16
!LDI     R16,       6
!OUT     TCNT0,     R16
!POP     R16
!OUT     SREG,      R16
!POP     R16
Return
')
die Variable Meanrx in Empf geschrieben wird
Ich sehe nicht ohne Weiteres, wie groß die werden kann.

Diese Zugriffe dürften übrigens recht "teuer" sein in Bezug auf die Ausführungszyklen:
Code:
If Empf(throttlechannel) > 61 And Empf(throttlechannel) < 139 Then       'don't process values that can't be correct
Sempf(throttlechannel) = Empf(throttlechannel) - 61
Wenn Bascom die Arrayadresse nicht zur Compilezeit kennt, wie bei einem durch Variable indizierten Array, so wird zu jedem Vergleich die gleiche Arrayzelle immer wieder neu geladen. Du könntest durch temporäre Variablen eine Beschleunigung der Rechnung erreichen.

Und da Du ein Word nicht atomar verarbeiten kannst, hättest Du auch ein Problem wenn im Wordarray tatsächlich Werte > 255 drinstehen würden.
Du kannst nicht verhindern (außer durch Sperren der Interrupts) dass der Interrupt gerade dann unterbricht, nachdem das erste Byte von Empf(x) zum Vergleich eingelesen wurde, die ISR Empf(x) dann beide Bytes verändert und nach Rückkehr das zweite Byte des nun veränderten Empf(x) zusammen mit dem ersten, nicht veränderten Byte weiterverarbeitet wird.