in r16, Led_Port // <-- should be in r16, DDRB
; sbr
sbr r16, 0b11111111
; out
out DDRB, r16
чтение из PORTB, запись в DDRB.Подозрительно.Почему все биты установлены, если только 3 используются в качестве выходов?
in r24, DDRD
cbr r24, 0b10000000
out DDRD,r24
Кстати, для изменения одного бита в регистрах 0 ... 31 (все PINx, DDRx, PORTx в ATmega328P находятся в этом диапазоне) вы можете использовать инструкции sbi
и cbi
.Например:
cbi DDRB, 7 // clear 7th bit of DDRB
; in
in r24, Switch_Port
; sbr
sbr r24, 0b11111111
; out
out Switch_Port,r24
Опять же, почему все 8 битов установлены, если вам нужен только один?
; Turn on the Blue Led to indicate Init is done!
sbi Led_Port,3
...
; Switch pressed = Red Led on
sbi Led_Port, 3
Итак, бит 3 Led_Port (PORTB) красный?Или синий?
В вашем коде беспорядок.Именованные константы смешиваются с непосредственными значениями.Если вы используете некоторые именованные константы.Пример:
.EQU LED_RED_pinno, 5
.EQU LED_BLUE_pinno, 3
...
; Turn on the Blue Led to indicate Init is done!
sbi Led_Port, LED_BLUE_pinno
...
; Switch pressed = Red Led on
sbi Led_Port, LED_RED_pinno
Также:
; sbis
sbis Switch_Port, 7
; sbi
sbi Led_Port, 3
sbis
пропускает следующую инструкцию, если установлен бит 7 в Switch_Port
.Switch_Port
равно PORTB
, и его бит 7 всегда очищается (если вы не записываете в него 1).
Чтобы проверить состояние входного порта, вам нужно прочитать PINx
(не PORTx!
) зарегистрироваться.В этом случае должно быть:
; Switch pressed = Red Led on
sbis PINB, 7 // (sic!)
sbi Led_Port, 3
; Switch not pressed = Red Led off
sbic PINB, 7 // (sic!)
cbi Led_Port,3