0

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

#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;
}
4

1 回答 1

0

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

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

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

于 2021-10-21T03:02:25.203 回答