架构师_程序员_码农网

N Recuperar contraseña
Registrarse

QQ登录

Sólo un paso para empezar

Buscar en
架构师_程序员_码农网 "架构师 ' 管理专区&Management Area ' Quejas y Sugerencias ' 回收站 ' 【转】Zigbee之旅(三):几个重要的CC2430基础实验- . - ...
Ver:4624|Repuesta: 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Interrupción externa

[Copiar enlace]
A 跳转到指定楼层
el propietario del edificio
发表于 2014-10-30 23:16:46|只看该作者回帖奖励|Navegar hacia atrás |Modo de lectura
I. Pasar de lo anterior a lo siguiente

  En la clase anterior nos familiarizamos con el proceso básico de desarrollo de programas CC2430 en IAR a través de un pequeño experimento con el más simple parpadeo de un LED. El cuchillo al menos se ha afilado (aunque no se me da muy bien esto de afilar con piedra), y ahora toca empezar a descuartizar bichos :). A continuación, vamos a aprender algunos experimentos básicos con el CC2430. Cada pequeño experimento, dividido en "introducción experimental", "diagrama de flujo del programa", "código fuente experimental y análisis" tres partes de la descripción.

  Este artículo explica la interrupción externa.

Ensegundo lugar, la interrupción externa(1) Introducción al experimento

  Interrupción es un microcontrolador en tiempo real para hacer frente a eventos internos o externos, un mecanismo interno. Cuando se produce algún tipo de evento interno o externo, el sistema de interrupción del microcontrolador obligará a la CPU para hacer una pausa en el programa que se está ejecutando, pero para ir al procesamiento de eventos de interrupción, procesamiento de interrupción se ha completado, y luego volver a ser interrumpido por el programa, continuar la ejecución.

  Las interrupciones se dividen en interrupciones externas e interrupciones internas, CC2430 contiene un total de 18 fuentes de interrupción (descripción específica de la interrupción y la definición del vector de interrupción, puede consultar el " CC2430 Manual Chino ").

  Ahora echemos un vistazo al diagrama de circuito de esta placa de desarrollo:

  La placa de desarrollo se ha conectado a la tecla S1 y P0.1, el efecto que quiere conseguir este experimento es disparar la interrupción de P0.1 pulsando la tecla S1, y luego controlar la luz/apagado del LED1 en la subrutina de servicio de interrupción.

(2) Principio experimental y diagrama de flujo

  El diagrama de flujo del experimento es el siguiente:

2011021811430713.png
c













(
3) Código fuente experimental// archivo de cabecera#include // subfunción 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++); }//inicialización del cristal 32Mvoid xtal_init( void ) { SLEEP &=~0x04; &
¡nbsp; //encendido totalwhile (!
(SLEEP & 0x40 )); //oscilador de cristal encendido y estable CLKCON &=~0x47; &






nbsp; //Seleccionar oscilador de cristal 32MHz SLEEP |=0x04; }//inicialización LEDvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 es un puerto de E/S normal P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Salida








led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//inicialización de E/S e interrupción externavoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 tiene pull-up y pull-down EA =1; //Habilitación total de interrupción P0IE =1; &



nbsp; //Habilitación de interrupción P0 PICTL |=0X09; //Habilitación de interrupción de puerto P0.1, disparo por flanco descendente P0IFG &=~0x02







; //P0.1 interrupt flag clear 0 };//función principalvoid main( void ) { xtal_init(); led_init();








io_init();while ( 1 ); //espera interrupción }//subrutina de servicio de interrupción#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ /desactivar interrupción Delay





( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); &

nbsp; if ((P0IFG & 0x02 ) >0 ) //interrupción de tecla { P0IFG &=~0x02; &


nbsp; //P0.1 interrupt flag clear 0 led1 = !led1; } P0IF =0; &

nbsp; /Bandera de interrupción P0 limpia 0 EA =1; &
nbsp; // activa la interrupción }

  Primero inicialice el Reloj Unitario: elija un oscilador de cristal de 32MHz.

  Después inicialice los LEDs: configure P1 como puerto de E/S de propósito general, configure la dirección P1.0 ~ P1.3 como salida, y apague los 4 LEDs.

  Después configura los registros SFR relevantes para interrupciones externas y activa la habilitación de interrupción en todos los niveles, involucrando 3 SFRs: EA, IEN1, PICTL (para una descripción detallada de cada SFR, por favor consulta el " CC2430 Chinese Manual "):

     EA -- habilitación total de interrupción;

     IEN1.5 -- Habilitación de interrupción P0;

     PICTL.3 -- habilitación de interrupción de puerto P0.1;

     PICTL.0 -- establece el flanco descendente de la entrada del puerto P0.1 para provocar el disparo de la interrupción.

  A continuación, utilice while(1) en la función principal para esperar la interrupción.

CC2430 Tips
(1) Bit Assignment Syntax Resumen
Muy a menudo, necesitamos asignar un valor (0 o 1) a un bit en un SFR de un byte para controlar con precisión un dispositivo hardware.
  

A
lgunos
SFRs
soportan
el direccionamiento de bits
, como TCON, P0, etc., en este momento, la asignación del bit es muy simple, basta con consultar el archivo de cabecera ioCC2430.h en el SFR Bit Access parte de la definición del bit puede ser:
P0_0
= 0; // P0
el primer bit de
la
asignación
del
valor
de 0
P0_0 = 1; / / / P0 el primer bit de la asignación del valor de
1
Sin embargo, hay SFRs no
soportan el direccionamiento de bits, como en el caso
del
primer bit de la asignación del valor del primer bit del primer bit del primer bit del primer bit del
segundo
bit
.
Sin embargo, algunos SFRs
no soportan direccionamiento de bits, como es el caso del PICTL en este experimento, cuando quieres asignar un valor a uno de ellos, la sintaxis es la siguiente:
PICTL &= ~0x01; //asignar un valor de 0 al primer bit
PICTL |= 0x01; //asignar un valor de 1 al primer
b
it
Puedes recordar que &
amp;= ~, |= ~, |= ~, |=
P0_0
=
1; //asignar un valor de 1 al primer bit de P0
. amp;= ~, |= estas dos sintaxis comunes de asignación de bits.
(2) Resumen de Habilitación de Interrupciones
Cuando una interrupción está involucrada en un programa, debe ser habilitada antes de que la interrupción se active.
  

C
51 sistema de habilitación de interrupción, su estructura jerárquica es muy obvia:
interrupción jefe: EA es el jefe, responsable de la interrupción total habilitar:
EA = 1;
interrupción capitán de desprendimiento: siguiente es para cada componente funcional (como P0, temporizador 1, etc) habilitar el control, tales SFR generalmente bit direccionable, nombrando generalmente contiene IE (Interrupt Enable):
P0IE = 1; la
interrupción
miembros del
equipo
: desprendimiento, pero debido a la
interrupcióndel programa
,
la interrupción
debe estar habilitado antes de desencadenar la interrupción.

c
ada interrupción miembros del equipo: equipo, pero debido a que cada componente funcional también contiene múltiples interrupciones, por lo que el último nivel es para cada control de habilitación de interrupción, tal SFR es generalmente no bit direccionable, nombrado generalmente contienen IE (Interrupt Enable) o IM (Interrupt Mask):
PICTL | = 0x01;
no es necesario memorizar la interrupción SFRs
.
No es necesario memorizar los SFRs de interrupción, siempre y cuando entiendas la jerarquía, y luego consultes el manual o los archivos de cabecera cuando los utilices.
(3) Escritura de Programas de Interrupción
El uso de interrupciones en un programa generalmente consta de dos partes: la escritura de la subrutina de servicio de interrupción y la apertura de la habilitación de interrupción.

L
a habilitación de interrupción se ha introducido anteriormente, la siguiente es una breve introducción a la preparación de la subrutina de servicio de interrupción:
En primer lugar, especifique el vector de interrupción, puede estar en el archivo de cabecera ioCC2430.h en la parte de Vectores de Interrupción de la consulta, la sintaxis es la siguiente:
# pragma vector = Vectores de Interrupción
y, a continuación, seguido por la preparación del manejador de interrupción, la estructura es la siguiente:
___ interrupt void Nombre de la función (___)


i
nterrupt void nombre de función(void)
{
//on interrupt
//manejo de interrupción
//interrupt flag clear 0
//off interrupt
}

III. Conclusión

  Este artículo presenta un método simple de implementación de interrupción externa basada en CC2430, con la base de la interrupción, a continuación, introducimos otro módulo muy importante - temporizador. CC2430 tiene un total de cuatro temporizadores, que se pueden dividir en tres categorías: temporizador 1, temporizador 2, temporizador 3/4 (3 y 4 de la utilización de la misma base). el mismo).


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




Previous :[Re-]Zigbee Journey (II): el primer programa CC2430 - experimento de parpadeo de LEDs.
Next :[Re-]Zigbee Journey (4): Algunos experimentos básicos importantes CC2430 - interrupciones del temporizador
La red de agricultores de código, sólo se publica en el proceso de la práctica, se encontró con dificultades técnicas, no engañar a los demás.
Tienes que iniciar sesión antes de poder volver a publicar Iniciar sesión | Registrarse

E sta versión de las normas integrales


DESCARGO DE RESPONSABILIDAD: Todo el software, materiales de programación o artículos publicados por Code Farmer se limitan a ser utilizados únicamente para fines de aprendizaje e investigación; los contenidos anteriores no podrán ser utilizados con fines comerciales o ilegales, de lo contrario, todas las consecuencias serán asumidas por los propios usuarios. Esta información del sitio de la red, disputa de derechos de autor no tiene nada que ver con este sitio. Debe eliminar completamente el contenido anterior de su ordenador en las 24 horas siguientes a la descarga. Si le gusta el programa, por favor apoye el software genuino, compre el registro y obtenga un mejor servicio genuino. Si se produce alguna infracción, póngase en contacto con nosotros por correo electrónico para solucionarlo.

Correo To:help@itsvse.com

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

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

Respuesta rápidaVolver arribaVolver a la lista