В Мега8 у меня был реализован счетчик авто-одометра на таймере 0. Таймер увеличивал свой счетчик на 1 при ниспадающем фронте сигнала (точную форму сигнала не знаю, но этот же сигнал идет на микросхему штатного одометра, уровень меняется в диапазоне 0-4,9В). Счетчик считал правильно и стабильно.
Сейчас я реализовал счетчик на прерывании. При ниспадающем сигнале срабатывает прерывание и я программно увеличиваю на 1 определенную переменную.
Беда в том, что счетчик на прерывании стал работать не стабильно, иногда он начинает очень быстро считать сам по себе. В железе ничего не менялось, только поменял вход сигнала с Т0 на INT1.
Как такое возможно, понять не могу. Есть ли в железе какое-то отличие во входах Т0 и INT1?
Последний раз редактировалось dandan Пн фев 21, 2011 12:02:21, всего редактировалось 3 раза.
Engineer_Keen писал(а):Вы на 100% исключаете программный косяк при переделке с таймера на прерывание?
Если в электрической части разницы между входами INT1 и T0 нет, то получается программный косяк. Я его ищу уже долго но не нахожу. В Протеусе все нормально работает, в железе на столе - тоже. Ставлю в авто - не работает.
Vov123 писал(а):Значит подтягивайте к земле.Попробуйте дотронутся пальцем - будут ложные срабатывания,потому как болтается в воздухе.
Блин, ничего не понимаю. Подтягиваю к земле или к питанию 1кОм резистор, дотрагиваюсь рукой идут ложные срабатывания. Рядом вход на кнопке, подтянутый 10кОм, дотрагиваюсь рукой никаких ложных срабатываний нет. Уже контроллер поменял на другой, та-же хрень. Что делать не пойму.
Еще пробовал без подтяжки, проводок от ножки 10см, замыкаю на массу, дотрагиваюсь пинцетом к ножке и идут ложные срабатывания. Такое впечатление, что прерывание срабатывает не от смены лог. уровня, а от любых незначительных колебаний напряжения на ножке. Как это возможно? Что делать? Может есть еще какие-то "хитрые" настройки этих прерываний?
Вопрос простой: могут ли наводки менять логический уровень на входе INT1, тем самым вызывая прерывание, если он притянут к +5В резистором 1кОм? И что делать если такое происходит?
Во первых, это может быть программный глюк (напримр неправильно настроен вход внешнего прерывания, этим иногда страдает визард CVAVR)
Во вторых это может быть аппаратное срабатывание - ставьте RC цепочку (см простейший НЧ-фильтр).Внутренняя подтяжка иил внешняя (что лучше внутренней) должна быть обязательна ибо во время работы мотора, формируются достаточно сильные уровни помех
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Meteor писал(а):Во первых, это может быть программный глюк (напримр неправильно настроен вход внешнего прерывания, этим иногда страдает визард CVAVR)
Программа написана в AVR Studio
Настройка портов:
LDI R16,0b11100010
OUT DDRD,R16
SBI PORTD,3
Настройка прерывания такая:
LDI R16,0b00001000
OUT MCUCR,R16
LDI R16,0b10000000
OUT GICR,R16
Meteor писал(а):
Во вторых это может быть аппаратное срабатывание - ставьте RC цепочку (см простейший НЧ-фильтр).Внутренняя подтяжка иил внешняя (что лучше внутренней) должна быть обязательна ибо во время работы мотора, формируются достаточно сильные уровни помех
Ну не знаю, прерывание срабатывает дома на столе, от прикосновения рукой, подтяжка к "+" 1кОм. Рядом вход от кнопки с подтяжкой 10кОм не реагирует на прикосновение. Хрень какая-то, просто опускаются руки.
Опрашиать как?
in r16, portd?
или
in r16, pind?
Сброс надо подтягивать обязательно
Попробуйте параллельно входу, поставить конденсатор, емкостью 0,01...0,5 мкф
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Meteor писал(а):Опрашиать как?
in r16, portd?
или
in r16, pind?
in r16, pind
Meteor писал(а):
Сброс надо подтягивать обязательно
Попробуйте параллельно входу, поставить конденсатор, емкостью 0,01...0,5 мкф
Сброс вчера пробовал на +5 замыкать, разницы нет.
Конденсатор 10nF помогает, но в автомобиле пока не проверял. Но конденсатор заваливает фронты, а мне нужно измерить длину импульса.
Еще интересный момент. Замкнул входы INT1 и T0, в программе одновременно считаю импульсы счетчиком и в прерывании. В результате при касании рукой счетчик не считает вообще, а в прерывании получается 210 импульсов в секунду на 4Мгц тактовой, причем количество насчитанных импульсов зависит напрямую от тактовой частоты, на 1МГц насчитывает 55 импульсов. Вот такая хрень.
Была похожая ситуация, в авто постоянно срабатывало прерывание по INT0 (открытие двери), особенно при запуске двигателя.
Решилось установкой на ногу МК керамики 0.1мкф и стабилитрона в качестве защиты, до этого делитель резистивный.
И само собой проводники до делителя и после к МК надо покороче делать и подальше от источников помех или силовой части схемы.
вся проблема в том, что бортовая сеть авто это совсем не просто питание +12В, там есть очень хитрые импульсы, которые генерирует катушка зажигания в момент формирования искры, их амплитуда может достигать -/+250В, при этом на самом входе меги, если цепь чисто резистивная, получаются колебания в такт с искрообразованием от -0,5В до +5,6В (смотрел осцилом), т.е. возникновение условия "прерывания INT0 по спаду".
я такие цепи подключаю через диод в прямом направлении и если позволяют временные характеристики сигнала - то и фильтрующий конденсатор 0.1 мкф.
GP1 писал(а):вся проблема в том, что бортовая сеть авто это совсем не просто питание +12В, там есть очень хитрые импульсы, которые генерирует катушка зажигания в момент формирования искры, их амплитуда может достигать -/+250В, при этом на самом входе меги, если цепь чисто резистивная, получаются колебания в такт с искрообразованием от -0,5В до +5,6В (смотрел осцилом), т.е. возникновение условия "прерывания INT0 по спаду".
я такие цепи подключаю через диод в прямом направлении и если позволяют временные характеристики сигнала - то и фильтрующий конденсатор 0.1 мкф.
Да это все понятно, только оно не работает как надо дома на столе, со стабилизированным источником питания.
И самое главное, что пробег нормально считался счетчиком T0, схема подключения не менялась, только входы поменял Т0 на INT1.
GP1 писал(а):вся проблема в том, что бортовая сеть авто это совсем не просто питание +12В, там есть очень хитрые импульсы, которые генерирует катушка зажигания в момент формирования искры, их амплитуда может достигать -/+250В, при этом на самом входе меги, если цепь чисто резистивная, получаются колебания в такт с искрообразованием от -0,5В до +5,6В (смотрел осцилом), т.е. возникновение условия "прерывания INT0 по спаду".
я такие цепи подключаю через диод в прямом направлении и если позволяют временные характеристики сигнала - то и фильтрующий конденсатор 0.1 мкф.
Да это все понятно, только оно не работает как надо дома на столе, со стабилизированным источником питания.
И самое главное, что пробег нормально считался счетчиком T0, схема подключения не менялась, только входы поменял Т0 на INT1.
По питанию у МК что стоит? попробуйте заменить МК на другой, схему плс покажите.
TechMike писал(а):
По питанию у МК что стоит? попробуйте заменить МК на другой, схему плс покажите.
Схемы нарисованной, к сожалению, нет. Нарисую - выложу.
По питанию сначала последовательно диод, затем параллельно 1000мкФ и 0,1мкФ, потом КР142ЕН5, после него 220мкФ и 0,1мкФ. Дома на столе питание от стаб. источника 12В.
На вход INT1 подтяжка 1кОм (начал с 10кОм, потом уменьшал, чем меньше сопротивление, тем меньше ложных срабатываний) припаян проводок 10см за второй конец беру рукой и прерывание начинает срабатывать или пинцетом касаюсь ножки, та же хрень.
МК менял уже 2 раза. В программе пробовал выкидывать все, кроме обработки прерывания.