Об управлении светодиодом с помощью кнопки с помощью ATmega328P

Я использую ATmega328P и хочу осветить светодиод, подключенный к PORTB, в соответствии с входом (с подтягивающим резистором) от PORTD. В той же программе я генерирую фазо-корректный ШИМ и беру выход с контакта PD6.

Проблема в том, что когда я комментирую функцию (PWM_out), светодиод загорается правильно. Но когда эта функция не комментируется, светодиод мигает (вкл.-выкл.) несколько раз, а я этого не хочу.

Schematic

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

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

void phase_pwm(void)  
{
  TCCR0A=(1<<WGM00)|(1<<COM0A1)|(1<<COM0B1); 
  TCCR0B=(1<<CS01); 
}

void PWM_out(uint8_t duty_cycle) 
{
  OCR0A=((duty_cycle*256)/100);
}


int main(void)
{   
  DDRD=0xf0;
  DDRB=0xff;

  phase_pwm(50);
  PWM_out();

  while(1)
  {
    if(PIND==0x04)
    {
      PORTB=0x02;
    }
    else
    { 
      PORTB=0x00;
    }
  }
}

, 👍1

Обсуждение

Вы не передаете аргумент своей функции PWM_out. Это даже не должно компилироваться. (И PWM включает и выключает светодиод по дизайну. Вам нужно, чтобы частота была достаточно высокой (> 60 Гц или что-то еще), чтобы получить плавный эффект для человеческих глаз.), @Mat

Я не могу повторить вашу проблему здесь, но " if (PIND & 0x04) {"- это то, что вы ищете, я думаю; на истинность "PIND == 0x04" не влияет *only* битный индекс 2. На самом деле здесь происходит не так уж много всего, что связано с Arduino. В PWM_out (); ' отсутствует аргумент. duty_cycle*256 может переполниться, если duty_cycle >= 0x80; вы должны * 256U или поочередно привести duty_cycle к unsigned или uint16_t` или что-то еще. Если вы спрашиваете об AVR в целом, то он, вероятно, принадлежит к электронному stackexchange., @timemage

Я вижу, вы принимаете от 0 до 100; во всяком случае, остальное применимо., @timemage