| I. Continuación del artículo anterior En la sección anterior, aprendimos juntos sobre la implementación de interrupciones externas simples. Después de tener experiencia práctica con las interrupciones, vamos a discutir las interrupciones del temporizador en esta sección.CC2430 tiene 4 temporizadores, que se pueden dividir en 3 categorías: Timer1, Timer2, Timer3/4 (el uso de 3 y 4 es el mismo). Dado que el autor es también acaba de tocar el CC2430, el proyecto que implica la experiencia temporizador es básicamente cero, por lo que no tiene intención de (y no puede ayudar) el análisis en profundidad del temporizador. Este artículo sólo sobre el temporizador 1 cuenta el uso de interrupción por desbordamiento para hacer una simple exploración experimental, para su captura de entrada / salida de comparación / función PWM se omite. Timer 2 y Timer 3/4 también se introducen sólo brevemente. A la espera de que el poder del autor para alcanzar un cierto nivel de fuego, y luego de pie en la altura de la experiencia de combate Zigbee para mejorar este ensayo. Temporizador 1 Timer1 es un temporizador de 16 bits con funciones de temporizador/contador/modulación de ancho de pulso. Dispone de tres canales de comparación de captura/salida de entrada programables individualmente, cada uno de los cuales puede utilizarse como salida PWM o utilizarse para capturar el tiempo de flanco de la señal de entrada (para más información sobre qué es la comparación de captura/salida de entrada y cómo implementar salidas PWM, los lectores pueden consultar por su cuenta el manual en chino del CC2430). El temporizador tiene un concepto muy importante: el modo de funcionamiento. Los modos de operación incluyen: free-running, modulo y up-down. La siguiente es la introducción de los tres modos del manual chino del CC2430:
Comparando los tres modos, se puede ver que: el valor de desbordamiento del modo de ejecución libre es 0xFFFF que no se puede cambiar; mientras que los otros dos modos se pueden controlar con precisión mediante la asignación de un valor a T1CC0 con el fin de controlar con precisión el valor de desbordamiento del temporizador. Este experimento hace uso de esta característica para hacer que el temporizador dispare una interrupción cada 1s a través del valor específico T1CC0, con el fin de controlar con precisión el intervalo de parpadeo del LED de 1s. (1) Introducción al experimento En el modo módulo del temporizador, el intervalo de parpadeo del LED se controla con precisión para que sea de 1s, es decir: claro 0,5s → oscuro 0,5s → claro 0,5s → oscuro 0,5s ...... → claro 0,5s → oscuro 0,5s (es decir, el momento de transición de oscuro a claro es de 1s). La inversión de claro/oscuro se realiza mediante interrupción por desbordamiento. (2) Diagrama de flujo del programa (3) Cálculos relacionados Como se mencionó anteriormente, el estado del LED es: brillante 0,5s → oscuro 0,5s → brillante 0,5s → oscuro 0,5s ...... → claro 0,5s → oscuro 0,5s, y necesitan alcanzarse con la interrupción por desbordamiento, por lo que se requiere que el periodo de desbordamiento del temporizador sea de 0,5s. Para ello, es necesario calcular el valor de desbordamiento correspondiente (fijado temporalmente en N). La frecuencia de reloj del sistema se selecciona como 32MHz, y la frecuencia de reloj proporcionada al temporizador es de 16MHz por defecto (ambas se configuran mediante el registro de función especial CLKCON, que puede encontrarse en el manual en chino del CC2430). Para el temporizador 1, configure su frecuencia de reloj a 128 divisiones. En resumen, la fórmula puede ser la siguiente:
c
Averiguar N = 62500, su hexadecimal es 0xF424, es decir, es necesario establecer T1CC0H = 0xF4, T1CC0L = 0x24 es decir .
(4) código fuente experimental y análisis/* Descripción del experimento: experimento Timer1, desbordamiento de la cuenta del temporizador, parpadeo del LED1 */ #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; /* inicialización del reloj del sistema-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& ¡nbsp; // ambos se enciendenwhile (! (SLEEP & 0x40 )); //oscilador de cristal encendido y estable CLKCON &=~0x47; &
nbsp; //seleccionar oscilador de cristal 32MHz SLEEP |=0x04; }/*Inicialización LED-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 es un puerto de E/S normal P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 salidas led1 =1; &
nbsp; //Apaga todos los LEDs led2 =1; led3 =1; led4 =1; }/*Inicialización de T1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // activar interrupción total & nbsp; T1IE=1; // activa interrupción T1OVFIM=1; // activa desbordamiento T1
i nterrupciónT1CC0L=0x24; //valor de desbordamiento bajo 8 bits T1CC0H=0xF4; //valor de desbordamiento alto 8 bits &
nbsp; T1CTL =0x0e; //128 divisiones; modo modulo (0x0000->T1CC0); empieza a funcionar;T1IF=0; &
nbsp; // borrar bandera de interrupción }/* función principal-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //esperar interrupción por desbordamiento }/*Subrutina de servicio del terminal T1-------------------------------------------------------*/#pragma vector=T1_VECTOR __interrupt
¡ void T1_ISR( void ) {EA=0; /desactivar interrupción led1 = !
led1; //LEDs invertidosEA=1; //En interrupción  
; T1CTL &=~0x10; //despejar bandera de interrupción } OK, compilar el programa y la depuración en línea, la placa de desarrollo en el LED1 parpadea como se esperaba, se siente el intervalo de parpadeo de aproximadamente 1s. Pero esto no es suficiente para demostrar el éxito del experimento, si se puede determinar rigurosamente el intervalo de 1s sería perfecto ~ así que abrí el reloj WIN 7 (haga clic en el lado derecho de la barra de tareas de tiempo puede ser). Mientras observaba el segundero, eché un vistazo al LED1 parpadeante con el rabillo del ojo. El resultado es: en dos minutos, el ritmo de los dos son básicamente idénticos (esta precisión se puede tolerar ~). En este punto, se puede decir que el experimento está básicamente terminado, jejeje~ Tercero, Temporizador 2 Timer2, también conocido como el temporizador MAC, está especialmente diseñado para soportar el protocolo de seguimiento de eventos en IEEE 802.15.4 MAC. El temporizador tiene un contador de desbordamiento de 8 bits que se puede utilizar para registrar el número de ciclos que se han producido; tiene un registro de captura de 16 bits que se utiliza para registrar el momento exacto en que se recibe/transmite un delimitador de inicio de trama o el momento exacto en que se completa una transmisión; y también contiene un registro de comparación de salida de 16 bits que se utiliza para generar varias señales de comunicación selectivas de comandos al módulo inalámbrico en un momento específico (empezar a recibir, empezar a transmitir, etc.). Temporizador 3/4 El temporizador 3/4 es un temporizador de 8 bits con funciones de temporizador/contador/PWM. t3/t4 tiene dos canales de comparación de salida, cada uno de los cuales puede utilizarse como salida PWM. V. Conclusión En esta sección, hemos aprendido el método de conteo de la interrupción por desbordamiento del temporizador 1, y hemos conseguido el control preciso del intervalo de parpadeo del LED de 1 s. Nos limitaremos a repasar los otros temporizadores, y volveremos a añadirlos más adelante. En la siguiente sección, introduciremos acerca de la comunicación del puerto serie del CC2430. |