Страница 1 из 4
Работа с регистрами
Добавлено: Пт июн 25, 2021 09:11:52
mixon46
Есть ли в ардуино файл описаний для атмеги 328? И как производить запись/чтение необходимых регистров. Мне напримет требуется считать значение регистра для того что бы понять изменяет ли его какая подключенная библиотека или нет
Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 09:23:05
parovoZZ
Работа с регистрами ни чем не отличается от работы с переменными.
Если речь идёт о периферии, то необходимо внимательно читать даташит. В частности, в каком поярдке осуществлять запись регистров, как и когда их читать и прочее.
Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 09:32:52
mixon46
У меня ничего не вышло. Я не понимаю как. На примере можете объяснить?
Если я сделаю так
i=0x21; //он переменной назначает константу а не значение регистра 0x21
Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 12:00:16
roman.com
Пиши название (Name) регистров. Ардуино знает название (Name) всех регистров.
ADMUX=0x21; //присвоить регистру ADMUX значение 0x21 (ADMUX - регистр настройки АЦП).
...
i=ADCL; //присвоить переменной значение регистра ADCL (ADCL - младший регистр данных АЦП).
...
и т.д.

Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 14:36:38
mixon46
Да спасибо. До меня раньше доперло. Я регистр не правильно писал

Ещё бы узнать с какой частотой тактируется cpu
Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 16:28:18
roman.com
Какой в Ардуино кварц с такой частотой тактируется CPU.
По умолчанию 16 МГц.

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

Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 22:52:58
parovoZZ
i=0x21; //он переменной назначает константу а не значение регистра 0x21
если хочется оперировать адресом регистра, то надо сперва взять его адрес:
volatile uint16_t* OCR;
OCR = &OCR1A;
Всё. Теперь при записи в переменную OCR значения, оно запишется в регистр OCR1A. Почему так? Потому, что в переменной OCR лежит адрес регистра OCR1A. Сама переменная OCR уже называется указатель.
Re: Работа с регистрами
Добавлено: Пт июн 25, 2021 23:17:45
roman.com
Нафига нам указатель, если можно просто записать в регистр OCR1A любое значение.
OCR1A=0x21; //присвоить регистру OCR1A значение 0x21 (OCR1A - регистр настройки таймера).
Одна строчка кода.))

Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 00:30:04
parovoZZ
А если мы на момент записи не знаем, в какой именно регистр класть значение? А вот куда именно класть, мы возьмём инфу из полученной структуры.
Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 08:10:36
BOB51
Говорю же - не троньте регистры без предварительного ознакомления с их системным назначением 9без предварительного анализа возможных "наложений")...
Т0 - используется в millis() и delay() а также в ШИМ на выводах D5 и D6.
Т1 - ШИМ на выводах D9 и D10.
Т2 - ШИМ на выводах D3 и D11 и функция tone().
Из "свободно-безопасного" использование прерывания по OCR0A - но там смотрим в каких кристаллах он имеется (168 и 328 есть а в 8 нету).
Относительно прямого управления регистрами портов - смотрим разве что в случае, если в пределах порта часть выводов используется другими функциями.

Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 08:47:22
oleg110592
Таймер 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
parovoZZ
Я для себя сделал такие таймеры
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
BOB51
Зачем слезать преждевременно?
Если ресурс позволяет- его надо использовать до последнего возможного содержимого и лишь затем переходить к следующему уровню.
Ведь работа на уровне регистров подразумевает и "чистый ассемблер" в том числе - а это абсолютно полная проработка документации конкретного кристалла.
Нужно ли подобное даже "продвинутому пользователю"?
Вы же не используете в повседневной работе с компом ни функции биос, ни функции API - только сами программы в основном.
То же и для МК справедливо.
Относительно адуринки - весьма неплохой результат "независимой тикалки" можно получить из тандема
tone() + int0/int1

Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 14:35:17
roman.com
Ресурс с самого начала не позволял ))
Скачайте AVRStudio и пишите на ассемблере.
http://easyelectronics.ru/avr-studio-likbez.html
Там есть все регистры )) И можно смотреть в реальном времени как они работают.

Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 14:36:52
parovoZZ
Я на дурине задержался пару недель. Дольше нервов не хватило)
Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 14:46:04
roman.com
Весьма неплохой результат "тикалки" можно получить на ассемблере... Если точно подогнать такты процессора (CPU).

Re: Работа с регистрами
Добавлено: Сб июн 26, 2021 19:52:52
BOB51
Так за "чистый ассемблер" отдельный разговор - там даташит перелопатить придется.
А у 328й это весьма моного для расчепятки и вычитывания...
Вряд-ли тот, кому терпения на адуринку не хватило в чистый ассемблер влезть осмелится.

Re: Работа с регистрами
Добавлено: Вс июн 27, 2021 11:53:55
parovoZZ
[uquote="roman.com",url="/forum/viewtopic.php?p=4052648#p4052648"]Скачайте AVRStudio и пишите на ассемблере.
http://easyelectronics.ru/avr-studio-likbez.html
Там есть все регистры )) И можно смотреть в реальном времени как они работают.
AVRStudio.jpg

[/uquote]
Такие красивые картинки очень вредны. Когда я не увидел оных в IAR, я чуть-чуть смутился. Но только чуть)
чистый ассемблер
а есть не чистый ассемблер?
К асму у меня сформировалось отторжение ещё в универе. Поэтому си и только си)
Re: Работа с регистрами
Добавлено: Вс июн 27, 2021 14:32:51
BOB51
В случае с ЯВУ ассемблерные вставки подчиняются правилам компилятора - всегда в соответствующей "обвертке" должны быть и с соблюдением определенных правил.
Взять хотя бы управление стеком...
В "чистом виде" - все ошибки на совести автора исходника, зато власть над ресурсами МК абсолютная.
Ессно желательно и тем и другим владеть хотя-бы "продвинутым пользователем".
