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

 
 
> Проблема в работе Timer1 при подсчете внеш.имп., Младший байт "считает" только до 127
Stas633
сообщение Jul 25 2006, 19:16
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Собрал устройство определения угла поворота сельсина. Принцип основан на измерении разности фаз между образцовым сигналом и сигналом с датчика (якорная обмотка). На ПЛИС из этих сигналов формируется пачка импульсов, число которых зависит от разности фаз (угла поворота), по окончанию "периода измерения" ПЛИС формирует одиночный импульс.
Алгоритм работы AVR (ATmega8) такой:
1. Режим ТС1 - подсчет импульсов на входе Т1 (PD5);
2. По приходу одиночного импульса на ICP1 (PB0) происходит "захват" ТС1 и в прерывании по "захвату" - запоминание захваченного значения, обнуление ТС1;
3. Запомненное значение передается по UART'ту. По запросу от РС.

При работе младший байт ТС1 считает только до 127 (0х7F). При этом старший байт инкриминируется правильно, то есть, как если бы младший считал до 255.

При этом ошибка проявляется не сразу, а через несколько часов (8...20) после обесточивания схемы.

Для устранения ошибки делал следующее:
- менял способ (внешний, внутренний) и частоту (2...16МГц) тактирования AVR;
- заменил сам кристалл (ATmega);
- программу написанную на Си переписал на ASM'e....
....результата нет. На Си программа передачи данных по UART была написана с применением "printf" - все работало... На следубщий вечер - ошибка. Переписал через "UDR=.." - все пошло... На следующий вечер - опять ошибка... Перепаял AVR, прошил - норма (и с "UDR=..", и с "printf")... На следующий вечер - снова ошибка.... Переписал программу на ASM - нормально, но опять прошел день и ошибка появилась...
Частота следования счетных импульсов 500 кГц, менял на 1МГц - ошибка оставалась.
На ASM (AlgBlb) программа обработки прерывания по захвату такая:

Прикрепленное изображение


Подскажите в чем проблема?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Petka
сообщение Jul 26 2006, 10:27
Сообщение #2


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



ещё мысль. тактируется МК от RC или от кварца? может немного не совпадают частоты и старший бит просто "наползает" на стоповый?
Go to the top of the page
 
+Quote Post
Stas633
сообщение Jul 26 2006, 11:14
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(Petka @ Jul 26 2006, 14:27) *
ещё мысль. тактируется МК от RC или от кварца? может немного не совпадают частоты и старший бит просто "наползает" на стоповый?


Очень возможно! Сейчас МК тактируется от внутр. RC на частоте 2 МГц. При этом, калибровочный байт я не загружаю.
Частота работы UART - 4800, а это "по-умолчанию" 0,2% ошибок при 2МГц, да еще и Int.RC не точен!
В старшем байте старший бит всегда 0, поэтому ошибки не возникает, а с младшим - проблемы.
Но с другой стороны, при передаче констант 0xAA и 0x55 - ошибок нет. Нужен эксперимент! Вечером попробую..
МК тактировался изначально от внешнего "Clock" 16МГц - ошибка была. Потом уже начались "поиски" с выбором источника тактирования, скоростью UART, "упрощением" программы...

Спасибо, еще раз.
Go to the top of the page
 
+Quote Post



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

 


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


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