XMega Timer生成1us

时间:2016-01-14 13:34:08

标签: embedded avr atmega atmelstudio

我正在使用xmega Atxmega32A4u,

如本例XMega Timer and Microseconds所示,我尝试了但是我无法生成1us来切换引脚。

请指导我获得1us延迟。

我想将此计时器与1wire协议一起使用。

#define OUTFREQ     120000L

static void Timer_OW_ISR(void)
{
  gpio_toggle_pin(OW_READER);
}

void Timer_Init_OW(void)
{
   tc_enable(&TCC2);
   tc_set_overflow_interrupt_callback(&TCC2, Timer_OW_ISR);
   tc_set_wgm(&TCC2, TC_WGMODE_FRQ_gc);
   tc_write_period(&TCC2, sysclk_get_per_hz() / (64L*2L*OUTFREQ) - 1); 
}

void Start_Timer_OW(void)
{
  tc_write_clock_source(&TCC2, TC2_CLKSEL_DIV1_gc);
}
主函数中的

我正在调用Timer_OW_ISR()函数

3 个答案:

答案 0 :(得分:0)

下载manual并查看第171页。您希望在页面底部生成FRQ波形。在本章的其他地方,您可以看到如何启用要切换的引脚。

默认情况下,器件以2MHz运行,速度足以切换引脚。您可以将时钟更改为32 MHz。

修改问题后编辑。

我发现您正在使用Atmel软件框架。我对它没有多少经验。它看起来仍然没有正确使用ASF。

你说你想要每1个人切换一个引脚。那是对的吗?也许你应该在你的问题中更具体地说明你想要做什么。

快速频率的难点在于设备上的时钟仅比该频率快一点。这表示您不应使用ISR(中断服务程序)。该例程将花费太多时间来运行,并且将无法实现1 MHz频率。 (在任何情况下,ISR都是为了响应中断而不是从main()调用。)

但是你可以在不使用ISR的情况下实现引脚切换。相反,让时钟直接切换引脚。使用FRQ功能。您可以在寄存器中设置周期,并使用事件通道系统将时钟连接到正确的引脚。详情应在手册中。

你必须使用ASF吗?没有它,配置时钟和处理器速度很容易。只需将某些寄存器分配给您自己的C代码中的正确值即可。

答案 1 :(得分:0)

如果您只想切换具有特定频率的引脚,那么我会选择一个支持PWM的引脚并使用CTC PWM模式。

这消除了ASF框架ISR调度程序代码引入的ISR开销和未知延迟。 (如果有的话 - 我对这个框架或ATXMegas没有那么多经验(只有atmega和attiny))

答案 2 :(得分:0)

检查Xmega manual的14.8.2节 以下使用内部2MHz时钟和FRQ模式(频率波形生成)将PC.0引脚切换为1Mhz。

#include <avr/io.h>

/*
* FRQ frequency = Fclk/(2N*(CCA+1)
* where N represents the prescaler divider used
* In this example:  1000000 = 2000000/(2*1*(0+1))
*/
int main( void )
{
    PORTC_DIR |= 0x01;       //Set PC.0 as output port
    TCC0_CTRLA |= 0x01;      //Clock divider clk/1
    TCC0_CTRLB |= 0x01;      //FRQ mode
    TCC0_CTRLB |= 0x10;      //Channel selection CCAEN
    TCC0_CCA = 0x00;         //Output toggled on each compare match between CNT and CCA registers
    while(1);
}