программа зависла после вызова и не возвращается из подпрограммы - PullRequest
0 голосов
/ 14 апреля 2019

Я новичок в программировании на ассемблере, и я пишу этот код, в котором я хочу сделать мигание светодиода, подключенного к portD.здесь я устанавливаю значение указателя стека равным ramend, но после вызова подпрограммы delay режим отладки останавливается и мигает все время!Я не понимаю почему!спасибо!

.include "m16def.inc"
 .ORG 0

 start:
	ldi r16 , high(ramend)
	out sph , r16
	ldi r16 , low(ramend)
	out spl , r16
	ldi r16 , 0b00110000 ; direction
	ldi r19 , 0b01001001    
	out DDRD , r16
	out PORTD , r19
	rjmp loop

loop:
	in r17 , PIND
	sbis PIND , 6          // part b
	rjmp BLINK
	rjmp loop

BLINK:
	ldi r24 , 2       
	ldi r18 , 0b00010000
	out PORTD , r18
	call delay
	ldi r18 , 0b00000000
	out PORTD , r18
	call delay
	dec r24
	brne BLINK   // if z = 0
	rjmp loop

delay:                 // For CLK(CPU) = 1 MHz
    LDI r20 , 16      // One clock cycle
delay1:
    LDI r21 , 125     // One clock cycle
delay2:
    LDI r22 , 250     // One clock cycle
delay3:
    DEC r22           // One clock cycle
    NOP                // One clock cycle
    BRNE delay3        // Two clock cycles when jumping to Delay3, 1 clock when continuing to DEC

    DEC r21            // One clock cycle
    BRNE delay2         // Two clock cycles when jumping to Delay2, 1 clock when continuing to DEC

    DEC r20             // One clock Cycle
    BRNE delay1         // Two clock cycles when jumping to Delay1, 1 clock when continuing to RET
RET
...