Удивительные чудеса с прерываниями Мега8515

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

Ди помоги мне пожалуйста!
Исходные данные
Мега 8515 работает от 3.3В принимает через int0-pd2 сигнал
от цифрового устройства работающего от АА батарейки (1,55В)
Сигнал примерно 40кгц частотой - мега по дефолту 1Мгц
Выставляю MCUCR например на 0b00000010 - прерывание по спаду!
Значит после срабатывания прерывания некоторое время на pd2
уровень должен быть 0! Теперь в обработчике прерывания
первой же инструкцией сохраняю в небольшой буфер друг за дружкой
значения Порта Д и потом их неспешно изучаю на компе!
Так какого же мое удивление когда кроме 0 на pd2
обнаруживаю иногда 1!!!! Это как так - произошел спад с 1 до 0
ноль должен держаться некоторое время а сканирование порта инструкцией PIND
показывает там 1???
Порт меги включен DDR на вход и PortD = 0 вольт и никто в него из программы не пишет 1 - я проверил!
Полтора вольта достаточно чтоб мега считала его 1 (даташит стр 223-233 -
типикал атмега характеристикс и гистерезис)
На проводах ниче не падает - токи микроскопические - сопротивление провода
полома! Помех близких нет! Кондер по питанию 104ый и 220mkf!
Контроллер не ребутиться просто так! Без кварца!

Цифрового осцила нет в хозяйстве!

Поставил транзистор ВС337 для усиления сигнала- 10Ком коллектором на плюс и 15Ком на базу! Еммитер на землю! Не помогло!

Пробовал подтягивать выход устройства 500Ком или 1Мом резистором к плюсу (устройство микромощное - токи микроамперные) - без толку!

Думал помеха пробегает какая - пробовал кондер на землю ставить на 1000пФ - без толку!

Просканировал контроллером поток на предмет самого короткого импульса - более 100 тактов контроллера!
То есть не может сигнал измениться с 0 до 1 за несколько тактов - на это уходят сотни тактов МК

Весь мозг сломал!
Если не разобраться с Этим получается что ингода при подсчете длин импульсов и длин пауз между ними
в буфере иногда обнаруживается два импульса низкого уровня без стоящего между ними высокого импульса! Бред какойто!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15591
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для начала схемку и полный код на посмотреть надобно :)
Реклама
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте. Я, конечно, не Ди, но может попробовать подсчитать "некоторое время". У меня получается, что при тактировании "меги по дефолту 1Мгц" и входном сигнале с периодом 25мкс (40кГц) ни о каких "сотнях тактов" говорить нельзя. Может попробовать провести лог состояния PIND2 без обработчика прерывания INT0, вход в который занимает 4мкс.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

mill, даже если учесть, что вы нигде не ошиблись в коде (хотя в этом нельзя быть уверенным никогда), вы уверены, что на линии нет звона? Посмотрите, как выглядит прямоугольный импульс при длине дорожки 3 сантиметра. Если провод длиннее, всплески будут больше, и вполне способны дотянуть до единицы.

Попробуйте завести сигнал через резистор в несколько килоом.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

BOB51 писал(а):Для начала схемку и полный код на посмотреть надобно :)

Да схема проста как овощь!
Мега8515 питается от кренки на 3и3В от сетевого ЗУ 220-9В
на выходе кренки 220мкф по питанию 104 кондер
И через УАРТ и преобразователь мах232 подключена к компу!

Земля меги и земля устройства соединена микропроводом длиной около 10см и выход данных устрйтсва
к выходу ПД2-ИНТ0 присоединен тоже 10см проводом (щас еще транзистор сделал для усиления - но все бестолку)!

Код простой
В прерывании так вообще 2е строчки
isr int0 ()
{Y=PIND;
if(Bit<48){BIt++; Array[Bit]=Y;}
}

Начало программы
инициализируем DDR PORT итп

mcucr=0b00000001; gicr=0b01000000; asm("sei");

Ну а дальше по одному байтики массива Аррай пересылаем в комп для анализа!

Все!

В программе еще много какого мусора есть - но оно все отключено и закомментировано для отладки!!
Реклама
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

ploop писал(а):mill, даже если учесть, что вы нигде не ошиблись в коде (хотя в этом нельзя быть уверенным никогда), вы уверены, что на линии нет звона? Посмотрите, как выглядит прямоугольный импульс при длине дорожки 3 сантиметра. Если провод длиннее, всплески будут больше, и вполне способны дотянуть до единицы.

Попробуйте завести сигнал через резистор в несколько килоом.

Ок попробую - просто устройство микромощное и боюсь что резистор еще та нагрузка для выхода!


Просто если бы всплески были они отобразилсь бы как отдельное прерывание и были бы зафиксированы при сканировании! (а я сначала просканириовал поток на предмет накождения самого короткого импульса)
Реклама
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

akl писал(а):Здравствуйте. Я, конечно, не Ди, но может попробовать подсчитать "некоторое время". У меня получается, что при тактировании "меги по дефолту 1Мгц" и входном сигнале с периодом 25мкс (40кГц) ни о каких "сотнях тактов" говорить нельзя. Может попробовать провести лог состояния PIND2 без обработчика прерывания INT0, вход в который занимает 4мкс.

Все верно самые короткие импульсы около 25 тактов а длинные - сотни и тысчи даже!

А в чем смысл лог без прерывания? Массив быстро забьется и все!

Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

mill писал(а):Все верно самые короткие импульсы около 25 тактов а длинные - сотни и тысчи даже!
А в чем смысл лог без прерывания? Массив быстро забьется и все!
Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!
Ничего я не предполагаю. Знаю, что "чудес с прерываниями Мега8515" не бывает. Меряет длительности и периоды и покруче Ваших требований.
Вам нужно определиться "кто виновато и чё делать". Можно вообще отсоединить устройство от контроллера и провести лог на предмет ложных срабатываний. Можно вместо устройства подключить меандр 1кГц и выяснить есть ли ложные срабатывания в течение 500мкс длительности высокого уровня, затем в течение 500мкс длительности низкого уровня.
mill писал(а):mcucr=0b00000001
Вызов прерываний по любому перепаду сделан намеренно или это ошибка?
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

akl писал(а):
mill писал(а):Все верно самые короткие импульсы около 25 тактов а длинные - сотни и тысчи даже!
А в чем смысл лог без прерывания? Массив быстро забьется и все!
Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!
Ничего я не предполагаю. Знаю, что "чудес с прерываниями Мега8515" не бывает. Меряет длительности и периоды и покруче Ваших требований.
Вам нужно определиться "кто виновато и чё делать". Можно вообще отсоединить устройство от контроллера и провести лог на предмет ложных срабатываний. Можно вместо устройства подключить меандр 1кГц и выяснить есть ли ложные срабатывания в течение 500мкс длительности высокого уровня, затем в течение 500мкс длительности низкого уровня.
mill писал(а):mcucr=0b00000001
Вызов прерываний по любому перепаду сделан намеренно или это ошибка?

Отсоединенное устройство не ловит помехи! Хотя проверю еще раз!

Где мне взять эталонный меандр? Еще одну мегу зашить и подключить?

Ошибка - по памяти писал!
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

Еще отмечу что по ДШ у 8515 оч малый гистерезис - 0.1В может в этом дело? у 16меги почти в три раза больше! :shock:
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Звуковая есть? Загрузите программу и получите, конечно, не эталонный, но вполне пригодный синус. Через резистор 1кОм подаете прямо на вход PD2/INT0.
SinGen.zip
Родился
Сообщения: 7
Зарегистрирован: Чт окт 11, 2012 22:49:58

Сообщение mill »

akl писал(а):Звуковая есть? Загрузите программу и получите, конечно, не эталонный, но вполне пригодный синус. Через резистор 1кОм подаете прямо на вход PD2/INT0.
SinGen.zip
Бпасибо! Хороший совет! На звуковуху я не подумал!

Надо разьем jack найти пустой? Земля крайний к корпусу и один из оставшихся выбрать? Верно?
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

В программе без оптимизации
Изображение

прежде чем будет прочитан порт, будет выполнено 0098 - 007С = 1С или 28 шагов процессора.
и так частота проца 1000000 / 28 = 35714 это и есть максимальная частота которую сможете отследить.
Возможно еще несколько шагов проца уйдет на вызов самого прерывания.

В зависимости от скважности импульсов, лог 0 будет присутствовать не весь период, а меньше.

По идее необходимо повышать частоту проца.
Ответить

Вернуться в «AVR»