Где находятся регистры специальных функций? (Atmega 328)
Я хотел бы запрограммировать свой Arduino с помощью ассемблера. Мы должны научиться этому в колледже. Проблема в том, что я могу найти документацию для набора команд, но не могу найти регистры специальных функций.
Что-то вроде этого было бы здорово или похоже на то, чтобы сделать такой лист самостоятельно.
@TimSch, 👍0
Обсуждение2 ответа
Где находятся регистры специальных функций? (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.
Ваше здоровье!
Существует несколько вариантов программирования 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 ; перезапуск
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
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