Сборка 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

, 👍1

Обсуждение

«Профессор имел в виду контакты 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


1 ответ


2

Знаете ли вы, что Arduino Uno использует процессор Atmel ATmega328P?

использование АЦП для аналогового ввода на ассемблере

Вы можете просмотреть главу "24. Аналого-цифровой преобразователь" Техническое описание ATmega328P.

Вы можете прочитать примечания по применению "AVR126: АЦП megaAVR в одностороннем режиме" и просмотреть соответствующий пример программного обеспечения AVR126. (Это на языке C, но в нем упоминаются все регистры, которые вам понадобятся для чтения ADC в вашей программе на ассемблере). (Как видно из описания ATmega328, ATmega88 имеет точно такой же АЦП, что и ATmega328).

"Исходный код на ассемблере для преобразования аналогового напряжения в 8-битное число", "Введение в AVR ASM: руководство для идиота по ADC" и "Пример АЦП ATmega8" иметь программу на чистом ассемблере для чтения АЦП на чипе Atmel AVR -- увы, на немного другом чипе, который может иметь немного другие регистры, чем ATmega328P.

Удачи!

,