| I. Continuação do artigo anterior Na secção anterior, aprendemos sobre a implementação de interrupções externas simples em conjunto. O CC2430 tem 4 temporizadores, que podem ser divididos em 3 categorias: Temporizador1, Temporizador2, Temporizador3/4 (a utilização do 3 e do 4 é a mesma). Uma vez que o autor também está apenas a tocar no CC2430, o projeto que envolve a experiência do temporizador é basicamente zero, por isso não pretendo (e não posso ajudar) uma análise aprofundada do temporizador. Este artigo apenas se refere ao uso da interrupção por estouro de contagem do timer 1 para fazer uma exploração experimental simples, pois sua função de captura de entrada/comparação de saída/PWM é omitida. O temporizador 2 e o temporizador 3/4 também são apresentados apenas brevemente. Esperando que o poder do autor atinja um certo nível de fogo, e depois ficar no auge da experiência de combate Zigbee para melhorar este ensaio. Temporizador 1 O Timer1 é um temporizador de 16 bits com funções de temporizador/contador/modulação de largura de pulso. Ele tem três canais de comparação de captura/saída de entrada programáveis individualmente, cada um dos quais pode ser usado como uma saída PWM ou usado para capturar o tempo de borda do sinal de entrada (para obter mais informações sobre o que é a comparação de captura/saída de entrada e como implementar saídas PWM, os leitores podem consultar o manual chinês do CC2430 por conta própria). O temporizador tem um conceito muito importante: o modo de funcionamento. Os modos de funcionamento incluem: funcionamento livre, módulo e up-down. A seguir, apresentamos a introdução dos três modos do manual chinês do CC2430:
Comparando os três modos, pode-se ver que: o valor de estouro do modo de execução livre é 0xFFFF que não é alterável; enquanto os outros dois modos podem ser controlados com precisão, atribuindo um valor a T1CC0, a fim de controlar com precisão o valor de estouro do temporizador. Esta experiência utiliza esta caraterística para fazer com que o temporizador dispare uma interrupção a cada 1s através do valor específico T1CC0, de modo a controlar com precisão o intervalo de 1s em que o LED pisca. (1) Introdução à experiência No modo módulo do temporizador, o intervalo de intermitência do LED é controlado com precisão para ser de 1s, ou seja: claro 0.5s → escuro 0.5s → claro 0.5s → escuro 0.5s ...... → claro 0,5s → escuro 0,5s (ou seja, o momento de transição do escuro para o claro é de 1s). A inversão de claro/escuro é efectuada por uma interrupção por transbordo. (2) Fluxograma do programa (3) Cálculos relacionados Como mencionado anteriormente, o estado do LED é: brilhante 0.5s → escuro 0.5s → brilhante 0.5s → escuro 0.5s ...... → claro 0,5s → escuro 0,5s, e precisam de ser alcançados com a interrupção de transbordo, pelo que o período de transbordo do temporizador deve ser de 0,5s. Para tal, é necessário calcular o valor de transbordo correspondente (temporariamente definido para N). A frequência de relógio do sistema é selecionada como 32MHz, e a frequência de relógio fornecida ao temporizador é de 16MHz por defeito (ambas são configuradas pelo registo de função especial CLKCON, que pode ser encontrado no manual chinês do CC2430). Para o temporizador 1, ajuste a sua frequência de relógio para 128 divisões. Em resumo, a fórmula pode ser a seguinte:
c
Descobrir N = 62500, o seu hexadecimal é 0xF424, ou seja, é necessário definir T1CC0H = 0xF4, T1CC0L = 0x24 ou seja .
(4) código-fonte experimental e análise/* Descrição da experiência: experiência com o temporizador1, contagem do temporizador excedida, LED1 a piscar */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* inicialização do relógio do sistema-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // ambos ligamenquanto (! (SLEEP & 0x40 )); //oscilador de cristal ligado e estável CLKCON &=~0x47; &
nbsp; //selecionar oscilador de cristal de 32MHz SLEEP |=0x04; }/*Inicialização dos LEDs-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 é uma porta de E/S normal P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 saídas led1 =1; &
nbsp; //Desliga todos os LEDs led2 =1; led3 =1; led4 =1; }/*Inicialização do T1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // liga a interrupção total & nbsp; T1IE=1; // ativa a interrupção T1OVFIM=1; // ativa o estouro de T1
T 1CC0L=0x24; //valor de estouro baixo 8 bits T1CC0H=0xF4; //valor de estouro alto 8 bits &
nbsp; T1CTL =0x0e; //128 divisões; modo modulo (0x0000->T1CC0); início da execução;T1IF=0; &
nbsp; // limpar sinalizador de interrupção }/* função principal-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //espera pela interrupção de overflow }/*Subrotina de serviço de terminal T1-------------------------------------------------------*/#pragma vetor=T1_VECTOR__interrupt
v oid T1_ISR( void ) {EA=0; //desligar interrupção led1 = !
led1; //LEDs invertidosEA=1; /Em interrupção  
; T1CTL &=~0x10; // limpar flag de interrupção } OK, compilar o programa e depuração online, a placa de desenvolvimento no LED1 pisca como esperado, sentir o intervalo de piscar de cerca de 1s. Mas isso não é suficiente para provar o sucesso da experiência, se você pode determinar rigorosamente o intervalo de 1s seria perfeito ~ então eu abri o relógio WIN 7 (clique no lado direito da barra de tarefas tempo pode ser). Enquanto observava o ponteiro dos segundos, olhei para o LED1 a piscar com o canto do olho. O resultado é: em dois minutos, o ritmo dos dois é basicamente idêntico (esta exatidão pode ser tolerada ~). Nesta altura, pode dizer-se que a experiência está basicamente concluída, hehehe~ Terceiro, Temporizador 2 O temporizador 2, também conhecido como temporizador MAC, foi especialmente concebido para suportar o protocolo de seguimento de eventos no IEEE 802.15.4 MAC. O temporizador tem um contador de transbordamento de 8 bits que pode ser utilizado para registar o número de ciclos ocorridos; tem um registo de captura de 16 bits que é utilizado para registar a hora exacta em que um delimitador de início de fotograma é recebido/transmitido ou a hora exacta em que uma transmissão é concluída; e contém também um registo de comparação de saída de 16 bits que é utilizado para gerar vários sinais de comunicação selectivos de comando para o módulo sem fios numa altura específica (início da receção, início da transmissão, etc.). Temporizador 3/4 O temporizador 3/4 é um temporizador de 8 bits com funções de temporizador/contador/PWM. t3/t4 tem dois canais de comparação de saída, cada um dos quais pode ser utilizado como saída PWM. V. Conclusão Nesta secção, aprendemos o método de contagem da interrupção de overflow do temporizador 1 e conseguimos controlar com precisão o intervalo de 1 s entre o piscar do LED. Na próxima secção, apresentaremos a comunicação da porta série do CC2430. |