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: 3248
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 10 Jun 2018 17:05

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor brasilma » 10 Jun 2018 19:15

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
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3248
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 24 Jun 2018 20:00

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?
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 24 Jun 2018 20:05

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor brasilma » 25 Jun 2018 08:30

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.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3248
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 08 Jul 2018 10:31

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 08 Jul 2018 13:14

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
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor brasilma » 08 Jul 2018 13:40

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...
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3248
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 08 Jul 2018 13:58

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: ajuda com interrupções em assembly

Mensagempor pamv » 08 Jul 2018 15:05

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
pamv
Word
 
Mensagens: 513
Registrado em: 20 Jun 2016 21:47

Re: ajuda com interrupções em assembly

Mensagempor renan-papaco » 09 Jul 2018 13:04

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.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Voltar para 8051

Quem está online

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