Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Прерывания


Автор: Alex1984 3.5.2006, 11:11
Не могу запретить прерывания.
Может у МК глюк какой. Может у кого было такое? 

Автор: Romikgy 3.5.2006, 12:12
Alex1984, а как запрещаешь , код покажи! 

Автор: PILOT 3.5.2006, 19:57
CLI команда есть. 
Либо в регистре соотв. прерывания ставь запрет.

СУВ.
 

Автор: Alex1984 3.5.2006, 20:16
да знаю, не могу понять почему происходит так, входит в прерывание, запрещаю прерывание (и биты обнулял и CLI), но по выходу из прерывания опять начинается обработка. Обнулял биты в конце обработки прерывания, но все равно вход выполняеться снова.

Код

.include "m8def.inc"
.device ATmega8
;-------------------------------------------------------------------------
.DSEG
.def A=r16            ;
.def B=r17            ;
.def C=r18            ;
.def buf=r19

.def PauseCounter=r23
.equ Delay_segment=0x03    

.CSEG
rjmp begin
rjmp TEST0    ;$0001 
rjmp TEST1    ;$0002 
reti        ;$0003 
reti        ;$0004 
reti        ;$0005 
reti        ;$0006 
reti        ;$0007 
reti        ;$0008 
reti        ;$0009 
reti        ;$000a 
reti        ;$000b 
reti        ;$000c 
reti        ;$000d 
reti        ;$000e 
reti        ;$000f 
reti        ;$0010
reti        ;$0011
reti        ;$0012 
.org 200

BEGIN:

ldi buf,0x04
out SPH,buf
ldi buf,0x5f
out SPL,buf

sei                                
ldi buf,0xff                    
out ddrb,buf

ldi buf,0b00001011                
out MCUCR,buf                    
ldi buf,0b10000000
out GICR,buf                    

ldi buf,0x00                    
out portb,buf
END:                            
nop
nop
nop
rjmp END                        


TEST1:
cli
ldi buf,0xff
out portb,buf
ldi PauseCounter,Delay_segment
RCALL Pause ;while(PauseCounter!=0)
ldi buf,0x00
out portb,buf
reti 
PAUSE:
ldi buf,0x0                        ;
cp buf, PauseCounter            ; Compare registers 0x00 and PauseCounter
breq  Equal                 ; Branch if registers  equal
dec PauseCounter
nop 
nop
nop 
nop
nop 
rjmp PAUSE
Equal:
ret
 

Автор: PILOT 4.5.2006, 19:43
У меня все работает:
Код

.include "m8def.inc"
.device ATmega8
;-------------------------------------------------------------------------
.DSEG
.def A=r16            ;
.def B=r17            ;
.def C=r18            ;
.def buf=r19
.def PauseCounter=r23
.equ Delay_segment=0x03    
.CSEG
rjmp begin
rjmp TEST0    ;$0001 
rjmp TEST1    ;$0002 
reti        ;$0003 
reti        ;$0004 
reti        ;$0005 
reti        ;$0006 
reti        ;$0007 
reti        ;$0008 
reti        ;$0009 
reti        ;$000a 
reti        ;$000b 
reti        ;$000c 
reti        ;$000d 
reti        ;$000e 
reti        ;$000f 
reti        ;$0010
reti        ;$0011
reti        ;$0012 
.org 200
BEGIN:
ldi buf,0x04
out SPH,buf
ldi buf,0x5f
out SPL,buf
sei                                
ldi buf,0xff                    
out ddrb,buf
ldi buf,0b00001011                
out MCUCR,buf                    
           LdI        buf,0b11000000
           Out        GICR,buf                    
ldi buf,0x00                    
out portb,buf
END:                            
nop
nop
nop
rjmp END                        
;-----------------------------------------------------------------------------
TEST0:
           Push       buf
           In         buf,SREG
           Push       buf
           ;do something
           Pop        buf
           Out        SREG,buf
           Pop        buf
RetI;

;-----------------------------------------------------------------------------
TEST1:
           Push       buf
           In         buf,SREG
           Push       buf
          
           LdI        buf,0xff
           Out        portb,buf
           LdI        PauseCounter,Delay_segment
           RCall      Pause ;while(PauseCounter!=0)
           LdI        buf,0x00
           Out        portb,buf

           Pop        buf
           Out        SREG,buf
           Pop        buf
RetI 
PAUSE:
ldi buf,0x0                        ;
cp buf, PauseCounter            ; Compare registers 0x00 and PauseCounter
breq  Equal                 ; Branch if registers  equal
dec PauseCounter
nop 
nop
nop 
nop
nop 
rjmp PAUSE
Equal:
ret



СУВ. 

Автор: Woodoo 13.6.2006, 00:10
reti ставит глобальный флаг I в SREG афтоматом
cli в начале абработчика ненужэн. прерыванме автоматом отчищает бит I 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)