|
MegaAVR, Timer |
|
|
|
Feb 28 2007, 11:49
|
Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758

|
[font=Times New Roman][size=4] Привет, всем посетителям форума! Возникла проблема с мегой 128...Может кто-нибудь из специалистов обратит внимание и разъяснит неопытному пользователю в чем проблема? А вопрос в следующем...пытаюсь измерить период с точностью до 0,1 мкс. Для этого задействована пара счетчиков (вариантов уже накопилось множество, поэтому прикладываю самый простой на, мой взгляд). Измеряемый диапазон частот 600 Гц-2,5 кГц Используется два таймера: -Т/С0-генерирует 102, 4 кГц, при каждом совпадении счетного регистра осуществляется инкремент регистров-результата; -Т/С2-считает импульсы с датчика-для обеспечения заданной точности 100*Т . Как только досчитали до 100 останавливаем , обнуляем таймеры и передаем по ком порту на комп. Мегу тактирую 7,3728 МГц (реально 7,3724 МГц) Проблема в том, что откудо-то берется погрешность: при такой конфигурации программы 0, 2 мкс на всех измеряемых частотах...Но если расширить возможности программы и передавать на комп после различных преобразований, то результирующее число заметно искажается причем чем меньше измеряемая частота, тем больше прогрешность. Т.е. фактически, если между остановкой и новым запуском счетчиков вставить цикл (инкремент регистров), то в зависимости от к-ва выполняемых операций, меняется результат в результирующих регистрах счетчиков. Не ясно почему? Работаю с STK500/501, AVR Studio 4.12 и самодельным Jtag ICE. В качестве сигнала с датчика использую кварц STK500.
|
|
|
|
|
 |
Ответов
|
Feb 28 2007, 17:15
|
Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758

|
Цитата(IgorKossak @ Feb 28 2007, 13:42)  1. Прерывание OC2addr_int: не содержит инструкции reti или я что-то не понял? 2. В прерывании OC0addr_int: строка cpi numberL,0xFF явно лишняя. 3. С Вашими настройками нулевого таймера полная каша. Проверьте то ли Вы пишете и в те ли регистры. По поводу прерывания: да инструкции действительно нет, но там есть команда rjmp wait_write но при таком выходе из п/п мне следовало бы заново проинициализировать стек?! По поводу лишней строчки согласна, т.к. проверяю состояние флага Z. А вот, что за каша в настройках нулевого таймера?? out ASSR,zero; выбираем синхронный режим ldi temp,0x23 ; модуль счета out OCR0,temp ; ldi temp,0x99 ; режим работы out TCCR0,temp ; out TCNT0,zero ; обнуляем счетный регистр В чем ошибка?
|
|
|
|
|
Feb 28 2007, 18:17
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Duduka @ Feb 28 2007, 16:15)  По поводу прерывания: да инструкции действительно нет, но там есть команда
rjmp wait_write
но при таком выходе из п/п мне следовало бы заново проинициализировать стек?! Да если бы только в этом дело. Сейчас может этого и хватит, но при минимальном развитии программы такой подход крайне неэлегантен. Поэтому подпрограммы и прерывания (особенно) желательно завершать штатным образом. Да и на С в будущем проще будет портировать. Цитата(Duduka @ Feb 28 2007, 16:15)  По поводу лишней строчки согласна, т.к. проверяю состояние флага Z. Строчка не столько лишняя, сколько ошибочная, т. к. инкремент старшей части надо делать при переходе младшей в 0х00, а не в 0xFF. Цитата(Duduka @ Feb 28 2007, 16:15)  А вот, что за каша в настройках нулевого таймера??
out ASSR,zero; выбираем синхронный режим ldi temp,0x23 ; модуль счета out OCR0,temp ; ldi temp,0x99 ; режим работы out TCCR0,temp ; out TCNT0,zero ; обнуляем счетный регистр
В чем ошибка? Здесь я имел в виду навороченность настроек TCCR0. На мой взгляд управлять выходом OC0 нет необходимости, т. к. Вы принудительно дёргаете shinad,inter0. Настройка в этом случае будет выглядеть как ldi temp,0x09. Проверьте, может я и не прав.
|
|
|
|
|
Feb 28 2007, 19:21
|
Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758

|
Да, вы правы, ненчего лишний раз дергать вывод... но так как мне хотелось видеть (для проверки), что генерирует счетчик, думаю в таком случае ldi temp,0x19.
Спасибо за ваши советы! Только вот общий вопрос по теме остается неразрешенным...погрешность каким-то образом зависит от количества выполняемых инструкций между пуском и остановкой счетчиков??
|
|
|
|
Сообщений в этой теме
Duduka MegaAVR Feb 28 2007, 11:49 IgorKossak Цитата(Duduka @ Feb 28 2007, 10:49) Испол... Feb 28 2007, 11:55 Duduka [font=Times New Roman][size=4]
А прикрепленный фа... Feb 28 2007, 13:11 SasaVitebsk Прерывания ни когда не дадут точный временной инте... Feb 28 2007, 14:17 Duduka Цитата(SasaVitebsk @ Feb 28 2007, 14:17) ... Feb 28 2007, 18:03 SasaVitebsk Цитата(Duduka @ Feb 28 2007, 12:49) А воп... Feb 28 2007, 23:48 Duduka Цитата(SasaVitebsk @ Feb 28 2007, 23:48) ... Mar 2 2007, 16:46 bodja74 Саша ,у таймера есть прерывание по захвату,так что... Mar 1 2007, 00:59 IgorKossak Действительно, варианта с Input Capture было бы вп... Mar 1 2007, 10:55 SasaVitebsk Согласен с обоими. Конечно любой разработчик при з... Mar 2 2007, 00:02 =GM= Поскольку входной сигнал асинхронен по отношению к... Mar 2 2007, 02:30  SasaVitebsk Цитата(=GM= @ Mar 2 2007, 03:30) Поскольк... Mar 2 2007, 03:32   =GM= Цитата(SasaVitebsk @ Mar 2 2007, 00:32) Ц... Mar 2 2007, 16:44    Duduka [quote name='=GM=' date='Mar 2 2007, 1... Mar 2 2007, 17:57     =GM= Цитата(Duduka @ Mar 2 2007, 14:57) Знаете... Mar 2 2007, 18:48 SasaVitebsk Да... Лоханулся... Измерять N-периодов мне почему-... Mar 3 2007, 01:08
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|