Я работаю над простым светодиодным проектом, используя микроконтроллер Atmega2560
. Светодиоды должны вращаться по кругу соответственно.
Константы DEF:
LED_AMNT
: Сколько светодиодов загорится
LED_DATA
: Какие светодиоды будут работать
Светодиодный дизайн макета:
LED_AMNT = 1 Анимация
LED_AMNT = 2 Анимация
Код, который я написал, работает немного неправильно.
1) L7 и L0 не работают вместе. В конце первый бит смещается в 0.
Шаг 0: L0 и L1 -> 0000 0011
...
Шаг 6: L6 и L7 -> 1100 0000
Шаг 7: L7 и L0 -> 1000 0001 (должны быть такими)
Шаг 7: L7 и L0 -> // пропущены к шагу 0
2) Когда я нажимаю кнопку LED_AMNT_INCREASE
, количество светодиодов увеличивается, но когда тур завершен. Он не увеличивается мгновенно. Я жду окончания текущего тура. (когда 0x80 меняется на 0x01)
Я написал простую программу, которая выглядит следующим образом:
.def LEDS = R16
.def LED_DIRECTION = R17
.def LED_AMOUNT = R19
.def LED_DATA = R21
.org 0
rjmp MAIN
MAIN:
ldi LEDS, 0xFF ; 0xFF = 1111 1111
ldi LED_DATA, 0x01 ; PORTC load register
ldi LED_DIRECTION, 0x01 ; 0x01 ==> Right, 0x00 ==> Left
ldi LED_AMOUNT, 0x01 ; total active led count
out DDRC, LEDS ; make PORTC's all pins to output
sbi PORTB, 0
sbi PORTB, 1
sbi PORTB, 2
LOOP_MAIN:
out PORTC, LED_DATA
call DELAY
call DELAY
call DELAY
call DELAY
call DELAY
sbis PINB, 0
rjmp BUTTON_CLICK_DIRECTION
sbis PINB, 1
rjmp BUTTON_CLICK_AMOUNT
cpi LED_DIRECTION, 0x01
brne LOOP_RIGHT
LOOP_LEFT:
lsl LED_DATA
cpi LED_DATA, 0x80
brne LOOP_MAIN
LEFT_RESET:
lsl LED_DATA
out PORTC, LED_DATA
call DELAY
mov LED_DATA, LED_AMOUNT
;mov LED_DATA, LED_AMOUNT
;brne LEFT_RESET
rjmp LOOP_MAIN
LOOP_RIGHT:
LOOP_MAIN_END:
rjmp LOOP_MAIN
BUTTON_CLICK_DIRECTION:
cpi LED_DIRECTION, 0x00
brne it_is
it_isnt:
ldi LED_DIRECTION, 0x01
rjmp yon_end
it_is:
ldi LED_DIRECTION, 0x00
yon_end:
rjmp LOOP_MAIN
BUTTON_CLICK_AMOUNT:
rol LED_AMOUNT
cpi LED_AMOUNT, 0x1F
breq amount_reset
rjmp amount_end
amount_reset:
ldi LED_AMOUNT, 0x01
amount_end:
mov LED_DATA, LED_AMOUNT
rjmp LOOP_MAIN
DELAY:
push r16
push r17
mov r16,0x40
ldi r17,0x00
ldi r18,0x00
_w0:
dec r18
brne _w0
dec r17
brne _w0
dec r16
brne _w0
pop r17
pop r16
ret
rol LED_AMOUNT; cpi LED_AMOUNT, 0x1f
... почему это не инкремент? - person Jester   schedule 21.11.2017