Hallo Andreas,
nein, das stimmt so nicht. Du hast Servo() als Word deklariert, da muss der Index nach Abzug der 1 noch mit 2 multipliziert werden, Du willst auch nicht den Wert des angesprochenen Arrayelements in Rslt haben, sondern in Timer1. Im Moment schreibst Du die Adresse des ge-indexten Bytes in den Timer.
Außerdem kannst Du Timer1 TCNT1L/H nicht mehr mit !OUT erreichen, denn das Timerregister ist beim ATM8 an &h2C/2D, das solltest Du zumindest wissen, wobei hier Bascom eine Ersetzung durch !STS durchführen wird, ohne dass Du's merkst.
Auch ist Kanal ein Byte, als geht !LDS R19, {Kanal+1} nicht, sondern R19 wird einfach auf 0 gesetzt.
Es muss also nach dem !SBIW , 1 mal 2 multipliziert werden, das geht per Linksschieben mit !LSL für das Lowbyte und !ROL für das Highbyte. Dann stimmt die Adresse für das ge-indexte Word schon mal, von welchem dann dann erst das Lowbyte per !LD Rx, Z+ und dann das Highbyte per !LD Ry, Z gelesen wird. Dann speicherst Du Rx/y nach TCNT1L/H, wobei Du zuerst das Highbyte des TCNT1 schreiben musst und dann das Lowbyte, siehe ATM8 Datenblatt unter Accessing 16-bit Registers.