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;
}
}
|