реклама на сайте
подробности

 
 
> Ламерский вопрос по timer1 Atmega88
brag
сообщение Sep 15 2014, 20:43
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Привет всем!
Собственно в сабже есть режим CTC и в нем есть фичи Clear OC1A/OC1B on Compare Match (Set output to low level) и Set OC1A/OC1B on Compare Match (Set output to high level).
Как ими пользоватся? wink.gif
В смысле, если я настрою выход OC1B как Clear OC1A/OC1B on Compare Match, то как сделать Set? Получается только путем переконфигурировать и дождатся события(или форс вручную)?

Вообще задача стоит так. Таймер T считает от 0 до X, при достижении X сбрасывается в 0 и так по кругу.
Когда T==0 set OC1A(или B,не важно). Когда T=a clear OC1A/B, при чем a<X. Тоесть обычный PWM.
Но, таймер должен еще сбрасыватся по компаратору(или внешнему пину), при чем с определенной задержкой.

Пока реализация вот такая. Режим CTC TOP=OCR1A. Clear OC1B on Compare Match и в OCR1B=a; OCR1A изначально равно X.
Код
ISR(TIMER1_CAPT_vect){
    OCR1A=ICR1+delay; // сброс таймера при достижении OCR1A
}

ISR(TIMER1_COMPA_vect){
    OCR1A=X;
}

Все было бы ок, если бы можно было заставить выход OC1B установится в лог1, когда таймер сбрасывается.
Ржим PWM не канает из за буфферизации OCR1x...

Можно как-то так, но эт как-то слишком глючно. На пример, если a слишком маленькое - есть риск что таймер его обгонит еще до того, как мы успеем обновить OCR1B и выход будет всегда висеть в единице, а это чревато последствиями sm.gif
Код
init(){
    TCCR1A=(1<<COM1B1)|(0<<COM1B0); //Clear OC1B on Compare Match
}

ISR(TIMER1_CAPT_vect){
    int t=ICR1+delay; // сброс таймера при достижении OCR1A
    OCR1A=t;
    OCR1B=t;
    TCCR1A=(1<<COM1B1)|(1<<COM1B0); // Set OC1B on Compare Match
}

ISR(TIMER1_COMPA_vect){
    OCR1A=X;
    OCR1B=a;
    TCCR1A=(1<<COM1B1)|(0<<COM1B0); //Clear OC1B on Compare Match
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
brag
сообщение Sep 17 2014, 12:05
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Ну раз так, то не надо его называть "capture event"

ну вообще то событие (точка 2) названо comparator IRQ/capture event sm.gif
В данном случаи(код для атмега88 ANALOG_COMP_vect) правильно будет software capture event или тип того. Но в идеале это должен быть настоящий железный capture

Цитата
В один таймер пишете 0, в другой 1. Запускаете первый, потом второй.

разве что на ассемблере с точным подсчетом тактов между запусками таймеров, и скорее не 1, а где-то 4 + не совсем известно сколько проходит тактов с момента начала выполнения инструкции до собственно старта таймера(мож в даташите и написано). это костыль, есть же бит TSM для этих целей.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016