Hallo Andreas,
Zitat Zitat von flyer_5 Beitrag anzeigen
Code:
!PUSH ZL
!PUSH ZH
Loadadr Servo(1) , z    
!LDS   R18,   {Kanal}
!LDS   R19,   {Kanal+1}
!SBIW  ZL,    1                   'Kanal fängt bei 1 an
!ADD   ZL,    R18
!ADC   ZH,    R19
!LD    R16,   Z
!STS   {Rslt},R16
!OUT     TCNT1L,     ZL
!OUT     TCNT1H,     ZH
Entspricht das ungefähr dem hier? Ich weiß leider nicht so genau in welchem Register dann was und wie reingeladen wird,und wie ich es an den Timer1 übergebe...
Code:
Timer1 = Servo(kanal)
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.