Há um tópico parecido aqui no site, mas não solucionou a dúvida. Possuo o conhecimento de como programar interrupções, no entanto, o máximo de delay que elas permitem são 65536us. Como faço para fazer interrupções maiores que esse valor? Esta programação abaixo permite 20.000us (ou 20ms), seu objetivo é incrementar em 1 o acumulador e depois de 20ms, ocorrer uma interrupção:
ORG 0000H
LJMP 100H
ORG 0BH
CLR TR0
RETI
ORG 100H
INICIO: MOV IE ,#82H
MOV IP ,#02H
MOV TMOD,#01H
MOV TH0 ,#HIGH(65535-20000)
MOV TL0 ,#LOW (65535-20000)
SETB TR0
MOV A ,#00H
LOOP: INC A
LJMP LOOP
END
Como faço para aumentar este valor SEM TRAVAR num loop infinito, como no caso abaixo (Seu objetivo foi trocar o estado de P2.5 a cada (20*10)ms no timer1 modo 01), para isso, usei DJNZ para repetir a interrução 10 vezes seguidas (ou seja, travei a programação):
ORG 0000H
LJMP INICIO
ORG 001BH
LJMP ROTINA
INICIO: CLR P2.5
MOV IE, #88H
MOV IP, #08H
MOV TCON, #40H
MOV TMOD, #10H
MOV TH1, #0D8H
MOV TL1, #0F1H
LJMP $ ; ESCREVA O PROGRAMA PRINCIPAL AQUI.
ROTINA: MOV R0, #09H
LOOP: MOV TH1, #0D8H
MOV TL1, #0F0H
JNB TF1,$ ; ESPERA A CONTAGEM TERMINAR (ESPERA O OVERFLOW) - não é possível fazer outras coisas coisas, somos obrigados a esperar TF1, logo, não é o ideal.
CLR TF1 ; LIMPA O TF1 POIS ELE NÃO MUDA DE ESTADO AUTOMATICAMENTE QUANDO O OVERFLOW TERMINA.
DJNZ R0, LOOP ; ESPERAMOS (TRAVADO) A INTERRUÇÃO ACONTECER 10 VEZES (20*10 = 200ms)
CPL P2.5 ; INVERTE O ESTADO LÓGICO DE P2.5 A CADA 200ms
RETI
Se alguém puder me dizer como faço para programar interrupções de mais de 65535us, eu ficaria agradecido!