c-我的程序在ATmega32的引脚b1上生成1kHz方波是否正确(8MHz 64预分频Timer1)



代码编译正确,但我无法获得1kHz的方波。我在PINB1连接了一个LED进行检查。我使用Timer1,CTC模式,预标量为64。P请参阅帮助。

#define F_CPU 8000000L
#include <avr/io.h>
#include "avr/iom32.h"

// - - - - PROGRAM TO GENERATE A SQUARE WAVE OF 1KHz - - - - //
void _delay_();
int main(void)
{
DDRB = 0xFF;
OCR1AH = 0xF4;
OCR1AL = 0x23;
TCNT1H = 0;
TCNT1L = 0;
while (1) 
{
PORTB |= (1 << 4);
_delay_();
PORTB &= ~(1 << 4);
_delay_();
}
}
void _delay_() {
TCCR1A = 0x00;
TCCR1B = 0x0B;
while(!(TIFR & (1 << 4)));
TCCR1B = 0x00;
TCCR1A = 0x00;
TIFR |= 0x10;
}

正如oldtimer建议的那样,您应该使用o-scope来验证输出。如果你没有,或者你有,但仍然没有输出,那么试着用一个简单的软件延迟来代替延迟例程,比如:

void _delay_() {
// simple software delay
for (uint32_t i = 0; i < 50000; i++);
}

这个想法是将最大计数(50000(调整为任何产生足够长的延迟以看到LED闪烁的值。如果LED仍然不闪烁,则问题出在其他代码或LED的外部连接上。例如,您说PINB1,但在位位置1<lt;1,但是您的代码使用1<lt;4.

最新更新