Upgrader, судя по тому, что вы приплели к таймеру обработчики внешних прерываний, вы не в курсе, что для каждого вектора есть свой обработчик. Например, для CTC T1: interrupt [TIM1_COMPA] void ext_int0_isr(void) {} Список векторов можно взять из хидера в папке \cvavr\inc\
Спасибо вам всем! Многое понял, теперь все работает! А можно еще одну вещь уточнить?
AI_Disable писал(а):
Так что, следует делать как говорил тов. ValBag, "отключать" ногу от таймера с помощью бита COM регистра TCCR. В вашем случаи, это будет выглядеть как TCCR0A&=0x80; для выключения и TCCR0A|=0x80; для включения.
Как узнать это значение "0x80", откуда оно?
_________________ Не променяю медь на ржавую несгорайку!
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт июн 03, 2010 20:13:44
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
Upgrader Для выбранного вами режима работы таймера Т0 - неинвертированный ШИМ сигнал, значения битов в регистре TCCR0A должны быть как в таблице выше: COM0A1=1 COM0A0=0, а для выключения выхода таймера оба эти бита равны нулю. Значит, в данном случае, для включения или выключения выхода таймера можно изменять один бит - COM0A1
TCCR0A &= 0x7F; // Обнуляет бит 7 - выключает выход TCCR0A |= 0x80; // Устанавливает бит 7 - включает выход. Или так: TCCR0A &= (~(1<<COM0A1)); // Выкл. TCCR0A |= (1<<COM0A1); // Вкл.
Помощь была бы существеннее, если изложить задачу подробнее.
Последний раз редактировалось ValBag Чт июн 03, 2010 21:43:54, всего редактировалось 2 раз(а).
Мне тоже объясняли, но я как дерево был, пока не допер. Регистр TCCR0A это 8 битов. Нумеруются так 7 6 5 4 3 2 1 0 Каждый бит установкой нуля или единицы отвечает за включение какого то состояния регистра. В даташет написаны навания каждого бита Так вот Вам напИсали название 7 бита - COAM01A и если Вы в него пишете единицу то соответственно выбираете режим работы. Правда следует заметить что присутствует в настройках и COAM01A и необязательно он будет 6. Надо посмотреть в даташете - какой он по счету. И если внимательно посмотреть на таблицу будет видно, что комбинация нулей и единиц записанных в эти ячейки даст Вам нужный режим работы. А приписка со звездочкой означает что эти настройки верны для режима если включен FAST PWM. И последний штрих - в регистр можно записывать нули и единицы также как и в порты. Это Вы уже умеете. Т.е сделав запись TCCR0A = 0b1000000 вы установили COAM01A в единицу и так далее. Считаем с правой стороны и начинаем не с единицы а с нуля. Посмотрите даташет там будут описаны все возможные состояния регистра. Посмотрел - это на 75 странице оригинального даташета на 2313 Тиню
Последний раз редактировалось nsl2004 Чт июн 03, 2010 21:29:55, всего редактировалось 2 раз(а).
я не знаю, как там в вашем CVAVR заведено, но вот в нормальных хидерах микроконтроллеров все имена битов всех регистров уже заданы, и если вместо 6 вы будете писать COAM01A, то думать о том, 6-й это бит или вдруг 5-й, вам не придется.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Все равно надо смотреть за что и что отвечает. Но первоначально было не понять, пока не дошло, это как механический селектор режимов работы - включил выключил. Их еще на заре - конфигураторами называли. Вроде просто, но это надо знать. Так раньше режимы работы факсов конфигурировались, кучей микриков.
Ага, почти понятно Значит получается что в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
ValBag писал(а):
Помощь была бы существеннее, если изложить задачу подробнее.
Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.
_________________ Не променяю медь на ржавую несгорайку!
Ага, почти понятно Значит получается что в Mega8 второго таймера (TCCR2) в том-же ШИМ режиме это будет 5-ый бит COM21, я правильно понимаю? Там названия другие, по этому не очень понятно.
ValBag писал(а):
Помощь была бы существеннее, если изложить задачу подробнее.
Задача заключается в простом включении и выключении выхода ШИМ, не изменяя при этом состояния ШИМ-а.
Выходит что так. Но там три таблички, котрые зависат от конфигурации других битов, т.е выбранных режимов работы. Например если у Вас FAST PWM то для Вас табличка 44. Вообщето надо разобратся. Если у Вас выставлен режим = 80 то это 0b10000000 Сопоставьте с рисунком на странице 117 вначале и увидете что у вас включено. Подозреваю совсем не то что нужно Вам.Т.к там простым английским языком написано, что этот бит активен только когда используется NON PWM режим. А так как я пока не въехал, зачем работающий шим с отключенной ногой. То и помочь не могу. Сам пока только разобрался КАК конфигурировать. А вот ЧТО - это зависит от задачи.
Интересная задачка. Но я не помогу. Надо эксперименты ставить. Я тоже сейчас с ШИМ разбираюсь, но у меня другая задача, которая сильно отличается от Вашей.
вот тоже нужна помошь по поводу ШИМ на attiny2313. есть проект, типа управление елочной гирляндой, хочу сделать, что бы лампочки не просто гасли и зажигались, а делали это плавно! Вот код который работает, подскажите как на основе его сделать плавное мигание...
if(revers_flag==0)i++; if(revers_flag==1)i--; if(i==5){revers_flag=1;i=4;} if(i==0){revers_flag=0;i=1;} break; }; case4:{ // все горят + if(t_select_prog!=select_prog){ PORTD=0b00001111; } break; }; case5:{ //перекрючаются по переменки через одного + if(i==1){PORTD=0x0A; i=2;}else{PORTD=0x05; i=1;}; break; }; case6:{ //дорошкой загорается и потом дорожкой тухнет + if (i==1)PORTD=0b00000001; if (i==2)PORTD=0b00000011; if (i==3)PORTD=0b00000111; if (i==4)PORTD=0b00001111; if (i==5)PORTD=0b00001110; if (i==6)PORTD=0b00001100; if (i==7)PORTD=0b00001000; if (i==8)PORTD=0b00000000; i++; if(i==9)i=1; break; }; case7:{ //то загораются, то гаснут + if(i==1) {PORTD=0b00001111; i=2;} else {PORTD=0b00000000; i=1;}; break; }; case8:{ //то загораются, то гаснут + if (i==1)PORTD=0b00000001; if (i==2)PORTD=0b00000011; if (i==3)PORTD=0b00000111; if (i==4)PORTD=0b00001111; if (i==5)PORTD=0b00001110; if (i==6)PORTD=0b00001100; if (i==7)PORTD=0b00001000; if (i==8)PORTD=0b00000000;
if (i==9) PORTD=0b00001000; if (i==10)PORTD=0b00001100; if (i==11)PORTD=0b00001110; if (i==12)PORTD=0b00001111; if (i==13)PORTD=0b00000111; if (i==14)PORTD=0b00000011; if (i==15)PORTD=0b00000001; if (i==16)PORTD=0b00000000;
2ssvd Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить. Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
2ssvd Надо прикрутить управление ШИМАми их у Тини 4 как раз должно Вам хватить. Я прикладываю код там для управления двумя шимами, по аналогии попробуйте сделать для четыех, подставляя соответствующие регистры. А управление ШИМами сделайте от своего управляющего блока заменив мою кнопку. Думаю все получится.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 416
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения