【发布时间】:2013-03-27 20:23:29
【问题描述】:
我使用的是 Ethernut 2.1 B,我需要一个 C 程序,它在定时器 1 输出 B 上输出时钟信号,换句话说,在输出 OCIB 上。时钟信号的频率应为 1.0 kHz。
有人知道这是怎么做到的吗?
【问题讨论】:
-
你试过什么??????
我使用的是 Ethernut 2.1 B,我需要一个 C 程序,它在定时器 1 输出 B 上输出时钟信号,换句话说,在输出 OCIB 上。时钟信号的频率应为 1.0 kHz。
有人知道这是怎么做到的吗?
【问题讨论】:
您需要查看COM 位中的计时器。例如,对于 Timer0(8 位),COM 位在TCCR0 寄存器中设置。您可能感兴趣的设置是
TCCR0 |= (0<<COM1)|1<<COM0); // Toggle OC0 on compare match
这将在定时器达到指定值时切换 OC0 (pin14) 线。
您使用哪个计时器取决于您需要的精度:显然 16 位计时器可以为您提供比 8 位计时器更精确的时间分辨率。
针对您的特定频率 (1Khz) 的寄存器设置取决于您芯片的时钟速度,以及您使用的定时器:定时器使用预先调整的通用时钟信号(请参阅数据表的表 56 了解可能值)。这意味着预分频器设置将取决于您的时钟速度以及您想要计数的高度。对于大多数精度,您将希望计数尽可能高,这意味着与您的定时器的最大值兼容的最低预分频器设置。
至于从哪里开始,一般来说,阅读数据表是一个好地方,但谷歌搜索“AVR 计时器”也很有帮助。
【讨论】:
它似乎基于Atmel ATmega 128,因此请阅读该 CPU 的数据表以了解如何对定时器硬件进行编程。
不确定该微控制器是否支持直接驱动定时器的输出,如果不支持,您将不得不通过中断服务例程在软件中进行。
【讨论】: