Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Некорректная загрузка регистра OCR3A в ATmega64 (режим 14 - "быстрый" ШИМ)
Отправлено
Юрий_СВ 06 октября 2008 г. 12:39
ОЧЕНЬ странно работает настройка таймера 3 ("быстрый" ШИМ, режим 14) в функции настройки переферии.
Очевидного объяснения этому в pdf (при беглом просмотре) не заметил.
Интересно, это у меня такой экземпляр или у всех так ?
Первый вызов функции настройки переферии проходит правильно, но если в программе ещё раз вызвать эту функцию, заметил, что, н-р, после повторного OCR3A=0x03ff; в OCR3A оказывается 0x01ff.
===============================
asm volatile("cli\n\t"::); // запрет прерываний
TCCR3B=0x00; // Выключаем входной делитель таймера 3
SFIOR=0x80; // Вход в режим синхронизации таймеров
SFIOR=0x83; // Сброс входных делителей всех таймеров
TCNT3=704 + 512; // грузим в таймер начальное смещение
ICR3 =0x07ff; // Т.к. перезапуск по ICR3 - задаём период (2048 тактов)
OCR3A=0x03ff; // регистр канала сравнения А (переводит выход в "1" по достижении 1023 и в "0" по нулю)
OCR3B=gp->g_comp; // регистр канала сравнения В
OCR3C=y_comp; // регистр канала сравнения С
TCCR3A=0xfa; // 0b 1a1b1c10 (a,b,c - состояние выхода по сравнению)
TCCR3B=0x19; // Входной делитель таймера 3 = 1. Быстрый ШИМ + Перезапуск по ICR3 (режим 14)
SFIOR=0x00; // SFIOR&=0x7f; Синхронный запуск таймеров (Выход из режима синхронизации)
asm volatile("sei\n\t"::); // разрешение прерываний
===============================
Если же после такой (неудачной) настройки OCR3A=0x03ff; выполнить за пределами функции
настройки - OCR3A станет равен 0x03ff, но фаза "0" счётчика Х сдвинеться на 180 градусов.
Со слудующего раза выполнение OCR3A=0x03ff; уже ничего не меняет.
(фаза остаётся сдвинута на 180 грудусов)
Т.е., неверно работает изменение OCR3A при настроенном TCCR3A (TCCR3A=0xfa;) и остановленном входном делителе (TCCR3B=0x00;)
Если перед настройкой поставить
TCCR3A=0x00; // Отключаем выходы таймера 3 от портов
- всё нормально.
Составить ответ | Вернуться на конференцию
Ответы