Ir ao conteúdo
  • Cadastre-se

Como programar um delay de 100ms (0.1 segundo) em assembly no 8051?)


t777

Posts recomendados

Como programar um delay de 100ms (0.1 segundo) no 8051 pelo temporizador??

Estou usando o 89S52. Preciso criar um delay de 100ms mas não tenho ideia de como faço isso pelo temporizador. Só sei por meio de registradores usando o DJNZ.

Como faria isso pelo temporizador???

Com registradores seria possível? Como faria isso?

Link para o comentário
Compartilhar em outros sites

Com duas palavras de controle se comanda os timers. Elas sao TMOD e TCON. Em TMOD eu programo como o timer irá funcionar: modo 0,1,2,ou 3; ainda defino nesta palavra TMOD, se o timer irá contar pulsos externos ou contará da base de tempo interna. Defino finalmente nesta, se o timer ficará sujeito a disparo por interrupcao. São quatro bits para cada timer de programação com fim a se utilizar dois bits para determinar o modo de operacao(M1,M0); um bit de definição de interrupção (GATE) e um bit para se definir se o timer irá se basear em base de tempo interna ou contagem de eventos externos(C/T).

Como temos dois timers disponíveis temos quatro bits para cada timer totalizando os oito bits disponíveis na palavra. Em TCON eu posso ligar o timer, como também verificar se a contagem ja chegou ao máximo. São dois bits para cada timer para estas duas funções(TR=liga,TF=chegou ao fim).Os outros quatro bits desta palavra tem outra função que será visto no programa de interrupção:

TMOD

; '''''''''''''''''''''''''''''''''''''''''''''''''''''''

; GATE1 C/T1 M1.1 M0.1 GATE0 C/T0 M1.0 M0.0

; --------------------------- ------------------------

; TIMER 1 TIMER 0

; TCON

; '''''''''''''''''''''''''''''''''''''''''''''''''''''''

; TF1 TR1 TF0 TR0 XX XX XX XX

; ------------ ---------- -----------------------

; TIMER1 TIMER0 NAO TEM APLICACAO NO TIMER

; Os modos de contagem sao :

;

; M1 M0

; MODO 0 0 0 ,conta ate' 13 bits

; MODO 1 0 1 ,conta ate' 16 bits

; MODO 2 1 0 ,conta ate' 8 bits com recarga automatica do numero

; MODO 3 1 1 ,conta" evento externo" por "tempo interno",utilizando

; neste caso parte do timer 1 para esta contagem "even-

; tos por tempo", alem de usar o timer 0 todo.

Para se carregar os valores de contagem se utiliza dos registradores chamados por TH,"Timer High" e TL,"Timer Low", um par deles para cada timer, isto é, TH1/TL1 e TH0/TL0. É neles que eu carrego o valor inicial de contagem desejada ,onde o contador ira' incrementando seu valor ate' chegar no máximo de contagem,onde ai' o timer nos avisará fazendo o bit TF=1 que fica na palavra TMOD.

Em resumo: cada timer tem sua programacao em TMOD,seu controle em TCON e sua carga inicial de contagem em THigh e TLow, que sao dois registra-

dores para cada timer ter seu valor inicial de contagem. Na contagem da base de tempo interna, o timer pega a frequencia do clock do Micro e divide por 12 antes de contar.(Ex clock 12MHz => 1microseg.) Cada vez que a contagem chega ao maximo eu tenho que recarregar os valores de TH eTL de novo. So' no modo 2 e' que eu nao preciso fazer isto, pois a recarga e' automatica.

Ex. Programar timer 0 como contador de 16 bits para contagem de um total de 20000 pulsos do clock interno do Micro .O cristal deste Micro roda a 12Mhz. Isto é, eu vou contar um total de 20 Milisegundos.(Certo?). Neste exemplo eu não uso interrupção para avisar o Micro que já chegou no fim de contagem, ie', eu faco o Micro ficar "esperando" o contador terminar a contagem, que não e' a melhor opção. No segundo ex. vai se interromper o Micro pelo Timer, que e' o ideal, pois o Micro ficara' livre para fazer outras tarefas enquanto o Timer conta.

Ex1: Timer nao interrompe o Micro.OBS: Como este programa se inicia em 000Fh, você deve forcar o "PC" ir para este ponto de memoria, senão não se conseguira' simular o exercício.

;label instr operando;comentários

;***** ***** ******** ***************************************

org 000Fh ;começo depois da interrupção que se vai gerar no segundo ex.(EX2) para não ter conflito de compilação.

mov ie,#00000000b ; Sem interrupção alguma.

mov TMOD,#10h ;programoTMOD,TIMER1,para modo 1 Isto e',TMOD=0000 0001,ou M1=0,M0=1 e ainda contagem interna,pois C/T=0

mov TH1,#high(65535-20000) ;Ao invés de fazer as contas na mão,deixo o compilador fazer para mim.

mov TL1,#low(65535-20000) ;Nestas duas instruções eu carreguei a parte alta do numero 45535 em THigh e a parte baixa em TLow, criando um

;contador de 16 bits que contará de 45535 até 65535, dando o total de 20000 contagens

setb TR1 ;Ligo o timer 1.E' um bit da palavra TCON que no caso acionei via "Bit" ao invés de via "Byte".(Veja a "palavra" acima no texto).

JNB TF1,$ ;Aqui o Micro fica "esperando" a contagem finalizar, através do teste do Bit TF1, que e' o indicador de "Contagem Estourada".

CLR TR1 ;O contador ja contou,então desligo-o através do bit TR1.

CLR TF1 ;Tenho que tomar cuidado par "desligar " o Flag de aviso de estouro de contagem, senão na próxima vez de usa-lo ele já estará

setado e fará confusão, pois você irá testa-lo se ele foi para "1" e ele já está em "1".

; Ex2: Timer interrompe o Micro. Comece analizando o software pelo org 100h" para poder estuda-lo.(Faca PC=100h)

;label instr operando;comentários

;***** ***** ******** ***************************************

;__________________________________________

ORG 0BH ;TIMER0 (ET0) -Serviço de interrupção do TIMER0

CLR TR0 ;O contador já contou,então desligo-o através do bit TR0. Observe que eu não fiz aqui a rotina "Clear TF0", pois a interrupção

automaticamente faz isto para mim.(So' no caso de Interrupção).

reti ;Retorno de Interrupção

;____________________________________________

org 100h ;comecei o programa em 100h

inicio: mov ie,#10000010B ;TIMER0 (ET0) pode pedir interrupção.

mov ip,#2 ;TIMER0 max prioridade

mov TMOD,#01h ;programoTMOD,TIMER0, para modo 1 Isto é,TMOD=0000 0001,ou M1=0,M0=1 e ainda contagem interna,pois C/T=0

mov TH0,#high(65535-20000) ;Ao invés de fazer as contas na mão, deixo o compilador fazer para mim.

mov TL0,#low(65535-20000) ;Nestas duas instruções eu carreguei a parte alta do número 45535 em THigh e a parte baixa em TLow,criando um

contador de 16 bits que contará de 45535 atá 65535,dando o total de 20000 contagens

setb TR0 ;Ligo o timer 0.E' um bit da palavra TCON que no caso acionei via "Bit" ao invés de via "Byte".(Veja a "palavra" acima no texto).

Mov A,#00 ; Zera A

loop: INC A ;Incrementa A enquanto o Timer fica contando.

sjmp loop ;Veja que eu nao estou "esperando" o Timer contar eu estou fazendo outra coisa (Incrementando "A" neste exemplo) ate' que o

Timer estoure a conta. Ai' eu atendo a sua interrupção, e depois, eu retorno da interrupcao (RETI), voltando ao meu antigo servico que era incrementar" A".

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