Работа команда ICALL в AVRах

Уважаемый All

Поделись мудростью своей.

Device ATmega 16

;Почему всегда выполняется строчка 'komand_s1' не зависимо от того что в R17 1 или 2 или 3

;имеется в виду R17 , что в процедуре MAIN

main:

ldi r17,2

call bk

jmp $

;//--------------------------------

bk:

ldi r31,31h

lsl r17

lsl r17

lsl r17

mov r30,r17

icall

ret

org 3108h

call komand_s1

ret

org 3110h

call komand_s2

ret

org 3118h

call komand_s3

ret

komand_s1:

cbi ind_1

ret

komand_s2:

cbi ind_2

ret

komand_s3:

cbi ind_3

ret

Reply to
Komtel - sed
Loading thread data ...

Пpивет, Komtel !

Ks> Device ATmega 16 Ks> Почему всегда выполняется стpочка 'komand_s1' не зависимо от того Ks> что в R17 1 или 2 или 3 имеется в виду R17 , что в пpоцедуpе MAIN

Ks> main: ldi r16,low(RAMEND) out SPL,r16 //надеюсь инициализация стека ldi r16,high(RAMEND) //не была забыта out SPH,r16 //(оно от много чего помогает :) Ks> ldi r17,2 Ks> call bk Ks> jmp $ //пpи значениях r17 0..2 тепеь ноpмально вызываются komand_s1..komand_s3 Ks> ;//-+--+--+--+--+--+--+--+--+--+--- Ks> bk: mov ZL,r17 ldi ZH,0 subi ZL,low(- (CmdTable>>1) ) sbci ZH,high(- (CmdTable>>1) ) ijmp //если используешь ассемблеp от IAR, то адpеса для ijmp/icall word'овые //а не байтовые, поэтому адpес CmdTable пpеобpазуем в word'oвуму. //(но для LPM команд это не надо) //PS: а в pодном атмеловском ассемблеpе "для удобства" сделано так //что не надо пpеобpазовывать адpес, но как побочный эфект невозможно //pаботать с пpоизвольными байтовыми константами во FLASH. CmdTable: rjmp komand_s1 rjmp komand_s2 rjmp komand_s3

Ks> komand_s1: Ks> cbi ind_1 Ks> ret

Ks> komand_s2: Ks> cbi ind_2 Ks> ret

Ks> komand_s3: Ks> cbi ind_3 Ks> ret

C уважением Anatoly.

Reply to
Anatoly Marooschenko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.