baltazar escreveu:Está tudo ok?
Está correto, sim. Só tem um detalhe que eu não sei se nos PICs é igual.
Tanto pra transmitir como para receber, a serial ocupa a mesma interrupção. Se algum dos flags for setado, o programa é desviado para o mesmo endereço que trata a serial. No seu caso vc não pode amarrar a transmissão ( usando
JNB TI,$ ), se vc já está usando interrupção pra tratar a serial. Vc precisa eliminar essa instrução e na sub-rotina de interrupção, colocar o seu código de tratamento lá.
Faz tempo que eu não programo em ASM, mas, a lógica é a mesma:
Se houver ou uma recepção, ou uma transmissão, a CPU vai ser desviada para o endereço de tratamento da interrupção.
Dentro da rotina vc testa os bits. Se for
RI, faz alguma coisa. Testa
TI. Se for
TI faz outras coisas.
Normalmente, se for
TI, a única coisa que a gente faz é resetar o flag dentro da interrupção e voltar pra execução do programa.
Acontece que o equipamento "trava" na linha "JNB TI,$", parece que o TI não está sendo setado em momento algum!
Não sei porque, mas acho que é por causa do que eu falei acima.
Talvez a CPU esteja resetando TI dentro do tratamento da interrupção e dessa forma, seu programa nunca mais vai sair do mesmo lugar.
Só mais um detalhe, esse projeto trabalha também com interrupção por estouro do Timer0(um RTC). Faz alguma diferença para a serial do 8052?
Não. Só que por construção, o MCU vai atender primeiro a interrupção do TIMER, que tem prioridade maior. Se vc quer que a serial tenha prioridade nas interrupções, basta setar o bit
PS no registrador
IP.
Ah, uma última coisa, estou trabalhando agora com um AT89C55, mas pelo que vi no datasheet a serial é exatamente igual, correto?
Correto.
Uma outra coisa que eu não sei se vc sabe é que nos vetores de interrupção do 51, só existem uns poucos bytes separando um vetor de outro, o que na maioria dos casos não dá pra colocar o código de tratamento da interrupção nesses bytes. Neste caso, o que se faz, é simplesmente colocar um JUMP pra um outro lugar onde haja mais espaço para codificar um tratamento. Uma coisa mais ou menos assim:
- Código: Selecionar todos
org 23h // endereço do vetor da interrupção serial
JMP TRATA_SERIAL
org 100h // inicio do programa
;seu código aqui
TRATA_SERIAL:
JNB RI, verifica_TI
;código de RI
CLR RI
verifica_TI:
JNB TI, exit
;código de TI
CLR TI
exit:
RETI
Espero ter ajudado. O 8051 é meio chatinho, mas depois, se torna uma máquina bem eficiente.
[]'s