如何修复错误消息“__builtin_avr_delay_cycles需要编译时整数常量make”?

问题描述 投票:2回答:2

我的程序没有使用GCC AVR编译器编译。这是微处理器和液晶屏上的小游戏。

move_delay = 200;
_delay_ms( move_delay );

它不喜欢这个_delay_ms是一个变量,但它需要是一个变量,因为我可以通过ADC调整屏幕动作。有没有办法可以使它成为常数但仍可用于ADC?

c adc
2个回答
4
投票

您可以根据需要循环播放所需的最小延迟,以获得所需的其他延迟。

void my_delay_ms(int ms)
{
  while (0 < ms)
  {  
    _delay_ms(1);
    --ms;
  }
}

由于花费_delay_ms()和减少ms的时间花费,这可能不是100%准确。但对于小ms来说,这可能就足够了。

对于较大的ms值,您可以介绍

void my_delay_ms_10ms_steps(int ms)
{
  while (0 < ms)
  {  
    _delay_ms(10);
    ms -= 10;
  }
}

等等 ...


还有一种动态方法:

void mydyn_delay_ms(unsigned ms)
{
  unsigned i = 0;
  while (0 < ms)
  {
    if (0 != (ms % 2))
    {
      switch (i)
      {
        case 0:
           _delay_ms(1 << 0);
           break;

        case 1:
           _delay_ms(1 << 1);
           break;

        case 2:
           _delay_ms(1 << 2);
           break;

        /* and so on */

        case <what ever bit-width unsigned uses> -1:
          _delay_ms(1 << (<what ever bit-wdith unsigned uses> -1));
          break;
      }
    }

    ms >>= 1;
    ++i;
  }
}

更新:

vaxquis comment之后,实现上述功能的另一种方法是:

void mydyn_delay_ms(unsigned ms)
{
  for (
    unsigned i = 0; /* requires at least C99 */
    0 < ms; 
    ++i)
  {
    if (0 != (ms % 2))
    {
      switch (i)
      {
        case 0:
           _delay_ms(1 << 0);
           break;

        case 1:
           _delay_ms(1 << 1);
           break;

        case 2:
           _delay_ms(1 << 2);
           break;

        /* and so on */

        case <what ever bit-width unsigned uses> -1:
          _delay_ms(1 << (<what ever bit-wdith unsigned uses> -1));
          break;
      }
    }

    ms >>= 1;
  }
}

1
投票

如果在#include语句之前使用以下定义,则还可以使用变量而不是数字常量调用延迟函数:

#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>

/************************************************************************
 * Function: sound
 * Description: Toggle Port to generate sound with a given pulse width.
 * Parameter: duration, pulsewidth
 * Uses: _delay_us()
 ************************************************************************/
void sound(uint16_t duration, uint16_t pulsewidth) {
  uint16_t i;
  uint16_t j = 2270 * duration/pulsewidth;

  for(i=0; i<j; i++) {
    SPKR_PORT |= (1 << SPKR_PAD);   //Set port -> create bit mask and OR it
    //delay
    _delay_us(pulsewidth);

    SPKR_PORT &= ~(1 << SPKR_PAD);   //clear port -> negate mask and AND it
    //delay
    _delay_us(pulsewidth);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.