Site icon Embarcados – Sua fonte de informações sobre Sistemas Embarcados

Interrupções e Subrotinas no Intel 8051

Instruções do Intel 8051 Mapa de Memória no Intel 8051 8051 Arquitetura Intel 8051

Este artigo é continuação da série Intel 8051 e tem como principal objetivo apresentar o sistema de interrupção do 8051. Além disso, a função do registrador SP será destacada no contexto de interrupções e chamada de subrotinas no Intel 8051. Os exemplos de interrupção serão apresentados nos artigos referentes a cada periférico.

Interrupções

Vimos que na condição de reset o sistema é iniciado a partir do endereço zero da memória de programa. Isso ocorre devido à localização dos vetores de interrupção. Especificamente, os vetores de interrupção ocupam posições fixas na memória de programa, e o reset é considerado uma “interrupção” estabelecida no endereço zero. Isso é ilustrado na Figura 1.

Figura 1: Localização dos vetores de interrupção [1].

Alguns periféricos podem gerar interrupções e para isso alguns endereços são reservados:

Se a interrupção não é utilizada, seu endereço é considerado de propósito geral. Além disso, os vetores são espaçados em 8 bytes. Portanto, se a rotina de interrupção é curta, essa região de 8 bytes pode ser utilizada, já as rotinas longas podem utilizar instruções de jump.

Registradores

As interrupções são controladas pelos registradores Interrupt Enable (IE) e Interrupt Priority (IP). O registrador IE, ilustrado na Figura 2, pode ser endereçado bit a bit e está localizado no endereço A8H. Esse registrador tem como função controlar as interrupções que o sistema deve atender.

Figura 2: Registrador IE [1].

O registrador IP, ilustrado na Figura 3, também pode ser endereçado bit a bit e está localizado no endereço B8H. Esse registrador tem como função determinar a prioridade de uma fonte de interrupção, podendo ser alta ou baixa.

Figura 3: Registrador IP [1].

Para utilizar uma interrupção deve-se:

  1. Escrever a rotina de interrupção com início no endereço do vetor correspondente. Isso é feito a partir da diretiva ORG <endereço da interrupção>;
  2. O bit correspondente a interrupção desejada deve ser habilitado no registrador IE;
  3. O bit EA (Enable All) deve ser ativado no registrador IE.

Além desses dois registradores, é importante citar a função do Program Status Word (PSW). Esse registrador, ilustrado na Figura 4, contém as flags de estado da CPU, pode ser endereçado bit a bit e está localizado no endereço D0H.

Figura 4: Registrador PSW [1].

Cabe ressaltar que esse registrador determina qual banco de registradores está sendo utilizado. Isso implica na referência dos nomes dos registradores R0~R7.

Figura 5: Banco de Registradores [1].

O Sistema de Interrupção

A Figura 6 mostra o sistema de interrupção. Nessa figura é possível observar a função dos registradores Interrupt Enable (IE) e Interrupt Priority (IP). Mas o que acontece quando interrupções simultâneas são capturadas? Bom, nesse caso é necessário avaliar a prioridade da interrupção, e no caso de interrupções com a mesma prioridade a seguinte ordem de avaliação é estabelecida: primeiro IE0, em seguida TF0, IE1, TF1, RI e por ultimo, TI.

Figura 6: Sistema de Interrupções [1].

Quando a interrupção é disparada, uma operação LCALL é realizada com destino ao vetor de interrupção correspondente. Durante a execução de LCALL, somente o contador de programas (PC) é armazenado na pilha. Portanto, os registradores PSW, Acumulado e B não são gravados na pilha durante a chamada de uma rotina de interrupção. Diante disso o ciclo de instrução apresentado no ultimo artigo pode ser modificado conforme a Figura 7.

Figura 7: Ciclo de instrução [2].

Cabe ressaltar que a instrução atual é finalizada antes da interrupção ser atendida.

O Ponteiro de Pilha (Stack Pointer)

O Stack Pointer é um registrador que possui uma função muito importante na CPU. Esse registrador, que é inicializado com o valor 07H durante a operação de Reset, tem como função gerenciar a chamada e o retorno de eventos de interrupção e chamada de subrotinas. O valor 07H indica que o registrador aponta para o endereço 07H, isto é, para o registrador R0 do segundo banco de registradores. Nesse sentido, o endereço armazenado em SP é chamado de topo da pilha. Para isso acontecer, duas instruções operam diretamente sobre esse registrador, são elas: PUSH e POP: 

Sabendo dessas duas operações, e tendo em vista um evento de interrupção, como será que a CPU gerencia o fluxo de execução do programa no momento de uma interrupção? Foi dito que durante a interrupção o programa é desviado por meio LCALL para o endereço do vetor de interrupção. Nesse momento, o contador de programa, que indica a próxima instrução que será buscada na memória, é armazenado na pilha. A Figura 8 ilustra essa transferência entre o programa em execução e a rotina de interrupção.

Figura 8: Fluxo de execução durante uma interrupção [2].

Quando a instrução RETI é executada, o contador de programa é restabelecido com os valores que estavam armazenados na pilha, isto é, o endereço da próxima instrução que seria executada antes de ocorrer a interrupção! Esse mesmo procedimento ocorre com as outras instruções de chamada de subrotina, contudo a instrução de retorno deve ser RET, pois RETI é restrito ao contexto das interrupções. É importante lembrar que a pilha não fica limitada a essas funções, e pode ser utilizada normalmente pelo programador.

Referências

Outros artigos da série

<< Conjunto de Instruções do Intel 8051Entradas e Saídas Digitais do Intel 8051 >>