Цитата(mempfis_ @ May 16 2010, 22:23)

Забавная идея постоянно вися в ISR после возникновения прерывания генерировать шимированный сигнал.
ну задача получилась такая, что ШИМ генерится однократно и плавно зажигается диод только после нажатия кнопки.
Цитата(mempfis_ @ May 16 2010, 22:23)

Во-первых зачем использовать long int там где обычного int вполне достаточно.
с этим полностью согласен
Цитата(mempfis_ @ May 16 2010, 22:23)

Во-вторых при входе в обработчик прерываний ставить кучу задержек - плохая идея.
а как победить дребезг. Существует вроде несколько программных способов, но почему задержки плохо?
Цитата(mempfis_ @ May 16 2010, 22:23)

В-третьих конструкция PWM_PORT &= (0<<PWM_PIN); не имеет смысла если хотите сбросить пин управления светодиодом.
Поставте чтоли PWM_PORT &= ~(1<<PWM_PIN);
что в протеусе, что в авр студии сбрасывается хорошо

Цитата(mempfis_ @ May 16 2010, 22:23)

По-поводу программы.
У вас сложно реализовано зажигание светодиода, пауза, гашение в void pwm_gen(unsigned int cmp16);
Упростите до:
void pwm_gen(unsigned int cmp16) //программная генерация ШИМ
{
PWM_PORT |= (1<<PWM_PIN); //зажгли
while(cmp16--); //подождали
PWM_PORT &= ~(1<<PWM_PIN); //погасили
};
спасибо - упрощу

Цитата(mempfis_ @ May 16 2010, 22:23)

MCUCR |= (1 << ISC01) | (0 << ISC00); - лень искать в документации по какому фронту тут устанавливается генерирование прерываний.
Если по обоим то возможно выключается по второму фронту.
Действительно ли вызов функций pause обеспечивает 80 мС? Проверте - может быть антидребезг не работает.
авр студио дает 20 мс на ф-ю pause
Цитата(mempfis_ @ May 16 2010, 22:23)

Как вариант попробуйте очищать флаг внешнего прерывания при выходе из обработчика ISR.
ок
Цитата(mempfis_ @ May 16 2010, 22:23)

Ну и может стоит в целом пересмотреть концепцию построения программы?
Использовать таймер-счётчик в режиме ШИМ, ввести опрос кнопки с програмным антидребезгом, вместо висения в ISR использовать установку флага что было прерывание и обрабатывать его в основном цикле программы.
спасибо за должную критику

я проги не часто пишу - вот поэтому столько кривостей.
но пока не понятно почему обработчик прерывания в реальной железке с ума сходит...