Сборка Arduino uno AVR со светодиодами
В настоящее время я прохожу вводный курс по языку ассемблера. Моя задача — использовать комплект экранов джойстика sparkfun, чтобы сделать что-то с Arduino Uno. Я считаю, что включить светодиоды проще всего. Мы должны запрограммировать его на ассемблере AVR (примечание: весь семестр мы использовали только ассемблер nasm).
Я действительно не знаю, как это нужно сделать, но я бы хотел, чтобы свет включался при нажатии кнопки (один светодиод на кнопку). Я также хочу использовать аналоговые контакты, чтобы светодиоды джойстика плавно появлялись и гасли.
ниже показан код, который у меня есть прямо сейчас, но у меня нет оборудования для его тестирования.
Я на правильном пути или это ужасный беспорядок? Профессор имел в виду контакты Arduino с шестнадцатеричным кодом, но я не смог найти сопоставление контактов и их шестнадцатеричных значений.
Заранее спасибо.
.include "/usr/local/include/atmega32u4.def"
.global main
.section .text
main:
cbi PortD, 2 ; joystick button
cbi PortD, 3 ; right button
cbi PortD, 4 ; up button
cbi PortD, 5 ; down button
cbi PortD, 6 ; left button
cbi PortC, 0 ; joystick vertical output
cbi PortC, 1 ; joystick horizontal output
ldi r16, 0x7c ; select pins 2-6 for button input mask
in ddrd, r16 ; set digital button pins as input
ldi r17, 0x03 ; select pins 0 & 1 for joystick input
in ddrc, r17 ; set analog joystick pins as input
ldi r18, 0x1f ; select pins 8-12 for button LED output
out ddrb, r18 ; set digital button LED pins as output
ldi r18, 0x0c ; select pins 2 & 3 for joystick LED ouput
out ddrc, r18 ; set analog joystick LED pins as output
loop:
ldi r20, PortD ; read in from digital pins 0-7
and r20, r16 ; apply button input mask
mov r20, r20 >> 2 ; shift left twice
sts PortB, r20 ; turn on LEDs of pushed buttons
ldi r20, PortC ; read in from analog pins
and r20, r17 ; apply joystick input mask
mov r20, r20 >> 2 ; shift left twice
sts PortC, r20 ; turn on LEDs of joystick movement
rjmp loop
@Tim, 👍1
Обсуждение1 ответ
Знаете ли вы, что Arduino Uno использует процессор Atmel ATmega328P?
использование АЦП для аналогового ввода на ассемблере
Вы можете просмотреть главу "24. Аналого-цифровой преобразователь" Техническое описание ATmega328P.
Вы можете прочитать примечания по применению "AVR126: АЦП megaAVR в одностороннем режиме" и просмотреть соответствующий пример программного обеспечения AVR126. (Это на языке C, но в нем упоминаются все регистры, которые вам понадобятся для чтения ADC в вашей программе на ассемблере). (Как видно из описания ATmega328, ATmega88 имеет точно такой же АЦП, что и ATmega328).
"Исходный код на ассемблере для преобразования аналогового напряжения в 8-битное число", "Введение в AVR ASM: руководство для идиота по ADC" и "Пример АЦП ATmega8" иметь программу на чистом ассемблере для чтения АЦП на чипе Atmel AVR -- увы, на немного другом чипе, который может иметь немного другие регистры, чем ATmega328P.
Удачи!
- Светодиод с кнопочным управлением Arduino со сборкой AVR
- Светодиод Arduino PWM с замиранием в сборке
- Проблемы с отправкой сигналов на Arduino-Uno через клавиатуру
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- SD-карта не инициализируется
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
«Профессор имел в виду контакты Arduino с шестигранной головкой…» Я не уверен, что понимаю, что это значит…, @Ignacio Vazquez-Abrams
PORTD и PORTC — входные регистры. Нет смысла очищать (cbi) их. У вас есть внешние подтягивающие/подтягивающие резисторы? Что касается джойстика; вы просто читаете цифровое значение (0/1), а не аналоговое (0..1023). Вам также необходимо использовать ШИМ для вывода различной яркости. Для удобочитаемости я бы, вероятно, использовал
sbi ddrb, ddb0; установите PB0 на выход
. Таким образом, вам не нужно использовать нечитаемые шестнадцатеричные значения. Это также значительно упрощает изменение назначения контактов. Он также сохраняет регистр. Хотя теперь я вижу, что вы используете его как маску для одновременной установки всех светодиодов (хороший трюк)., @Gerben«Профессор имел в виду контакты arduino с шестнадцатеричным значением, но я не смог найти сопоставление контактов и их шестнадцатеричных значений». Допустим, вам нужно повлиять на контакт 10, в шестнадцатеричном формате это будет 0A ., @Nick Gammon
mov r20, r20 >> 2 ; дважды сдвинуть влево
- для меня это выглядит как сдвиг вправо дважды, но неважно., @Nick Gammon.include "/usr/local/include/atmega32u4.def"
— Uno использует процессор Atmega328P, поэтому этот файл не подходит для включения., @Nick Gammon