avr-gcc проблемы при обращении к структуре пинов в цикле

топ 100 блогов ru_radio_electr10.04.2023 Имеем компилятор AVR-GCC в AVR-студии, оптимизация отключена, от слова совсем. Для обращения к группам устройств, разбросанных на разных пинах разных портов, сделал такую структуру.

typedef struct {
  uint16_t port;
  uint16_t ddr;
  uint8_t mask;
} power_control;


Пример, инициализации такой структуры:

#define V5_SIZE  5
const power_control PROGMEM power_5v [V5_SIZE] = {
  {(uint16_t) &PORTA, (uint16_t) &DDRA, _BV(7)}, //POWER_5B_1
  {(uint16_t) &PORTA, (uint16_t) &DDRA, _BV(6)}, //POWER_5B_2
  {(uint16_t) &PORTC, (uint16_t) &DDRC, _BV(6)}, //POWER_5B_3
  {(uint16_t) &PORTH, (uint16_t) &DDRH, _BV(6)}, //POWER_5B_4
  {(uint16_t) &PORTC, (uint16_t) &DDRC, _BV(4)}, //POWER_5B_5
};



При этом, если попробовать сделать все пины в единицу в цикле, а потом в ноль в цикле - это не работает:

//set to 1
  for(int i = 0; i < V5_SIZE; i ++) {
    * (uint8_t *) power_5v[i].port |= power_5v[i].mask;
  }
  _delay_ms(1000);

//set to 0
  for(int i = 0; i < V5_SIZE; i ++) {
    * (uint8_t *) power_5v[i].port &=~ power_5v[i].mask;
  }


Артефакты какие-то есть на пинах, но всё не поднимается. При этом, если просто вручную написать обращение по индексу, то всё работает корректно:

//set to 1
  * (uint8_t *) power_5v[0].port |= power_5v[0].mask;
  * (uint8_t *) power_5v[1].port |= power_5v[1].mask;
  * (uint8_t *) power_5v[2].port |= power_5v[2].mask;
  * (uint8_t *) power_5v[3].port |= power_5v[3].mask;
  * (uint8_t *) power_5v[4].port |= power_5v[4].mask;
  _delay_ms(1000);
//set to 0
  * (uint8_t *) power_5v[0].port &=~ power_5v[0].mask;
  * (uint8_t *) power_5v[1].port &=~ power_5v[1].mask;
  * (uint8_t *) power_5v[2].port &=~ power_5v[2].mask;
  * (uint8_t *) power_5v[3].port &=~ power_5v[3].mask;
  * (uint8_t *) power_5v[4].port &=~ power_5v[4].mask;


Почему такое может быть, а главное: как это исправить? Ведь задача тривиальная, и во всяких клавиатурах и иже с ним используется.

З.Ы. Не в первый раз сталкиваюсь, как avr-gcc чудит со структурами, и пока не знаю внятного решения как это победить. Буду рад любым рекомендациям и советам

Оставить комментарий

Предыдущие записи блогера :
Архив записей в блогах:
Попробовал немного по-старинке карандашиком и гелевой ручкой на бумажке ...
...
П оздравляю с самым лучшим, ярким, сказочным и долгожданным праздником во всём мире. Желаю в этот день почувствовать себя ребёнком, встретиться с чудом, загадать желания которые сбудутся! Хочу от всего сердца пожелать Вам в 2023 году сказочного настроения, оптимизма, вдохновения и ...
Зеленая или суповая черепаха. В длину 1,5-2 метра. Мужчины, если такая черепашка-ниндзя встанет на ноги, это грозный противник! Еще и в доспехах. Еще и весом под 400 кг!! Первую фотку я выбрала за то, что она здесь восхитительно зеленая!! А вторую за то, что видно, как она плавает! Она ...
Я никогда не хотела ребенка... Ни от одного из своих мужчин... Не считая последнего... Там было все... Страсть... Эмоции... Бьющие через край... И доверие... Полное и безоговорочное... Я представляла себе... Девочку... Дочку... С ангельскими кудряшками... ...