Ir ao conteúdo
  • Cadastre-se

Assembly 8051 - Programação & Hardware sobre este MCU


xyko-2020

Posts recomendados

o qe vce está qerendo com esse R1?

do jeito qe tá, seu timer tá contando 12 segundos, é essa tua intenção?

na primeira vez qe cai na rotina, ele altera o estado do led, e decrementa R1.. pelo seu programa, R1 era zero, portanto, após esse estouro do timer será FFh

eaí, ele só alterará o estado do led de novo, depois de 255 interações, ou aproximadamente 12 segundos!

outra coisa..

dentro da tua interrupção, tem essa linha

jz PISCAR_LED

caso ele de o jump, dentro da label PISCAR_LED não tem reti, e o programa vai se perder, de novo!

diz o qe vce tá qerendo com esse programa, qe fica mais fácil de ajudar, pqe eu realmente não entendi direito ainda!

vce qé piscar o led, em uma certa frequencia, é isso? de quanto em quanto tempo?

Link para o comentário
Compartilhar em outros sites

Quero piscar o led de 1 em 1 segundo..


LED EQU P1.0 ; define LED como pino 0 porta 1

org 0

sjmp INICIO ; vaí para o início do programa

org 0003h ; interrupção int0
mov A, R1 ; acomulador agora tem o valor de R1

jz PISCAR_LED ; compara acomulador com 0, se for vaí para PISCAR_lED

dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 15535
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0
reti ; retorna para onde estava

PISCAR_LED:
clr TR0 ; desliga timer0
cpl LED ; liga ou desliga LED
reti

INICIO:
; configurar timer
mov TMOD, #01h ; timer0 modo 1
; valor inicial 15535
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
mov IE, #82h ; habilita interrupções globais e do timer0
mov IP, #02h ; timer0 com prioridade alta e os demais em baixa

mov R1, #10

setb TR0 ; liga timer0

setb LED ; acender LED

sjmp LOOP ; desvia para o loop

LOOP:
; fazer código para controlar o tempo do estouro do tmr0 por meio de chaves (p0.1 e p0.2)

sjmp LOOP ; fica em loop

end ; fim do programa

Link para o comentário
Compartilhar em outros sites

tá, teu código tá quase..

mas seguinte.. tem um erro grave aí!

mas fácil de resolver!

o endereço da interrupção do timer zero não é 0003 e sim 000b!

então, troque seu ORG 0003h por ORG 000bh

outra coisa..

aqui nesse trecho


PISCAR_LED:
clr TR0 ; desliga timer0
cpl LED ; liga ou desliga LED

vce inverte o estado do led..

e desliga o timer..

e aí? seu led não vai piscar nunca mais..!

o qe vce tem qe fazer aí é

cpl LED

e aí reconfigurar o timer..

eu recomendo qe ve faça uma rotina separada para isso aqi ó


mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

e aí por acall ou lcall vce chama ela..

senão, vce fica jogando esse código um motne de vezes no teu programa, vira bagunça! e se tu quiser alterar esse tempo de piscar, dá um trabalho!

só mais uma coisa..

não precisa ficar desligando e ligando teu timer toda hora não!

deixa ele ligado sempre..! é só ir recarregando ele com o valr correto! desligar ele nesse caso não faz diferença e te economiza código!

é isso aí.. desse jeito vai funcionar!

mas de uma estudada, tente arrumar os códigos! ;)

esse seu código aí dá pra dá uma boa diminuida nele! se eu tiver com tempo amanhã posto aqi pra ti!

bons estudos e qualquer coisa, estams aí! o/

Link para o comentário
Compartilhar em outros sites

posta teu código..

de qualquer forma, segue um código qe funciona aqui ó!

é o teu arrumado! já já faço um e posto aqui, mais arrumado, pra tu dá uma estudada!

LED EQU P1.0 ; define LED como pino 0 porta 1

org 0

sjmp INICIO ; vaí para o início do programa

org 000bh ; interrupção int0
mov A, R1 ; acomulador agora tem o valor de R1

jz PISCAR_LED ; compara acomulador com 0, se for vaí para PISCAR_lED

dec R1 ; incrementa flag R1

; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 15535
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)

setb TR0 ; liga timer0
reti ; retorna para onde estava

PISCAR_LED:
clr TR0 ; desliga timer0
; reconfigura timer
clr TR0 ; desliga timer0
; valor inicial 15535
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
setb TR0
mov R1,#10
cpl LED ; liga ou desliga LED
reti

INICIO:
; configurar timer
mov TMOD, #01h ; timer0 modo 1
; valor inicial 15535
mov TH0, #HIGH (65535 - 50000)
mov TL0, #LOW (65535 - 50000)
mov IE, #82h ; habilita interrupções globais e do timer0
mov IP, #02h ; timer0 com prioridade alta e os demais em baixa

mov R1, #10

setb TR0 ; liga timer0

setb LED ; acender LED

sjmp LOOP ; desvia para o loop

LOOP:
; fazer código para controlar o tempo do estouro do tmr0 por meio de chaves (p0.1 e p0.2)

sjmp LOOP ; fica em loop

end ; fim do programa

olha ae cara, tá explicadinho!

qualquer coisa posta ae! ;)


LED EQU P1.0 ;define LED como pino 0 porta 1

ORG 0
ljmp Inicio ;Ir para início do programa

ORG 000Bh ;Interrupção do Timer0 (IT0)
ljmp Timer0
reti ;Sair da interrupção

Inicio:
;Configurar Timer0
mov TMOD,#01h ;Timer0 Modo 1

setb ET0 ;Habilitar interrupção do Timer0-
setb EA ;Habilitar interrupções globais

mov R1, #10 ;Contar 10 vezes o Timer0, para dar 500ms

lcall CarregaTimer ;CarregarTimer
setb TR0 ;Liga Timer0
sjmp $ ;Travar o programa

Timer0: ;Interrupção do Timer0
djnz R1,ContaMais ;Verifica se já contou 10 vezes 50ms
cpl LED ;Se sim, inverte o LED
mov R1,#10 ;Programa R1 para contar mais 10 vezes
ljmp SairInt ;Volta para o programa
ContaMais:
lcall CarregaTimer ;Se não contou 10 vezes, recarregar
;Timer com mais 50ms
SairInt:
Reti

CarregaTimer: ;Recarregamento do Timer0
clr TR0 ;Desliga o Timer
mov TH0,#3Ch ;Carrega com 50ms
mov TL0,#0AFh
setb TR0 ;Religa o Timer0
Ret

Link para o comentário
Compartilhar em outros sites

sjmp $

faz o programa ficar parado, em loop!

esse programa não tem um fim, certo? ele vai ficar executando pra sempre!

então, o qe fazer pra ele ficar executando pra sempre?

fazer um loop!

sjmp $

faz ele ficar saltando para a mesma linha!

é o mesmo qe fazer

Loop:

sjmp Loop

entendeu?

por que tirar o SairInt?

vce não pode tirar.. se vce entra na interrupção, vce tem qe sair dela com Reti

senão, sua pilha vai ficar toda perdida e o 8051 vai se perder!

do jeito qe eu fiz o programa, ele já fica em loop!

se vce quiser fazer algo dentro desse loop, troque o sjmp $ pela alternativa com o sjmp Loop qe eu acabei de dizer!

;)

fora isso, entendeu? descobriu pqe teu código qe tinha ái não estava funcionando?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Se o problema é tirar o jump para a saída...


Timer0: ;Interrupção do Timer0
djnz R1,ContaMais ;Verifica se já contou 10 vezes 50ms
cpl LED ;Se sim, inverte o LED
mov R1,#10 ;Programa R1 para contar mais 10 vezes
RETI ;Volta para o programa
ContaMais:
lcall CarregaTimer ;Se não contou 10 vezes, recarregar
;Timer com mais 50ms
RETI

Pode colocar quantos RETI precisar, pois só um vai ser executado mesmo!

Mas se antes de sair, tivesse recupareção de registros com POP... melhor deixar aquele jump.

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

ai galera beleza to precisando de um codigo assembly para 8051 que conte 0 a 6 em ordem aleatória e que quando eu apertar um botão ele é unico tem que interromper a contagem e mostrar o numero no display de 7 segemnto. Galera eu não sei nada de programação>>>>>>>>>>>>>>>>>>>>>>>>>>me ajudem .

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

posso ate te ajudar.............com esse dado eltronico....hehe


;***************************************************************************************
;***************************************************************************************
;***************************************************************************************
;DADO eletrônico
;MCU 8051
;BY TECMAST2
;P1.0 = BOTAO, COLOCA GND NO PINO QUANDO ACIONADO
;P2 SAIDA DE DADOS PARA LIGAR DIRETAMENTE UM DISPLAY 7 segmentos ANODO COMUN
;DISPOSIÇÃO:
;P2.0 = A
;P2.1 = B
;P2.2 = C
;P2.3 = D
;P2.4 = E
;P2.5 = F
;P2.6 = G
;P2.7 = PONTO NAO LIGADO
;ANODO COMUN A 5V
;COLOCAR RESISTORES NOS PINOS DA P2, 8 X 820R
;CRISTAL 12MHZ
;***************************************************************************************
ORG 0000H ;RESET
JMP INI
;
;***************************************************************************************
;
ORG 0003H ;EXTERNA0
RETI
;
;***************************************************************************************
;
ORG 0000BH ;INTERRUPCAO TIMER 0
RETI
;
;***************************************************************************************
;
ORG 00013H ;EXTERNA1
RETI
;
;***************************************************************************************
;
ORG 0001BH ;INTERRUPCAO TIMER 1
RETI
;
;***************************************************************************************
;
ORG 0023H ;SERIAL
RETI
;
;***************************************************************************************
;LOOP INF
ini: mov a,#1
inicio: inc a
jnb p1.0,GIRANDO
cjne a,#6,inicio
jmp ini
;
;***************************************************************************************
;
TEMPO_100ms: MOV R6,#255
MOV R4,#250
DJNZ R6,$
DJNZ R4,$
RET
;
;***************************************************************************************
;
GIRANDO: MOV R7,#10
GIRA: MOV P2,#00000011B
CALL TEMPO_100ms
MOV P2,#00000110B
CALL TEMPO_100ms
MOV P2,#00001100B
CALL TEMPO_100ms
MOV P2,#00011000B
CALL TEMPO_100ms
MOV P2,#00110000B
CALL TEMPO_100ms
MOV P2,#00100001B
DJNZ R7,GIRA
;
;***************************************************************************************
;MOSTRA
cjne a,#1,pula1
mov p2,#11111001B
jmp ini
pula1: cjne a,#2,pula2
mov p2,#01011011B
jmp ini
pula2: cjne a,#3,pula3
mov p2,#01001111B
jmp ini
pula3: cjne a,#4,pula4
mov p2,#01100110B
jmp ini
pula4: cjne a,#5,pula5
mov p2,#01101101B
jmp ini
pula5: cjne a,#6,pula6
mov p2,#01111100B
pula6: jmp ini
end
;***************************************************************************************

Link para o comentário
Compartilhar em outros sites

  • mês depois...
  • 4 meses depois...
  • mês depois...

Oi soschip tudo bem? não consigo acessar o link de onde estavam seus exemplos, teria como disponibilizar novamente? também estou com dúvida em como criar uma lógica para um receptor de controle remoto, não consegui entender como devo fazer para a lógica "captar" cada bit que é recebido pra no final "juntar" tudo e definir qual tecla foi pressionada, obrigado, até mais, abraço.

Link para o comentário
Compartilhar em outros sites

  • 5 semanas depois...
  • Coordenador

Colega Danilo, você consegue um gerador de clock facilmente com circuitos astáveis...

Astable.png

555ASTV.gif

UJT_circuito.png

No link abaixo tem inúmeros sites ensinando a calcular a frequência de oscilação deles...

http://www.google.com.br/images?hl=pt-BR&source=imghp&q=circuitos+astaveis&gbv=2&aq=f&aqi=&aql=&o que=&gs_rfai=

Aguarde outras dicas!...

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

Eu estou tentando fazer uma lombada eletronica com a programação 8051, mas estou tendo dificuldades de como deixar um valor gravado pra que divida o tempo que um objeto irá percorrer entre os dois sensores

Por exemplo: o tempo transcorrido entre os dois sensores deve ser dividido por um valor pré determinado que no caso é a distancia... sei que é possível fazer isso mas até agora não consegui fazer o valor do contador ser dividido por um valor que fique lá estático e depois seja transferido para o visor... Alguem sabe de algo do genero para que possa me dar uma luz nisso?

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Boa tarde pessoal.. estou começando aprender (ou tentando começar) com microcontroladores, e já estou com muitos problemas.. lá vai meu drama...

Estou estudando BASCOM-AVR com a apostila do Paulo http://forum.clubedohardware.com.br/tutorial-programacao-basic/790825 , mas na minha cidade não encontro os atmegas só encontro o at89s52 e similares. Então baixei o BASCOM-8051.

A Questão...

O BASCOM-8051 versão demo não tem o arquivo .DAT para compilar o AT89S52. Existe alguma configuração no programa que eu posso fazer, ou é melhor usar outro programa?

Fica aqui o me agradecimento ao Paulo (aphawk) por compartilhar todo o seu conhecimento com todos, pois as suas apostilas são muito boas.. Obrigado.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!