Definitionen sind (glaube ich) die vom ersten Post:
Code:
Dim Empf(5) As Word
Dim Channel As Byte
Hm, das ist mir durchaus klar, aber ich kann nicht den ganzen Code nach ASM übersetzen; Trotzdem möchte ich die ISR "etwas" verschnellern. Momentan (also reines Bascom) sinds 162 Takte, das ist zulange.
Worum gehts?
Mit dieser ISR wird das Summensignal des Empfängers eingelesen (und näturlich mithilfe des Timer0). Es gibt 5 relevante Kanäle, die die Software benötigt. Durchschnittsberechnungen sind keine vorhanden. Hier nochmal der orignale Code:
Code:
Getreceiver: 'falling edge detection
If Channel > 0 And Channel < 6 Then 'fill empf(1-5)
Empf(channel) = Timer0
End If
Timer0 = 6 'preload for 4.096 ms
Incr Channel 'if no falling edge was detected for a longer period, channel will increase above 11
Return
(wie gesagt von Willa)
Diesen möchte ich auf ASM umschreiben. Habs auch schon mal so gemacht:
Code:
Isr_int0:
push r16 'sichere r16
lds r16 , {channel} 'lade channel in r16
cpi r16 , 6 'vergleiche r16 mit 6
brlo _lower 'springe, wenn kleiner
rjmp _out_of_range 'sonst springe nach _out_of_range
_lower: '_lower Label
cpi r16 , 1 'vergleiche r16 mit 1
brge _higher 'springe, wenn größer gleich
rjmp _out_of_range 'sonst springe nach _out_of_range
_higher: '_higher Label
'######################################################################################################################################
'######################################################################################################################################
Empf(channel) = Timer0
'######################################################################################################################################
'######################################################################################################################################
_out_of_range: '_out_of_range Label
ldi r16 , 6 'lade 6 in r16
!out tcnt0 , r16 'schreibe r16 in timer0
lds r16 , {channel} 'lade Channel in r16
inc r16 'erhöhe Channel um 1
sts {channel} , r16 'lade r16 in Channel
pop r16 'stelle r16 wieder her
Return
Das waren glaube ich 43 Takte, was auch schon deutlich besser ist. (Als Nosave INT) Aber da geht doch noch mehr, oder nicht?
Gruß
Chris
EDIT:
Bei dem letzten Code habe ich vergessen, die Register, die Bascom für die Anweisung "Empf(channel) = Timer0" braucht, zu sichern. Das sind R10, R11, R24, R26, R27.
Das macht dann nochmal 5(Register) * 2(Push&Pop) * 2(Takte pro Befehl) = 20 Takte mehr.
Lesezeichen