2016-09-19 3 views
0

Мне нужно сделать ассемблерную программу. Я должен сделать кольцевой счетчик работы как: -Кольцо счетчик avr ассемблер,

функции, на 8 светодиодов:

(0000 000X, 0000 00X0, 0000 0X00, 0000 X000, 000X 0000, 00X0 0000, 0X00 0000, X000 0000) 

я сделал программу, но она работает как:

(0000 000x, 0000 00xx, 0000 0xxx, 0000 xxxx, 000x xxxx, 00xx xxxx,0xxx xxxx,xxxx xxxx) 

может кто-то помочь мне, как делать светодиодные лампы один за другим?

мой код

.include "m2560def.inc" 
ldi r20, HIGH(RAMEND) ; R20 = high part of RAMEND address 
out SPH,R2      ; SPH = high part of RAMEND address 
ldi R20, low(RAMEND) ; R20 = low part of RAMEND address 
out SPL,R20  ; SPL = low part of RAMEND address 
ldi r20, 0xFF 
out DDRA, r20 
ldi r20, 0b10000001  
out PORTA, r20 
loop_1: ; Begin a loop 
    rcall Delay 
    lsl r20 
    out PORTA,r20 
    cpi r20,0x00 ; 
    breq reset 
jmp loop_1 
Delay: 
    inc r16 
    cpi r16,0xFF  
    brne del_1 
ret go back to loop 
del_1:  
    inc r21 
    cpi r21,0xFF 
    brne del_1 
jmp Delay  
reset: 
    ldi r20, 0xFF 
    out PORTA, r20 
ret 

ответ

1

Ваша информация немного редко, поэтому я должен выяснить, что вы делаете :)

Из того, что я вижу, что вы используете ATmega микроконтроллера

если «сброс» является функцией, которая отключает все светодиоды

reset: 
    ldi r20, 0xFF 
    out PORTA, r20 

затем этот код тел Мне кажется, что 0 на порту включает светодиод.

lsl r20 

LSL сдвиги влево, вставив ZERO, который включит светодиод, который не то, что вы хотите.

вы должны включить в крайний правый бит (не спрашивайте меня, как, я не familliar с Atmel)

Я хотел бы попробовать:

sec 
rol r20 

(это должно установить перенос флаг и rol смещает его как 1 на r20)

0

Я не уверен, что «счетчик звонков», но я предполагаю, что вы хотите сделать бегущий светодиод? Если да, то может быть, это помогает

ldi r20,0xff 
out PORTA,r20 ;output initialization 
ldi r23,1  ;unused registers 

loop : ;main loop 
out PORTA,i 
rcall delay ; you can use your delay function, i assume its correct 
rol r23  ; rotate the value 
cpi r23,0  ; this is "reset" when the led reach the 8th 
brne loop  ;back to loop 
ldi r23,1  ; reset the value 
rjmp loop  ;back to loop 

с помощью ROL изменит значение я
инициализации: 1 (0b0000 0001)
первый рол: (0b0000 0010)
..
..
седьмых рулет: (0b1000 0000)
8 рулоне: (0b0000 0000) < < - выполняют обнулить

надеюсь, что это помогает

Смежные вопросы