2

我正在使用 xmega Atxmega32A4u,

如本示例所示XMega Timer 和 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() 函数

4

3 回答 3

0

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

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

于 2016-01-19T17:06:25.800 回答
0

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

该设备默认以 2MHz 运行,这足以切换引脚。您可以将时钟更改为 32 MHz。

修改问题后编辑。

我看到您正在使用 Atmel 软件框架。我没有太多经验。看起来您仍然没有正确使用 ASF。

你说你想每 1 我们切换一个引脚。那是对的吗?也许您应该更具体地说明您要做什么。

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

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

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

于 2016-01-15T18:21:36.147 回答
0

检查Xmega 手册 的第 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);
}
于 2019-04-17T12:00:18.330 回答