NewSistems Опубликовано 2 ноября Жалоба Поделиться Опубликовано 2 ноября Здравствуйте, я делаю диммер на Atmega8. Наблюдаю проблему что через пару периодов прерывание на детектор нуля не срабатывает. #define F_CPU 8000000UL // Частота микроконтроллера 8 МГц#define ZERO_PIN 2 // Пин детектора нуля (INT0)#define DIMMER_PIN 4 // Пин для управления симистором#include <avr/io.h>#include <avr/interrupt.h>volatile uint16_t dimmer_delay = 5000; // Время задержки включения симистора (в микросекундах)void setup_pins(void) { DDRD &= ~(1 << ZERO_PIN); // Устанавливаем ZERO_PIN как вход PORTD |= (1 << ZERO_PIN); // Включаем подтягивающий резистор DDRD |= (1 << DIMMER_PIN); // Устанавливаем DIMMER_PIN как выход}void setup_external_interrupt(void) { MCUCR |= (1 << ISC01); // Прерывание по нисходящему фронту на INT0 GICR |= (1 << INT0); // Разрешаем прерывание INT0}void setup_timer1(void) { TCCR1A = 0; // Обычный режим работы, без PWM TCCR1B = (1 << WGM12) | (1 << CS11); // CTC, делитель 8 (1 мкс на такт) TIMSK |= (1 << OCIE1A); // Разрешаем прерывание по совпадению OCR1A}void start_timer1(uint16_t delay) { TCNT1 = 0; // Обнуляем счетчик таймера OCR1A = delay; // Устанавливаем значение сравнения TCCR1B |= (1 << CS11); // Запускаем таймер с делителем 8}void stop_timer1(void) { TCCR1B &= ~(1 << CS11); // Останавливаем таймер}ISR(TIMER1_COMPA_vect) { PORTD |= (1 << DIMMER_PIN); // Включаем симистор stop_timer1(); TCNT1 = 0; // Останавливаем таймер после срабатывания}ISR(INT0_vect) { TCNT1 = 0; PORTD &= ~(1 << DIMMER_PIN); // Выключаем симистор на пересечении нуля start_timer1(dimmer_delay); // Запускаем таймер с задержкой}int main(void) { setup_pins(); setup_external_interrupt(); setup_timer1(); sei(); // Включаем глобальные прерывания while (1) { // Основной цикл программы, можно изменять значение dimmer_delay // например, с помощью аналогового ввода }} Вот мой код. Работаю в среде AtmelStudio 7. Схему прекрепил, только вместо Ардуины у меня Atmega8. Тактируется МК от внутреннего генератора на 8Мгц. R2 и R5 убрал. Давали помехи. Собрано все на макетке. На Осцилографе четко видно как отрабатывает схема и через пару периодов пропускает синусоиду полностью. Из за этого лампочка мигает.View the full article Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.