Программирование AVR: решение проблем, FAQ Error __builtin_avr_delay_cycles expects a compile time integer constant Fri, April 19 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Error __builtin_avr_delay_cycles expects a compile time integer constant Печать
Добавил(а) microsin   

Ошибка связана с попыткой подставить в функцию _delay_us или _delay_us переменную вместо целочисленной константы:

uint8_t delay10mks = 10;
...
_delay_us(100 * delay10mks);

Исправить ситуацию можно двумя способами. Во-первых, можно вместо _delay_us использовать функцию delayMicroseconds, которая есть среди библиотек Arduino. Имейте в виду, что эта функция имеет жестко определенные встроенные задержки на инструкциях nop, и поэтому она рассчитана на определенные значения тактовой частоты F_CPU.

Во-вторых, можно заменить _delay_us своей реализацией функции задержки, примерно так:

void mydyn_delay_us(uint16_t us)
{
   for (unsigned i = 0; /* требуется как минимум поддержка C99 */
        0 < us;
        ++i)
   {
      if (0 != (us % 2))
      {
         switch (i)
         {
         case 0:
            _delay_us(1 << 0);
            break;
         case 1:
            _delay_us(1 << 1);
            break;
         case 2:
            _delay_us(1 << 2);
            break;
         case 3:
            _delay_us(1 << 3);
            break;
         case 4:
            _delay_us(1 << 4);
            break;
         case 5:
            _delay_us(1 << 5);
            break;
         case 6:
            _delay_us(1 << 6);
            break;
         case 7:
            _delay_us(1 << 7);
            break;
         case 8:
            _delay_us(1 << 8);
            break;
         case 9:
            _delay_us(1 << 9);
            break;
         case 10:
            _delay_us(1 << 10);
            break;
         case 11:
            _delay_us(1 << 11);
            break;
         case 12:
            _delay_us(1 << 12);
            break;
         case 13:
            _delay_us(1 << 13);
            break;
         case 14:
            _delay_us(1 << 14);
            break;
         case 15:
            _delay_us(1 << 15);
            break;
         }
      }
      us >>= 1;
   }
}

 

 

Добавить комментарий


Защитный код
Обновить

Top of Page