0

我试图用 ATtiny2313 在 OC0A (PB2) 上发送一个 PWM 信号,但由于某种原因,端口 B2 上没有任何反应。我的代码显示如下:

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/**
 * Initialize fast pwm on PB2 (OC0A)
 */
void pwmInit() {
    // Setup the output for PWM
    DDRB |= (1 << DDB2);

    // Set Timer/Counter0 prescaler to clock/1.
    // At 8MHz this is 8MHz.
    TCCR0B |= (1 << CS00);

    // Set to 'Fast PWM' mode
    TCCR0A |= (1 << WGM01) | (1 << WGM00);

    // Clear OC0A output on compare match, upwards counting.
    TCCR0A |= (1 << COM0A1);

    // If the value '128' is reached, the PWM signal will set to LOW
    OCR0A=128; // 128 = 50% duty cycle
}

void setup() {
    pwmInit();

    DDRB |= (1 << DDB0); // Setup the Output fon port B0
}

int main(void) {
    setup();

    while(1) {
        PORTB |= (1<<PB0);
        _delay_ms(500);

        PORTB &= ~(1<<PB0);
        _delay_ms(500);
    }

    return 0;
}

PB0 上的 LED 闪烁,但示波器上没有显示 PWM 信号(在 PB2 上),并且 PB2 上的 LED 仍然熄灭。我是否错误配置了 MCU?

ATtiny13A 上的类似代码仍在工作。

4

1 回答 1

0

好的,我在 Code::Blocs 中创建项目时不小心选择了错误的 MCU 架构(在我的例子中是 attiny13 而不是 attiny2313)。我通过更改“.cbp”中的配置解决了这个问题,并将任何 attiny13 更改为 attiny2313(在我的情况下是环境、编译器和链接器配置)。

我如何检测到这一点:尝试设置

DDRD |= (1<<DD5);

测试 OC0B 而不是 OC0A 作为 PWM 输出会发生编译器错误,例如找不到 DDRD。

于 2018-10-02T16:28:39.377 回答