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 ')Ich sehe nicht ohne Weiteres, wie groß die werden kann.die Variable Meanrx in Empf geschrieben wird
Diese Zugriffe dürften übrigens recht "teuer" sein in Bezug auf die Ausführungszyklen:
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.Code:If Empf(throttlechannel) > 61 And Empf(throttlechannel) < 139 Then 'don't process values that can't be correct Sempf(throttlechannel) = Empf(throttlechannel) - 61
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.






Zitieren


Lesezeichen