Об управлении светодиодом с помощью кнопки с помощью ATmega328P
Я использую ATmega328P и хочу осветить светодиод, подключенный к PORTB, в соответствии с входом (с подтягивающим резистором) от PORTD. В той же программе я генерирую фазо-корректный ШИМ и беру выход с контакта PD6.
Проблема в том, что когда я комментирую функцию (PWM_out), светодиод загорается правильно. Но когда эта функция не комментируется, светодиод мигает (вкл.-выкл.) несколько раз, а я этого не хочу.
#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;
}
}
}
@user47005, 👍1
Обсуждение0
Смотрите также:
- Проблема с отправкой ИК-сигнала с at ATmega328P-PU
- Заменить предохранители Arduino Uno (может ли Arduino Uno заменить свои собственные предохранители?)
- Светодиод Arduino PWM с замиранием в сборке
- ШИМ-управление, как остановить мерцание светодиода?
- ATmega328P - проблема с использованием таймера 2 для генерации тона
- Последовательная связь Arduino и AVR через USB
- Arduino включение/затухание 5 светодиодов, схема действия
- максимальная частота ШИМ на основе прерываний при 500 Гц
Вы не передаете аргумент своей функции 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