架构师_程序员_码农网

N Recuperar palavra-passe
Registar

QQ登录

Apenas um passo para começar

Pesquisar
Visualizações:4624|Repostas: 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Interrupção externa

[Copiar link]
L 跳转到指定楼层
o proprietário do edifício
发表于 2014-10-30 23:16:46|只看该作者回帖奖励|ReverseBrowse|Read Mode
I. Passagem da anterior para a seguinte

  Na aula anterior, familiarizámo-nos com o processo básico de desenvolvimento de programas CC2430 no IAR através de uma pequena experiência com o mais simples LED a piscar. A faca foi pelo menos afiada (embora eu não seja muito bom com esta pedra de afiar), e agora é altura de começar a abater insectos :). De seguida, vamos aprender algumas experiências básicas com o CC2430. Cada pequena experiência, dividida em "introdução experimental", "diagrama de fluxo do programa", "código fonte experimental e análise" três partes da descrição.

  Este artigo explica a interrupção externa.

Segundo, a interrupção externa(1) Introdução à experiência

  A interrupção é um microcontrolador em tempo real para lidar com eventos internos ou externos, um mecanismo interno. Quando ocorre algum tipo de evento interno ou externo, o sistema de interrupção do microcontrolador forçará a CPU a pausar o programa que está a ser executado, mas para ir para o processamento do evento de interrupção, o processamento da interrupção é concluído e, em seguida, voltar a ser interrompido pelo programa, continuar a executar.

  As interrupções são divididas em interrupções externas e interrupções internas, o CC2430 contém um total de 18 fontes de interrupção (descrição específica da interrupção e definição do vetor de interrupção, você pode consultar o " Manual Chinês do CC2430 ").

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

  A placa de desenvolvimento foi ligada ao botão S1 e a P0.1, o efeito que esta experiência pretende alcançar é acionar a interrupção de P0.1 ao premir a tecla S1, e depois controlar a luz/apagamento do LED1 na sub-rotina de serviço de interrupção.

(2) Princípio experimental e fluxograma

  O fluxograma da experiência é o seguinte:

2011021811430713.png
c













(
3) Código fonte experimental// ficheiro de cabeçalho#include // subfunção delay#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &



nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &






nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//32M cristal initialisationvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp; //tudo ligadowhile (!
(SLEEP & 0x40 )); //oscilador de cristal ligado e estável CLKCON &=~0x47; &






nbsp; //Selecionar oscilador de cristal de 32MHz SLEEP |=0x04; }//inicialização do LEDvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 é uma porta de E/S normal P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Saída








led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//inicialização da porta de E/S e interrupção externavoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 tem pull-up e pull-down EA =1; //Habilita interrupção total P0IE =1; &



nbsp; //Habilitação de interrupção P0 PICTL |=0X09; //Habilitação de interrupção da porta P0.1, disparo de borda descendente P0IFG &=~0x02







; //P0.1 interrupt flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();








io_init();while ( 1 ); //espera pela interrupção }//sub-rotina de serviço de interrupção#pragma vetor = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ / desliga a interrupção Delay





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

nbsp; if ((P0IFG & 0x02 ) >0 ) //interrupção de chave { P0IFG &=~0x02; &


nbsp; //P0.1 sinalizador de interrupção clear 0 led1 = !led1; } P0IF =0; &

nbsp; //P0 interrupt flag clear 0 EA =1; &
nbsp; // liga a interrupção }

  Primeiro inicialize o Unity Clock: escolha um oscilador de cristal de 32MHz.

  Em seguida, inicialize os LEDs: defina P1 como a porta de E/S de uso geral, defina a direção P1.0 ~ P1.3 como a saída e, em seguida, desligue os 4 LEDs.

  Em seguida, configure os registos SFR relevantes para interrupções externas e ligue a ativação da interrupção em todos os níveis, envolvendo 3 SFRs: EA, IEN1, PICTL (para uma descrição detalhada de cada SFR, consulte o " CC2430 Chinese Manual "):

     EA -- total interrupt enable;

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

     PICTL.3 -- habilita a interrupção da porta P0.1;

     PICTL.0 -- define a borda descendente da entrada da porta P0.1 para causar o disparo da interrupção.

  Em seguida, use while(1) na função principal para aguardar a interrupção.

Dicas CC2430
(1) Sintaxe de Atribuição de Bit Resumo
Muitas vezes, precisamos atribuir um valor (0 ou 1) a um bit em um SFR de byte único para controlar precisamente um dispositivo de hardware.
  

A
lguns SFRs suportam o endereçamento de bits, como TCON, P0, etc., neste momento, a atribuição do bit é muito simples, basta consultar o arquivo de cabeçalho ioCC2430.h na parte SFR Bit Access da definição de bit pode ser:
P0_0 = 0; // P0 o primeiro bit da atribuição do valor de 0
P0_0 = 1; / / / P0 o primeiro bit da atribuição do valor de 1
No entanto, existem SFRs não suportam
o endereçamento de bits, como no caso do
primeiro bit da atribuição do valor do primeiro bit do primeiro bit do primeiro bit do primeiro bit do primeiro bit do primeiro bit do
segundo
bit
.

N
o
entanto, alguns SFRs
não suportam o endereçamento de bits, como é o caso do PICTL nesta experiência, quando se pretende atribuir um valor a um deles, a sintaxe é a seguinte:
PICTL &= ~0x01; //atribuir um valor de 0 ao primeiro bit
PICTL |= 0x01; //atribuir um valor de 1 ao primeiro bit
Pode lembrar-se que &
amp;= ~, |= ~, |= ~, |= ~,
|= P0_0
=
1; //atribuir um valor de 1 ao primeiro bit de P0
. amp;= ~, |= estas duas sintaxes comuns de atribuição de bits.
(2) Resumo da ativação da
interrupção Quando uma interrupção está envolvida num programa, tem de ser activada antes de a interrupção ser desencadeada.
  

S
istema de habilitação de interrupção C51, sua estrutura hierárquica é muito óbvia:
chefe de interrupção: EA é o chefe, responsável pela habilitação de interrupção total:
EA = 1;
capitão de destacamento de
interrupção: a seguir é para cada componente funcional (como P0, temporizador 1, etc.) habilitar o controle, como SFR geralmente bit endereçável, nomeando geralmente contém IE (Interrupt Enable):
P0IE = 1;
os membros
da equipe de interrupção
: destacamento, mas devido à
interrupção
do
programa
,
a interrupção
deve ser habilitada antes de disparar a interrupção.

c
ada membro da equipa de interrupção: equipa mas porque cada componente funcional também contém múltiplas interrupções, pelo que o último nível é para o controlo da ativação de cada interrupção, esse SFR não é geralmente endereçável por bits, geralmente designado por IE (Interrupt Enable) ou IM (Interrupt Mask):
PICTL | = 0x01;
não
é necessário memorizar os SFRs de interrupção Não é necessário memorizar os SFRs de interrupção, desde que se compreenda a hierarquia e se consulte o manual ou os ficheiros de cabeçalho quando os utilizar.
(3) Escrever programas de interrupção
A utilização de interrupções num programa consiste geralmente em duas partes: a escrita da sub-rotina de serviço de interrupção e a abertura da habilitação de interrupção.

A
habilitação de interrupções foi introduzida acima, e segue-se uma breve introdução à preparação da sub-rotina de serviço de interrupções:
Em primeiro lugar, especificar o vetor de interrupções, que pode estar no ficheiro de cabeçalho ioCC2430.h, na parte "Vectores de interrupções" da consulta, a sintaxe é a seguinte:
# pragma vetor = Vectores de interrupções
e, em seguida, a preparação do manipulador de interrupções, a estrutura é a seguinte:
___
interrupt void Function Name (___)


i
nterrupt void function name(void)
{
//on interrupt
//interrupt handling
//interrupt flag clear 0
//off interrupt
}

III. Conclusão

  Este artigo apresenta um método simples de implementação de interrupção externa baseado no CC2430, com a base da interrupção, depois apresentamos outro módulo muito importante - o temporizador. O CC2430 tem um total de quatro temporizadores, que podem ser divididos em três categorias: temporizador 1, temporizador 2, temporizador 3/4 (3 e 4 do uso do mesmo básico). o mesmo).


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




Anterior :[Re-]Jornada Zigbee (II): o primeiro programa CC2430 - experiência de piscar LED
Próximo :[Re-]Viagem ao Zigbee (4): Algumas experiências básicas importantes do CC2430 - interrupções do timer
O código da rede de agricultores, apenas publicado no processo de prática, encontrou dificuldades técnicas, não induzir outros em erro.
Tem de iniciar sessão antes de poder voltar a publicar Iniciar sessão | Registar

E sta versão das regras integrais


DISCLAIMER: Todo o software, materiais de programação ou artigos publicados pelo Code Farmer estão limitados a serem utilizados apenas para fins de aprendizagem e investigação; os conteúdos acima referidos não devem ser utilizados para fins comerciais ou ilegais, caso contrário, todas as consequências serão suportadas pelos próprios utilizadores. A informação deste sítio é proveniente da rede, a disputa de direitos de autor não tem nada a ver com este sítio. Deve remover completamente o conteúdo acima do seu computador no prazo de 24 horas após o descarregamento. Se gosta do programa, por favor apoie o software genuíno, compre o registo e obtenha um melhor serviço genuíno. Se houver alguma infração, contacte-nos por correio eletrónico para tratarmos do assunto.

Correio eletrónico To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-17 14:49

Resposta rápidaVoltar ao topoVoltar à lista