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 чудит со структурами, и пока не знаю внятного решения как это победить. Буду рад любым рекомендациям и советам

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

Предыдущие записи блогера :
Архив записей в блогах:
Сегодня мы поговорим о такой интересной штуке, как калининградская недвижимость. Поясню, почему я могу совершенно спокойно на эту тему рассуждать и давать советы. Начиная с 1986 года, мы последовательно жили в разных районах города, и за это время сменили восемь квартир. Кроме того, я пост ...
Платье из коричневого, серебряного и золотого атласа ламе, украшенного стилизованными цветами. Дом моды Уорта. Около 1926 года. Принадлежало Цецилии Ней-Эльхинген, принцессе Мюрат. Хранится в Музее моды города Парижа. ...
Ангелы Тобольска Мне нравится, когда во время знакомства с новой точкой на карте, у этого места обнаруживаются какие-нибудь интересные фишечки. Это могут быть архитектурные элементы ...
Лурдес Леон в пятницу на улицах Манхэттана. src ...
Не по наслышке зная, что происходит в Украине, более логичным считаю давать деньги тем, кто в нее едет. Но нет, обстоятельства бывают сильнее и теперь желающим прокатиться с ветерком да комфортом по федеральной трассе М3 "Украина" придется за это заплатить. Дмитрий Медведев подписал ...