Para cada tipo particular de interrupção foi desenvolvida uma rotina, tendo em conta os requisitos de cada uma das fontes de interrupção.
As fontes de interrupção utilizadas destinam-se a: • Assinalar falhas de energia;
• Assinalar a recepção de mensagens CAN;
• Permitir a calibração do sistema SLIO CAN e acções de controlo temporizadas.
De seguida será explicada cada uma das rotinas de serviço à interrupção utilizadas pela ordem de prioridade que foi estabelecida, através de programação dos registos próprios do microcontrolador durante a iniciação, conforme descrito no Anexo 6.
6.2.2.1 R
OTINA DE SERVIÇO À INTERRUPÇÃO NÃO MASCARÁVEL(NMI)
Para precaver situações em que haja falha de energia no sistema, foi implementado um processo que permite salvaguardar o estado das variáveis quando a falha ocorre e desta forma retomar o funcionamento, quando a anomalia for solucionada, em condições idênticas às verificadas na altura em que ocorreu a falha. Esta rotina é responsável pelo atendimento de interrupções provenientes do circuito de monitorização de tensão de alimentação explicado no capítulo 5, secção 5.1.1.3, e que tem por base o circuito integrado DS1231 [41].
A sequência de instruções executadas sempre que esta rotina é solicitada, está representada no fluxograma da Figura 6.26 e consiste nos seguintes pontos:
1. Sempre que ocorra esta interrupção é activada uma flag, que a identifica no decorrer do programa, permitindo que sejam realizadas tarefas com ela relacionadas;
2. É guardada em memória a hora, a flag anteriormente referida e o ponteiro de dados para que, após a reposição da alimentação, o sistema inicie com os dados que possuía antes da interrupção ter sido detectada;
3. O microcontrolador passa ao modo livre, IDLE, do qual sai quando for feito o reset do mesmo por hardware [41], conforme explicado no capítulo 5.
115
Figura 6.26 – Fluxograma para a rotina de serviço à interrupção NMI.
6.2.2.2 R
OTINA DE SERVIÇO À INTERRUPÇÃOCAN
Esta rotina é responsável pelo atendimento a interrupções provenientes do controlador CAN.
Assim como a anterior, esta interrupção é de extrema importância uma vez que é ela que assinala a existência de novas mensagens CAN destinadas ao nó onde é gerada. A sequência de operações que esta rotina executa é representada no fluxograma da Figura 6.27 e é a seguinte:
1. Sempre que ocorre uma interrupção destas, são inibidos os outros tipos de interrupção e é verificado o conteúdo do registo interno de interrupções, para que assim seja possível actuar sobre a linha de interrupção.
2. É verificado se a interrupção é devida a uma recepção de dados e se o bloco de dados em questão é o primeiro.
• Se o bloco de dados for o primeiro, activa-se uma flag que identifica a ocorrência de uma interrupção CAN, e o registo do buffer de recepção é consultado para se verificar quantos bytes compõem a mensagem. Posteriormente, é transferida esta informação do buffer de recepção para um buffer de dados previamente reservado na memória do microcontrolador. Por fim, o buffer de recepção é libertado para que possa ser utilizado na recepção da próxima mensagem.
• Se o bloco de dados não for o primeiro, isto é, se for uma mensagem segmentada, é consultado o registo do buffer de recepção para se
Início
Flag_INT0 Å 1
Guardar Flag_INT0 Guardar Ponteiro de Dados
Guardar Hora
116
verificar quantos bytes da mensagem ainda faltam receber. Posteriormente é transferida esta informação do buffer de recepção para um buffer de dados previamente reservado na memória do microcontrolador, decrementando uma variável global que indica o número de blocos ainda por receber.
3. São habilitados os outros tipos de interrupção.
Figura 6.27 – Fluxograma da rotina de serviço a uma interrupção CAN.
6.2.2.3 R
OTINA DE SERVIÇO À INTERRUPÇÃO DO RELÓGIO DE TEMPOREAL
(RTC)
Esta rotina é de extrema importância uma vez que é recorrendo a ela que se implementa o processo de calibração dos nós SLIO CAN pelos quais o nó Host é responsável. Assim, esta rotina é chamada a ser executada em intervalos fixos de tempo (62,5 ms) que são assinalados por interrupções geradas pelo RTC DS1287, os quais são programados durante a iniciação do microcontrolador de acordo com os requisitos de
Início
Desabilitar todas as fontes de interrupção Ler registo de interrupções para identificar a interrupção
Flag_CAN Å 1
Transferir dados do buffer de recepção para o buffer CAN na memória do microcontrolador;
Libertar o buffer de recepção CAN; Habilitar todas as fontes de interrupção.
Sim FIM Mensagem nova ? Não Verificar o estado do buffer de recepção
117
calibração dos nós SLIO CAN.
Esta rotina possibilita, também, o desencadear de tarefas de actuação de natureza temporal, recorrendo a contadores de interrupções conseguindo-se assim tempos de actuação múltiplos do período de interrupção gerado pelo RTC.
A sequência de instruções executadas, sempre que esta rotina é solicitada, está representada no fluxograma da Figura 6.28 e consiste nos seguintes pontos:
1. Sempre que ocorra esta interrupção são desabilitados os outros tipos de interrupção e é activada uma flag, que a identificará no decorrer do programa, permitindo que sejam realizadas tarefas com ela relacionadas; 2. É incrementado um contador de interrupções para o caso de necessidade de
actuações de natureza temporal, permitindo assim tempos múltiplos do período com que a RTC gera uma interrupção; O reset deste contador é efectuado durante o decorrer do programa principal residente no Host;
3. É enviada uma mensagem de calibração para a rede CAN por forma a manter os nós SLIO CAN activos na rede e consequentemente prontos a comunicar via barramento CAN. Este requisito foi abordado anteriormente na secção 6.1.4, dedicada ao processo de calibração dos nós SLIO CAN;
4. Por fim são habilitados todos os tipos de interrupção prosseguindo o funcionamento normal do programa.
Figura 6.28 – Fluxograma para a rotina de serviço à interrupção RTC.
Início
Desabilitar interrupções
Flag_RTC Å 1
Incrementar contador de interrupções Ressincronizar os nós SLIO CAN
FIM
118