por pomboeletronic » 03 Jan 2007 11:50
Faça as contas de qual é o valor que vc precisa carregar o timer para atingir o tempo que vc quer...
por exemplo 500 para 5 segundos, e 1000 para 10 segundos
escolha o modo de operaçao do timer...
se vc escolher recarga altomatica...
*************************************
org 0
ljmp inicio
org 000Bh;timer 0
ljmp func_timer0
org 001Bh;timer 1
ljmp func_timer1
**********************
inicio:
: aqui vc deve escolher omodo de operaçao do timer
.supondo que vc saiba fazer isso,caso tenha dificuldade poste aqui...
;faça o que vc quizer...
setb TR0
sjmp $
func_timer0:
clr tr0; desliga o timer 0
setb p1.0 ;liga o motor
setb TR1
reti
func_timer1:
clr tr1; desliga o timer 1
clr p1.0 ;liga o motor
setb TR0
reti
end
Aqui vc encontra o exemplo do livro do Denys E C Nicolosi
*************************************************************
;Aqui voce so' tera um resumo da aplicacao.Com duas palavras de
; controle se comanda os timers.Elas sao TMOD e TCON. Em TMOD eu programo
; como o timer ira' funcionar :modo 0,1,2,ou 3;ainda defino nesta palavra
; TMOD se o timer ira' contar pulsos externos ou contara' da base de tempo
; interna.Defino finalmente nesta,se o timer ficara' sujeito a disparo
; por interrupcao.Sao quatro bits para cada timer de programacao com fim
; a se utilizar dois bits para determinar o modo de operacao(M1,M0);um
; bit de definicao de interrupcao (GATE) e um bit para se definir se o
; timer ira' se basear em base de tempo interna ou contagem de eventos ex-
; ternos(C/T).Como temos dois timers disponiveis ,temos quatro bits para
; cada timer totalizando os oito bits disponiveis na palavra. Em TCON eu
; posso ligar o timer,como tambem verificar se a contagem ja chegou ao ma-
; ximo.Sao dois bits para cada timer para estas duas funcoes(TR=liga,
; TF=chegou ao fim).Os outros quatro bits desta palavra tem outra funcao
; que sera' visto no programa de interrupcao:
; 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 cha-
; mados por TH,"Timer High" e TL,"Timer Low", um par deles para cada timer,
; isto e'. TH1/TL1 e TH0/TL0.E' neles que eu carrego o valor inicial de
; contagem desejada ,onde o contador ira' incrementando seu valor ate' che-
; gar no maximo de contagem,onde ai' o timer nos avisara' 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 valo-
; res 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 e', eu vou contar um total de 20 Milisegundos.(Certo?).Neste
; exemplo eu nao uso interrupcao para avisar o Micro que ja' chegou no
; fim de contagem,i.e',eu faco o Micro ficar "esperando" o contador termi-
; nar a contagem,que nao e' a melhor opcao.No segundo ex. vai se interrom-
; per 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,voce deve forcar o "PC" ir para este ponto de memoria,senao
; nao se conseguira' simular o exercicio.
;label instr operando;comentarios
;***** ***** ******** ***************************************
org 000Fh ;comeco este software depois da interrupcao
;que se vai gerar no segundo ex.(EX2) para nao
;ter conflito de compilacao entre este programa
;e o que vem a seguir, que usa a interr. do
;Timer 0 que esta' em 000Bh.
mov ie,#00000000b ; Sem interrupcao 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 inves de fazer as contas na
;mao,deixo o compilador fazer
;para mim.
mov TL1,#low(65535-20000) ;Nestas duas instrucoes eu carreguei
;a parte alta do numero 45535 em THigh
;e a parte baixa em TLow,criando um
;contador de 16 bits que contara' de
;45535 ate' 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 inves de
;via "Byte".(Veja a "palavra" acima no texto).
JNB TF1,$ ;Aqui o Micro fica "esperando" a contagem fi-
;nalizar,atraves do teste do Bit TF1, que e'
;o indicador de "Contagem Estourada".
CLR TR1 ;O contador ja' contou,entao desligo-o atraves
;do bit TR1.
CLR TF1 ;Tenho que tomar cuidado par "desligar " o Flag
;de aviso de estouro de contagem,senao na pro-
;xima vez de usa-lo ele ja' estara' setado e fa-
;ra'confusao,pois voce ira' testa-lo se ele foi
;para "1" e ele ja'esta' em "1".
; Ex2: Timer interrompe o Micro .Comece analizando o software pelo
; "org 100h" para poder estuda-lo.(Faca PC=100h)
;label instr operando;comentarios
;***** ***** ******** ***************************************
;__________________________________________
ORG 0BH ;TIMER0 (ET0) -Servico de interrupcao do TIMER0
CLR TR0 ;O contador ja' contou,entao desligo-o atraves
;do bit TR0.Observe que eu nao fiz aqui a rotina
;"Clear TF0",pois a interrupcao automaticamente faz
;isto para mim.(So' no caso de Interrupcao).
reti ;Retorno de Interrupcao
;____________________________________________
org 100h ;comecei o programa em 100h
inicio: mov ie,#10000010B ;TIMER0 (ET0) pode pedir interrupcao.
mov ip,#2 ;TIMER0 max prioridade
mov TMOD,#01h ;programoTMOD,TIMER0,para modo 1
;Isto e',TMOD=0000 0001,ou M1=0,M0=1
;e ainda contagem interna,pois C/T=0
mov TH0,#high(65535-20000) ;Ao inves de fazer as contas na
;mao,deixo o compilador fazer
;para mim.
mov TL0,#low(65535-20000) ;Nestas duas instrucoes eu carreguei
;a parte alta do numero 45535 em THigh
;e a parte baixa em TLow,criando um
;contador de 16 bits que contara' de
;45535 ate' 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 inves 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 (Incre-
;mentando "A" neste exemplo) ate' que o Timer
;estoure a conta. Ai' eu atendo a sua inter-
;rupcao, e depois, eu retorno da interrupcao
;(RETI),voltando ao meu antigo servico que era
;incrementar" A".
END
"Nós nos transformamos naquilo que praticamos com frequência.
A perfeição,portanto, não é um ato isolado. É um hábito".
Aristóteles