如何在 avr-gcc 中定义定时器

Posted

技术标签:

【中文标题】如何在 avr-gcc 中定义定时器【英文标题】:How to define a timer in avr-gcc 【发布时间】:2012-11-25 17:10:50 【问题描述】:

我正在学习使用avr-gcc,但我不知道如何解决以下任务:

端口 B 的 8 位应该以 500 毫秒的间隔从 0 到 1 交替设置。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

你可以使用#include <util/delay.h>,如果你写:_delay_loop_2(1000);你会有1毫秒的延迟; 你可以使用这个功能:

void delay()


    for(int i=0;i<500;i++) 

        _delay_loop_2(1000);

【讨论】:

【参考方案2】:

看看这个例子。这是timer0 的一个非常基本的代码:

#include<avr/io.h>
#include<avr/interrupt.h>
#define F_CPU 1000000UL
unsigned int t=0;
main()

    DDRD=0xFF;
    TCCR0=(1<<CS00);
    TCNT0=0;
    TIMSK=(1<<TOIE0);
    sei();
    while(1);

ISR(TIMER0_OVF_vect)

    t++;
    if(t==40000)
    
        PORTD=~PORTD;
        t=0;
    


【讨论】:

即使你觉得很基础,也最好加一些cmets来帮助别人 FTR:如果你想让 ISR 更小,可以将PORTD = ~PORTD; 替换为PIND = 0xff;,并使t 计数器计数从@987654326 向下 @ 向下到 0 而不是向上。或者切换到 16 位计时器并完全摆脱 t【参考方案3】:

正如@Alex 所说,您可以#include &lt;util/delay.h&gt;,但是使用提供的代码(@Alex)您可以简单地使用_delay_ms(500);

这将为您提供 500 毫秒的延迟。

选择权在您手中,请记住,在这两种情况下,您的时钟频率都必须正确地定义给您的编译器:

16MHz 示例:#define F_CPU 16000000UL

【讨论】:

以上是关于如何在 avr-gcc 中定义定时器的主要内容,如果未能解决你的问题,请参考以下文章

avr-gcc:如何将 __attribute__((address)) 与 EEMEM 一起使用?

avr-gcc 如何将字符串放入程序中?

avr-gcc:(看似)简单功能中不需要的序言/尾声

使用 AVR Studio 中的自动完成功能使用 avr-gcc 对 C 进行编码

为啥 AVR-GCC 编译器在使用相同的变量但作为 PROGMEM 重载时会引发错误?

如何在spring中配置定时任务