s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Здравствуйте, почему не работает такой код, что я еще не дописал? Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр. Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Здравствуйте, почему не работает такой код, что я еще не дописал? Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр. Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка? уберите *. просто OCR[0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба уберите *. просто OCR[0] Вы шутите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
technik-1017 0 8 июля, 2018 Опубликовано 8 июля, 2018 (изменено) · Жалоба OCR это не РЕГИСТРЫ сравнения, а ПОРТЫ, вы пытаетесь обратиться к портам по указателю? Или какая цель этого кода? Что вы хотите получить? Наверно необходимо преобразование типа OCR до типа определения портов, чтобы компилятор понял, что это не адресное пространство RAM почитайте здесь (2. Передача порта через указатель) http://easyelectronics.ru/rabota-s-portami...erov-na-si.html Изменено 8 июля, 2018 пользователем technik-1017 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Если вы хотите элементы массива использовать как адрес, то надо сделать приведение типа именно к тому адресному пространству, куда вы хотите обратиться. У AVR их много разных, компилятор сам не угадает что от него хотят. Посмотрите как в заголовочных файлах порты прописаны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Цель - 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба VladislavS, Вы можете дать код который будет работать именно для этого случая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Нет, я сейчас не занимаюсь AVR. Просто по старой памяти :) Хотя нет, могу. OCR0A = pwm_tab[idx1]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба VladislavS, понятно, спасибо. Это у меня и так работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Да блин, ну я же цитату с документации не зря привёл! const uint8_t reg = 0x27; *(__io uint8_t *)reg = 0x55; // 12 *(__io uint8_t *)reg = 0x55; LDI R16, 85 OUT 0x27, R16 Для массива сами раскрутите... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Извиняюсь, цитату я как раз пропустил читаю с телефона. Нет, все равно не идет даже без массива: 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Это точно для iar avr? Точнее не бывает. И с массивом тоже работает. idx1 как определено? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
s_gary 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба idx1 глоб. 8 бит без знака Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Здравствуйте, почему не работает такой код, что я еще не дописал? вот такой код в иаре компилится и должен работать unsigned char volatile* ocr_arr[] = { &OCR0A, &OCR0B }; *ocr_arr[0] = *ocr_arr[1] = 12; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться