Universidad Tecnológica de Querétaro Firmado digitalmente por Universidad Tecnológica de Querétaro Nombre de reconocimiento (DN): cn=Universidad Tecnológica de Querétaro, o=Universidad Tecnológica de Querétaro, ou, email=webmaster@uteq.edu.mx, c=MX Fecha: 2010.08.25 19:09:08 -05'00' UNIVERSIDAD TECNOLÓGICA DE QUERÉTARO Voluntad ● Conocimiento ● Servicio MANUAL DE USUARIO PARA MICROCONTROLADOR LPC 1114 GESDC Reporte de Estadía para obtener el Título de Técnico Superior Universitario en Electrónica y Automatización EDUARDO BARCENAS ROMERO Santiago de Querétaro, Qro. Agosto de 2010 UNIVERSIDAD TECNOLÓGICA DE QUERÉTARO Voluntad ● Conocimiento ● Servicio MANUAL DE USUARIO PARA MICROCONTROLADOR LPC 1114 GESDC Reporte de Estadía para obtener el Título de Técnico Superior Universitario en Electrónica y Automatización ASESOR DE LA EMPRESA ING. FERNANDO GONZÁLEZ V. ASESOR DE LA ESCUELA ING. TOMAS GERARDO TORRES LUNA ALUMNO EDUARDO BARCENAS ROMERO Santiago de Querétaro, Qro. Agosto de 2010 AGRADECIMIENTOS Al término de mis estudios como TSU quiero expresar mi sincero agradecimiento a las personas que mas me apoyaron durante este periodo de mi vida. A mis padres, por apoyarme en todas mis decisiones y creer en mí. A mis hermanos por aguantar los días que no los dejaba dormir. A todos mis compañeros por enseñarme el valor del trabajo en equipo. A mis profesores, que a lo largo de mi formación profesional me han dado las bases para mi desarrollo profesional, Pero sobre todo a Dios por darme el coraje y la voluntad de aprender mas cosas día a día. A memo que con tu humildad nos has dado una lección de vida. ÍNDICE AGRADECIMIENTOS ÍNDICE INTRODUCCIÓN CAPÍTULO I. ANTECEDENTES GENERALES DE LA EMPRESA Pág. 1.1 Antecedentes de la empresa………………………………………………..10 1.2 Misión……………………………………………………………………….10 1.3 Visión………………………………………………………………………..10 1.4 Política de calidad…………………………………………………….……..11 1.5 Organización………………………………………………………………...11 1.6 Campo de desarrollo nacional o internacional…………………………….12 1.7 Proceso general de producción……………………………………………...12 CAPÍTULO II. EL PROYECTO 2.1 Antecedentes………………………………………………………………..14 2.2 Definición del proyecto…………………………………………………….14 2.3 Objetivo……………………………………………………………………..14 2.4 Alcance………….........................................................................................14 2.5 Plan de trabajo………………………………………………………………15 2.5.1 Separación y secuencia de actividades…………………………...15 2.5.2 Asignación de tiempos……………………………………………16 2.5.3 Gráfica de Gantt…………………………………………………..16 CAPÍTULO III. MARCO TEÓRICO 3.1 IAR Embedded Workbench…………………………………………………19 3.2 Microcontroladores…………………………………………………………19 3.2.1 AVR……………..………………………………………………...20 3.2.2 ARM…………….………………………………………………...20 3.3 Programación en C………………………………………………………….21 3.4 Reusabilidad………………………………………………………………...21 3.5 Portabilidad…………………………………………………………………22 CAPÍTULO IV. DESARROLLO DEL PROYECTO 4.1 Reconocimiento del compilador para microcontroladores AVR…………...24 4.2 Reconocimiento del microcontrolador ATMEGA8………………………...25 4.3 Capacitación sobre normas de la empresa…………………………………..26 4.4 Elaboración de prácticas…………………………………………………….26 4.5 Reconocimiento del compilador para micros ARM………………………...26 4.6 Reconocimiento del microcontrolador LPC1114……………………..…….27 4.6.1 Características de la tarjeta de desarrollo………………………….29 4.7 Realización de pruebas……………………………………………………...29 4.8 Realización de prácticas…………………………………………………….29 4.8.1 Encendido de un LED……………………………………………30 4.8.2 Barrido de puerto 3……………………………………………….30 4.8.3 Puertos de entrada..……………………………………………….31 4.8.4 Timer 16…………………………………………………………...32 4.8.5 Timer 32…………………………………………………………...33 4.8.6 Comunicación UART………………………………………….….34 4.8.7 ADC……………………………………………………………….40 4.8.8 ADQ………………………………………………………….……45 4.9 Realización de manual de operación………………………………………..46 4.10 Verificación y ajuste del manual de operación…………………………….46 4.11 Implementación del proyecto……………………………………………...47 CAPÍTULO V. ACTIVIDADES DIVERSAS 5.1 Ensamble SMT y PTH……………………………………………………..49 CAPÍTULO VI. EVALUACIÓN ECONÓMICA Y RESULTADOS OBTENIDOS 6.1 Evaluación económica……………..………………………………………..51 6.2 Resultados obtenidos……………………………………………………….51 CONCLUSIONES Conclusiones……………………………………………………………..….…..53 BIBLIOGRAFÍA Bibliografía y/o páginas consultadas en Internet ………………………….……55 INTRODUCCIÓN El presente reporte de estadía se realizó dentro de la empresa AIMSA, S.A. de C.V. en el área de diseño y ensamble de PCB’s, durante el periodo mayo – agosto de 2010. El proyecto consistió en la creación de manuales de proceso para los operadores encargados de soldar los materiales que se utilizan para la fabricación de sierras cintas. Los manuales se elaboraron analizando el modo como se realizaba el proceso, detectando sus fallas y haciendo pruebas para corregirlas hasta lograr el producto deseado. El manual realizado con la finalidad de que cualquier operador del personal pueda manipular la máquina cuando el operador titular no se presente a trabajar. A lo largo de este trabajo se hace una descripción de las actividades realizadas dentro de la empresa; por lo mismo, comprende la recopilación de datos hasta la entrega del manual. CAPÍTULO I ANTECEDENTES GENERALES DE LA EMPRESA 1.1 Antecedentes de la empresa 1 AUTOMATIZACIÓN INTELIGENTE DE MÉXICO S.A es una empresa mexicana establecida en el estado de Querétaro, en la ciudad de Santiago de Querétaro. Fundada en el año 2001, esta empresa se dedica al diseño y ensamble de tarjetas PCB, así como la venta de software embebido de diseño, tales como IAR e Interpodic’s. También ofrece entrenamiento y asesoría impartidos por instructores certificados. Hasta el momento la empresa está buscando la mejora continua para lograr la optimización de sus procesos y el aumento de la calidad de sus productos, para satisfacer todos y cada uno de los requerimientos y exigencias de sus clientes. AIMSA tiene varios clientes a nivel nacional e internacional, clientes como empresas, universidades y centros de investigación muy reconocidos en la región. También cuenta con una gran variedad de proveedores internacionales, trayendo constantemente piezas de importación para una mejor calidad en el producto final 1.2 Misión Resolver los problemas de abasto de productos industriales a nivel nacional en la forma más eficiente del mercado, con los productos de mejor relación COSTO-BENEFICIO existentes. 1.3 Visión (No tiene visión la empresa.) 1 La información del capitulo I fue proporcionada por la empresa AIMSA. 10 1.4 Política de calidad En AIMSA, en el equipo GESDC, se encarga de desarrollar software de la más alta calidad y eficiencia, para cumplir con las demandas y exigencias de los clientes en tiempos y volúmenes acordados. 1.5 Organización AIMSA, S.A. de C.V. está organizada en dos áreas, con la finalidad de que el personal de cada área se dedique únicamente a sus labores específicas, sin involucrarse con el trabajo de otras áreas. A continuación en la figura 1.1 se presenta el organigrama de la empresa. AIMSA PCBRAPIDO.COM GESDC Figura 1.1 Organigrama de la empresa AIMSA Diseño y venta de tarjetas PCB, ensamble de piezas SMD y PTH. Diseño de software 1.6 Campo de desarrollo AIMSA además de realizar el diseño, fabricación y ensamble de PCB’S. es principalmente una empresa distribuidora. Es una de las principales distribuidoras de tarjetas electrónicas del país a nivel nacional. 11 1.7 Proceso general de la producción 2 Dentro de sus principales actividades de producción figuran las siguientes: • Diseño de tarjetas electrónicas. • Ensamble SMT y PTH. • Fabricación de tarjetas electrónicas. • Ensamble de PCB’S. • Software diseño embebido. • Gabinetes a la medida. Para realizar lo anterior el cliente debe de contactar a la empresa vía internet, o llamando a el área de atención al cliente. Algunos clientes o prospectos llaman por teléfono o contactan a la empresa por internet, para solicitar algún producto o servicio de los que brinda la empresa (la mayoría son clientes) y realizan su pedido directamente en la gerencia de ventas. Éste es entregado hasta que cubren el costo total del mismo. 2 En los casos anteriores se da un plazo para la entrega de productos o para realizar el servicio, así como también para el pago de éstos 12 CAPÍTULO II EL PROYECTO 2.1 Antecedentes GESDC es una empresa en vías de desarrollo y con la mira de ser la empresa líder en su ramo, es por esto que se preocupa por ofrecer siempre el mejor servicio posible y los mejores productos del mercado al que pertenece. Por esta razón se mantiene en mejora continua día con día. Es muy importante para la empresa el estar actualizada en cuanto a nuevas tecnologías se refiere, es por esto que surge la necesidad de utilizar un nuevo microcontrolador para mejorar las aplicaciones que se desarrollan dentro de la empresa. 2.2 Definición del proyecto El proyecto denominado “Elaboración de manual de uso para MICROCONTROLADOR LPC114” comprende desde la configuración del oscilador del micro y los cambios de las opciones del compilador, hasta la realización de una tarjeta de adquisición de datos (ADQ). 2.3 Objetivo Este proyecto tiene como meta final manejar correctamente el micro, elaborar un manual claro y conciso para utilizar el Microcontrolador LPC1114, y conocer las distintas aplicaciones de este chip. 2.4 Alcance Se pretende entregar un manual de uso que permita operar correctamente el microcontrolador, lograr adaptar las SFR’s a las librerías estandarizadas de la empresa y así poder reutilizar código existente, además de poder ser portable en otros micros. 14 2.5 Plan de trabajo Al realizar un proyecto, es de suma importancia que se conozca cada una de las actividades a desarrollar, ya que esto evitará un gasto extra de capital. Por este motivo, se planean de una manera ordenada y secuencial todas las actividades del proyecto, estableciendo los tiempos de ejecución de las mismas. 2.5.1 Separación y secuencia de actividades La separación de actividades consiste en desglosar el proyecto en tareas, las cuales pueden ser útiles para lograr concluirlo de una manera fácil y sencilla. Una vez que se identificaron las actividades que se llevarían a cabo, se les asignó la siguiente secuencia (ver 2.1). Actividad Reconocimiento del compilador para micros AVR Reconocimiento del microcontrolador ATMEGA8 Capacitación sobre normas de la empresa Elaboración de practicas Reconocimiento del compilador para micros ARM Reconocimiento del microcontrolador LPC1114 Realización de pruebas Realización de prácticas Realización de manual de operación Verificación y ajuste del manual de operación Implementación del proyecto Seguimiento 1 2 3 4 5 6 7 8 9 10 11 Tabla 2.1 Secuencia de actividades 15 2.5.2 Asignación de tiempos La asignación de tiempos es algo muy importante, ya que de esto depende la oportuna realización del proyecto. En la tabla 2.2 se presentan las actividades y los tiempos estimados para cada una de estas actividades. Actividad Reconocimiento del compilador para micros AVR Reconocimiento del microcontrolador ATMEGA8 Capacitación sobre normas de la empresa Elaboración de practicas Reconocimiento del compilador para micros ARM Reconocimiento del microcontrolador LPC1114 Realización de pruebas Realización de prácticas Realización de manual de operación Verificación y ajuste del manual de operación Implementación del proyecto Tiempo en días 1 5 3 25 1 1 7 20 6 2 1 Tabla 2.1 Secuencia de actividades 2.5.3 Gráfica de Gantt En la siguiente gráfica de Gantt (tabla 2.3) se muestra la secuencia de actividades así como sus tiempos (definidos en horas), que son el resultado de las tablas anteriores. La gráfica permite organizar el proyecto de tal modo que los tiempos establecidos sean aprovechados en las actividades que se hayan planeado, dejando algunas horas para resolver imprevistos en el proyecto. 16 Tiempo en días Actividad 1 5 3 25 1 1 7 20 6 2 1 Reconocimiento del compilador para micros AVR Reconocimiento del microcontrolador ATMEGA8 Capacitación sobre normas de la empresa Elaboración de practicas Reconocimiento del compilador para micros ARM Reconocimiento del microcontrolador LPC1114 Realización de pruebas Realización de practicas Realización de manual de operación Verificación y ajuste del manual de operación Implementación del proyecto Tabla 2.3 Gráfica de Gantt 17 CAPÍTULO III MARCO TEÓRICO En este capitulo se expresa la información teórica del proyecto. 3.1 IAR Embedded Workbench 3 IAR Embedded Workbench es un conjunto de herramientas de desarrollo para la construcción y depuración de aplicaciones integradas del sistema usando ensamblador, C y C + +. Proporciona un entorno de desarrollo completamente integrado que incluye un gestor de proyectos, editor, herramientas de construcción y el depurador de C-SPY. El compilador IAR C/C++ es conocido por su generación de código eficiente; cada compilador contiene optimizaciones globales genéricos, así como un bajo nivel de optimizaciones específicas de chip que garanticen un tamaño pequeño de código mientras toma ventaja de todas las características del dispositivo seleccionado. IAR Embedded Workbench está disponible para una amplia selección de dispositivos de 8, 16 y 32-bits de diferentes fabricantes. 3.2 Microcontroladores 4 Un Microcontrolador es Circuito integrado o chip que incluye en su interior las tres unidades funcionales de una computadora: CPU, Memoria y Unidades de E/S, es decir, se trata de un ordenador completo en un solo circuito integrado. Aunque sus prestaciones son limitadas, además de dicha integración, su característica principal es su alto nivel de especialización. Aunque los hay del tamaño de una moneda, lo normal es que sean incluso más pequeños, ya que, lógicamente, forman parte del dispositivo que controlan. 3 4 http://www.iar.com/website1/1.0.1.0/14/1/ http://www.olimex.cl/present.php?page=que_es_un_microcontrolador 19 Un microcontrolador típico posee en su interior un generador de reloj integrado, una pequeña cantidad de memoria RAM y ROM/EPROM/EEPROM. Para hacerlos funcionar todo lo que se necesita son unos pocos programas de control, alimentación (típicamente 3.3V o 5V) y un cristal de sincronización. Los microcontroladores disponen generalmente también de una gran variedad de dispositivos de entrada/salida, como convertidores de analógico a digital, temporizadores, UART’s y buses de interfaz serie especializados, como I2C y CAN. Los microcontroladores más utilizados son los: • AVR • ARM • MSP430 • PIC 3.2.1 AVR 5 AVR combina la arquitectura más eficiente para el código-C y la programación de montaje con la posibilidad de ajustar los parámetros del sistema en todo el ciclo de vida completo de sus productos clave. 3.2.2 ARM 6 Los microcontroladores ARM son dispositivos de altas prestaciones, con un core RISC de 16/32bits. El mercado de los ARM es uno de los que ha crecido mas rápido en cuanto a microcontroladores se refiere. Los precios de los ARM son similares a los dispositivos de 8 bits, sin embargo proveen mucho más poder y periféricos que cualquier otro 5 6 http://www.atmel.com/products/avr/ http://www.olimex.cl/present.php?page=que_es_un_microcontrolador 20 dispositivo de 8 bits. Se encuentran disponibles de distintos proveedores como: Texas Instruments, Atmel, NXP, OKI, ST, Cirrus Logic, Analog Devices y otros. Muchos expertos en el tema dicen que dentro de 5 años los ARM reemplazaran la industria ocupada por la arquitectura 8051 en la mayoría de las aplicaciones. 3.3 Programación en C 7 C es un lenguaje bastante conciso y en ocasiones desconcertante. Considerado ampliamente como un lenguaje de alto nivel, posee muchas características importantes, tales como: programación estructurada, un método definido para llamada a funciones y para paso de parámetros, potentes estructuras de control, etc. Sin embargo gran parte de la potencia de C reside en su habilidad para combinar comandos simples de bajo nivel, en complicadas funciones de alto nivel, y en permitir el acceso a los bytes y palabras del procesador. Uno de los fundamentos de C es que los parámetros (variables de entrada) se pasan a las funciones (subrutinas) en la pila, y los resultados se devuelven también en la pila. Así las funciones pueden ser llamadas desde las interrupciones y desde el programa principal sin temor a que las variables locales sean sobre escritas. 3.4 Reusabilidad Debido a que el software está típicamente compuesto por partes similares, la mayoría del software nuevo puede ser ensamblado a partir de componentes preexistentes. La noción de objeto permite que programas que traten las mismas estructuras de información reutilicen las definiciones de objetos empleadas en otros programas e 21 incluso los procedimientos que los manipulan. De esta forma, el desarrollo de un programa puede llegar a ser una simple combinación de objetos ya definidos donde estos están relacionados de una manera particular. 3.5 Portabilidad 8 La portabilidad es uno de los conceptos clave en la programación de alto nivel. Se define como la característica que posee un software para ejecutarse en diferentes plataformas, el código fuente del software es capaz de reutilizarse en vez de crearse un nuevo código cuando el software pasa de una plataforma a otra. A mayor portabilidad menor es la dependencia del software con respecto a la plataforma. El prerrequisito para la portabilidad es la abstracción generalizada entre la aplicación lógica y las interfaces del sistema. Cuando un software se puede compilar en diversas plataformas, se dice que es multiplataforma. Esta característica es importante para el desarrollo de reducción costos, cuando se quiere hacer una misma aplicación. 7 8 caro.eii.us.es/descargas/Programacion_C_microcontroladores.pdf http://www.taringa.net/posts/info/945123/El-verdadero-concepto-de-portabilidad.html 22 CAPÍTULO IV DESARROLLO DEL PROYECTO Conviene mencionar que la estadía se divide en dos momentos. Durante el mes de mayo y junio se desarrollaron actividades para conocer funcionamiento del microcontrolador ATMEGA8, y la segunda parte de la estadía consistió en desarrollar el proyecto. En este capitulo se describe con detalle las tareas implicadas en la realización del proyecto, se llevo a cabo con base a la grafica de Gantt (tabla 2.3), en la cual se desglosaron las actividades. 4.1 Reconocimiento del compilador para microcontroladores AVR La primera actividad que se desarrolló fue conocer el uso del compilador para microcontroladores AVR (figura 4.1), este software es el “IAR Embedded Workbench for AVR V5” proporcionado por la empresa noruega IAR. Figura 4.1 Ambiente del compilador IAR Embedded Workbench para AVR 24 Debido a que nunca antes se había utilizado este software, se le dedicó un día para conocer las distintas herramientas que ofrece y la configuración para compilar un proyecto nuevo. 4.2 Reconocimiento del microcontrolador ATMEGA8 El microcontrolador ATMEGA8 (figura 4.2) es un micro de 8 bit. Este microcontrolador es uno de los más utilizados en la empresa; con este chip se han desarrollado distintos proyectos, como un probador para tableros de tractor. Figura 4.2 Microcontrolador ATMEGA8 Debido al poco conocimiento de este microcontrolador, se destinaron dos días para conocer su funcionamiento, características, ventajas y desventajas. Se consiguió la hoja de datos que proporciona la empresa ATMEL. Se conoció la localización de los puertos, los canales ADC, los puertos de comunicación, etc. Durante este periodo se proporcionó una tarjeta de desarrollo realizada dentro de la empresa, así como también un programador. Se desarrollaron dos prácticas simples que consistieron en: enviar una señal a través del puerto d y tomar lecturas de entrada del puerto c. 25 .4.3 Capacitación sobre normas de la empresa Durante la segunda semana de la estadía se proporcionó una capacitación para cumplir con las normas de la empresa, se subrayó la importancia de la portabilidad y reusabilidad del software para reducir costos y mejorar la calidad del producto. Durante este periodo se suministraron librerías que cumplían con los estándares de la empresa. 4.4 Elaboración de prácticas A partir de la tercera semana se empezaron a desarrollar una serie de proyectos para aprender a aplicar lo instruido durante la capacitación. Las prácticas empleadas fueron las siguientes 9: Prender un puerto. Accionar relevadores con ayuda de un shift register. Llamado de multitareas con ayuda de un Timer. Uso del ADC Inicializar una LCD Comunicación a través del puerto UART con una PC. Creación de librerías personalizadas. Reutilización de código. Estandarización de prácticas realizadas. 4.5 Reconocimiento del compilador para micros ARM Al haber concluido con la primera parte de la estadía satisfactoriamente, se dio a conocer el proyecto de la estadía, se proporciono el nuevo compilador a utilizar que es el “IAR Embedded Workbench for ARM V5,5” de la empresa IAR (Figura 4.3). 26 Figura 4.2 Microcontrolador ATMEGA8 Se conoció este nuevo ambiente de trabajo y se estudiaron las nuevas características de este software, con ayuda del manual de usuario proporcionado por el fabricante. 4.6 Reconocimiento del microcontrolador LPC1114 Para realizar el proyecto la empresa proporcionó una tarjeta de desarrollo manufacturada por la compañía “OLIMEX”. El modelo de la tarjeta es el LPC- P1114 (Figura 4.3), y también un debuger de la empresa IAR (Figura 4.4). Figura 4.3 Tarjeta de desarrollo LPC-P1114 9 Debido al código de confidencialidad de la empresa no se incluirá lenguaje de programación este punto. 27 Figura 4.4 Debugger J-LINK El microcontrolador cuenta con las siguientes características: • Procesador ARM con núcleo Cortex-M0, corre a frecuencias de 50MHz. • El ARM Cortex-M0 incorpora controladores de interrupciones de Vectores Anidadas (NVIC por sus siglas en ingles). • 32KB de memoria de programación en flash. • 8kB en SRAM. • Maneja las interfaces UART, I2C. • Tiene dos controladores SSP con FIFO. • Cuenta con 42 pines de E/S (GPIO) de propósito general. • Cuatro Timer/Counter de propósito general, con cuatro entradas de captura. • Watch Dog Timer (WDT) programable. • Sistema temporizador de pulsos. • Depuración de cable en serie (SWD). • PMU (Unidad de Gestión de energía) integrada para reducir al mínimo el consumo de energía durante el sueño (Sleep), sueño profundo (Deep-Sleep) y en modo de apagado profundo (Deep power-down modes). • Tres modos de ahorro de energía Sleep, Deep-Sleep y Deep power-down modes. • Convertidor ADC de 10 bits con multiplexado en los canales. • Cristal oscilador con un rango de operación de 1 a 25MHz. 28 • Oscilador interno RC de 12 MHz con una precisión de 1%, opcionalmente se puede utilizar como reloj del sistema. 4.6.1 Características de la tarjeta de desarrollo 10 • Circuito de suministro de energía • LED de encendido • Conector USB sólo para el suministro de energía, no la funcionalidad USB. • Interfaz de depuración Depuración de cable en serie (Serial Wire Debug) • Conector UEXT • Ocho LEDs de uso. • Dos botones de uso. • Botón de restablecimiento. 4.7 Realización de pruebas Durante este periodo con ayuda de los ejemplos proporcionados por el compilador se hicieron una serie de prácticas para así conocer la funcionalidad del microcontrolador, estas pruebas eran bastante simples, pero que utilizaban librerías innecesarias, pero el objetivo de echar mano de ellas era conocer como echar a andar el chip. 4.8 Realización de prácticas Al haber concluido la fase de experimentación, se procedió a realizar proyectos personales como parte del manual de uso, estos proyectos se describen en los siguientes apartados. 10 http://www.olimex.com/dev/ 29 4.8.1 Encendido de un LED. Esta práctica consistió en encender un LED (Led_0) de la tarjeta de desarrollo, ubicado en el puerto GPIO3_0 (Tabla 4.1). #include "LPC11xx.h" int main(void) { LPC_GPIO3->DIR |= (1<<0);//_________________ Configuarar_GPIO_3,_Como_Salida __ while(1) { LPC_GPIO3->DATA &= ~(1<<0);//___________________________________ Led_On __ LPC_GPIO3->DATA |= (1<<0);//___________________________________ Led_Off __ } } Tabla 4.1 Código funcional de encendido de un LED. 4.8.2 Barrido de puerto 3 A continuación se realizó un barrido para comprobar el funcionamiento del GPIO_3 con ayuda de un contador, se definió un comando para almacenar la posición del bit (Tabla 4.2). #include "LPC11xx.h" #define BIT(x) (1<<(x)) int delay(uint32_t n){ for(uint32_t x=0;x<n;x++);} int init(void){ LPC_GPIO3->DIR |= (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5); int main(void){ init(); uint8_t Contador = 0; while(1) { LPC_GPIO3->DATA &= ~(BIT(Contador));//_________________________ Ledn_On __ delay(500000);//_________________________________________________ 500ms __ LPC_GPIO3->DATA |= (BIT(Contador));//_________________________ Ledn_Off __ delay(500000);//_________________________________________________ 500ms __ if(++ Contador > 7) Contador = 0; }} Tabla 4.2 Código funcional de Barrido del puerto 3. 30 4.8.3 Uso de los Puertos de entrada Haciendo uso de los botones con los que cuenta la tarjeta de desarrollo se elabora esta práctica que consiste en: 1. Definir los puertos de entrada de los botones. 2. Inicializar los puertos. 3. Si el botón 1(B1_PIN) es presionado encenderá el LED_0 y apagará el LED_1 (GPIO3_1). 4. Si el botón 2(B2_PIN) es presionado encenderá el LED_1 y apagará el LED_0. El código funcional esta en la tabla 4.3. #include "LPC11xx.h" //___________________________________________________________________ Boton 1 __ #define B1_MASK (1UL<<9) #define B1_DIR LPC_GPIO2->DIR #define B1_PIN (*((volatile unsigned int *)(0x50020000+ (B1_MASK<<2)))) //___________________________________________________________________ Boton 2 __ #define B2_MASK (1UL<<4) #define B2_DIR LPC_GPIO1->DIR #define B2_PIN (*((volatile unsigned int *)(0x50010000+ (B2_MASK<<2)))) int main(void) { LPC_GPIO3->DIR |= (1<<0) | (1<<1); while(1) { if(!B1_PIN) { LPC_GPIO3->DATA &= ~(1<<0); LPC_GPIO3->DATA |= (1<<1); } if(!B2_PIN) { LPC_GPIO3->DATA &= ~(1<<1); LPC_GPIO3->DATA |= (1<<0); } } } Tabla 4.3 Código funcional de uso de Botones. 31 4.8.4 Timer 16 Los Timer son importantes en el mundo de los microcontroladores, ya que de esta manera se reduce el consumo de energía del microcontrolador, y puede automatizar procesos. La siguiente práctica se desarrolló de la siguiente manera: 1. Se incluirán las librerías correspondientes. 2. Se creará una variable que indicará si se utilizará el Timer 1 o 0. 3. Se declararán variables en donde se almacenarán los pulsos del Timer. 4. Se configura el Timer de acuerdo a los parámetros deseados. 5. Se creará el código funcional correspondiente a cada Timer (0 ó 1). El código funcional se encuentra en la tabla 4.4 #include "LPC11xx.h" #include "timer16.h" #include "clkconfig.h" #define Test_Timer_Num 1//_________________________ 0~1 Para Timer de 16-bits __ extern volatile uint32_t timer16_0; extern volatile uint32_t timer16_1; int InitTimer(void) { uint32_t interval; //_________________________________ Config_CLK CLKOUT_Setup(CLKOUTCLK_SRC_MAIN_CLK); LPC_IOCON->PIO0_1 &= ~(0x07); LPC_IOCON->PIO0_1 |= (0x01);//_____________________________________ CLK_Out __ LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);//____________________ Enable AHB Clock __ //___________________ TEST_TIMER_NUM is either 0 or 1 for 16-bit timer 0 or 1 __ interval = SystemAHBFrequency/1000-1; if(interval > 0xFFFF) interval = 0xFFFF; init_timer16(Test_Timer_Num, interval); enable_timer16(Test_Timer_Num); LPC_GPIO3->DIR |= (1<<0);//______________ Establecer Puerto 3_0 Como salida __ } int main(void) { InitTimer(); while(1) { #if Test_Timer_Num 32 if((timer16_1>0) && (timer16_1<=200)) LPC_GPIO3->DATA &= ~(1<<0); if((timer16_1>200) && (timer16_1<=400)) LPC_GPIO3->DATA |= (1<<0); else if(timer16_1>400) timer16_1 = 0; #else if((timer16_0>0) && (timer16_0 <= 200)) LPC_GPIO3->DATA &= ~(1<<0); if((timer16_0>200) && (timer16_0<=400)) LPC_GPIO3->DATA |= (1<<0); else if(timer16_0>400) timer16_0 = 0; #endif } } Tabla 4.4 Código funcional del Timer 16. 4.8.5 Timer 32 Los Timer son importantes en el mundo de los microcontroladores, ya que de esta manera se reduce el consumo de energía del microcontrolador, y puede automatizar procesos. La siguiente práctica se desarrollo de la siguiente manera: 1. Se incluirán las librerías correspondientes. 2. Se creara una variable que indicara si se utilizara el Timer 1 o 0. 3. Se declararan variables en donde se almacenaran los pulsos del Timer. 4. Se configura el Timer de acuerdo a los parámetros deseados. 5. Se creara el código funcional correspondiente a cada Timer (0 ó 1). El código funcional se encuentra en la tabla 4.5 #include "LPC11xx.h" #include "timer32.h" #include "gpio.h" #define Test_Timer_Num 1//_________________________ 0~1 Para_Timer_de_32-Bits __ extern volatile uint32_t timer32_0; extern volatile uint32_t timer32_1; //__________________________________ Init_Timer32 ______________________________ int InitTimer(void) 33 { //____________________________________________________________ Test_Timer_Num __ init_timer32(Test_Timer_Num, TIME_INTERVAL); enable_timer32(Test_Timer_Num); //_______________________________________ Enable_AHB_clock_to_the_GPIO_domain __ LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); LPC_GPIO3->DIR |= (1<<0);//______________ Establecer_Puerto_3-0 como_salida __ } //_________________________________ Main_Function ______________________________ int main(void) { InitTimer(); while(1) { #if Test_Timer_Num if((timer32_1>0) && (timer32_1<=50)) LPC_GPIO3->DATA &= ~(1<<0); if((timer32_1>50) && (timer32_1<=100)) LPC_GPIO3->DATA |= (1<<0); else if(timer32_1>100) timer32_1 = 0; #else if((timer32_0>0) && (timer32_0<=50)) LPC_GPIO3->DATA &= ~(1<<0); if((timer32_0>50) && (timer32_0<=100)) LPC_GPIO3->DATA |= (1<<0); else if(timer32_0>100) timer32_0 = 0; #endif } } Tabla 4.5 Código funcional del Timer 32. 4.8.6 Comunicación UART La comunicación entre el chip y la PC es importante ya que con esto se pueden almacenar datos y crear bases de datos para distintos proyectos. Es por ello que se desarrolló la siguiente práctica, cuyo objetivo es comunicar el micro con la PC. 1. Se llamará a las librerías correspondientes. 2. Se declarará una variable que será utilizada para contar los desbordes del TIMER. 3. Se creará la función para habilitar, deshabilitar y limpiar las interrupciones. 4. Se establecerá la función que inicializará al reloj del sistema. 34 5. Se generará la función que inicializará y configurará al puerto UART, aquí se indicará cuales son los puertos de transmisión (TX) y recepción (RX), se señalará que se enviarán ocho bits de datos, un bit de paro y no tendrá paridad. El código funcional se encuentra en la tabla 4.6 #include "includes.h" //______________________________________________________________________________ volatile Int32U Ticks; //______________________________________________________________________________ static int MyLowLevelGetchar(void); //________________________ NVIC_IntEnable ______________________________________ //________________________ Interup_Number ______________________________________ //_____________ Enable_Interrupt_at_NVIC. ______________________________________ void NVIC_IntEnable(Int32U IntNumber) { volatile unsigned long * pNVIC_SetEn = &SETENA0; assert((NVIC_WAKE_UP0 <= IntNumber) && (NVIC_PIO_0 >= IntNumber)); IntNumber -= NVIC_WAKE_UP0; pNVIC_SetEn += IntNumber/32; *pNVIC_SetEn = (1UL<<(IntNumber%32)); } //_______________________ NVIC_IntDisable ______________________________________ //_______________________ Interrup_Number ______________________________________ //_____________ Disable_Interrup_at_NVIC. ______________________________________ void NVIC_IntDisable(Int32U IntNumber) { volatile unsigned long * pNVIC_ClrEn = &CLRENA0; assert((NVIC_WAKE_UP0 <= IntNumber) && (NVIC_PIO_0 >= IntNumber)); IntNumber -= NVIC_WAKE_UP0; pNVIC_ClrEn += IntNumber/32; *pNVIC_ClrEn = (1UL<<(IntNumber%32)); } //__________________________ NVIC_ClrPend ______________________________________ //_______________________ Interrup_Number ______________________________________ //_______ Clear_Pending_Interrup_at_NVIC. ______________________________________ void NVIC_ClrPend(Int32U IntNumber) { volatile unsigned long * pNVIC_ClrPend = &CLRPEND0; assert((NVIC_WAKE_UP0 <= IntNumber) && (NVIC_PIO_0 >= IntNumber)); IntNumber -= NVIC_WAKE_UP0; pNVIC_ClrPend += IntNumber/32; *pNVIC_ClrPend = (1UL<<(IntNumber%32)); } //__________________________ NVIC_ClrPend ______________________________________ //_______________________ Interrup_Number ______________________________________ //_____________________ Interrup_Priority ______________________________________ 35 //______________ Sets_Interrupt_Priority. ______________________________________ void NVIC_IntPri(Int32U IntNumber, Int8U Priority) { volatile Int8U * pNVIC_IntPri = (Int8U *)&IP0; assert((NVIC_WAKE_UP0 <= IntNumber) && (NVIC_PIO_0 >= IntNumber)); IntNumber -= NVIC_WAKE_UP0; pNVIC_IntPri += IntNumber; *pNVIC_IntPri = Priority; } //____________________________ Init_Clock ______________________________________ //____________________ Clock,_AHB_Devider ______________________________________ //_______ Initialize_PLL_To_Desired_Clock ______________________________________ //______ and_AHB_Devider_Sys_Clock_is_Sys ______________________________________ //___________________________ PLL_Output. ______________________________________ void InitClock(Int32U clock, Int32U ahbdiv) { SYSOSCCLTRL = (MAIN_OSC_FREQ>(20MHZ))?(0x2):(0x0);//__ Sys_Oscilator_Enable __ PDRUNCFG_bit.SYSOSC_PD = 0;//_______________________ Power_Up_Sys_Oscilator __ PDRUNCFG_bit.IRC_PD = 0;//____________________ Enable_Internal_RC_Oscilator __ MAINCLKUEN = 0;//__________________________________________ Select Internal __ MAINCLKSEL = 0;//_________________________________________ RC Oscilator for __ MAINCLKUEN = 1;//________________________________________ Sys_Clock_Source. __ PDRUNCFG_bit.SYSPLL_PD = 1;//________ Configure_Sys_PLL||Power_Down_Sys_PLL __ SYSPLLCLKUEN = 0;//_____________________________________________ Select Sys __ SYSPLLCLKSEL = 1;//___________________________________________ Oscilato for __ SYSPLLCLKUEN = 1;//________________________________________ Sys PLL Source. __ Int32U m = clock/MAIN_OSC_FREQ - 1;//_______________________________ Calc M __ assert(m<32); //_____________ Configure PLL Frequency ______________________________________ SYSPLLCTRL = (m)//________________ MSEL ______________________________________ | (0<<5)//_________ PSEL = 1 ______________________________________ | (0<<7)//_______ DIRECT = 0 ______________________________________ | (0<<8);//______ BYPASS = 0 ______________________________________ PDRUNCFG_bit.SYSPLL_PD = 0;//_________________________________ Power_Up_PLL __ SYSAHBCLKDIV_bit.DIV = ahbdiv;//_________________ Set_Sys_AHB_Clock_Devider __ while(!(SYSPLLSTAT_bit.LOCK));//______________________ Wain_Until_PLL_Locks __ MAINCLKUEN = 0;//___________________________________________________ Select __ MAINCLKSEL = 3;//_______________________________________ Sys_PLL_Output_For __ MAINCLKUEN = 1;//________________________________________ Sys_clock_Source. __ } //________________________ Sys_GetMainClk ______________________________________ //________________ Return_Main_Clock_[Hz] ______________________________________ 36 Int32U SYS_GetMainClk(void) { Int32U Clk; switch(MAINCLKSEL_bit.SEL) { case 0: Clk = I_RC_OSC_FREQ; break; case 1: Clk = MAIN_OSC_FREQ; break; case 2: Clk = WDT_OSC_FREQ; break; case 3: switch(SYSPLLCLKSEL_bit.SEL) { case 0: Clk = I_RC_OSC_FREQ; break; case 1: Clk = MAIN_OSC_FREQ; break; case 2: Clk = WDT_OSC_FREQ; break; default: Clk = 0; break; } if(!SYSPLLCTRL_bit.BYPASS) Clk *= (SYSPLLCTRL_bit.MSEL+1); break; default: Clk = 0; break; } return Clk; } void UART_Init (Int32U BaudRate) { Int32U Pclk; UARTCLKDIV = 1;//____________________________________________ Enable Clocks __ while((Pclk=SYS_GetMainClk()/UARTCLKDIV)> 70MHZ) { UARTCLKDIV ++; } SYSAHBCLKCTRL_bit.UART = 1;//___________________ Enable UART register clock __ SYSAHBCLKCTRL_bit.IOCON = 1;//__________ Enable I/O Configuration registers __ IOCON_PIO1_6 = 1;//________________________________ Uart RX function select __ IOCON_PIO1_7 = 1;//________________________________ Uart RX function select __ U0LCR_bit.WLS = 3;//________________________________________ Serlect 8-Bits __ U0LCR_bit.SBS = 0;//__________________________________________ One Stop Bit __ U0LCR_bit.PE = 0;//______________________________________________ No parity __ U0LCR_bit.DLAB = 1;//_________________________ Devisor Latch Access ebabled __ //____________________ Set UART0 BAUDRATE U0DLL = ((((Pclk+8)/16)+BaudRate/2)/BaudRate)%256; // U0DLM = ((((Pclk+8)/16)+BaudRate/2)/BaudRate)/256; // U0LCR_bit.DLAB = 0;//_______________________ Clear Devisor Latch Access bit __ U0FCR = (1<<0);//_______________________________________ Enable UART0 FIFOs __ U0TER = (1<<7);//______________________________________ Enable Transmission __ } //______________________________ Dly100us ______________________________________ 37 //_____________________________ void *arg ______________________________________ //_________________________ Delay[100us]. ______________________________________ void Dly100us(Int32U Dly) { volatile Int32U Dly100; for(;Dly;Dly--) for(Dly100 = 550; Dly100; Dly100--); } //______________________________ GpioInit ______________________________________ //__________________________________ void ______________________________________ //_______ Reset_All_GPIO_Pins_to_Default: ______________________________________ //_____________________ Primary_Function. ______________________________________ void GpioInit(void) { //_________________________ Set_to_Inputs ______________________________________ GPIO0DIR = \ GPIO1DIR = \ GPIO2DIR = \ GPIO3DIR = 0; //________ Reset_All_GPIO_Pins_to_default ______________________________________ //_____________________ Primary_Function. ______________________________________ IOCON_PIO2_6 = \ IOCON_PIO2_0 = \ IOCON_RESET_PIO0_0 = \ IOCON_PIO0_1 = \ IOCON_PIO1_8 = \ IOCON_PIO0_2 = \ IOCON_PIO2_7 = \ IOCON_PIO2_8 = \ IOCON_PIO2_1 = \ IOCON_PIO0_3 = \ IOCON_PIO1_9 = \ IOCON_PIO2_4 = \ IOCON_PIO2_5 = \ IOCON_PIO0_6 = \ IOCON_PIO0_7 = \ IOCON_PIO2_9 = \ IOCON_PIO2_10 = \ IOCON_PIO2_2 = \ IOCON_PIO0_8 = \ IOCON_SWCLK_PIO0_10 = \ IOCON_PIO2_11 = \ IOCON_PIO3_0 = \ IOCON_PIO3_1 = \ IOCON_PIO2_3 = \ IOCON_PIO3_2 = \ IOCON_PIO1_5 = \ IOCON_PIO3_3 = 0x50;//________ 0b01010000 IOCON_PIO1_10 = \ IOCON_R_PIO0_11 = \ IOCON_R_PIO1_0 = \ 38 IOCON_R_PIO1_1 = \ IOCON_R_PIO1_2 = \ IOCON_SWDIO_PIO1_3 = \ IOCON_PIO1_4 = \ IOCON_PIO1_11 = 0xD0;//_______ 0b11010000 IOCON_PIO0_4 = \ IOCON_PIO0_5 = 0x00;//0b0000000000000000 } //_______________________ TMR0_IRQHandler ______________________________________ //____________ Timer_0_interrupt_Handler. ______________________________________ void CT32B0_IRQHandler (void) { ++Ticks; TMR32B0IR_bit.MR0INT = 1;//________________________________ Clear_Interrupt __ NVIC_ClrPend(NVIC_CT32B0);//__________________________________________________ } //________________________________ Timers ______________________________________ void CT32B0_Init(Int32U tps) { Ticks = 0; SYSAHBCLKCTRL_bit.CT32B0 = 1;//_________________________ Enable_TIM0_Clocks __ //___________________________ Init_Timer0 ______________________________________ TMR32B0TCR_bit.CE = 0;//__________________________________ Counting_Disable __ TMR32B0TCR_bit.CR = 1;//_________________________________________ Set_Reset __ TMR32B0TCR_bit.CR = 0;//_____________________________________ Release_Reset __ TMR32B0CTCR_bit.CTM = 0;//____________ Timer32_Mode: Every_Rising_PCLK_Edge __ TMR32B0MCR_bit.MR0I = 1;//_________________________ Enable_Interrupt_on_MR0 __ TMR32B0MCR_bit.MR0R = 1;//____________________________ Enable_Reset_on_MR0 __ TMR32B0MCR_bit.MR0S = 0;//_____________________________ Disable_Stop_on_MR0 __ //_____________________ Set_Timer0_Period ______________________________________ TMR32B0PR = 0; TMR32B0MR0 = (SYS_GetMainClk()/(SYSAHBCLKDIV))/(tps); //_________________ Init_Timer0_Interrupt ______________________________________ TMR32B0IR_bit.MR0INT = 1;//________________________ Clear_Pemding_Interrupt __ TMR32B0TCR_bit.CE = 1;//___________________________________ Counting_Enable __ //____________ Enable_NVIC_TMR0_Interrupt ______________________________________ NVIC_IntEnable(NVIC_CT32B0); NVIC_IntPri(NVIC_CT32B0,16); } void CT32B0_Stop(void) { TMR32B0TCR_bit.CE = 0;//__________________________________ Counting_Disable __ NVIC_IntDisable(NVIC_CT32B0); SYSAHBCLKCTRL_bit.CT32B0 = 0;//______________________________ Disable_Clock __ } //______________________________________________________________________________ int delay(Int32U n) { for(Int32U x=0;x<n;x++); } int main(void) 39 { /*char buf[3]; int n,p; float tmp;*/ InitClock(132MHZ, 2);//_________________________________________ Init clock __ SYSAHBCLKCTRL_bit.GPIO = 1;//____________________________ Enable GPIO Clock __ SYSAHBCLKCTRL_bit.IOCON = 1;//__________________________ Enable IOCON Clock __ GpioInit();//__________________________________ Set all pins as input ports __ //_____________________________________________ UART Init: 115200 bps, 8-bit, UART_Init(115200);//____________________________ 1-Stop bit, Parity - None. __ CT32B0_Init(10);//_________________ Enable Timer. Ticks 10 times per second __ while(1){ printf("**************************\n\r"); delay(1000000);//______________________________________________ delay 100mS __ printf("* Esto es una prueba *\n\r"); delay(1000000);//______________________________________________ delay 100mS __ printf("* Prueba Finalizada *\n\r"); delay(1000000);//______________________________________________ delay 100mS __ printf("**************************\n\r"); delay(1000000);//______________________________________________ delay 100mS __ } } static int MyLowLevelGetchar(void) { int ch; if(U0LSR_bit.DR) { ch = U0RBR; if(U0LSR_bit.OE || U0LSR_bit.PE || U0LSR_bit.FE ) { return (ch | 0x10000000); } return (ch & 0xff ); } return -1; } Tabla 4.6 Código funcional del comunicación UART 4.8.7 ADC El microcontrolador cuenta con 10 canales ADC con 10 bits de resolución, en la siguiente práctica se tomará lectura de los diferentes canales. En la tabla 4.7 esta el código con las funciones que configurara al micro para hacer lecturas de los canales ADC. 40 #include "LPC11xx.h" #include "adc.h" volatile uint32_t ADCValue[ADC_NUM];//variable para almacenar valores volatile uint32_t ADCIntDone = 0; #if ADC_INTERRUPT_FLAG //_____________________________ ADC_IRQHandler _________________________________ //______________________ ADC_Interrupt_Handler _________________________________ void ADC_IRQHandler (void) { uint32_t regVal; regVal = LPC_ADC->STAT;//________________ Read_ADC_Will_Clear_The_Interrupt __ if(regVal & 0x0000FF00)//________________________ Check_OVERRUN_Error_First __ { regVal = (regVal & 0x0000FF00) >> 0x08; //_________ If_Overrun,Just_Read_ADDR_To_Clear //____________ regVal_Variable_Has_Been_Reused switch (regVal) { case 0x01: regVal = LPC_ADC->DR[0]; break; case 0x02: regVal = LPC_ADC->DR[1]; break; case 0x04: regVal = LPC_ADC->DR[2]; break; case 0x08: regVal = LPC_ADC->DR[3]; break; case 0x10: regVal = LPC_ADC->DR[4]; break; case 0x20: regVal = LPC_ADC->DR[5]; break; case 0x40: regVal = LPC_ADC->DR[6]; break; case 0x80: regVal = LPC_ADC->DR[7]; break; default: break; } LPC_ADC->CR &= 0xF8FFFFFF;//________________________________ Stop_ADC_Now __ ADCIntDone = 1; return; } if (regVal & ADC_ADINT) { switch(regVal & 0xFF)//___________________________________ Check_Done_Bit __ { case 0x01: ADCValue[0] = (LPC_ADC->DR[0]>>6) & 0x3FF; break; case 0x02: ADCValue[1] = (LPC_ADC->DR[1]>>6) & 0x3FF; break; case 0x04: ADCValue[2] = (LPC_ADC->DR[2]>>6) & 0x3FF; break; case 0x08: ADCValue[3] = (LPC_ADC->DR[3]>>6) & 0x3FF; break; case 0x10: ADCValue[4] = (LPC_ADC->DR[4]>>6) & 0x3FF; break; case 0x20: ADCValue[5] = (LPC_ADC->DR[5]>>6) & 0x3FF; break; case 0x40: ADCValue[6] = (LPC_ADC->DR[6]>>6) & 0x3FF; break; case 0x80: ADCValue[7] = (LPC_ADC->DR[7]>>6) & 0x3FF; break; default: break; } #if BURST_MODE channel_flag |= (regVal & 0xFF); if ( (channel_flag & 0xFF) == 0xFF) { 41 //_____________ All_The_Bits_in_Have_Been_set, //___________________ it_Indicates_All_The_ADC //______________ Channels_Have_Been_Converted. LPC_ADC->CR &= 0xF8FFFFFF;//______________________________ Stop_ADC_Now __ ADCIntDone = 1; } #else LPC_ADC->CR &= 0xF8FFFFFF;//________________________________ Stop_ADC_Now __ ADCIntDone = 1; #endif } return; } #endif //____________________________________ ADCInit _________________________________ //____________________ Initialize_ADC_Channels _________________________________ //_____________________________ ADC_Clock_Rate _________________________________ void ADCInit(uint32_t ADC_Clk) { uint32_t i; LPC_SYSCON->PDRUNCFG &= ~(0x1<<4);//_ Disable_Power_Down_Bit_to_The ADC_Block LPC_SYSCON->SYSAHBCLKCTRL |= (1<<13);//________ Enable_AHB_Clock_to_The_ADC __ for ( i = 0; i < ADC_NUM; i++ ) { ADCValue[i] = 0x0; } //__ Unlike some other pings, for ADC test, all the pins need //__ to set to analog mode. Bit 7 needs to be cleared according //__ to design team. #ifdef __JTAG_DISABLED LPC_IOCON->JTAG_TDI_PIO0_11 &= ~0x8F;//_____________________ ADC I/O config __ LPC_IOCON->JTAG_TDI_PIO0_11 |= 0x02;//_____________________________ ADC IN0 __ LPC_IOCON->JTAG_TMS_PIO1_0 &= ~0x8F;//_____________________ ADC I/O config __ LPC_IOCON->JTAG_TMS_PIO1_0 |= 0x02;//_____________________________ ADC IN1 __ LPC_IOCON->JTAG_TDO_PIO1_1 &= ~0x8F;//_____________________ ADC I/O config __ LPC_IOCON->JTAG_TDO_PIO1_1 |= 0x02;//_____________________________ ADC IN2 __ LPC_IOCON->JTAG_nTRST_PIO1_2 &= ~0x8F;//____________________ ADC I/O config __ LPC_IOCON->JTAG_nTRST_PIO1_2 |= 0x02;//____________________________ ADC IN3 __ LPC_IOCON->ARM_SWDIO_PIO1_3 &= ~0x8F;//___________________ ADC I/O config __ LPC_IOCON->ARM_SWDIO_PIO1_3 |= 0x02;//___________________________ ADC IN4 __ #endif LPC_IOCON->PIO1_4 &= ~0x8F;//__________ Clear bit7,change to analog mode __ LPC_IOCON->PIO1_4 |= 0x01;//____________________________________ ADC IN5 __ LPC_IOCON->PIO1_10 &= ~0x8F;//__________ Clear bit7,change to analog mode __ LPC_IOCON->PIO1_10 |= 0x01;//____________________________________ ADC IN6 __ LPC_IOCON->PIO1_11 &= ~0x8F;//__________ Clear bit7,change to analog mode __ LPC_IOCON->PIO1_11 |= 0x01;//____________________________________ ADC IN7 __ LPC_ADC->CR = (0x01<<0)|//_______________ Sel=1,_Select_Channel_0~7_on_ADC* __ ((SystemAHBFrequency/ADC_Clk-1)<<8)|//____________ CLKDIV=Fpclk/1000000-1 __ 42 ( 0 << 16 ) | //___________ BURST=0,_no_Burst_Software_Controlled __ ( 0 << 17 ) | //________________________ CLKS=0,11_clocks/10_Bits __ ( 1 << 21 ) | //__________________________ PDN=1,Normal_Operation __ ( 0 << 22 ) | //____________________________________ TEST1:0 = 00 __ ( 0 << 24 ) | //____________________ START=0 A/D_Conversion_Stops __ ( 0 << 27 ); //__ EDGE=0 (CAP/MAT Singal_Falling,_Trigger_A/D_Conversion __ //_____ If_Polling,no_Need_to_do_The_Following #if ADC_INTERRUPT_FLAG NVIC_EnableIRQ(ADC_IRQn); LPC_ADC->INTEN = 0x1FF;//_____________________________ Enable_All_Interrupt __ #endif return; } //____________________________________ ADCRead _________________________________ //___________________________ Read_ADC_Channel _________________________________ //_____________________________ Channel_Number _________________________________ //_____________ Value_Read,if_Interrupt_Driven _________________________________ //__________________________ Return_Channel_#. _________________________________ uint32_t ADCRead(uint8_t channelNum) { #if !ADC_INTERRUPT_FLAG uint32_t regVal, ADC_Data; #endif if(channelNum >= ADC_NUM)//___________________ Channel_Number_is0_Through 7 __ { channelNum = 0;//_____________________________________ Reset_Channel_to_0 __ } LPC_ADC->CR &= 0xFFFFFF00; LPC_ADC->CR |= (1<<24)|(1<<channelNum);//_ Switch_Channel,Start_A/D_Convert __ #if !ADC_INTERRUPT_FLAG while(1)//___________________________________ Wait_Until_End_of_A/D_Convert __ { regVal = *(volatile unsigned long *)(LPC_ADC_BASE + ADC_OFFSET + ADC_INDEX * channelNum); if(regVal & ADC_DONE)//____________________ Read_Result_of_A/D_Conversion __ { break; } } LPC_ADC->CR &= 0xF8FFFFFF;//__________/* */___________________ Stop_ADC_Now __ if(regVal & ADC_OVERRUN)//Save_Data_when_it's_not_Overrun,OtherwiseReturn_0 __ { return(0); } //ADC_Data = (regVal>>6) & 0x3FF; ADC_Data = ( regVal >> 6 ) & 0x3FF; return(ADC_Data);//____________________________ Return A/D Conversion_Value __ #else return( channelNum );//________ if_It's_Interrupt_Driven,the_ADC_Reading_is __ //_____ Done_Inside_the_Handler.So,return_Channelnumber. __ 43 #endif } //______________________________ ADC0BurstRead _________________________________ //__________________ Use_Burst_Mode_to_Convert _________________________________ //_____________________ Multiple_Channel_Once. _________________________________ void ADCBurstRead( void ) { if(LPC_ADC->CR & (0x7<<24)) { LPC_ADC->CR &= ~(0x7<<24); } //_______________________________ Test_Channel 5,6,7 Using_Burst_Mode_Because __ //___________________________________ They_Are_Not_Shared_with_the_JTAG_Pins. __ LPC_ADC->CR &= ~0xFF; LPC_ADC->CR |= (0xFF);//_____________________ Read_All_Channels,0_Through_7 __ LPC_ADC->CR |= (0x1<<16);//___________ Set_Burst_Mode_and_Start_A/D_Convert __ return;//______________ The_ADC_Reading_is_Done_Inside_The_Handler,_Return0 __ } //_______________________________ End_1st_File _________________________________ //____________________________________________________________________________// Tabla 4.6 Código correspondiente a la configuración del ADC El código se dividió en dos secciones para minimizar el tamaño del código funcional. En la tabla 4.7 se aprecia el código principal. #include "LPC11xx.h" #include "adc.h" //______________________________________________________________________________ extern volatile uint32_t ADCValue[ADC_NUM]; extern volatile uint32_t ADCIntDone; //_______________________________________ main _________________________________ //____________________________ Functional_Code _________________________________ int main(void) { uint32_t i=0; SystemInit(); ADCInit(ADC_CLK); while(1){ for(i=0;i<ADC_NUM;i++) { #if ADC_INTERRUPT_FLAG ADCRead(i); while(!ADCIntDone); ADCIntDone = 0; #endif } } } Tabla 4.7 Código principal del ADC 44 4.8.8 ADQ En esta práctica se tomarán lecturas de los canales ADC, y se transmitirá esa información a la PC. La parte uno de esta práctica corresponde a la configuración del ADC la cual está descrita en la tabla 4.6. El código principal (Tabla 4.8) se encarga de llamar a las funciones definidas en la parte uno, además de configurar el puerto UART. Se creó una función extra que convertirá los valores de las lecturas en ASCII, para que así esa información sea enviada al PC. #include "LPC11xx.h" #include "adc.h" #include "uart.h" //______________________________________________________________________________ extern volatile uint32_t ADCValue[ADC_NUM]; extern volatile uint32_t ADCIntDone; extern volatile uint32_t UARTCount; extern volatile uint8_t UARTBuffer[BUFSIZE]; //_____________________________ ConvertDigital _________________________________ uint8_t ConvertDigital ( uint8_t digital )//convertidor a ASCII { uint8_t ascii_char; if((digital>=0) && (digital<=9)) { ascii_char = digital + 0x30;//_______________________________________ 0~9 __ } else { ascii_char = digital - 0x0A; ascii_char += 0x41;//________________________________________________ A~F __ } return (ascii_char); } //_______________________________________ main _________________________________ //____________________________ Functional_Code _________________________________ int main(void) { uint32_t i=0; SystemInit(); ADCInit(ADC_CLK); UARTInit(115200); 45 while(1){ for(i=0;i<ADC_NUM;i++) { #if ADC_INTERRUPT_FLAG ADCRead(i); while(!ADCIntDone); ADCIntDone = 0; #else ADCValue[i] = ADCRead(i)//_______________________________________ Polling __ #endif } //_______________________________________ UART _________________________________ for(i=0;i<ADC_NUM;i++) { UARTBuffer[0] = ConvertDigital( (uint8_t)(ADCValue[i]>>28)); UARTBuffer[1] = ConvertDigital( (uint8_t)((ADCValue[i]>>24)&0xF)); UARTBuffer[2] = ConvertDigital( (uint8_t)((ADCValue[i]>>20)&0xF)); UARTBuffer[3] = ConvertDigital( (uint8_t)((ADCValue[i]>>16)&0xF)); UARTBuffer[4] = ConvertDigital( (uint8_t)((ADCValue[i]>>12)&0xF)); UARTBuffer[5] = ConvertDigital( (uint8_t)((ADCValue[i]>>8)&0xF)); UARTBuffer[6] = ConvertDigital( (uint8_t)((ADCValue[i]>>4)&0xF)); UARTBuffer[7] = ConvertDigital( (uint8_t)(ADCValue[i]&0xF)); UARTBuffer[8] = '\r'; UARTBuffer[9] = '\n'; UARTSend((uint8_t *)UARTBuffer, 10); } } } Tabla 4.8 Código principal del ADC 4.9 Realización de manual de operación Una vez realizadas todas las prácticas, se desarrolló un manual en el que se explican las propiedades del microcontrolador, en dónde se desarrollaron las prácticas, las características de la tarjeta de desarrollo, cómo modificar el oscilador del micro, y cómo se modificaron las opciones de configuración del software que se utilizó. 4.10 Verificación y ajuste del manual de operación Una vez elaborado el manual, se hizo una evaluación del mismo para verificar el contenido del proyecto. Esta evaluación fue hecha por el director de la empresa. Se le realizaron algunos ajustes para cumplir con los requisitos de la empresa. 46 4.11 Implementación del proyecto Al realzar los ajustes necesarios este manual fue presentado al personal de la empresa, entregándoseles una copia electrónica para su uso. Este hecho fue comunicado oportunamente al director de la empresa, el cual recibió la noticia en forma favorable, pues responde a lo que la empresa requería. Con esta implementación la empresa continúa su tarea de renovación que le seguirá abriendo mercado, ganando clientes y mejorando la calidad de sus productos. 47 CAPÌTULO V ACTIVIDADES DIVERSAS A lo largo de la estadía en la empresa AUTOMATIZACION INTELIGENTE DE MEXICO S.A. se realizaron varias actividades sin relación directa con el proyecto principal, pero que tuvieron también una importancia significativa. Todo ello, sin embargo estuvo relacionado con el ensamble y soldado de piezas SMT y PTH. 5.1 Ensamble SMT y PTH. En la empresa AUTOMATIZACIÓN INTELIGENTE DE MÉXICO S.A. en el equipo de PCBRAPIDO.COM se dedica al ensamble de piezas SMT y PTH, debido a las grandes cantidades de piezas a ensamblar, continuamente se estaba prestando apoyo a esta área. Estas actividades fueron importantes, ya que, así se tuvo la oportunidad de conocer los distintos procesos que lleva ensamblar este tipo de tarjetas electrónicas y conocer su manera de soldado. Figura 5.1 SMT montado en tarjeta. 49 CAPÍTULO VI EVALUACIÓN ECONÓMICA Y RESULTADOS OBTENIDOS 6.1 Evaluación económica En todo proyecto es necesario llevar un estimado de los gastos que se requerirán a lo largo del mismo, tomando en cuenta los imprevistos que pueden presentarse en cualquier momento. En la tabla 6.1 se describen los gastos que se generaron en la realización de este proyecto. Descripción Unidad Precio Unitario Precio Total Programador USB ATMEL 1 $525,00 $525,00 ATMEGA8 1 $95,00 $95,00 Placa de desarrollo LPCP 1114 1 $77,00 $77,00 1 $1.898,60 $1.898,60 864 $25,00 $21.600,00 J-Tag Debugger Horas hombre Total= $24.195,60 Tabla 6.1 Estimación de gastos del proyecto 6.2 Resultados obtenidos Al término del periodo de estadía, los resultados a los que se llegó fueron satisfactorios. Después de realizar los ajustes necesarios al manual, se realizó correctamente la estandarización del manual y fue entregado. Por estos motivos la empresa AIMSA aprobó los resultados del proyecto desarrollado, el cual le generará importantes beneficios económicos y un mayor campo de desarrollo, todo lo cual ayudará en último terminó a reafirmar la confianza de sus clientes. 51 CONCLUSIONES Después de haber estado algunos meses enfrentando la vida laboral dentro en la empresa AUTOMATIZACIÓN INTELIGENTE DE MÉXICO S.A., me di cuenta de que es muy distinta la vida estudiantil a la laboral, así como las perspectivas de otras personas con respecto al trabajo, Entendí que no es fácil para alguien que no tiene experiencia profesional adaptarse de manera rápida al mundo empresarial. A lo largo de este proyecto apliqué conocimientos adquiridos a lo largo los dos años que estuve en la UTEQ, pero también aprendí muchísimas otras cosas que lamentablemente no enseñan en la UTEQ. Por otra parte, este proyecto fue interesante para mí, ya que trabajar siempre con nuevas tecnologías es muy importante y, sobre todo, porque estuve laborando sobre algo que me gusta: la programación. "El trabajo pesado es por lo general la acumulación de tareas livianas que no se hicieron a tiempo." 53 BIBLIOGRAFÍA http://www.iar.com/website1/1.0.1.0/14/1/ http://www.olimex.cl/present.php?page=que_es_un_microcontrolador http://www.atmel.com/products/avr/ http://www.olimex.cl/present.php?page=que_es_un_microcontroladorcaro.eii.us.es/desc argas/Programacion_C_microcontroladores.pdf http://www.taringa.net/posts/info/945123/El-verdadero-concepto-de-portabilidad.html 55