|
Конфигурирование timer1 (Atmega16) в режим PWM |
|
|
|
Feb 2 2011, 15:50
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 11-01-08
Пользователь №: 34 008

|
Добрый день, Подскажите плз в чем может быть проблема , хочу сделать два канала ШИМ 8 bit на выходы OC1A,OC1B , использую timer1 конфигурирую его для работы в режиме Fast Mode 8 bit
#define setbit(x,y) (x|=(1<<y)) #define clearbit(x,y) (x&=~(1<<y)) #define checkbit(x,y) (x&(1<<y))
TCCR1B = 2; //clk/8 setbit(DDRD,PD5); setbit(DDRD,PD4);
setbit(TCCR1A,WGM10); clearbit(TCCR1A,WGM11); setbit(TCCR1B,WGM12); clearbit(TCCR1B,WGM13); установка режима fast mode setbit(TCCR1A,COM1A0); setbit(TCCR1A,COM1A1); setbit(TCCR1A,COM1B0); setbit(TCCR1A,COM1B1); управление выводом OCR1AH=255/256; OCR1AL=255%256; //setbit(TIMSK,OCIE1A); //INT CompareA enable
OCR1BH=255/256; OCR1BL=255%256; //setbit(TIMSK,OCIE1B); //INT CompareA enable
По отдельности выводы OC1A и OC1B работают , а вместе не хотят . В чем может быть причина?
|
|
|
|
|
 |
Ответов
|
Apr 27 2011, 19:36
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
не буду создавать новую тему спрошу тут также про 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
|
|
|
|
|
Apr 28 2011, 09:44
|
Участник

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383

|
Цитата(Палыч @ Apr 28 2011, 12:36)  Один таймер - одна частота. Вероятно, нужно задействовать ещё один таймер, если есть свободный. Есть таймер 2 свободный... но посчитал, он не подойте чтобы использовать его для прерывания 1/64с А всякими финтами можно добится поставленной задачи?
Сообщение отредактировал Roger - Apr 28 2011, 09:47
|
|
|
|
Сообщений в этой теме
man1 Конфигурирование timer1 (Atmega16) в режим PWM Feb 2 2011, 15:50 2891oleg Вот тебе работающий пример из СVAVR.
Кстати, ты не... Feb 2 2011, 16:21 man1 Цитата(2891oleg @ Feb 2 2011, 19:21) Вот ... Feb 2 2011, 16:40  demiurg_spb Цитата(man1 @ Feb 2 2011, 19:40) в том чт... Feb 2 2011, 17:04    Roger Цитата(Палыч @ Apr 28 2011, 14:51) Зависи... Apr 28 2011, 11:34     Палыч Цитата(Roger @ Apr 28 2011, 15:34) 18.432... Apr 28 2011, 11:52      Roger Цитата(Палыч @ Apr 28 2011, 15:52) Прийдё... May 3 2011, 06:16       Палыч Цитата(Roger @ May 3 2011, 10:16) мое пре... May 3 2011, 06:25        Roger Цитата(Палыч @ May 3 2011, 10:25) Да, каж... May 5 2011, 10:40 Roger Малек разогнал...
както 1/64с была отпимально.
пос... Apr 28 2011, 12:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|