реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Регистры сравнения через указатель, iar avr Compiler V6.12.1.50500
Ga_ry
сообщение Jul 8 2018, 12:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Здравствуйте, почему не работает такой код, что я еще не дописал?
Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр.
Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 8 2018, 13:44
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Ga_ry @ Jul 8 2018, 18:47) *
Здравствуйте, почему не работает такой код, что я еще не дописал?
Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр.
Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка?


уберите *. просто OCR[0]
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 14:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Цитата(Jenya7 @ Jul 8 2018, 16:44) *
уберите *. просто OCR[0]

Вы шутите?
Go to the top of the page
 
+Quote Post
technik-1017
сообщение Jul 8 2018, 14:45
Сообщение #4





Группа: Участник
Сообщений: 12
Регистрация: 3-09-17
Пользователь №: 99 108



OCR это не РЕГИСТРЫ сравнения, а ПОРТЫ, вы пытаетесь обратиться к портам по указателю? Или какая цель этого кода? Что вы хотите получить?
Наверно необходимо преобразование типа OCR до типа определения портов, чтобы компилятор понял, что это не адресное пространство RAM

почитайте здесь (2. Передача порта через указатель)
http://easyelectronics.ru/rabota-s-portami...erov-na-si.html

Сообщение отредактировал technik-1017 - Jul 8 2018, 14:52


--------------------
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 8 2018, 14:53
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Если вы хотите элементы массива использовать как адрес, то надо сделать приведение типа именно к тому адресному пространству, куда вы хотите обратиться. У AVR их много разных, компилятор сам не угадает что от него хотят. Посмотрите как в заголовочных файлах порты прописаны.
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 15:35
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Цель - 6 аппаратных каналов шим. Присваивая определённому регистру сравнения число 8 бит, я получаю управления скважностью шим.
В заголовочных файлах это прописано так:
SFR_B_R(0xB4, OCR2B)
SFR_B_R(0xB3, OCR2A)
SFR_W_R(0x8A, OCR1B)
SFR_W_R(0x88, OCR1A)
SFR_B_R(0x28, OCR0B)
SFR_B_R(0x27, OCR0A)
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 8 2018, 16:49
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Ga_ry @ Jul 8 2018, 18:35) *
SFR_B_R(0xB4, OCR2B)

Ну а дальше пройтись и посмотреть что это значит не судьба?

Небольшая цитатка из документации, чтобы осознать глубину задачи. Звёздочкой тут не отделаться, это вам не ARM.
Цитата
Memory attributes
A memory attribute corresponds to a certain logical or physical memory in the
microcontroller.
Available function memory attributes:
__nearfunc, __farfunc
Available data memory attributes:
__tiny, __near, __far, __huge, __regvar, __eeprom, __tinyflash, __flash,
__farflash, __hugeflash, __generic, __io, and __ext_io.
Data objects, functions, and destinations of pointers or C++ references always have a
memory attribute. If no attribute is explicitly specified in the declaration or by the
pragma directive #pragma type_attribute, an appropriate default attribute is
implicitly used by the compiler. You can specify one memory attribute for each level of
pointer indirection.
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 17:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



VladislavS, Вы можете дать код который будет работать именно для этого случая?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 8 2018, 17:27
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Нет, я сейчас не занимаюсь AVR. Просто по старой памяти sm.gif

Хотя нет, могу.

Код
OCR0A = pwm_tab[idx1];
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 17:59
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



VladislavS, понятно, спасибо.
Это у меня и так работает.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 8 2018, 18:02
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Да блин, ну я же цитату с документации не зря привёл!

Код
  const uint8_t reg = 0x27;
  *(__io uint8_t *)reg = 0x55;


Код
//   12   *(__io uint8_t *)reg = 0x55;
        LDI     R16, 85
        OUT     0x27, R16


Для массива сами раскрутите...
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 18:54
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Извиняюсь, цитату я как раз пропустил читаю с телефона.

Нет, все равно не идет даже без массива:
Код
const unsigned char
  OCR = 0x27;
void cycle_1(void)
{
  *(__io unsigned char *) OCR = pwm_tab[idx1];
}

Строки с ошибкой теперь не выделяются а просто в сообщениях компилятор пишет.
Tool Internal Error:
Internal Error: [CoreUtil/General]: Illegal state

Это точно для iar avr?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 8 2018, 18:59
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Ga_ry @ Jul 8 2018, 21:54) *
Это точно для iar avr?

Точнее не бывает. И с массивом тоже работает. idx1 как определено?
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Jul 8 2018, 19:17
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



idx1 глоб. 8 бит без знака
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 8 2018, 19:32
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Ga_ry @ Jul 8 2018, 16:47) *
Здравствуйте, почему не работает такой код, что я еще не дописал?


вот такой код в иаре компилится и должен работать
unsigned char volatile* ocr_arr[] = { &OCR0A, &OCR0B };
*ocr_arr[0] = *ocr_arr[1] = 12;



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 21:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.0152 секунд с 7
ELECTRONIX ©2004-2016