Перейти к содержанию
    

Регистры сравнения через указатель

Здравствуйте, почему не работает такой код, что я еще не дописал?

Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр.

Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка?

post-50579-1531054781_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, почему не работает такой код, что я еще не дописал?

Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр.

Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка?

 

уберите *. просто OCR[0]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Наверно необходимо преобразование типа OCR до типа определения портов, чтобы компилятор понял, что это не адресное пространство RAM

 

почитайте здесь (2. Передача порта через указатель)

http://easyelectronics.ru/rabota-s-portami...erov-na-si.html

Изменено пользователем technik-1017

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы хотите элементы массива использовать как адрес, то надо сделать приведение типа именно к тому адресному пространству, куда вы хотите обратиться. У AVR их много разных, компилятор сам не угадает что от него хотят. Посмотрите как в заголовочных файлах порты прописаны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цель - 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

OCR0A = pwm_tab[idx1];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Для массива сами раскрутите...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Нет, все равно не идет даже без массива:

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?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это точно для iar avr?

Точнее не бывает. И с массивом тоже работает. idx1 как определено?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, почему не работает такой код, что я еще не дописал?

 

вот такой код в иаре компилится и должен работать

unsigned char volatile* ocr_arr[] = { &OCR0A, &OCR0B };

*ocr_arr[0] = *ocr_arr[1] = 12;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...