не буду создавать новую тему спрошу тут также про Timer 1
МК Atmega 32
Задача использую Timer 1
Нужно генерировать два прерывания
1:с изменяющей частотой от 500Гц до 11кГц, главное менять состояние вывода на PD5 аппаратно, но можно и программно
2:с частотой 1/64с 15.625мс или 64Гц. При этот состояние вывода PD4 не нужно.
Поменять выводы пины PD5 и PD4 можно, как и прерывания.
делаю так, режим FastPWM(14). но наверное можно и CTC(12)
инициализация таймера
Код
// Инициализация таймера 1
// Выбор источника тактого сигнала и коэфф. предделителя
TCCR1B|=(0<<CS12)|(1<<CS11)|(0<<CS10); // коэфф. 8
// Режим работы FASTPWM - сброс при совпадении
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<WGM11); //WGM10-0 по defualt
TIMSK|=(1<<OCIE1A)|(1<<OCIE1B); //Разеришь прерывание по событию "совпадение А" таймера 1
//Разеришь прерывание по событию "совпадение B" таймера 1
TCCR1A|=(1<<COM1A0);//Разрешить изменения состояние выхода на противоположное
ICR1=0x464F;//15.625мс
OCR1B=0x464F;//15.625мс
OCR1A=0x08FF;//500Гц
Ну и обработка прерывания
Код
*/
// Прерывание по совпадению таймера 1 A
#pragma vector=TIMER1_COMPA_vect
__interrupt void StepDriver(void)
{
//PORTD ^= (1<<(5)); попытка программно менять состояние пина.
// что то делаем
}
// Прерывание 15.625мс
#pragma vector=TIMER1_COMPB_vect
__interrupt void SpeedUpDown(void)
{
// что то делаем
//OCR1A= новое значение
}
В результате на выходе PD5 получаю постоянно частоту 1/64с 64гц.
в чем я ошибся?
Сообщение отредактировал Roger - Apr 28 2011, 07:22