Перейти к содержанию
bbh_blocked_dnftl

Dx PortalПроблемы с пропуском прерывания Atmega8


Рекомендуемые сообщения

Здравствуйте, я делаю диммер на 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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...