Ir ao conteúdo
  • Cadastre-se

Problema Timer MultiSim


graccula

Posts recomendados

Pessoal,

Estou começando a estudar a programação da família 8051 e estou usando o multisim como simulador.Estou acompanhando os exercícios do livro "Laboratório de Microcontroladores da Família 8051" do Denys Nicolosi.

Estava indo tudo bem até o exercício de timers.

Bom, para o cirtuito eu apenas coloquei no board um 8051 genérico e polarizei ele e comecei a escrever uns programas em assembler.

Todos os programas dos exercícios anteriores funcionaram perfeitamente inclusive este:

1 ORG 10H

2 MOV IE, #00H

3 MOV TMOD, #10H

4 MOV TH1, #HIGH(65535-20000)

5 MOV TL1, #LOW(65535-20000)

6 SETB TR1

7 JNB TF1, $

8 NOP

9 CLR TR1

10 CLR TF1

11 END

Acompanhando com um cronometro funcionou perfeito. Ele ficou 20 segundos no loop da linha 7, o que era esperado.

Mas neste código abaixo, onde eu programei para que o timer interrompesse o programa principal:

1 ORG 0BH

2 CLR TR0

3 RETI

4 ORG 100H

5 INICIO: MOV IE, #82H

6 MOV IP, #2

7 MOV TMOD, #01H

8 MOV TH0, #HIGH(65535 - 20000)

9 MOV TL0, #LOW(65535 - 20000)

10 SETB TR0

11 MOV A, #00H

12 LOOP: INC A

13 SJMP LOOP

14 END

Bom, o que acontece é que eu coloco um breakpoint na linha 2 e outro na linha 5. No meu entender ele deveria comecar o programa na linha 5 e apenas quando a partir da linha 10 quando eu ligasse o timer (depois de 20 segundos) que o programa deveria ir parar no breakpoint da linha 2.

Mas o que acontece é que o programa começa na linha 2, executa a linha 2 e a 3 e volta na linha 2, ficando eternamente nesse loop.

O que estou fazendo de errado? Alguém já passou por isso?

Agradeço qqer ajuda. Se precisarem do projeto pra dar uma olhada eu posso enviar.

[]s

Renato

Link para o comentário
Compartilhar em outros sites

Pessoal,

**** vacilo. Descobri a idiotice que eu estava fazendo. Faltava uma instrução de jump em um endereço anterior ao da interrupção. Bastou eu colocar as linhas:

org 00h

ljmp #0100h

e tudo funcionou perfeitamente. Que mancada. Bom, fica a dica para os cabeções que nem eu!

O programa ficou assim:

1: ORG 00H

2: LJMP 0100H

3: ORG 0BH

4: CLR TR0

5: RETI

6: ORG 100H

7: INICIO: MOV IE, #82H

8: MOV IP, #2

9: MOV TMOD, #01H

10: MOV TH0, #HIGH(65535 - 20000)

11: MOV TL0, #LOW(65535 - 20000)

12: SETB TR0

13: MOV A, #00H

14: LOOP: INC A

15: SJMP LOOP

16: FIM: NOP

17: END

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...