0

我正在使用 Attiny 9。 在此处输入图像描述

我将一个 LED 连接到 PB1。我编写了以下代码并将其上传到 Attiny 9。

#define F_CPU 800000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define D0 PB1

int main(void)
{
  power_adc_disable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  TCCR0A |= (1<<WGM00)|(1<<WGM01)|(1<<COM0B1);
  TCCR0B |= (1<<WGM03)|(1<<WGM02)|(1<<CS00);

  DDRB |= 1<<D0;

  PORTB |= 1<<D0;
  _delay_ms(3000);
  PORTB &= ~(1<<D0);

  for (uint8_t i = 255; 247 < i; --i)
  {
    OCR0B = i;
    _delay_ms(70);
  }

  for (uint8_t i= 247; -1 < i; --i)
  {
    OCR0B = i;
    _delay_ms(4);
  }

  while(1){
    sleep_enable();
    sleep_cpu();
  }

  return 0;
}

我希望 LED 变亮和变暗。但是在我上传代码后,LED 一直亮着。我还阅读了 Attiny 9 的数据表。我遵循了如何使用 PWM。但它不起作用。

怎么了?

4

1 回答 1

3

该代码存在许多问题。

  1. 您正在将处理器置于断电模式,根据数据表,该模式会禁用时钟,并且只能发生异步事件。
  2. 您将其设置为使用以 OCR0A 作为顶部的快速 PWM 模式,但您没有在任何地方设置 OCR0A。如果您的计时器计数不够高,您将不会生成任何比较匹配。从您的循环中可以看出,您希望计时器计数到 255。
  3. 您只需在 while 循环之前更改 PWM 的占空比,因此即使您的 PWM 设置正确,您也永远无法看到您想要的 LED 脉冲。

这是一个链接,提供了如何设置 PWM 并更改其占空比的示例:http: //allaboutavr.com/index.php/2017/05/13/chapter-5-timers-and-pwm-pulse-width -调制/

像这样:

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

#define D0 PB1

int main(void)
{
    DDRB |= 1<<D0;

    TCCR0A |= (1<<WGM00)|(1<<COM0B1);
    TCCR0B |= (1<<WGM02)|(1<<CS00);

    while (1) {
        for (uint8_t i = 0; i < 255; i++) {
            OCR0B = i;
            _delay_ms(4);
        }

        for (uint8_t i = 255; i >= 0; i--) {
            OCR0B = i;
            _delay_ms(4);
        }
    }
}
于 2017-05-26T04:54:49.400 回答