Easyelectronics.ru • Просмотр темы - Вопрос по присваиванию значений регистрам AVR

Easyelectronics.ru

Электроника для всех
Текущее время: 21 авг 2018, 18:32

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 19:29 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
Почему некоторым регистрам AVR (в частности Atmega328) можно напрямую присвоить значение, а некоторым только через указатель (экспериментирую пока в ардуино иде).

Например, регистру OCR1BH нельзя присвоить значение "напрямую", можно только через указатель:

// Данный вариант работает, регистр будет иметь значение 0x12
byte *ptrToReg;
ptrToReg = &OCR1BH;
*ptrToReg = 0x12;

// Данный вариант не работает, значение регистра не изменится
OCR1BH = 0x12;

С другой стороны, например, значение регистра TCCR1A можно изменить напрямую:
TCCR1A = 0xD0;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 19:41 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1289
Откуда: Курск
Видимо это потому, что Вы пишите в 16 битный регистр, а МК у Вас 8 битный
Почитайте как правильно писать/читать 16 битные регистры. В документации на каждый МК это есть
http://ww1.microchip.com/downloads/en/D ... asheet.pdf
Страница 151, "20.6. Accessing 16-bit Registers"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 19:51 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
Да, действительно, ведь я пишу в в старшую половину регистра - OCR1BH, а меняется младшая ... OCR1BL изменило свое значение. Теперь понятно, но с другой стороны, зачем премудрости с указателями, когда можно напрямую указать нужное значение регистру? Спасибо за ответ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 20:14 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2983
Откуда: Тольятти
Потому что компилятор обязан выполнять очередность в присваивании двух половинок 16-битного регистра, а вы его ставите перед выбором - подчиняться вам или соблюдать правила. Нехорошо.
А вот так сработает? OCR1B = 0x1234


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 20:31 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
Странно, в первый момент я подумал, что будет выдана ошибка на имя OCR1B - ведь такого регистра нет согласно даташиту, но тем не менее, компилятор проглотил и выдал результат: OCR1B = 34


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 21:12 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
Пардон, результат равен 0x1234


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 09 янв 2018, 23:23 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 867
ulis, а что ж вы в главу ДШ не заглянули всё-таки, куда вас направили? Там ведь указано всё:
Цитата:
16-bit Access
The following code examples show how to access the 16-bit Timer Registers assuming that no interrupts
updates the temporary register. The same principle can be used directly for accessing the OCR1A/B and
ICR1 Registers. Note that when using C, the compiler handles the 16-bit access.
...
C Code Example(1)
unsigned int i;
...
/* Set TCNT1 to 0x01FF */
TCNT1 = 0x1FF;
/* Read TCNT1 into i */
i = TCNT1;
...
Note: 
1. The example code assumes that the part specific header file is included. For I/O Registers located
in extended I/O map, “IN”, “OUT”, “SBIS”, “SBIC”, “CBI”, and “SBI” instructions must be replaced
with instructions that allow access to extended I/O. Typically “LDS” and “STS” combined with
“SBRS”, “SBRC”, “SBR”, and “CBR”.

В частности в файле include/avr/iom328p.h найдете дефайн для регистра atmega328p:
Код:
...
#define OCR1B _SFR_MEM16(0x8A)

#define OCR1BL _SFR_MEM8(0x8A)
#define OCR1BL0 0
#define OCR1BL1 1
#define OCR1BL2 2
#define OCR1BL3 3
#define OCR1BL4 4
#define OCR1BL5 5
#define OCR1BL6 6
#define OCR1BL7 7

#define OCR1BH _SFR_MEM8(0x8B)
#define OCR1BH0 0
#define OCR1BH1 1
#define OCR1BH2 2
#define OCR1BH3 3
#define OCR1BH4 4
#define OCR1BH5 5
#define OCR1BH6 6
#define OCR1BH7 7
...

Ну а дальше в sfr_defs.h можно еще глянуть как _SFR_MEM16 раскрывается и т.д. А дальше уже компилятор генерит правильный код для записи в регистр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 10 янв 2018, 00:23 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
NStorm писал(а):
ulis, а что ж вы в главу ДШ не заглянули всё-таки, куда вас направили? Там ведь указано всё:
Цитата:
Ну а дальше в sfr_defs.h можно еще глянуть как _SFR_MEM16 раскрывается и т.д. А дальше уже компилятор генерит правильный код для записи в регистр.

Спасибо, часть ДШ у меня распечатана, я просто пока перевариваю информацию про таймеры, но вы мне дали правильное направление ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 11 янв 2018, 01:05 
Заглядывает иногда

Зарегистрирован: 25 янв 2011, 23:42
Сообщения: 186
Многие со мной не согласятся и закидают ссаными тряпками, но я лично считаю, что изучение 8 битных контроллеров типа атмеги надо начинать с ассемблера.

А возможно и закончить ассемблером.

Все плюсы высокоуровневых языков меньше чем на stm32 не раскроются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 11 янв 2018, 08:39 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 614
Откуда: Челябинск
Хм... Нужно не ассемблер или Си изучать, нужно изучать архитектуру! И Си, и другие ЯВУ лишь скрывают недостатки архитектуры. Если вы считаете это плюсом, ваше право так считать.
PS: Между прочим, STM32 разные бывают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 11 янв 2018, 11:05 
Только пришел

Зарегистрирован: 09 янв 2018, 19:26
Сообщения: 6
Откуда: Магнитогорск
Я совершенно согласен, что изучать нужно архитектуру МК, но для лучшего понимания нужно разбирать примеры, а примеры приводятся и на си и на ассемблере, поэтому практически изучение лично для меня идет параллельно. С другой стороны многие интересные задумки в инете пишут на си, так что без него - никуда


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 11 янв 2018, 11:32 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 614
Откуда: Челябинск
Ну, лично я программирую на Си вот уже около 35 лет. Но и про ассемблер не забываю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по присваиванию значений регистрам AVR
СообщениеДобавлено: 11 янв 2018, 11:37 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4838
Откуда: Усинск, республика Коми
Чтобы писать эффективные программы для компьютера нужно думать как компьютер. Если пишите для МК - станьте МК. Наибольшее понимание внутренней работы и контроль над действиями процессора дает ассемблер.

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB