Definitionen sind (glaube ich) die vom ersten Post:
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.Code:Dim Empf(5) As Word Dim Channel As Byte
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:
(wie gesagt von Willa)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
Diesen möchte ich auf ASM umschreiben. Habs auch schon mal so gemacht:
Das waren glaube ich 43 Takte, was auch schon deutlich besser ist. (Als Nosave INT) Aber da geht doch noch mehr, oder nicht?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
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.







Zitieren

Lesezeichen