Interrupcao TIMER2 89s52

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Interrupcao TIMER2 89s52

Mensagempor deley_alves » 09 Jun 2008 10:53

Bom dia pessoal,

Gostaria de uma força de vcs, estou com duvida referente a interrupção do timer2 do 89s52, estou fazendo um teste com o microcontrolador para saber como funciona a interrupção. Estou com o seguinte codigo.

inicio:
org 00h

jmp Inicio_2
org 002Bh
call teste
reti

org 36h
Inicio_2:
;***************Configuração do canal Serial************************************
MOV sp,#056h ;realoca o stack pointer
MOV scon,#050h ;seleciona modo 1 do canal serial e habilita recepcao
MOV tmod,#021h ;configura timer1: 8 bits com recarga automatica
MOV th1,#0fDh ;carrega timer1 para gerar taxa F4
MOV tl1,#0fDh ;de transmissao/recepcao (fosc = 11.0592) F4
MOV pcon,#0h ;dobra taxa de recepcao/transmissao (baud rate = 9600)
MOV tcon,#40h ;liga timer
CLR TI
CLR RI

clr EXF2
clr TCLK
clr RCLK
setb EXEN2
clr CT2
clr CPRL2C
setb EA
setb ET2
setb p1.1

Principal:
mov sbuf,#'R'
jnb ti,$
clr ti
jmp Principal

teste:
clr EA
clr ET2
clr TF2
clr EXF2
mov sbuf,#'J'
jnb ti,$
clr ti

jnb p1.1,$

setb EA
setb ET2
ret

END

O que esta acontecendo com o codigo é o seguinte, a serial fica o tempo todo enviando 'R', quando ocorre a interrupção enviara 'J' e depois deveria voltar a ficar enviando 'R', mas o que esta acontecendo é o seguinte a serial fica enviando 'R', mas quando coloco em nivel baixo o pino p1.1, ele envia 'J', mas nao retorna a enviar 'R', se coloco novamente em nivel baixo no pino p1.1, ele envia novamente o 'J'.
Entao nao sei o que tem mas para configurar para que ele fique enviando 'R' e quando ocorre a interrupcao enviar 'J' e depois voltar a enviar 'R'.
Neste caso estou fazendo esse teste pois tenho uma aplicativo q usa 2 sinais, um de clock e outro de dados, entao ligaria o sinal de dados no pino p1.1, e o microcontrolador ficaria livre para fazer outras coisas e quando o sinal de dados cair para zero atenderia a interrupcao e faria o papel de ler os dados vindos pelo os 2 sinais q tenho o clock e data. Por favor se alguem tiver uma ideia de como posso fazer isso agradeço.
deley_alves
Bit
 
Mensagens: 5
Registrado em: 30 Out 2006 22:39

Mensagempor Maurício » 09 Jun 2008 15:07

Salve, deley_alves.

Experimenta essas mudanças. Muito poucas. Faz tempo que eu não programo em ASM.

Código: Selecionar todos
inicio:
org 00h

jmp Inicio_2
org 002Bh
call teste
reti

org 36h
Inicio_2:
;***************Configuração do canal Serial************************************
MOV sp,#056h ;realoca o stack pointer
MOV scon,#050h ;seleciona modo 1 do canal serial e habilita recepcao
MOV tmod,#021h ;configura timer1: 8 bits com recarga automatica
MOV th1,#0fDh ;carrega timer1 para gerar taxa F4
MOV tl1,#0fDh ;de transmissao/recepcao (fosc = 11.0592) F4
MOV pcon,#0h ;dobra taxa de recepcao/transmissao (baud rate = 9600)
MOV tcon,#40h ;liga timer
CLR TI
CLR RI

clr EXF2
clr TCLK
clr RCLK
clr CT2
clr CPRL2C

setb p1.1
setb EXEN2
setb EA
setb ET2

Principal:
mov sbuf,#'R'
jnb ti,$
clr ti
jmp Principal

teste:
clr EA
clr ET2
clr TF2
clr EXF2
jnb ti,$   ;espera transmitir

mov sbuf,#'J'
jnb ti,$
clr ti

jnb p1.1,$

setb EA
setb ET2
ret

END


Espero que possa resolver.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor deley_alves » 09 Jun 2008 15:33

Salve Maurício,

Cara obrigado, funcionou blz. Agora sem querer abusar da boa vontade me responde uma coisa se puder claro, quando o 8051 atende esse tipo de interrupção nao quer dizer q tenho q zerar ou colocar um valor nos registradores TH2 e TL2, basta fazer da forma q estou fazendo mesmo, somente setando pra zero o flag EXF2 e assim terei quantas interrupções forem necessarias, me perdoe se fale bobagem, é q estou começando com 8051 e estou totalmente na cara e na coragem pra aprender.

[]'s
deley_alves
Bit
 
Mensagens: 5
Registrado em: 30 Out 2006 22:39

Mensagempor Maurício » 10 Jun 2008 11:17

Salve, deley.

Que bom que funcionou. Isso quer dizer que eu não estou tão enferrujado assim, eheheheheheheh

O TIMER2 tem vários modos de funcionamento. Gerar interrupções através de um pino externo é um dos modos. O problema é que usando um atributo de um timer, vc pode eliminar os outros.

Vc precisa definir quais as necessidades do programa, e verificar se o timer pode fazer isso.

Como eu disse, faz muito tempo que eu não programo mais em ASM no 51, só com C, mas, se o seu intuito é o de somente disparar uma ação, quando uma interrupção externa ocorrer, vc tb tem a possibilidade de usar INT0 e INT1, que causam o mesmo efeito que essa que vc usou do timer2, só que com a vantagem que vc livra mais um timer. E de 16 bits, que é melhor ainda.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x