|
Проблема с таймером на Atmega168, Не получается установить режим FastPWM |
|
|
|
Dec 26 2010, 12:16
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 26-10-09
Пользователь №: 53 223

|
Итак, есть девайс, Atmega168. Задачу можно свести к следующему минимуму: Необходимо установить режим FastPWM и дрыгать ножкой - устанавливать низкий уровень по совпадению с регистром сравнения, высокий по переполнению счетного регистра таймера. Используется Timer1 16bit. Проблема заключается в том, что по идее в режиме FastPWM таймер должен дотикать до FF, сбросить счетчик в 0, выдать прерывание по переполнению, и продолжить по кругу. При отладке программы в симуляторе avrstudio, таймер тикает до FF, затем тикает обратно до 0, и только тогда выдает прерывание, как в режиме PWM Phase Correct. Инициализация следующая: COM1A1..0 = 00 COM1B1..0 = 00 WGM13..0 = 0101 ; FastPWM 8bit CS12..0 = 001 ; без предделителя OCIE1A = 1 ; прерывание по совпадению TOIE1 = 1 ; прерывание по переполнению В OCR1A пришу, например, 0x003F. Притом флаги OCF1A и TOV1 вообще не выставляются по соответствующим событиям, но прерывания исправно отрабатываются. Итого имеем PWM Phase Correct при настройках для FastPWM. Где собака зарыта? Глюк в симуляторе, или (скорее всего), я что-то делаю неправильно? Проект на всякий случай прилагаю.
|
|
|
|
|
 |
Ответов
|
Dec 26 2010, 15:24
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 26-10-09
Пользователь №: 53 223

|
Цитата(777777 @ Dec 26 2010, 20:57)  Какой компилятор? В AVR Studio все исправно работает в режиме FastPWM. Флаги OCF1A и TOV1 ты не увидишь потому что они очищаются при входе в прерывание. Не осознал вопроса. Что значит "какой компилятор?". В avrstudio есть несколько компиляторов под ассемблер? Цитата(777777 @ Dec 26 2010, 20:57)  А зачем SEI перед выходом из прерывания? Почему то сбрасывается флаг I в регистре SREG при входе по вектору прерывания. По идее не должен. Вообще надо попробовать на железе без SEI перед выходом. Завтра доберусь до осциллографа, выясню точно, получается ли FastPWM или PhaseCorrect.
|
|
|
|
|
Dec 27 2010, 02:21
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(CatMurr @ Dec 26 2010, 21:24)  Не осознал вопроса. Что значит "какой компилятор?". В avrstudio есть несколько компиляторов под ассемблер? Не заметил сразу что ты написал про студию. Наверное версия старая, у них часто бывают глюки в симулятрое, у меня 4.18 b716. Цитата(CatMurr @ Dec 26 2010, 21:24)  Почему то сбрасывается флаг I в регистре SREG при входе по вектору прерывания. По идее не должен. По идее как раз должен, при входе в прерывание он всегда сбрасывается. А при выходе восстанавливается слово состояния в котором он был установлен.
|
|
|
|
|
Dec 27 2010, 03:08
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 26-10-09
Пользователь №: 53 223

|
Цитата(777777 @ Dec 27 2010, 08:21)  Не заметил сразу что ты написал про студию. Наверное версия старая, у них часто бывают глюки в симулятрое, у меня 4.18 b716. Студия 4.18 b716. За обновлениями слежу. Цитата(777777 @ Dec 27 2010, 08:21)  По идее как раз должен, при входе в прерывание он всегда сбрасывается. А при выходе восстанавливается слово состояния в котором он был установлен. Да, Вы правы, при использовании RETI флаг I выставляется заново при выходе из прерывания. Наверное, ранее я использовал RET. Сегодня утром погонял еще раз программку на симуляторе, затем посмотрел осциллографом. Выставил в регистре сравнения значение 0x3F, т.е. четверть периода (для наглядности). Симулятор: таймер упорно считает до FF, затем вниз до 0. Частота на 8 мегагерцовом кварце (без использования предделителя) получается порядка 15 кГц, т.е. 8000000/(255*2)=15686 Гц. Железо: частота 31,25 кГц (8000000/255), то есть настоящий FastPWM. Очевидно, что таймер по достижению FF сбрасывается в 0, иначе бы получили частоту в два раза меньше. Налицо глюк симулятора?
|
|
|
|
|
Dec 27 2010, 04:10
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(CatMurr @ Dec 27 2010, 09:08)  Студия 4.18 b716. За обновлениями слежу.
Железо: частота 31,25 кГц (8000000/255), то есть настоящий FastPWM. Очевидно, что таймер по достижению FF сбрасывается в 0, иначе бы получили частоту в два раза меньше. Налицо глюк симулятора? Я прогонял в симуляторе непосредственно вашу программу из первого поста и всё работало нормально, т.е. таймер по достижению FF сбрасывался в 0. Я даже не знаю, может кроме версии студии нужны еще версии файлов, которые использует симулятор с описанием процессора? А вообще от симуляторов толку мало, например, если PWM вывести наружу (т.е. COM1A1..0 поставить не ноль) то симулятор все равно не показывает изменения выводов. Поэтому я обычно им не пользуюсь и сразу все делаю в железе. Цитата(Diusha @ Dec 27 2010, 08:57)  Какое слово состояния? Просто при выполнении RETI устанавливается I (эквивалентно SEI + RET в одном флаконе) RETI не эквивалентен SEI + RET При прерывании в стеке сохраняется не только адрес возврата, но и слово состояния. По команде RETI они извлекаются из стека и продолжается выполнение программы с прерванного места. Поскольку в слове состояния бит I был установлен (если бы не был установлен, то и прерывание бы не произошло), то он восстанавливается наравне со всеми остальными битами слова состояния.
|
|
|
|
|
Dec 27 2010, 11:10
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(777777 @ Dec 27 2010, 10:10)  RETI не эквивалентен SEI + RET При прерывании в стеке сохраняется не только адрес возврата, но и слово состояния. По команде RETI они извлекаются из стека и продолжается выполнение программы с прерванного места. Поскольку в слове состояния бит I был установлен (если бы не был установлен, то и прерывание бы не произошло), то он восстанавливается наравне со всеми остальными битами слова состояния. Это где же Вы такое нашли? Во-первых, что Вы называете "словом состояния" применительно к меге168?  Может регистр SREG? Так сохранить его в целости во время обработки прерывания - полностью на совести программера. B стеке сохраняется только адрес возврата А вся неэквивалентность RETI и SEI + RET только в количестве тактов. RETI я использую и когда надо из обычной п/п выйти с одновременной установкой I
Сообщение отредактировал Diusha - Dec 27 2010, 11:11
|
|
|
|
Сообщений в этой теме
CatMurr Проблема с таймером на Atmega168 Dec 26 2010, 12:16 Diusha Попробуйте WGM=1110, а 0х00FF загоните в ICR1. У м... Dec 26 2010, 13:20 CatMurr Цитата(Diusha @ Dec 26 2010, 19:20) При э... Dec 26 2010, 13:42  Diusha Цитата(CatMurr @ Dec 26 2010, 19:42) При ... Dec 26 2010, 13:57  Сергей Борщ QUOTE (CatMurr @ Dec 26 2010, 18:42) При ... Dec 27 2010, 04:34  ae_ Цитата(CatMurr @ Dec 27 2010, 02:24) ...
... Dec 26 2010, 23:56   Diusha Цитата(777777 @ Dec 27 2010, 08:21) А при... Dec 27 2010, 02:57      777777 Цитата(Diusha @ Dec 27 2010, 17:10) Это г... Dec 27 2010, 14:54 CatMurr Выбрал другую отладочную платформу: AVR Simulator2... Dec 27 2010, 05:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|