-1

我正在使用带有扩展名 Visual_Micro 的 MS_Visual_Studio 使用 Arduino1.6/1.8 Gemma 板定义对 ATtiny85 进行编程。程序员是 Sparkfun Tiny Programmer。
这是使用的非常简单的代码。(感谢 InsideGadgets YouTube 频道“即时更改 ATtiny85 时钟速度)。它再简单不过了。

然而,尽管我将 #define F_CPU 1000000 更改为 #define F_CPU 8000000,但对大约 2 秒的 LED 闪烁周期绝对没有影响。
尽管对 F_CPU 进行了任何更改,但 ATtiny85 的时钟频率似乎为 1MHz。
我在 CLKPR = 0 上测试了 CLKPR = 3,这会将预分频器的因子从 1 更改为 8。
这应该会使延迟延长 8 倍,它确实如此。我搜索了有关 F_CPU 定义的一些详细信息,但找不到对此行为的任何解释。

问题:为什么F_CPU从1MHz定义到8MHz后_delay_ms(1000)没有影响?

#define F_CPU 1000000  
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void) {
    DDRB |= (1 << PB0);

    while (1) {
        PORTB |= (1 << PB0);  //  Toggle LED 
        _delay_ms(1000);      //  delay 1 second
        PORTB &= ~(1 << PB0);
        _delay_ms(1000);      //  delay 1 second

        cli();
        CLKPR = (1 << CLKPCE); // set for changing prescaler
                               // Change clock prescaler to 0000
        CLKPR = 0;             // divider by 1
//      CLKPR = 3;             // divider by 8
        sei();
    }                          // complete Loop is a 2 seconds period
return 0;
}
4

1 回答 1

1

F_CPU只是让宏计算_delay_ms()每秒需要多少个周期。您需要这个,因为延迟宏非常简单,并且在运行时调用它们时不知道预分频器碰巧设置为什么。

因此,如果您要即时更改预分频器,您可能需要创建两个不同的延迟函数,以便您可以在代码中清楚地说明发生了什么。

它可能看起来像...

#define F_CPU 1000000                   // We start with 8x prescaler on 8Mhz clock

#define delay_ms_1Mhz(x) (_delay_ms(x))   // Delay when prescaller set to 8x
#define delay_ms_8Mhz(x) (_delay_ms(x*8)) // Delay when prescaller set to 1x so we need to burn 8x as many cycles

...然后根据代码中该点的预分频器设置来决定调用哪个。

于 2019-04-02T22:30:39.887 回答