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

ATmega8A прерывание

Добавлено: Вс дек 30, 2012 17:04:09
СЦБист
Столкнулся со следующей проблемой.

Я настраиваю внешнее прерывание по INT1.

При изменении сигнала на входе INT1 по фронту вызывается подпрограмма обработчика прерывания
EXT_INT1:
Потом программа начинает выполнятся с метки RESET (начало программы), после окончания обработчика прерывания.

Как сделать так, чтобы программа продолжала выполнятся после окончания выполнения прерывания, с момента его вызова.


**********************************************************


.include "m8Adef.inc"

.cseg
.org 0

rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp AD ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler



;RESET:
EXT_INT0:
; EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
AD:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:

reti



RESET:
ldi R16,0b00001100
out MCUCR,R16

ldi R16,0b10000000
out GICR,R16

ldi R16,0

sei



Main1:
nop
rjmp Main1


EXT_INT1: inc R16
out PORTB,R16
reti

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 17:19:12
Kavka
Инициализировать указатель стека.

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 17:27:23
BOB51
Ну и накручено..! :cry:
Тут без пол-литры валерианки сложновато, да и не объяснять, а заново учить надобно... :facepalm:
Кстати, указатель стека в большинстве AVRок автоматически "по умолчанию" инициализируется на RAMEND для данной модели... Была б у топикстартера "личка" или e-mail - можно трафарет-заготовку хоть на tiny2313/mega8515 или mega162 скинуть (8-й мегой не балуюсь) :tea:
Ладушки... Скушаньки для начала вот это:
набросок с бодуна.txt
(3.63 КБ) 192 скачивания

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 17:31:18
pyzhman
Что-то мешает сюда кинуть?

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 17:32:42
blackx
Добавьте это в начало.

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

.CSEG

ldi R16,Low(RAMEND)	; stack init
out SPL,R16		
 
ldi R16,High(RAMEND)
out SPH,R16

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 18:27:45
BOB51
уже бодунутый вариант кинул (правкой к предыдущему посту):facepalm:

Re: ATmega8A прерывание

Добавлено: Вс дек 30, 2012 18:35:46
СЦБист
blackx большое спасибо! Заработало :shock: .


************************************************************

.include "m8Adef.inc"

.CSEG

.org 0

rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp AD ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler



;RESET:
EXT_INT0:
; EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
AD:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:

reti



RESET:


ldi R16,Low(RAMEND) ;èíèöèàëèçàöèÿ ñòåêà
out SPL,R16

ldi R16,High(RAMEND) ;èíèöèàëèçàöèÿ ñòåêà
out SPH,R16

ldi R16,0b00001100
out MCUCR,R16

ldi R16,0b10000000
out GICR,R16

ldi R16,0

sei



Main1:
nop
rjmp Main1


EXT_INT1: inc R16
out PORTB,R16
reti

Re: ATmega8A прерывание

Добавлено: Ср апр 17, 2013 21:36:42
UA4WAT
А можно ли заместо неиспользуемых прерываний которые указаны вставить nop пустую команду !

Re: ATmega8A прерывание

Добавлено: Чт апр 18, 2013 08:08:11
Engineer_Keen
Можно, только осторожно, иначе при не совсем грамотном написании программы (случайно разрешить прерывание без обработчика) можно словить веселый глюк, типа беспричинного выполнения прерывания или вообще сброса. Так что уж лучше ставить туда RETI, или как написано выше - RJMPы на (пустой) обработчик неиспользуемых прерываний.

Re: ATmega8A прерывание

Добавлено: Сб апр 20, 2013 00:12:59
vitalik_1984
Тема насчет случайных прерываний уже обсуждалась в теме вроде WinAVR.Вообще нежелательно чтобы ненужные прерывания происходили, так как это может сильно тормозить выполнение нужного кода. И в этой IDE предусмотрен как раз таки сброс в случае неправильно разрешенного прерывания.