Не правильно работают внешние прерывания у avr

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Вт дек 11, 2012 17:50:19

Сообщение Alexey862012 »

Никогда раньше не работал с внешними прерываниями. столкнулся с такой проблемой:
Хотел при помощи внешнего прерывания отслеживать нажатие/отускание кнопки.

написал простенькую программу, чтобы протестировать. программа на attiny13 в Proteus генерировала прерывания постоянно независимо от установки прерываний по спаду/подъему или низкому уровню и независимо от состояния сигнала на ноге INT0. в эмуляторе avr studio 5 постоянно срабатывали только когда ставил по низкому уровню. по фронтам не работали. на железе нормально работало только прерывание по спаду. по подъему и по любому измененению срабатывали вообще стихийно. по низкому уровню генерировались постоянно. тестил также на atmege 8. в Proteus не правильно срабатывают. на железе вообще не работают. программу сначала писал на С. потом переписал на ассемблере. вот код:

.include "d:\avrasm\appnotes\tn13def.inc"

.def temp = r16
.def temp2 = r17
.def temp3 = r18

;================МАКРОСЫ======== ====

;================ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ====================
rjmp reset
rjmp pitanie

;============ПРЕРЫВАНИЯ==============
pitanie:
sbi DDRB,4
sbi PORTB,4
reti

;============ДАННЫЕ==================

;============ПРОГРАММА===============


;============Инициализация===========
reset:

clr temp
out GIMSK,temp ; отключаем прерывания
out TIMSK,temp
; out DDRB,temp

ldi temp,$FF ; сбрасываем флаги прерываний
out GIFR,temp
out TIFR,temp

ldi temp,low(Ramend) ;инициализируем стек
out SPL,temp

; sbi ACSR,ACD ; отключаем компаратор

; in temp,MCUCR ; отключаем подтягивающие резисторы
; sbr temp,(1<<PUD)
; out MCUCR,temp



;============Тело программы============

in temp,GIMSK ;включаем прерывание INT0
ori temp,(1<<INT0)
out GIMSK,temp
in temp,MCUCR ;по низкому уровню сигнала
andi temp,0b11111100
; ori temp,0b00000011 ; если ставим по фронтам, ативируем данную строчку

out MCUCR,temp
sei ;разрешаем прерывания

main:
rjmp main

немного о железе. для генерации прерывания использовал обычный тумблер, закороченный на питание. то есть, если тумблер выключен - низкий уровень (отсутствие питания), если включен - высокий (U питания). щелкая тумблером имитировал импульсы. Для контроля срабатывания прерывания использовал порт B 4 пин с подключенным к нему светодиодом через резистор

что я делал не так и почему у меня не работали прерывания?. и почему Proteus их не отрабатывал?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Alexey862012 писал(а):есть, если тумблер выключен - низкий уровень (отсутствие питания)
С чего вы взяли, что выключенный тумблер — низкий уровень? Схему в студию.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Родился
Сообщения: 5
Зарегистрирован: Вт дек 11, 2012 17:50:19

Сообщение Alexey862012 »

Gudd-Head писал(а):
Alexey862012 писал(а):есть, если тумблер выключен - низкий уровень (отсутствие питания)
С чего вы взяли, что выключенный тумблер — низкий уровень? Схему в студию.
Взял с того, что когда тумблер выключен - никакого питания на ногу не приходит, след-но уровень низкий.
А если вы считаете, что уровень высокий, тогда почему срабатывают прерывания по НИЗКОМУ уровню. В том числе и при включенном тумблере, когда уровень точно ВЫСОКИЙ. Вот вам схема только расширение на PROTEUSовское поменяйте. (DSN)
Вложения
timer.txt
Схема
(100.29 КБ) 613 скачиваний
Родился
Сообщения: 5
Зарегистрирован: Вт дек 11, 2012 17:50:19

Сообщение Alexey862012 »

И вот еще модифицированная схема с переключением тумблера на землю
Вложения
timer2.txt
Схема2
(102.94 КБ) 614 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Alexey862012 писал(а):в эмуляторе avr studio 5 постоянно срабатывали только когда ставил по низкому уровню. по фронтам не работали.
Погонял в четвёртой студии — всё работает как надо — и по уровню, и по фронту, и по спаду, и по изменению.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Сообщение mark13121971 »

Так тумблер опрашивать нельзя. При выключенной кнопке у вас нога болтается в воздухе (подтяжка отключена) и там присутствует бог весть что. Отсюда и ложные срабатывания. Притяните ножку к питанию (включите подтяжку) и замыкайте кнопку на землю. Это классика.
И потом, судя по схеме, тумблер подключен совсем не на ножку прерывания (PB1), а на PB0. Как это так получается???
Реклама
Родился
Сообщения: 5
Зарегистрирован: Вт дек 11, 2012 17:50:19

Сообщение Alexey862012 »

Спасибо тебе, человече! не заметил, что прерывание не на ту ножку завел. Я уж весь извелся от злости, что не работает. )) А вот еще такой вопрос, если порт сформирован на вход и резистор отключен. у порта 3-е высокоимпендансное состояние. вот если этот не подключенный пин считать, какой уровень покажет? высокий или низкий? или рандом?
И если подтягивающий резистор подключен и мы замыкаем на землю, сильно большой ток будет течь на землю?
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Сообщение mark13121971 »

Alexey862012 писал(а):Спасибо тебе, человече! не заметил, что прерывание не на ту ножку завел. Я уж весь извелся от злости, что не работает. )) А вот еще такой вопрос, если порт сформирован на вход и резистор отключен. у порта 3-е высокоимпендансное состояние. вот если этот не подключенный пин считать, какой уровень покажет? высокий или низкий? или рандом?
И если подтягивающий резистор подключен и мы замыкаем на землю, сильно большой ток будет течь на землю?
Если пин сконфигурирован как вход и не притянут к питанию внутренним резистором или к земле внешним резистором то читать с него ты будешь все что угодно, только не истинное состояние вывода. Если притянуть к питанию внутренним резистором (20-50кОм см. даташит) и замыкать на землю, ток будет совсем небольшим от 100мкА до 250мкА (какой там внутренний резистор черт его знает, в даташите точно не указано), в зависимости от напряжения питания в схеме (I=U/R). В конце концов можно притянуть ногу к питанию внешним резистором и выбрать его номинал в зависимости от того тока, на который ты расчитываешь. Но слишком низкие токи тоже выбирать не следует.
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Вт янв 05, 2010 14:51:04

Сообщение mark13121971 »

И потом, надо помнить про дребезг контактов. В процессе дребезга у тебя будет постоянно происходить генерация прерывания по INT0. Поэтому в обработчик надо встраивать задержку на дребезг с повторным чтением пина на предмет достоверности его состояния или вводить какой-то счетчик достоверных нажатий (это как душе угодно), что скажется на эффективности выполнения программы. Поэтому мне кажется для опроса кнопки нет смысла съедать такой внешний ресурс МК, как внешнее прерывание, а опрос кнопки завести например на таймер, через определенные промежутки времени (70-100мс), естественно с подавлением дребезга.
Родился
Сообщения: 5
Зарегистрирован: Вт дек 11, 2012 17:50:19

Сообщение Alexey862012 »

Спасибо еще раз. да, про дребезг контактов слышал. Эта программка так сказать, проба пера. Внешенее прерывание я хотел использовать для другого. просто таким образом проверял его работоспособность. еще раз спасибо
Ответить

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