universidad tecnológica de querétaro

Anuncio
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
Descargar