XMega Timer生成1us

问题描述 投票:2回答:3

我正在使用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);
}

在main函数中我调用了Timer_OW_ISR()函数

embedded avr atmega atmelstudio
3个回答
0
投票

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

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

修改后的问题编辑。

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

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

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

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

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


0
投票

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

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


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.