Entrar    Registrar

ajuda com interrupções em assembly

Software e Hardware para linha x51

Moderadores: guest2003, 51, Renie, gpenga

  • Autor
    Mensagem

ajuda com interrupções em assembly

Mensagempor CMBS-13 TV » 15 Jun 2017 08:34

olá pessoal, beleza? então, finalmente consegui entender o assembly do 8051, e ja comecei a fazer alguns experimentos,

esse circuito aqui que eu montei e filmei funcionando, deveria fazer o seguinte, ele tem 4 teclas e 4 leds, as teclas vão no P0 e os leds em P2
três das quatro teclas pressionadas apaga um led cada uma e a outra ativa um sequencial.
só que quando eu ativo essa função, o programa fica preso no delay, eu ainda to meio cru no assembly e queria saber se tem algum meio de quebrar esse loop por meio das interrupções ou das teclas do port P0.
eu escolhi tentar dar um break pelo int 0

este é o codigo fonte:

asm code
org     0000h           
ajmp start
;-------------interrupção--------------
org 0003h
acall start
reti
;-----------------------------------------
mov A,#00h
mov A,P2

start:
;-----------configuração dos registradores de interrupção------
mov a,#10000001b
mov ie,a
mov a,#00000001b
mov ip,a
mov a,#00000001b
mov tcon,a
;---------------------------------------------------------------------
mov a,#000h
mov P0,a

loop:
jb P2.0,butt2 ;Botão 1 pressionado? Não, pula para butt2
setb B.0 ;Sim, seta flag0
sjmp testButt1 ;Desvia para testButt1

butt2:
jb P2.1,butt3 ;Botão 2 pressionado? Não, pula para butt3
setb B.1 ;Sim, seta flag1
sjmp testButt2 ;Desvia para testButt2

butt3:
jb P2.2,butt4 ;Botão 3 pressionado? Não, pula para butt4
setb B.2 ;Sim, seta flag2
sjmp testButt3 ;Desvia para testButt3

butt4:
jb P2.3,loop ;Botão 4 pressionado? Não, pula para loop
setb B.3 ;Sim, seta flag3
sjmp testButt4 ;Desvia para testButt4

testButt1:
jnb P2.0,$
clr B.0
mov a,#010h
mov P0,a
sjmp loop

testButt2:
jnb P2.1,$
clr B.1
mov a,#020h
mov P0,a
sjmp loop

testButt3:
jnb P2.2,$
clr B.2
mov a,#040h
mov P0,a
sjmp loop

testButt4:
jnb P2.3,$
clr B.3
call main
sjmp loop



;------------------sequencial------------------

MAIN:
MOV P0,#10H
CALL DELAY500MS
MOV P0,#20H
CALL DELAY500MS
MOV P0,#40H
CALL DELAY500MS
MOV P0,#80H
CALL DELAY500MS

JMP MAIN

DELAY500MS: ; rotina de delay

MOV R1,#0FFh ;MOVE O VALOR 250 DECIMAL PARA O REGISTRADOR R1
AUX1:
MOV R2,#0FFH ; 1X 500 MOVE O VALOR 249 DECIMAL PARA O REGISTRADOR R2
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500 3000uS
AUX2:
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
DJNZ R2,AUX2 ; 2X 500 X 500 = 250000
DJNZ R1,AUX1 ; 2X 500 TOTAL 1,754000uS ou, 1,75 segundos
RET

end


video do circuito funcionando
CMBS-13 TV
 
Mensagens: 1
Registrado em: 15 Jun 2017 07:36

Re: ajuda com interrupções em assembly

Mensagempor brasilma » 16 Jun 2017 09:22

Vamos lá:

A instrução RETI normalmente fica no final da rotina de tratamento de interrupção;
A chamada da rotina de interrupção a partir do espaço reservado aos vetores normalmente é feito com um LJMP;

Se dentro da interrupção você desejar reiniciar seu programa, é preciso recuperar o endereço do stack, o que você pode fazer (entre 03H-13H cabe este código) é algo como abaixo:

Código: Selecionar todos
POP     ACC  ; pop return address
POP     ACC
CLR     A    ; push 0 as new
PUSH    ACC  ; return address to stack
PUSH    ACC
RETI      ; execute return of interrupt
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3184
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes