Hallo,
möchte nun versuchen, eine ISR von Bascom nach ASM zu übersetzen. Ich denke, der Großteil ist mir auch gelungen, jedoch habe ich auch nach mehrstündigem Suchen im Web keine Tipps gefunden, wie man ein Array KONKRETT in ASM anspricht. Vielleicht kann mir das jemand erklären? Hier mal mein Code:
Bascom:
Code:
Isr_int0:
If Channel > 0 And Channel < 6 Then
Empf(channel) = Timer0
End If
Timer0 = 6
Incr Channel
Return
Datentypes:
Code:
Dim Empf(5) As Word
Dim Channel As Byte
Dim Empf_tmp As Word
Hier mein Übersetzungsversuch:
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
'###
in r16 , tcnt0
sts {empf_tmp} , r16
Empf(channel) = Empf_tmp
'###
_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
Meint ihr, das würde so funktionieren? Laut Simulation siehts ganz gut aus. Habt ihr noch Tipps, wie ich das ganze noch etwas verschlanken kann? Bin mir nicht sicher, ob die If-Else-Abfrage nicht noch etwas eleganter / kürzer ginge?
Außerdem wollte ich noch fragen, wie das ist, wenn man einem Word ein Byte in ASM zuweist? Soweit ich das verstanden habe, wird das Byte in das untere Byte des Words geschrieben, weil man ja das höherwertige Byte des Words mit {Word+1} anspricht, oder?
Vielen Dank schonmal
Gruß
Chris
Lesezeichen