C语言 AVR 编程中意外的浮点数到无符号字符转换



微控制器:ATmega328P在Arduino Uno
中时钟频率 : 16兆赫

void timeDelay_CTC(float sec, unsigned char times)
{
    unsigned char cycles = (unsigned char)(sec / 0.000064f);
    OCR1A = cycles - 1;
    TCCR1A = 0b00000000;
    TCCR1B = 0b00001101;
    for( unsigned char i = 1; i <= times; i++ )
    {
        while( (TIFR1 & (1<<OCF1A)) == 0 ); 
        TIFR1 |= (1<<OCF1A);
    }
    TCCR1A = 0;
    TCCR1B = 0;
}

该函数用于计算延时周期数,然后实现它。

int main(void)
{
    //Initialization
    LED1_DDR |= (1<<LED1_BIT);
    LED1_PORT |= (1<<LED1_BIT);
    //Start
    while(1)
    {
        LED1_PORT ^= (1<<LED1_BIT);
        timeDelay_CTC(1, 1);
    }
}

但是,在运行上述代码时,LED 灯不会切换。如果我只输入 OCR1A = 15624;(1 秒的周期数),效果很好。因此,问题应该来自unsigned char cycles = (unsigned char)(sec / 0.000064f);的计算,我认为数据类型转换可能是错误的。你能教我如何让它工作吗?或者给我一些提示。

请检查

无符号字符的范围,它是[0 255],它对于您的应用程序来说不够大。尝试使用无符号的 int。

最新更新