Este artigo de 2004 fornece informações de como acrescentar interrupções adicionais ao 80C51, de utilidade para os que ainda usam este tipo de microcontrolador.
Os microcontroladores da família 80C51 são dotados de até 2 entradas as quais podem ser usadas como interrupções de uso geral. Um dispositivo típico proporciona até um total de 5 fontes de interrupção. O timer 0 e o Timer 1 geram vetores de interrupção assim como a porta serial. As aplicações que precisam de mais de duas interrupções externas e não usam os contadores ou a porta serial podem ser configuradas para operarem como entradas de interrupções externas adicionais. Veja como fazer isso neste artigo baseado em Application Note da Philips Semiconductors.
Descrevemos neste artigo uma forma de configurar o timer/contador e a porta serial para uso como entradas de interrupção. Partimos então do diagrama mostrado na figura 1.
Um dos principais objetivos desta idéia é obter um tempo de resposta mínimo.
Uma outra forma de implementar entradas extras de interrupções é colocar sob controle de software um pino de porta que seja configurado como entrada. Este método é necessário quando os periféricos on-chip estão em uso.
Aplicações onde estar abordagem é recomendada são aquelas nas quais o processador passa mais da metade do tempo executando um "loop de espera", ou uma seqüência de código curta que salta ou ramifica de volta sem realizar nenhuma função.
Neste caso, as instruções que checam o estado da entrada são usadas como uma fonte de interrupção e inseridas nesta seqüência. Isso significa que esta entrada é ignorada quando outras rotinas estão sendo executadas.
Esta entrada deve ser travada externamente (latch) ou ou processador pode esquecer o sinal enquanto executando outras rotinas.
Entradas dedicadas para interrupções que vetoriam o processador para rotinas individuais de serviço (como as duas entradas de interrupções de uso geral) não sofrem influências quando o método descrito é aplicado.
Configuração do Contador/Timer
Os timers 0 e 1 são colocados no modo 2, o qual configura o timer/register como um contador de 8 bits com reload automático. O contador e o registrador com reload são carregados com FF (hexadecimal) o qual é armazenado em TH1 e TL1 ou TH0 e TL0.
Para preparar um dos timer para este tipo de operação, um número de bits de controle tem de ser ajustado. Damos a seguir uma lista desses bits e os seus valores:
No TMOD:
Gate = 0
C/T =1
M1 = 1
M0 = 0
No TCON:
TRi = 1
No IE:
ETi = 1
EA = 0
Onde "ï" e o número do timer que está sendo usado como interrupção externa. O valor TMOD deve ser 66 hexadecimal em ambos os timers que estão sendo usados como fontes de interrupção externa, x6 hex para o timer 0 e 6x hex para o timer 1. A prioridade de interrupção também deve ser ajustada no registrador IP.
Uma fronte descendente no timer correspondente (T0 ou T1) faz com que o contador transborde e gere uma interrupção. O contador será automaticamente recarregado com outro FF no registro Reload, e com isso uma interrupção pode ocorrer novamente tão logo a rotina de serviço de interrupção se complete.
Configuração da Porta Serial
A porta serial pode ser colocada no modo 2 que é uma UART de 9 bits onde a taxa de transmissão em Baud é derivada do oscilador. A interrupção externa é sinalizada através da porta no pino receptor de dados RxD. A recepção é inicializada pela detecção da transição de 1 para 0 em RxD.
O sinal deve ficar em 0 em pelo menos 5/8 do período de um bit para que este nível seja reconhecido. O sinal de entrada deve permanecer baixo por pelo menos o período de um bit na freqüência selecionada do oscilador e não mais do que 9 períodos de bit.
Para preparara a porta serial para uso como interrupção externa, os seguintes bits devem ser configurados:
Na SCON:
SM0 = 1
SM1 = 0
Sm2 = 0
REN = 1
A interrupção da porta serial será então usada como uma interrupção de uso geral. Os conteúdos do buffer de recepção podem ser ignorados e subseqüentemente podem ser sobrescritos durante a interrupção seguinte.
Observe que o tempo de resposta de entrada será menor do que das entradas Counter/Timer. Isso ocorre devido ao fato de que Ri é gerado depois de 8 bits de dados seriais depois da frontes descendente em RxD.
Programa Demonstração:
O programa dado como exemplo a seguir é sugerido pelo Application Note AN420 da Philips Semiconductors.
$MOD51
$ TITLE (Cinco Interrupções Vetoriadas Externamente)
; Tabela de Saltos de Interrupção
ORG OH ; Reset
AJMP Setup
ORG 3H ; Interrupção externa 0
RETI ; não implementada neste demo
ORG 0BH ; interrupção do timer 0
AJMP Tim0
ORG 13H ; Interrupção externa 1
RETI ; não implementada neste demo
ORG 1BH ; interrupção do timer 1
AJMP Tim1
ORG 23H ; interrupção da porta serial
AJMP Serial
; Começa o ajuste do código de setup
#7FH ;inicializa o ponteiro
; Configura ambos os timers
#66H ;coloca ambos os contadores no modo 2.
#0FFH
MOV TL0,A ; carrega FF hex nos dois contadores
MOV TH0,A
MOV TL1,A
MOV TH1,A
SETB ET0 ; habilita a interrupção do timer 0
SETB ET1 ; habilita a interrupção do timer 1
SETB TR0 ; habilita o funcionamento do timer 0
SETB TR1 ; habilita o funcionamento do timer 1
; Configura a porta serial
SETB ES ; habilita a interrupção da porta serial
#90H ; coloca a porta serial no modo 2
SETB EA ; habilita o sistema de interrupções
Wait: NOP ; espera por uma interrupção
JMP Wait
Serial: NOP ; rotina de serviço de interrupção serial
CLR RI ; limpa o aviso de interrupção do receptor
RETI
Tim0: NOP ; rotina de serviço de interrupção do timer 0
RETI
Tim1 NOP ; rotina de serviço do timer 0
RETI
END