Página 1 de 1

ajuda com interrupções em assembly

MensagemEnviado: 15 Jun 2017 08:34
por CMBS-13 TV
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

Re: ajuda com interrupções em assembly

MensagemEnviado: 16 Jun 2017 09:22
por brasilma
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

Re: ajuda com interrupções em assembly

MensagemEnviado: 10 Jun 2018 17:05
por renan-papaco
brasilma escreveu: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


e onde mais ou menos deve ser usada a instrução LJMP(salto longo) ?
essa conta era eu, tinha perdido meu login anterior mas o recuperei e voltei com o perfil antigo.

Re: ajuda com interrupções em assembly

MensagemEnviado: 10 Jun 2018 19:15
por brasilma
O LJMP fica no espaço reservado para o direcionamento das interrupções, no 8051 ele vai de 0003H até 002BH, abaixo um exemplo de direcionamento da interrupção referente ao Timer 0 e a Serial

Código: Selecionar todos
ORG   0BH      ; interrupcao timer 0
LJMP   TIMER_0_INT


Código: Selecionar todos
ORG   23H      ; interrupcao serial
LJMP   SERIAL_INT

Re: ajuda com interrupções em assembly

MensagemEnviado: 24 Jun 2018 20:00
por renan-papaco
brasilma escreveu:O LJMP fica no espaço reservado para o direcionamento das interrupções, no 8051 ele vai de 0003H até 002BH, abaixo um exemplo de direcionamento da interrupção referente ao Timer 0 e a Serial

Código: Selecionar todos
ORG   0BH      ; interrupcao timer 0
LJMP   TIMER_0_INT


Código: Selecionar todos
ORG   23H      ; interrupcao serial
LJMP   SERIAL_INT



o código que permite salvar e resgatar dados na stack deve ser colocado no começo do programa?
em que trecho mais ou menos devo colocar?

Re: ajuda com interrupções em assembly

MensagemEnviado: 24 Jun 2018 20:05
por renan-papaco
agora to meio enrolado, mas vou recompilar esse codigo que coloquei aqui originalmente, gravar na placa e executar ele, e filma-lo e postar no youtube,
também filmarei ele com as instruções que você botou aqui pra comprovar o funcionamento.

se isso realmente funcionar, vai ser um avanço inimaginável no meu aprendizado.

Re: ajuda com interrupções em assembly

MensagemEnviado: 25 Jun 2018 08:30
por brasilma
Normalmente o salvamento e recuperação dos dados dos registradores afetados pela interrupção é feito dentro da rotina de atendimento da interrupção.

No espaço inicial reservado para o desvio o espaço é limitado.

Re: ajuda com interrupções em assembly

MensagemEnviado: 08 Jul 2018 10:31
por renan-papaco
agora estou livre pra treinar programação, vou implementar esse código com rotina de salvar dados na pilha, filmarei e postarei aqui.

se for isso mesmo, vai ter sido uma bela ajuda.

Re: ajuda com interrupções em assembly

MensagemEnviado: 08 Jul 2018 13:14
por renan-papaco
AÍ!! DEU CERTO!

caramba esse tempo todo programando microcontroladores eu nem imaginava isso!!
você realmente deu uma ajuda em tanto!
saca o vídeo do circuito e do software em funcionamento!

posso inclusive salvar e gravar dados na stack pointer usando qualquer botão de entrada, não apenas as interrupções, né?

https://www.youtube.com/watch?v=_YtuWmR ... e=youtu.be

Re: ajuda com interrupções em assembly

MensagemEnviado: 08 Jul 2018 13:40
por brasilma
Fico contente que tenha funcionado!

Alguns tipos de aplicações só são possíveis com interrupção, e depois que se acostuma a utilizá-las fica difícil viver sem...

Re: ajuda com interrupções em assembly

MensagemEnviado: 08 Jul 2018 13:58
por renan-papaco
brasilma escreveu:Fico contente que tenha funcionado!

Alguns tipos de aplicações só são possíveis com interrupção, e depois que se acostuma a utilizá-las fica difícil viver sem...


claro, eu já tive 1001 ideias pra esse projeto, e eu to gostando muito de programar em assembly.
também estou dando umas estudadas no Z80, pelo canal do WR kits, mas ele posta pouca coisa a respeito dessa CPU que eu tenho também interesse.
mas o 8051 tem mais conteúdo e eu to mais familiarizado com ele, e queria uma ajudinha para um próximo tópico que vou abrir, quero aprender a fazer um circuito já antigo que venho querendo fazer a anos, botar o 8051 para ler um teclado matricial, e fazer essa rotina em assembly, baseado num circuito que eu projetei, toda ajuda será muito bem vinda.

Re: ajuda com interrupções em assembly

MensagemEnviado: 08 Jul 2018 15:05
por pamv
Tem muitos tutoriais de Z80 na extinta revista Byte disponível no archive.org.

E tem o livro do Steve Circia que resultou disso "Build Your Own Z80 Computer" que se acha para baixar por aí:

https://www.modmypi.com/download/BuildYourOwnZ80.pdf

https://archive.org/details/BuildYourOw ... eveCiarcia

Re: ajuda com interrupções em assembly

MensagemEnviado: 09 Jul 2018 13:04
por renan-papaco
pamv escreveu:Tem muitos tutoriais de Z80 na extinta revista Byte disponível no archive.org.

E tem o livro do Steve Circia que resultou disso "Build Your Own Z80 Computer" que se acha para baixar por aí:

https://www.modmypi.com/download/BuildYourOwnZ80.pdf

https://archive.org/details/BuildYourOw ... eveCiarcia


é uma boa, vou baixar.