Где находятся регистры специальных функций? (Atmega 328)

Я хотел бы запрограммировать свой Arduino с помощью ассемблера. Мы должны научиться этому в колледже. Проблема в том, что я могу найти документацию для набора команд, но не могу найти регистры специальных функций.

Что-то вроде этого было бы здорово или похоже на то, чтобы сделать такой лист самостоятельно.

, 👍0

Обсуждение

http://playground.arduino.cc/Main/AVR?, @Dat Ha

Ну, по крайней мере, в заголовке есть "AVR". Но не более того... Я знаю этот сайт и не смог найти то, что искал. Я показал пример. Где я могу найти что-то подобное??, @TimSch

Прочтите все это целиком, я думаю, это может быть уместно. Как говорится, "Не суди о книге по обложке!"., @Dat Ha

https://www.arduino.cc/en/Reference/PortManipulation Вот что я нашел (некоторое время назад). Но, похоже, это относится только к контактам. Мне нужен "прямой" доступ ко всей atmega, а не через функции c., @TimSch

Все регистры очень подробно описаны в техническом описании чипа., @Majenko

[Глава 36](http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf#612), @Gerben

Обратите внимание, что функции C уже имеют доступ ко "всей Atmega", для этого вам не нужна сборка. Единственный способ сделать то, что вы хотите, - это прочитать всю таблицу данных с самого начала и убедиться, что вы ее понимаете (может потребоваться несколько чтений, пока вы действительно не поймете ее, это никогда не бывает легким чтением для всех). Из - за отсутствия подробностей в вашем вопросе это единственный хороший совет, который вы сможете получить., @jfpoilpret

[Port Registers Arduino tutorial](https://www.arduino.cc/en/Reference/PortManipulation) действительно показывает вам самый “прямой” способ доступа к SFR. Если вы напишете что-то вроде "PORTB |= bit(PB5);" и разберете полученный двоичный файл, вы увидите, что компилятор преобразует этот оператор в одну машинную инструкцию sbi., @Edgar Bonet


2 ответа


1

Где находятся регистры специальных функций? (Atmega 328)

См. главу 36 Резюме регистра, стр. 612, в http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf

Регистры доступны "по имени" в заголовочных файлах AVR IO.

Ваше здоровье!

,

2

Существует несколько вариантов программирования AVR в сборке, но поскольку у вас есть Arduino, а Arduino IDE связывает набор инструментов gcc, использование этого набора инструментов, вероятно, является самым простым способом. Кроме того, если вы изучите ассемблер в синтаксисе GNU, вы сможете использовать его вместе с C++ и библиотеками Arduino.

Компилятор gnu будет запускать через препроцессор C любую ассемблерную программу с расширением .S (в верхнем регистре). Затем вы начнете свою программу с

#include <avr/io.h>

чтобы получить все определения SFR из avr-libc. Этот include-файл предназначен для работы как на языке Си, так и на ассемблере. Объявленные таким образом СФР следует рассматривать как непрозрачные идентификаторы. Чтобы получить их адреса, следует использовать макросы _SFR_IO_ADDR() или _SFR_MEM_ADDR(). Лично я нахожу эти имена слишком громоздкими для ввода, поэтому я склонен определять свои собственные ярлыки.

Просто чтобы вы начали, вот минимальная “мигающая” программа в сборке для Arduino Uno (ATmega328P со светодиодом на PB5):

; Блинки в сборке.

#include <avr/io.h>
#define io(reg) _SFR_IO_ADDR(reg)

.global main
main:
    sbi io(DDRB), PB5  ; PB5 в качестве выхода
0:  sbi io(PINB), PB5  ; переключатель PB5

    ; задержка 16 * 65536 * 5 циклы ~ 0.31 с
    ldi  r26, 16
1:  sbiw r24, 1
    sbci r26, 0
    brne 1b

    rjmp 0b ; перезапуск
,