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

 
 
> Проблема в работе 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, 08:24
Сообщение #2


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

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



И ещё одна шальная мысль: UART выделяет начало байта ориентируясь по стартовому биту. Если идёт непрерывный поток данных, то UART может принять за стартовый какой-нибудь бит из передаваемого байта и тогда вся синхронизация по началу байта пудет потеряна (точнее синхронизация будет ложной). и будете получать левую информацию. особенно часто это происходит, когда переодически без промежутков шлётся один и тот-же байт. для того, что бы синхронизация сама по себе восстанавливалась я между пакетами шлю 0x00 а затем 0xff т.е. такие байты, что внутри одного нет бита, который можно принять за стоп, а внутри друго нельзя найти ложный старт =). вдруг у Вас такая же "фича"?
Go to the top of the page
 
+Quote Post
Stas633
сообщение Jul 26 2006, 10:12
Сообщение #3


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

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



Цитата(Petka @ Jul 26 2006, 12:24) *
И ещё одна шальная мысль: UART выделяет начало байта ориентируясь по стартовому биту. Если идёт непрерывный поток данных, то UART может принять за стартовый какой-нибудь бит из передаваемого байта и тогда вся синхронизация по началу байта пудет потеряна (точнее синхронизация будет ложной). и будете получать левую информацию. особенно часто это происходит, когда переодически без промежутков шлётся один и тот-же байт. для того, что бы синхронизация сама по себе восстанавливалась я между пакетами шлю 0x00 а затем 0xff т.е. такие байты, что внутри одного нет бита, который можно принять за стоп, а внутри друго нельзя найти ложный старт =). вдруг у Вас такая же "фича"?


Трудно согласиться. Обмен по UART был сложнее, чем в приведенном примере: AVR ждал "запроса" от PC на передачу. После получения запроса передавал 3 байта, последний из которых - 0х00. В другом устройстве (измерение частоты) обмен данными по UART по такому алгоритму не вызывает нареканий.
Вот только, ТС1 работает там не в режиме подсчета внешних импульсов. Да и, повторю, программа была написана через getchar() и printf(), а компилятор CV_AVR эти функции "отрабатывает" с использованием прерываний, т.е. "наслоение" маловероятно... С другой стороны, возможность неправильной работы одного бита ТС1, причем, только на чтение, в двух микросхемах...еще менее вероятна...

Одним словом, попробую сегодня выводить "ошибочный" бит в порт AVR для анализа, при этом, те же данные будут передаваться по UART.

В любом случае, спасибо!!!

Сообщение отредактировал Stas633 - Jul 26 2006, 10:16
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 19:53
Рейтинг@Mail.ru


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