Обсуждаем контроллеры компании Atmel.
Ответить

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

Чт окт 11, 2012 23:14:40

Ди помоги мне пожалуйста!
Исходные данные
Мега 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 за несколько тактов - на это уходят сотни тактов МК

Весь мозг сломал!
Если не разобраться с Этим получается что ингода при подсчете длин импульсов и длин пауз между ними
в буфере иногда обнаруживается два импульса низкого уровня без стоящего между ними высокого импульса! Бред какойто!

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

Пт окт 12, 2012 07:27:02

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

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

Пт окт 12, 2012 07:35:33

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

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

Пт окт 12, 2012 07:55:36

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

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

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

Пт окт 12, 2012 10:06:25

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");

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

Все!

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

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

Пт окт 12, 2012 10:14:03

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

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



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


Просто если бы всплески были они отобразилсь бы как отдельное прерывание и были бы зафиксированы при сканировании! (а я сначала просканириовал поток на предмет накождения самого короткого импульса)

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

Пт окт 12, 2012 10:19:04

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



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

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

Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!

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

Пт окт 12, 2012 11:23:50

mill писал(а):Все верно самые короткие импульсы около 25 тактов а длинные - сотни и тысчи даже!
А в чем смысл лог без прерывания? Массив быстро забьется и все!
Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!

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

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

Пт окт 12, 2012 11:30:10

akl писал(а):
mill писал(а):Все верно самые короткие импульсы около 25 тактов а длинные - сотни и тысчи даже!
А в чем смысл лог без прерывания? Массив быстро забьется и все!
Можно попробовать тогда мегу ускорить до 8Мгц если вы предполагаете что за 4 такт устройство успевает импульс поменять!

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



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

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

Ошибка - по памяти писал!

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

Пт окт 12, 2012 11:36:29

Еще отмечу что по ДШ у 8515 оч малый гистерезис - 0.1В может в этом дело? у 16меги почти в три раза больше! :shock:

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

Пт окт 12, 2012 11:51:06

Звуковая есть? Загрузите программу и получите, конечно, не эталонный, но вполне пригодный синус. Через резистор 1кОм подаете прямо на вход PD2/INT0.
SinGen.zip

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

Пт окт 12, 2012 11:53:45

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


Бпасибо! Хороший совет! На звуковуху я не подумал!

Надо разьем jack найти пустой? Земля крайний к корпусу и один из оставшихся выбрать? Верно?

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

Пт окт 12, 2012 20:57:08

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

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

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

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