Easyelectronics.ru

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

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • 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
Сообщения: 1071
Откуда: Курск
Видимо это потому, что Вы пишите в 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
Сообщения: 2479
Откуда: Тольятти
Потому что компилятор обязан выполнять очередность в присваивании двух половинок 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
Сообщения: 314
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
Сообщения: 175
Многие со мной не согласятся и закидают ссаными тряпками, но я лично считаю, что изучение 8 битных контроллеров типа атмеги надо начинать с ассемблера.

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

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


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

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


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

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


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

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


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

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

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


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

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


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

Сейчас этот форум просматривают: Poseydon42


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

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

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