Не правильно работают внешние прерывания avr
Никогда раньше не работал с внешними прерываниями. столкнулся с такой проблемой:
Хотел при помощи внешнего прерывания отслеживать нажатие/отускание кнопки.
написал простенькую программу, чтобы протестировать. программа на 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<
;============Тело программы============
in temp,GIMSK ;включаем прерывание INT0
ori temp,(1<
in temp,MCUCR ;по низкому уровню сигнала
andi temp,0b11111100
; ori temp,0b00000011 ; если ставим по фронтам, ативируем данную строчку
out MCUCR,temp
sei ;разрешаем прерывания
main:
rjmp main
немного о железе. для генерации прерывания использовал обычный тумблер, закороченный на питание. то есть, если тумблер выключен - низкий уровень (отсутствие питания), если включен - высокий (U питания). щелкая тумблером имитировал импульсы. Для контроля срабатывания прерывания использовал порт B 4 пин с подключенным к нему светодиодом через резистор
что я делал не так и почему у меня не работали прерывания?. и почему Proteus их не отрабатывал?
А в железе собирал? Попробуй
А в железе собирал? Попробуй собрать в железяке и на реальном микроокнтроллере протестируй. МОжет быть просто твоя квалификация работы с Протеусом не на том уровне что бы отловить его ошибки а не ошибки прошивки.