roboforum.ruТехнический форум по робототехнике. |
|
|
Однако, задание значения вершины счета близкого к значению нижнего предела счета, когда счетчик работает без предделения или с малым значением предделения, необходимо выполнять с особой осторожностью, т.к. в режиме СТС нет двойной буферизации. Если значение, записанное в OCRnA или ICRn, меньше текущего значения TCNTn, то сброс счетчика по условию совпадения наступит, когда он достигнет максимального значения (0xFFFF), затем перейдет в исходное состояние 0x0000 и достигнет нового значения OCRnA или ICRn. Во многих случаях возникновение такой ситуации не желательно.
//Таймер 3 (отсчёт частоты звука)
//Быстрая ШИМ, OC3A переключается при сбросе таймера
TCCR3A = 0x00 | 1<<COM3A0 | 1<<WGM31 | 1<<WGM30;
TCCR3B = 0x00 | 1<<WGM33| 1<<WGM32;
//Установка значения счётного регистра
OCR3A = nFreq;
//Проверка на "перепрыгивание" предела
nCounter = TCNT3;
if(nCounter >= nFreq) {
//Cброс счетчика
TCNT3 = 0x00;
}
ISR(SIG_OUTPUT_COMPARE1A) {
/*
здесь достаем freq и time из буфера
*/
OCR3A = freq;
OCR1A += time;
}
nFreq = F_CPU / ((fFreq * 4/*транспозиция*/)*2*8/*предделитель*/);
Вернуться в Новичкам или основы основ роботостроения.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4