Страница 1 из 1

Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 09:55:01
mvs9
Как определить, от которого входа произошло внешнее прерывание, если разрешено (и возможно) прерывание от нескольких внешних выводов?

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 11:05:23
>TEHb<
У них адреса разные. Ведь наверняка не читали документацию, а сразу кинулись сюда.

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 11:07:59
ARV
очевидно, речь не о ВНЕШНИХ прерываниях INT0 и INT1, а о PIN CHANGE INTERRUPT - то есть о прерывании по изменению уровня на любом из пинов? если так, то надо считать порт и посмотреть, какие биты в нем изменились - вот вам и определение, от которого сработало все :)))

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 11:21:56
mvs9
>TEHb< писал(а):У них адреса разные. Ведь наверняка не читали документацию, а сразу кинулись сюда.
Нет, не наверняка. Кинулся сюда, после того, как не нашел нужной информации.
ARV писал(а):очевидно, речь не о ВНЕШНИХ прерываниях INT0 и INT1, а о PIN CHANGE INTERRUPT - то есть о прерывании по изменению уровня на любом из пинов? если так, то надо считать порт и посмотреть, какие биты в нем изменились - вот вам и определение, от которого сработало все :)))
Именно этот случай. Но так все довольно криво получается: прерывания генерируются на любое изменение состояния входов, т.е. нужно отслеживать, какие состояния входов были до прерывания (или в предыдущем прерывании).

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 11:54:11
ARV
даже и не знаю, в чем кривость? при инициализации

Код: Выделить всё

volatile unsigned char prev_port = PINB;
а сам обработчик прерывания

Код: Выделить всё

ISR(PCINT0_vect){
   switch(PINB ^ prev_port){
   // тут обрабатываем варианты изменения пинов
   case 0b00000001:
   case 0b00000010:
   // и т.д. - вариантов много, особенно если могут быть одновременные изменения нескольких пинов
   }
   prev_port = PINB;
}
что тут криво?!

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 12:38:10
mvs9
Спасибо, в таком виде намного прямее, чем я представлял.
Честно говоря, для меня, как для многолетнего Паскалиста и Дельфиста, любая СИшная нотация - кривая :)

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 19:22:30
>TEHb<
ARV писал(а):очевидно, речь не о ВНЕШНИХ прерываниях INT0 и INT1, а о PIN CHANGE INTERRUPT
Тогда извиняйте. В тини13 не так уж и много вариантов, так что один лишний байтик вполне можно выделить. А си да, слегка сбивает с толку после паскаля.

Re: Внешние прерывания в ATtiny13

Добавлено: Ср авг 04, 2010 20:38:25
ARV
>TEHb< писал(а):Тогда извиняйте.
да ладно, чего там...

Re: Внешние прерывания в ATtiny13

Добавлено: Пт мар 16, 2012 15:12:47
xkp
можно ли задействовать PB4(PCIN4) заместо INT0? нужно отслеживать фронтальное изменение сигнала. а пока плату делал - маленько накосячил и завел сигнал не на PB2(INT0) а на PB4(PCINT4)

Re: Внешние прерывания в ATtiny13

Добавлено: Пт мар 16, 2012 15:17:25
Engineer_Keen
В чем проблема? Программу перепишите и все... PCINT от INT0-1 отличается только общим вектором для всего порта и отсутствием режима прерывания по уровню.

Re: Внешние прерывания в ATtiny13

Добавлено: Пт мар 16, 2012 15:19:53
xkp
проблема в том что ни как не найду как разрешить именно только от PCINT4.
OUTI MCUCR,(1<<ISC00)|(1<<ISC01) ;срабатывание по нарастанию INT0
OUTI GIMSK,(1<<INT0) ;разрешаем INT0 от внешнего сигнела
чем заменить вторую строчку?

ps. первую тоже менять надо?

Re: Внешние прерывания в ATtiny13

Добавлено: Пт мар 16, 2012 15:29:01
Engineer_Keen
MCUCR не нужен, в GIMSK ставим бит PCIE, в PCMSK ставим PCINT4, а чтобы ловить только передний фронт - в самом прерывании проверяем

Код: Выделить всё

SBIS PINB,PB4 ;проверяем фронт
RETI ;выход, если задний
...
делаем что надо, если передний фронт
...
RETI

Re: Внешние прерывания в ATtiny13

Добавлено: Пт мар 16, 2012 15:48:13
xkp
спасибо

Код: Выделить всё

	. . .
	OUTI   GIMSK,(1<<PCIE)				;разрешаем PCINT4 от внешнего сигнела
	OUTI   PCMSK,(1<<PCINT4)
	sei
	main:
. . .
	rjmp main

PCINT_0:
	SBIS PINB,PB4 ;проверяем фронт
	RETI
. . .
	reti
.org $00
	rjmp RESET		;Reset Handler
	reti			;rjmp EXT_INT0 ; IRQ0 Handler
	rjmp PCINT_0	; PCINT0 Handler
	reti			;rjmp TIM0_OVF ; Timer0 Overflow Handler
	reti			;rjmp EE_RDY ; EEPROM Ready Handler
	reti			;rjmp ANA_COMP ; Analog Comparator Handler
	reti			;rjmp TIM0_COMPA ; Timer0 CompareA Handler
	reti			;rjmp TIM0_COMPB ; Timer0 CompareB Handler
	reti			;rjmp WATCHDOG ; Watchdog Interrupt Handler
	reti			;rjmp ADC_inc ; ADC Conversion Handler
работает