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

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

Предыдущие записи блогера :
Архив записей в блогах:
Вопрос к читателям, которые используют слово «либерал» (либераст) как ругательство: Что именно вы вкладываете в слово «либерал»? Спасибо. ...
В тюрьме можно оказаться частью «спящей» террористической ячейки, не принимая ислам, так как «вербовка сторонников не ограничивается только средой мусульман», рассказал журналист Андрей Медведев. В своем Telegram-канале он напомнил о своей публикации трехлетней давности, в которой ...
Когда мы только начинали жить в Испании, ещё даже не совсем, а долгими наездами по работе, то поневоле сталкивались с повседневными бытовыми делами и проблемами. Ходить в магазин и готовить еду приходилось точно так же, как и везде, а следовательно надо было и выбрасывать мусор. Уже ...
Фарц, фарца - то же самое, что и фарцовщик Утюг - то же самое, что и фарцовщик в московском сленге (от необходимости "утюжить" по улице туда сюда рядом с гостиницей для встречи с фирмачом) Фирмач - иностранец Гамщик, пурукумщик (от англ. gum, фин. purukumi - жевательная резинка), а также ...
В одном провинциальном аэропорту Западной Европы увидел эту маленькую трагедию: Похоже уже пара часов так стоит.... Уверен на 100%, что хозяин не наш человек, наши люди своего на бросают, не на себе, так в себе увезли. взяли бы ее с собой… ...