Curso de C com microcontroladores MCF51QE128 e MC9S08QE128 – Parte 4

Curso de C com microcontroladores

MATERIAL DESENVOLVIDO PARA TREINAMENTOS DURANTE O LANÇAMENTO DA LINHA FLEXIS DA FREESCALE EM 2009.

1. Diretivas e funções do compilador CodeWarrior

Além de todos os comandos, controles e funções da linguagem C, tem-se ainda uma série de diretivas que são intrínsecas ao Compilador CodeWarrior. Para estudá-las, o melhor caminho são os arquivos de HELP que acompanham o compilador, além dos arquivos USER GUIDE, em formato .pdf, que podem ser acessados diretamente através do menu Help do  compilador. Dentre estes arquivos destacamos alguns que farão parte do CD que compõe o material didático deste treinamento.

Apesar da grande quantidade de informação que estes arquivos fornecem, é interessante tê-los sempre a mão, como uma fonte de consulta, toda vez que se está desenvolvendo um novo programa.

Dentre as diversas diretivas e funções do compilador Code Warrior, vamos listar dois tipos, que serão utilizados ao longo do treinamento: as PREPROCESSOR DIRECTIVES e as NATIVE ASSEMBLER DIRECTIVES. As demais funções deverão ser consultadas pelos estudantes diretamente nos arquivos.

1.1. Preprocessor Directives

1.2. Native Assembler Directives

1.2.1. Pragmas

Pragmas são um modo de passar informações especiais para o compilador e para adicionar extensões específicas de vendedor à biblioteca do microcontrolador, garantindo assim sua portabilidade entre diversos chips.

As diretivas #pragma são definidas pelo ISO/ANSI C e fazem, entre outras coisas, o controle do comportamento do compilador. Por exemplo, ela pode determinar que quantidade de memória é alocada para cada variável ou função, permitir o uso de palavras chaves, fornecer mensagens de alerta, etc.

É necessário o uso do pré processador #pragma para que estas diretivas sejam entendidas
pelo compilador e passem a ser tratadas como tal.

2. Interrupções

Para os dois dispositivos (MC9S08QE128 e MCF51QE128) são considerados diversas fontes de interrupção e reset do sistema, todas gerenciadas pelo bloco SYSTEM CONTROL, como mostra a figura abaixo:

As fontes de reset do sistema são:
• Power-on reset (POR);
• External pin reset (PIN);
• Computer operating properly (COP) timer;
• Illegal opcode detect (ILOP);
• Low-voltage detect (LVD);
• Background debug forced reset;
• Illegal address detect (ILAD) (apenas no core V1)

2. 1. Detalhes sobre o COP Watchdog (Computer Operating Properly)

O registrador onde é feito o controle do COP é o SOPT1 (System Options Register 1), mostrado em detalhes abaixo:

System Options Register 1 (SOPT1)

2.1.1. EXEMPLO 13: como funciona o COP

2.2. NMI – Interrupções não mascaráveis

Todas estas fontes de reset podem ser consideradas interrupções não mascaráveis, já que não podem ser desabilitadas pelos bits de controle que atuam nas demais interrupções. Portanto elas não dependem da vontade do programador, que deve ter mecanismos para conviver com elas ao logo de seu programa.

2.3. Interrupções mascaráveis

As interrupções mascaráveis são geradas por todos os periféricos que possuem capacidade de interrupção. Cada fonte de interrupção mascarável tem um bit que habilita ou desabilita seu funcionamento, sendo que existe ainda um bit de controle geral, chamado de GIE (General Interrupt Enable), presente no status register (SR).

2.3.1. O processamento de uma interrupção

Quando uma interrupção é solicitada por um periférico, é necessário que os bits de habilitação individual e geral (GIE) estejam setados. Isto fará com que o programa sofra um
desvio para uma rotina de interrupção.

2.3.1.1. Entrada em uma interrupção

1) Qualquer instrução que esteja sendo executada é finalizada;

2) O valor dos registradores CCD, ACC, Index, PCH e PCL, que guardam todas as informações importantes para o processamento dos dados naquele momento, são salvos na pilha (pushed onto the stack), exatamente na ordem citada;

3) A interrupção que tiver a maior prioridade é selecionada, caso multiplas interrupções ocorram simultaneamente;

4) Uma requisição de interrupção reseta o flag de interrupção dos periféricos que tem fonte única de interrupção (o conversor AD de 12 bits, por exemplo). Se o periférico tiver múltiplas flags de interrupção (portas P1 e P2, por exemplo), então o reset destas flags deverá acontecer por software;

5) O registrador CCD tem o seu bit I setado, fazendo com que todas as demais interrupções sejam desabilitadas.

6)O conteúdo do vetor de interrupção correspondente a quem fez a solicitação é carregado no PC, que passará a executar o programa a partir do que houver escrito ali.

2.3.1.2. Saída de uma interrupção

Toda interrupção é terminada quando uma instrução RTI (return from an interrupt service routine) é encontrada:

1) Os registradores que foram salvos da pilha (CCD, ACC, Index, PCH e PCL) são restaurados com todos os valores ajustados previamente;

2) Como o valor anterior para o bit I do registrador CCD deveria ser zero para que uma interrupção tenha sido aceita, este bit retorna ao seu valor zero, aceitando assim processar outra interrupção de menor prioridade que esteja na fila.

O aninhamento de interrupções é habilitado quando, durante o tratamento de uma interrupção, o usuário seta o bit I no registrador CCD. Neste caso, havendo uma nova interrupção os procedimentos mostrados ocorrerão novamente, seguindo a ordem de prioridades de atendimento de interrupções.

2.4. Múltiplas Interrupções

2.5. O controle de interrupções no HCS08 (8 bits) e no ColdFire (32 bits)

Para controlar e gerenciar o funcionamento de interrupções tanto no HCS08 quanto no ColdFire, é necessário atuar em diversos registradores. Para este nosso estudo inicial, vamos nos ater a apenas três destes registradores.

No registrador IRQSC (Interrupt Pin Request Status and Control Register), cujos bits  podem ser vistos abaixo:

Também é necessário atuar no SRS (System Reset Status Register), cujos bits podem ser vistos abaixo:

E por fim, outro registrador essencial a ser ajustado é o SPOT1 (System Options Register 1), já visto durante o funcionamento do COP e mostrado anteriormente.

2.6. Os vetores de interrupção

Os vetores de interrupção não são idênticos para os chips com núcleo S08 e ColdFire V1. Isto se deve ao fato de estarem em áreas de memória diferentes em cada um dos núcleos. Assim, a portabilidade de código de um núcleo para outro deve levar em consideração que os endereços de interrupção de um determinado periférico são diferentes para chips diferentes. Por exemplo:

► No MC9S08QE128, a interrupção por RTC (Vrtc) é alocada no endereço 0xFFCE e seu vetor é o de número 24.

► Já no MCF51QE128, o mesmo periférico (RTC) tem seu vetor de interrupção (Vrtc) alocado no endereço 0x(00)00_0158 e seu vetor é o de número 86.

► Uma simples equação permite a conversão de vetores entre estes dois núcleos:

Número do vetor no ColdFire V1 = Número do vetor no S08 + 62

► Um dica importante para a portabilidade de código é designer os vetores de interrupção através de uma declaração de interrupção do tipo VectorNumber_Vname no arquivo de cabeçalho (header file) do CodeWarrior ao invés de utilizar os números fixos do vetor.

2.6.2. EXEMPLO 14: Funcionamento das interrupções no HSC08

2.6.3. Vetores de interrupção no MCF51QE128

2.6.4. EXEMPLO 15: Funcionamento das interrupções no ColdFire

Converta o EXEMPLO 14, mostrado anteriormente, de modo que ele faça exatamente a mesma tarefa, mas funcionando com o ColdFire V1.

3. Keyboard Interrupts (KBI)

O Keyboard Interrupt é um hardware existente nos dois chips (S08 – 8 bits e ColdFire V1 – 32 bits), tendo as seguintes características:

• Permite gerar interrupções a partir de até 8 pinos externos do MCU.

• Cada pino pode ser programado para interromper em borda de subida ou descida.

• Habilitação das interrupções por softwares.

• As interrupções podem retirar o MCU de qualquer low Power mode em que se encontre.

O hardware em cada um dos pinos que aceita a interrupção é mostrado na figura abaixo:

3.1. Procedimento para inicializar o KBI

Para conseguir utilizar o KBI é necessário fazer um procedimento de inicialização, conforme a descrição abaixo, a fim de evitar que uma falsa interrupção seja gerada antes que toda a configuração esteja realiza:

• Mascare as interrupções, fazendo com que os bits KBIxSC, no registrador [KBIE], sejam zerados;

• Selecione a polaridade dos pinos ajustando corretamente os bits KBIxES no regitrador [KBEDGn];

• Utilize o dispositivo interno de pull up, configurando o dispositivo pull up correspondente habilitando os bits KBIxPE no registrador [KBIPEn];

• Habilite os pinos de interrupção correspondentes através do ajuste correto nos bits KBIxPE no registrador [KBIPEn];

• Escreva zero nos bits KBIxSC do registrador KBACK a fim de limpar qualquer falsa interrupção existente;

• Finalmente, sete os bits KBIsSC no registrador [KBIE] a fim de habilitar as interrupções

3.2. Pinos disponíveis para KBI

3.3. Registradores de controle do KBI

3.3.1. KBI Interrupt Status and Control Register (KBIxSC)

As configurações possíveis de serem feitas neste registrador permitem ajustar o funcionamento do KBI e são mostradas na tabela a seguir:

3.3.2. KBI Interrupt Pin Select Register (KBIxPE)

Permite designar qual será o pino (ou os pinos) que irá gerar a interrupção. Seu controle é feito do seguinte modo:

Bit = 0: O pino está desabilitado para gerar interrupções.

Bit = 1: O pino está habilitado para gerar interrupções.

3.3.3. KBI Interrupt Edge Select Register (KBIxES)

Permite determinas se a interrupção acontecerá em uma borda de subida ou de descida. Os ajustes possíveis são:

Bit = 0: Um dispositivo de pull-up é conectado ao pino fazendo a detecção de uma borda de descida para gerar interrupções.

Bit = 1: Um dispositivo de pull-down é conectado ao pino fazendo a detecção de uma borda de subida para gerar interrupções.

3.3.4.EXEMPLO 16: Funcionamento do KBI

Outros artigos da série

<< Curso de C com microcontroladores MCF51QE128 e MC9S08QE128 - Parte 3Curso de C com microcontroladores MCF51QE128 e MC9S08QE128 - Parte 5 >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Curso de C com microcontroladores MCF51QE128 e MC9S08QE128 - Parte 4
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 

Soluções inteligentes para acionamento de MOSFETs/IGBTs com família STDRIVE

Data: 08/10 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link