Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 7368|Resposta: 0

Jornada Zigbee (3): Vários experimentos básicos importantes do CC2430 - interrupção externa

[Copiar link]
Publicado em 30/10/2014 23:16:46 | | | |
1. Conectando os níveis superior e inferior

Na aula anterior, nos familiarizamos com o processo básico do desenvolvimento do programa CC2430 pela IAR por meio de um experimento simples de piscas LED. A faca já foi afiada de qualquer forma (embora minha pedra de afiar não esteja boa), e agora vou começar a abater insetos :). A seguir, vamos aprender alguns experimentos básicos do CC2430. Cada pequeno experimento é dividido em três partes: "Introdução ao Experimento", "Diagrama de Fluxo do Programa" e "Código-Fonte e Análise Experimental".

Este artigo explica interrupções externas.

2. Interrupção externa(1) Introdução ao experimento

Interrupções são um mecanismo interno para microcontroladores processarem eventos internos ou externos em tempo real. Quando ocorre um evento interno ou externo, o sistema de interrupções do microcontrolador força a CPU a pausar o programa em execução e, em vez disso, processar o evento de interrupção.

As interrupções são divididas em externas e internas, e o CC2430 contém um total de 18 fontes de interrupção (para descrições específicas de interrupções e definições de vetores de interrupção, consulte "Manual de Chinês CC2430》)。

Agora vamos dar uma olhada no diagrama de circuito dessa placa de desenvolvimento:

O botão S1 foi conectado ao P0.1 na placa de desenvolvimento, e o efeito desse experimento é disparar a interrupção do P0.1 através do botão S1, e então controlar o ligar/desligar do LED1 no subprograma de serviço de interrupção.

(2) Princípio experimental e fluxograma

O fluxograma experimental é o seguinte:


(3) Código-fonte experimental//头文件
#include

//延时子函数
#defineliderou1 P1_0
#defineLed2 P1_1
#defineLed3 P1_2
#defineliderou4 P1_3

vazioAtraso(sem assinaturan)   
{
  sem assinaturatt;
  para(tt =0; TT<N; tt++);
  para(tt =0; TT<N; tt++);
  para(tt =0; TT<N; tt++);
  para(tt =0; TT<N; tt++);
  para(tt =0; TT<N; tt++);
}

//32M晶振初始化
vazioxtal_init(vazio)
{
  SONO &= ~0x04;            //都上电
  enquanto(! (SONO &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Escolha um oscilador de cristal de 32MHz
  SONO |=0x04;
}

//LED灯初始化
vazioled_init(vazio)
{
  P1SEL =0x00;         P1 é a porta normal de E/S
  P1DIR |=0x0F;         Saída P1.0 P1.1 P1.2 P1.3
  
  liderou1 = 0;
  liderou2 = 0;
  liderou3 = 0;
  liderou4 = 0;
}

//io及外部中断初始化
vazioio_init(vazio)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    PICTL |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
vaziomain(vazio)   
{
  xtal_init();
  led_init();  
  io_init();

  enquanto(1);   //等待中断
}

//中断服务子程序
#pragma vetor = P0INT_VECTOR
__interrupt vazioP0_ISR(vazio)
{
  EA =0;                        O portão é interrompido  

  Atraso(10000);  
  Atraso(10000);
  Atraso(10000);
  Atraso(10000);
  Atraso(10000);

  se((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    liderou1 = !liderou1;
  }
  P0SE =0;                       //P0中断标志清0

  EA =1;                        //开中断
}

Primeiro, inicialize o clock do sistema: selecione um oscilador de cristal de 32MHz.

Depois, inicialize os LEDs: defina P1 como porta geral de E/S, defina a direção P1.0 ~ P1.3 como saída e então desligue as 4 luzes de LED.

Em seguida, configure os registradores de SFR relevantes para interrupções externas para permitir interrupções em todos os níveis, envolvendo 3 SFRs:EAIEN1PICTL(Para detalhes de cada SFR, consulte oManual de Chinês CC2430》):

EA- Interrupção total habilitada;

    IEN1.5- Ativação de interrupção P0;

    PICTL.3—— Ativação de interrupção de porta P0.1;

    PICTL.0—— Configure a borda de queda da entrada da porta P0.1 para causar disparo de interrupção.

Depois, use while(1) na função principal e aguarde a interrupção.

Dicas CC2430
(1) Resumo da sintaxe de atribuição de bits
Muitas vezes, precisamos atribuir um bit (0 ou 1) a um único byte de SFR para controlar com precisão o dispositivo de hardware.
Existe a SFREndereçamento de bits de suportePor exemplo, TCON, P0, etc., neste momento, a atribuição de contrapontos é muito simples, basta consultar a definição de bits na seção SFR Bit Access do arquivo de cabeçalho ioCC2430.h:
P0_0 = 0; // atribua 0 ao primeiro dígito de P0
P0_0 = 1; // atribuir um valor de 1 ao primeiro dígito de P0  

Mas alguns SFRs não estão láEndereçamento de bits não é suportado, como neste experimentoPICTL, neste momento, você quer atribuir um valor a um deles, a sintaxe é a seguinte:
PICTL &= ~0x01;   Atribua um valor 0 ao primeiro dígito
PICTL |= 0x01;     Atribua um valor 1 ao primeiro dígito

Você pode lembrar&= ~|=Essas duas sintaxe de atribuição de bits são comumente usadas.
(2) Resumo da habilitação de interrupções
Quando uma interrupção está envolvida no programa, ela deve ser ativada antes que a interrupção seja acionada.
A hierarquia do sistema de habilitação de interrupções C51 é muito óbvia:
Chefe de Interrupção: EAé o chefe, responsávelGeralAtivar Interrupções:
EA = 1;

  Cada líder de esquadrão interrompido: O próximo é para cada umPartes funcionais(como P0, timer 1, etc.), esses SFRs geralmente são endereçáveis por bits, e o nome geralmente contém IE (Interrupt Enable):
P0IE = 1;

  Cada membro da equipe foi interrompido: Esquadrão Mas como cada recurso também contém múltiplas interrupções, o último nível é para esteToda interrupçãoEsse tipo de SFR geralmente é sem bits e não endereçável, e geralmente contém IE (Interrupt Enable) ou IM (Interrupt Mask) no nome:
PICTL |=0x01;

Não precisa fazer o SFR de interrupção automático, basta entender sua hierarquia e então dedicar um tempo para consultar o manual ou o arquivo de cabeçalho.
(3) Interromper a escrita de programas
O uso de interrupções em um programa geralmente inclui duas partes: a escrita do subprograma de serviço de interrupção e a abertura da habilitação de interrupções. A função de interrupção foi apresentada acima, e a seguir está uma breve introdução à escrita do subprograma de serviço de interrupção:
Especifique primeiroVetor de quebra, que pode ser consultado na seção Vetores de Interrupção do arquivo de cabeçalho ioCC2430.h, com a seguinte sintaxe:
#pragma vetor = vetor de interrupção

Depois, escreva o gerenciador de interrupções imediatamente em seguida, que está estruturado da seguinte forma:
__interrupt nome da função void (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Conclusão

Este artigo apresenta o método de implementação de interrupções externas simples baseado no CC2430 e, após a base das interrupções, apresentaremos outro módulo muito importante - temporizadores. O CC2430 tem um total de 4 temporizadores, que podem ser divididos em três categorias: cronômetro 1, cronômetro 2, cronômetro 3/4 (3 e 4 basicamente têm o mesmo uso).


</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);
</n; tt++);




Anterior:Zigbee Journey (2): O primeiro programa CC2430 - experimento com piscas de luz LED
Próximo:Jornada Zigbee (4): Vários experimentos básicos importantes do CC2430 - interrupção do temporizador
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com