【发布时间】:2017-10-06 05:53:56
【问题描述】:
我编写了一个简单的程序来生成占空比为 50% 的 PWM 波。然后我去 AtmelStudio 进行调试。除了 OCR0 之外的所有寄存器都被分配了相应的值。为什么 OCR0 没有分配任何值。 ATmega32,快速 PWM。
#include <avr/io.h>
int main(void)
{
DDRB = (1 << PB3);
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01);
OCR0 = 127;
TCCR0 |= (1 << CS02);
return 0;
}
【问题讨论】:
-
你永无止境的循环在哪里?
-
是什么让您认为写入值的尝试没有成功?硬件规范是否将 OCR0 寄存器描述为可读的?它可能是只写的吗?
-
@tilz0R 请详细说明。什么是永无止境的循环?
-
@Lundin> 编译器(即 avr-gcc)在其文档中使用
int main(void)和return0;。它在微控制器上确实有意义,它具有 C 运行时库赋予它的任何意义。在大型系统上,它是“使用该错误代码清理并终止进程”,但运行时库可以完美地定义“以非零值退出主程序,我将疯狂地闪烁一些红色 LED” i>. -
别误会我的意思,我也不喜欢看到这种情况,即使我确实想冻结设备,我宁愿将其置于待机/睡眠模式。我只是想指出它是有效的,只要平台文档这么说它就有意义。它会生成与手册
for(;;) {}完全相同的二进制文件。所以没有理由在这件事上叫他出来。实际上,使用 c++ 时它做得更好的一件事是:它在 main() 的范围内调用对象的析构函数,而手动无限循环不会这样做。