首页 > 解决方案 > 我怎样才能解决这个问题。“__builtin_avr_delay_cycles 需要一个编译时间整数常量”

问题描述

我正在使用带有atmega32A MCU的伺服电机。我想通过将度数发送到函数来转动电机。这是我的主要方法。

#ifndef F_CPU
#define F_CPU 8000000UL 
#endif

#include <avr/io.h>
#include <util/delay.h>
#include "servo.h"

int main(void)
{
    DDRC = 0b00000001; 
    PORTC = 0x00;

    while(1)
    {
        turnTo(90);
    }
}

这是我的伺服电机代码。

#ifndef F_CPU
#define F_CPU 8000000UL // 8 MHz clock speed
#endif

#include <avr/io.h>
#include <util/delay.h>

int turnTo(double degree){
    int pulse=(degree*500/90)+1000;
    PORTC = 0x01;

    _delay_us(pulse);

    PORTC = 0x00;
    
    return 0;
}

我尝试了以下答案。但是什么都没奏效。我怎样才能解决这个问题?

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

标签: cembeddedavratmelservo

解决方案


延迟函数在编译期间计算no operation循环,不能在控制器上动态。所以尝试添加这样的函数:

void wait(unsigned int us)
{
  for(unsigned int i=0; i < us; i++)
  {
    _delay_us(1);
  }
}

并调整您的程序


int turnTo(double degree){
    unsigned int pulse=(degree*500/90)+1000;
    PORTC = 0x01;

    wait(pulse)

    PORTC = 0x00;
    
    return 0;
}

这并不完全是因为 for 循环也需要一些汇编指令。目前我没有要检查的编译器,但您可以通过计算编译器使用的汇编指令和调整us变量来更正结果。更好的解决方案是使用计时器而不是延迟。它们具有更好的延迟精度,并且控制器可以在计数期间执行其他操作!


推荐阅读