Доброго дня всем!
Пролог. Давно почитываю ваш сайт. Нравятся самоделки и проекты, порой интересно понаблюдать за созданием устройства. Самому тоже нравится поднапрячь мозги, но практического опыта все же не хватает.
Итак! Имеется контроллер ATmega16 на тестовой плате. Имеется очень большое желание плавного управления яркостью светодиода. Вполне логично, что для этого имеет смысл использования ШИМ, что я и делаю. Однако, если же хочу использовать не стандартную ногу OC1A, а любую на мой выбор, то придется изменить ШИМ. Отключаю ногу и ставлю два прерывания по сравнению и по переполнению. В одном случае устанавливаю нужную мне ногу, в другом сбрасываю. Однако, даже когда регистр OCR1A равен нулю, то все равно имеется некая задержка во времени, которая не дает моему светодиоду потухнуть полностью. Вот пример на COdeVision:
Код:
//Настройка таймера:
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x01;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//Включение прерываний:
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x14;
//Прерывания:
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
PORTD.0=1;
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
PORTD.0=0;
}
Вложение:
Задержка ШИМ.png [ 130.9 КиБ | Просмотров: 1596 ]
Собственно, вот и ситуация. А хотелось бы если не избавиться, то минимизировать эту задержку. Предполагаю, что это происходит в связи с обработкой прерывания, или нет? Возможно ли избавиться? Менять скорость ШИМ на более низкую не очень-то хотелось бы - а если не один светодиод решу сделать, а, допустим, 50. Тогда надо на максимальной скорости работать, чтобы успевать переключаться. Выходить на 10 битное разрешение тоже, наверное, будет неудобно.
Есть ли другие варианты решения? Гуру, подскажите!
З.Ы. Глюканул форум, второй раз набиваю сообщение