如何在 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 <util/delay.h>
,但是使用提供的代码(@Alex)您可以简单地使用_delay_ms(500);
这将为您提供 500 毫秒的延迟。
选择权在您手中,请记住,在这两种情况下,您的时钟频率都必须正确地定义给您的编译器:
16MHz 示例:#define F_CPU 16000000UL
【讨论】:
以上是关于如何在 avr-gcc 中定义定时器的主要内容,如果未能解决你的问题,请参考以下文章
avr-gcc:如何将 __attribute__((address)) 与 EEMEM 一起使用?
使用 AVR Studio 中的自动完成功能使用 avr-gcc 对 C 进行编码