Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Работа с регистрами

Пт июн 25, 2021 09:11:52

Есть ли в ардуино файл описаний для атмеги 328? И как производить запись/чтение необходимых регистров. Мне напримет требуется считать значение регистра для того что бы понять изменяет ли его какая подключенная библиотека или нет

Re: Работа с регистрами

Пт июн 25, 2021 09:23:05

Работа с регистрами ни чем не отличается от работы с переменными.
Если речь идёт о периферии, то необходимо внимательно читать даташит. В частности, в каком поярдке осуществлять запись регистров, как и когда их читать и прочее.

Re: Работа с регистрами

Пт июн 25, 2021 09:32:52

У меня ничего не вышло. Я не понимаю как. На примере можете объяснить?

Если я сделаю так

i=0x21; //он переменной назначает константу а не значение регистра 0x21

Re: Работа с регистрами

Пт июн 25, 2021 12:00:16

Пиши название (Name) регистров. Ардуино знает название (Name) всех регистров.
Screenshot_1.jpg
(120.61 KiB) Скачиваний: 163

ADMUX=0x21; //присвоить регистру ADMUX значение 0x21 (ADMUX - регистр настройки АЦП).
...
i=ADCL; //присвоить переменной значение регистра ADCL (ADCL - младший регистр данных АЦП).
...
и т.д.
:tea:

Re: Работа с регистрами

Пт июн 25, 2021 14:36:38

Да спасибо. До меня раньше доперло. Я регистр не правильно писал :))
Ещё бы узнать с какой частотой тактируется cpu

Re: Работа с регистрами

Пт июн 25, 2021 16:28:18

Какой в Ардуино кварц с такой частотой тактируется CPU.
По умолчанию 16 МГц.
Screenshot_2.jpg
(57.24 KiB) Скачиваний: 132

:tea:

Re: Работа с регистрами

Пт июн 25, 2021 16:41:30

С прямым обращением к регистрам поаккуратнее надо - учитываем системные функции референса IDE (дабы их не зацепить).
Частота для различных платформ на основе AVR по умолчанию 16 МГЦ, если в описании платформы не присутствует чего иного - те же варианты от MCUdude или diy....
:roll:

Re: Работа с регистрами

Пт июн 25, 2021 22:52:58

i=0x21; //он переменной назначает константу а не значение регистра 0x21

если хочется оперировать адресом регистра, то надо сперва взять его адрес:

volatile uint16_t* OCR;

OCR = &OCR1A;


Всё. Теперь при записи в переменную OCR значения, оно запишется в регистр OCR1A. Почему так? Потому, что в переменной OCR лежит адрес регистра OCR1A. Сама переменная OCR уже называется указатель.

Re: Работа с регистрами

Пт июн 25, 2021 23:17:45

Нафига нам указатель, если можно просто записать в регистр OCR1A любое значение.

OCR1A=0x21; //присвоить регистру OCR1A значение 0x21 (OCR1A - регистр настройки таймера).

Одна строчка кода.))
:tea:

Re: Работа с регистрами

Сб июн 26, 2021 00:30:04

А если мы на момент записи не знаем, в какой именно регистр класть значение? А вот куда именно класть, мы возьмём инфу из полученной структуры.

Re: Работа с регистрами

Сб июн 26, 2021 08:10:36

Говорю же - не троньте регистры без предварительного ознакомления с их системным назначением 9без предварительного анализа возможных "наложений")...
Т0 - используется в millis() и delay() а также в ШИМ на выводах D5 и D6.
Т1 - ШИМ на выводах D9 и D10.
Т2 - ШИМ на выводах D3 и D11 и функция tone().
Из "свободно-безопасного" использование прерывания по OCR0A - но там смотрим в каких кристаллах он имеется (168 и 328 есть а в 8 нету).
Относительно прямого управления регистрами портов - смотрим разве что в случае, если в пределах порта часть выводов используется другими функциями.
:roll:

Re: Работа с регистрами

Сб июн 26, 2021 08:47:22

Таймер 0 используется для работы системных функций времени delay(), delayMicroseconds() и millis() и micros(), поэтому перенастройка таймера 0 под свои нужды приведёт к некорректной работе функций времени, но при желании можно их скорректировать следующим образом:

#define delay(x * div)
#define delayMicroseconds(x * div)
#define millis() (millis() / div)
#define micros() (micros() / div)
// где div - делитель (или множитель), подбирать из степеней двойки
Таймер 1 используется в некоторых библиотеках, например Servo. При перенастройке таймера 1 под свои нужды Servo перестанет работать.

Таймер 2 используется для генерации звука стандартной функцией tone(), причём перенастройка таймера не “сломает” tone – вызов функции перенастроит таймер под нужды функции.

Различные библиотеки могут использовать таймеры для своих целей, если вам нужны прерывания по таймерам совместно с работой других библиотек – смотрите, не используют ли они эти же таймеры!

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

осторожно ссылка ломает видовс ХР (BOB51 так говорит - у других все нормально), и там на сайте есть переделанные библиотеки таймеров:
https://alexgyver.ru/gyvertimers/

Re: Работа с регистрами

Сб июн 26, 2021 10:35:55

Я для себя сделал такие таймеры
void SoftTimer_Disarm(SoftTimer_t* const SoftTimer);
void SoftTimer_ReSet(SoftTimer_t* const SoftTimer);
void SoftTimer_Set(SoftTimer_t* const SoftTimer, const SoftClock_t SoftTime);
Bool_t SoftTimer_FreeRun(SoftTimer_t* const SoftTimer, const SoftClock_t SoftTime);
Bool_t SoftTimer_Expired(SoftTimer_t* const SoftTimer);
Bool_t SoftTimer_Status(SoftTimer_t* const SoftTimer);


Не хватает ещё оконных таймеров (в окне, вне окна). Будем делать.

Говорю же - не троньте регистры без предварительного ознакомления с их системным назначением

рецепт очень простой - слезть с этой дурины. Когда слезете, даже дышаться будет по-другому. Свободнее.

Re: Работа с регистрами

Сб июн 26, 2021 10:57:30

Зачем слезать преждевременно?
Если ресурс позволяет- его надо использовать до последнего возможного содержимого и лишь затем переходить к следующему уровню.
Ведь работа на уровне регистров подразумевает и "чистый ассемблер" в том числе - а это абсолютно полная проработка документации конкретного кристалла.
Нужно ли подобное даже "продвинутому пользователю"?
Вы же не используете в повседневной работе с компом ни функции биос, ни функции API - только сами программы в основном.
То же и для МК справедливо.
Относительно адуринки - весьма неплохой результат "независимой тикалки" можно получить из тандема
tone() + int0/int1
8)

Re: Работа с регистрами

Сб июн 26, 2021 14:35:17

Ресурс с самого начала не позволял ))
Скачайте AVRStudio и пишите на ассемблере. http://easyelectronics.ru/avr-studio-likbez.html
Там есть все регистры )) И можно смотреть в реальном времени как они работают.
AVRStudio.jpg
(133.86 KiB) Скачиваний: 136

:tea:
Последний раз редактировалось roman.com Сб июн 26, 2021 14:45:46, всего редактировалось 2 раз(а).

Re: Работа с регистрами

Сб июн 26, 2021 14:36:52

Я на дурине задержался пару недель. Дольше нервов не хватило)

Re: Работа с регистрами

Сб июн 26, 2021 14:46:04

Весьма неплохой результат "тикалки" можно получить на ассемблере... Если точно подогнать такты процессора (CPU).
:tea:

Re: Работа с регистрами

Сб июн 26, 2021 19:52:52

Так за "чистый ассемблер" отдельный разговор - там даташит перелопатить придется.
А у 328й это весьма моного для расчепятки и вычитывания...
Вряд-ли тот, кому терпения на адуринку не хватило в чистый ассемблер влезть осмелится.
8)

Re: Работа с регистрами

Вс июн 27, 2021 11:53:55

Скачайте AVRStudio и пишите на ассемблере. http://easyelectronics.ru/avr-studio-likbez.html
Там есть все регистры )) И можно смотреть в реальном времени как они работают.
AVRStudio.jpg

:tea:

Такие красивые картинки очень вредны. Когда я не увидел оных в IAR, я чуть-чуть смутился. Но только чуть)

чистый ассемблер

а есть не чистый ассемблер?
К асму у меня сформировалось отторжение ещё в универе. Поэтому си и только си)

Re: Работа с регистрами

Вс июн 27, 2021 14:32:51

В случае с ЯВУ ассемблерные вставки подчиняются правилам компилятора - всегда в соответствующей "обвертке" должны быть и с соблюдением определенных правил.
Взять хотя бы управление стеком...
В "чистом виде" - все ошибки на совести автора исходника, зато власть над ресурсами МК абсолютная.
8)
Ессно желательно и тем и другим владеть хотя-бы "продвинутым пользователем".
:roll:
Ответить