Arduino Uno [Using Assembly] - переключение светодиодного модуля с помощью джойстика - PullRequest
0 голосов
/ 21 сентября 2019

Новичок в Arduino и пытается создать программу, которая будет переключать светодиодный модуль, подключенный к контактам 5,4 и 3 порта PORTB (13,12 и 11 на плате).

Джойстик имеет соединениена массу и соединение, от SW до контакта 7 PORTD (7 на плате).

Идея состоит в том, чтобы использовать программирование сборки для этого.Это программа, которую я сделал до сих пор (она может быть очень неправильной, поскольку я учусь по ходу дела)

Обновление

Я настроил свой код и исправил некоторые вещи.Часть Setup запускается и включает синий светодиод, когда я удаляю часть apploop.Однако компонент apploop не работает, и красный светодиод не срабатывает, когда я переключаю джойстик.Попробовал взглянуть на другие примеры, но пока не смог исправить это

Любые указатели были бы очень благодарны!

   #include "m328pdef.inc"
.global main
.EQU Red_Pin, 17
.EQU Green_Pin, 16
.EQU Blue_Pin, 15
.EQU Led_Port, PORTB
.EQU Switch_Pin, 11
.EQU Switch_Port, PORTD
main:
appSetup:
; Init the 3 output RGB LED's
; in
in r16, Led_Port
; sbr
sbr r16, 0b11111111
; out
out DDRB, r16


; Init the input switch, configure with internal pull up resistor

; in
in r24, DDRD
; cbr
cbr r24, 0b10000000
; out
out DDRD,r24

; in 
in r24, Switch_Port

; sbr
sbr r24, 0b11111111

; out
out Switch_Port,r24


; Turn on the Blue Led to indicate Init is done!

; sbi

sbi Led_Port,3

appLoop:

; Switch pressed = Red Led on

; sbis
sbis Switch_Port, 7

; sbi
sbi Led_Port, 3
; Switch not pressed = Red Led off
; sbic
sbic Switch_Port, 7

; cbi
cbi Led_Port,3

; rjmp appLoop ; keep doing this indefinitely

rjmp appLoop

1 Ответ

0 голосов
/ 25 сентября 2019
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
...