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.
Lesezeichen