Diseño e Implementación de un Analizador Lógico Digital basado en Microprocesador ARM7

Page 1

UNIVERSIDAD DE VALLADOLID DEPARTAMENTO DE ELECTRICIDAD Y ELECTRÓNICA

ESCUELA TÉCNICA SUPERIOR DE INGENIEROS DE TELECOMUNICACIÓN

PROYECTO FIN DE CARRERA INGENIERO EN ELECTRÓNICA

DISEÑO E IMPLEMENTACIÓN DE UN ANALIZADOR LÓGICO DIGITAL BASADO EN MICROPROCESADOR ARM7

Autor: Marta Vilariño Valle Tutor: Dr. Jesús M. Hernández Mangas Julio de 2014



TÍTULO:

Diseño e Implementación de un Analizador Lógico Digital basado en microprocesador ARM7

AUTOR:

Marta Vilariño Valle

TUTOR:

Dr. Jesús M. Hernández Mangas

DEPARTAMENTO:

Departamento de Electrónica

Miembros del Tribunal

PRESIDENTE:

Jesús Arias

VOCAL:

Jesús M. Hernández Mangas

SECRETARIO:

Héctor García

SUPLENTE:

Ruth Pinacho

FECHA DE LECTURA:

CALIFICACIÓN:



RESUMEN El objetivo del proyecto es diseñar e implementar un analizador lógico digital basado en un microprocesador ARM7. Este analizador almacenará en memoria interna los datos recogidos de las señales digitales de entrada a la velocidad de muestreo indicada por el usuario. Para la configuración e interacción con el analizador lógico se implementará una interfaz gráfica para el ordenador personal que manejará el usuario y donde se mostrarán gráficamente las señales de entrada. Además, se permitirá aumentar o disminuir las señales para su mejor visualización así como guardar los datos y las imágenes obtenidas e incluso cargar datos de capturas anteriores. El microprocesador elegido será el modelo LPC2114, del fabricante NXP Semiconductors, que se ajusta a los requisitos establecidos al principio del proyecto. El analizador será lo más pequeño posible y se alimentará a 5V mediante USB conectado al ordenador personal para dotarle de portabilidad y facilidad de uso.

ABSTRACT The aim of the Project is to design and implement a digital logic analyzer based on ARM7 microprocessors. The analyzer will store all collected data from input digital signals to the sampling rate specified by the user, in an internal memory. For configuration and interaction with the digital logic analyzer, a graphical interface will be implemented to the personal computer, which will handle by the user and display digital input signals graphically. Furthermore, it will increase or decrease the input signals for better display and it will save data and obtained images and even upload data from previous catches. The selected microprocessor will be the LPC2114 device, whose manufacturer is NXP Semiconductors. This device conforms the early requirements in the Project. In addition, the analyzer will be as small as possible and the power supply will be 5V, which will be obtained through USB connected to personal computer. This will give it portability and ease of use.

PALABRAS CLAVE Analizador digital, microprocesadores ARM7, comunicación serie, muestreo digital de señales, diseño hardware/software.



AGRADECIMIENTOS

A mis padres, porque sin su apoyo, paciencia y confianza en mí no hubiera sido posible llegar hasta aquí. A mi tutor, Jesús Hernández Mangas, por brindarme la oportunidad de realizar este proyecto y por su ayuda, interés, paciencia y esmero en todo momento. A mis amigos de la universidad, mi pequeña universitaria”, por todos esos momentos inolvidables.

“familia

A mis amigos “amuveros”, por todo lo que hemos aprendido juntos, especialmente a Raulín con quien tantos ratos he dedicado a programar desde aquel Epi velocista. A mi gran amiga Penélope: estuvo, está y estará.

Gracias a todos.



Contenido

I

CONTENIDO RESUMEN .................................................................................................................... V ABSTRACT .................................................................................................................. V PALABRAS CLAVE .................................................................................................... V Capítulo 1 INTRODUCCIÓN Y OBJETIVOS .......................................................5 1.1 Presentación del proyecto ......................................................................................... 5 1.2 Objetivos del proyecto .............................................................................................. 7 1.3 Especificaciones y requisitos iniciales. ..................................................................... 7 1.3.1. PCB Analizador Lógico ..................................................................................... 7 1.3.2. Interfaz gráfica de usuario para PC .................................................................... 9 1.4 Estructura de la memoria ........................................................................................ 10 Capítulo 2 PREPARACIÓN DEL ENTORNO DE TRABAJO ............................11 2.1 Elección e Instalación de los Programas ................................................................. 11 2.2 Programación y Simulación con VSM Studio y Proteus ........................................ 12 2.3 Programación de la memoria Flash del Microcontrolador ..................................... 14 Capítulo 3 DISEÑO HARDWARE .....................................................................17 3.1 Definición de especificaciones ............................................................................... 17 3.1.1. Especificaciones para la realización del diseño electrónico de la placa y elección del microcontrolador ........................................................................................................ 17 3.1.2. Especificaciones de funcionamiento real deseado del analizador controlado desde la aplicación que controlaremos desde el PC................................................................. 18 3.2 Diagrama de bloques .............................................................................................. 18 3.2.1. Red de alimentación y transmisión de datos .................................................... 18 3.2.2. Microcontrolador ............................................................................................. 18 3.2.3. Señales de Entrada ........................................................................................... 20 3.3 Desarrollo de esquemas .......................................................................................... 20 3.3.1. Microcontrolador ............................................................................................. 20 3.3.2. USB y Alimentación ........................................................................................ 21 3.3.3. Registros de Desplazamiento ........................................................................... 22 3.4 Desarrollo de librerías ............................................................................................. 22 3.5 Documentación Técnica: Cálculo de consumos, test points y puertos ................... 23 3.5.1. Cálculo de consumos de potencia .................................................................... 23 3.5.2. Mapeo de Puertos............................................................................................. 24 3.6 Documentación de Fabricación .............................................................................. 24 3.6.1. Acabado superficial de la placa ....................................................................... 25 3.6.2. Requerimientos especiales: control de impedancias, reflow ............................ 25 3.6.3. Stack-up ........................................................................................................... 26 3.7 Contorno ESD......................................................................................................... 26 3.8 Definición de forma ................................................................................................ 27 3.9 Reglas de diseño ..................................................................................................... 28 3.10 Posicionamiento .................................................................................................... 30 3.11 Rutado ................................................................................................................... 31 3.11.1. Capa Top ........................................................................................................ 32 3.11.2. Capa Bottom .................................................................................................. 32 3.11.3. Visualización 3D............................................................................................ 34 3.12 Check outs ............................................................................................................ 36 3.13 Documentos de fabricación .................................................................................. 37 3.13.1. Definición del panel ....................................................................................... 37

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


II

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

3.13.2. Output Jobs .................................................................................................... 37 3.14 Acopio de material ................................................................................................ 38 3.15 Ensamblado de prototipo ...................................................................................... 39 3.16 Validación de prototipo (AMFE: Análisis Modal de Fallos y Efectos) ................ 39 Capítulo 4 DISEÑO SOFTWARE DEL MICROCONTROLADOR .....................41 4.1 Microprocesadores ARM7 ...................................................................................... 41 4.2 Elección del dispositivo: LPC2114......................................................................... 42 4.2.1. Diagrama de bloques........................................................................................ 43 4.2.2. Información de los pines .................................................................................. 44 4.2.3. Mapa de memoria ............................................................................................ 45 4.3 Creación de proyectos y aplicaciones con el ARM ................................................ 46 4.3.1. Lenguaje de programación: El Lenguaje C...................................................... 46 4.3.2. Herramientas de desarrollo: El compilador Yagartoy VSMStudio.................. 47 4.3.3. Elementos de un proyecto ................................................................................ 48 4.4 Configuración del dispositivo LPC2114................................................................. 49 4.4.1. Hoja de especificaciones del dispositivo ......................................................... 49 4.4.2. Arquitectura del LPC2114 ............................................................................... 50 4.5 Configuración y gestión de entradas y salidas digitales ......................................... 50 4.5.1. Pin Connect Block ........................................................................................... 51

4.5.1.1 Registros PINSEL ............................................................................51 4.5.2. GPIO ................................................................................................................ 53

4.5.2.1 Registros GPIO ................................................................................53 4.5.2.1.1 IODIRx: .....................................................................................53 4.5.2.1.2 IOSETx: .....................................................................................54 4.5.2.1.3 IOCLRx:.....................................................................................54 4.5.2.1.4 IOPINx: ......................................................................................54 4.5.2.2 Registros FAST GPIO .....................................................................55 4.6 Configuración del PLL configuración del oscilador del sistema. ........................... 55 4.6.1. Descripción del periférico ................................................................................ 56 4.6.2. Registros del PLL ............................................................................................ 58

4.6.2.1 PLLCON: Registro de Control del PLL ..........................................58 4.6.2.2 PLLCFG: Registro de Configuración del PLL ................................59 4.6.2.3 PLLSTAT: Registro de estado del PLL ...........................................59 4.6.2.4 Registro PLL Feed ...........................................................................59 4.6.3. Cálculo de frecuencia del PLL ......................................................................... 60 4.6.4. Proceso de ajuste de parámetros del proyecto ................................................. 61 4.7 Controlador de los Vectores de Interrupción (VIC) ............................................... 63 4.7.1. Descripción del periférico ................................................................................ 63 4.7.2. Registros del VIC ............................................................................................. 64 4.7.3. Fuentes de interrupción .................................................................................... 64 4.8 Configuración e Interrupción del TIMER0 Y/O TIMER1: .................................... 67 4.8.1. Descripción del periférico ................................................................................ 67 4.8.2. Registros del Timer: ......................................................................................... 69

4.8.2.1 TxTCR: Timer Control Register. .....................................................69 4.8.2.2 TxTC: Timer Counter. .....................................................................69 4.8.2.3 TxPR: Prescale Register. .................................................................69 4.8.2.4 TxPC: Prescale Counter ...................................................................70 4.8.2.5 TxMRx [MR0…MR3]: Match Registers.........................................70 4.8.2.6 TxMCR: Match Control Register. ...................................................70 4.8.2.7 TxCCR: Capture Control Register. ..................................................70 Vilariño Valle, Marta


Contenido

III

4.8.2.8 TxCRx [CR0…CR3]: Capture Register. .........................................70 4.8.2.9 TxEMR: External Match Register. ..................................................70 4.8.2.10 TxIR: Registro de interrupción. .....................................................72 4.8.3. Configuración del periférico para la aplicación ............................................... 73 4.9 Configuración e Interrupción del puerto serie de comunicación UART. ............... 79 4.9.1. Descripción del periférico ................................................................................ 79 4.9.2. Registros de la UART ...................................................................................... 79

4.9.2.1 U0RBR: Receiver Buffer Register...................................................80 4.9.2.2 U0THR: Transmit Holding Register ................................................80 4.9.2.3 U0DLL y U0DLM: Divisor Latch Registers ...................................80 4.9.2.4 U0FDR: Fractional Divider Register ...............................................81 4.9.2.5 U0FCR: FIFO Control Register .......................................................82 4.9.2.6 U0LCR: Line Control Register ........................................................83 4.9.2.7 U0LSR: Line Status Register ...........................................................84 4.9.3. Cálculo del Baud Rate ..................................................................................... 85 4.9.4. Registros de interrupción ................................................................................. 87

4.9.4.1 U0IER: Interrupt Enable Register ....................................................88 4.9.4.2 U0IIR: Interrupt Identification Register ..........................................88 4.9.5. Configuración del periférico para la aplicación ............................................... 90 4.10 Programa de Control del Analizador Lógico ........................................................ 92 4.10.1. Recepción y Envío de Tramas de Datos entre el Microprocesador y el PC... 93 4.10.2. Rutina Principal ............................................................................................. 99 4.10.3. Rutina de Recepción de Carácter por Interrupción UART0 ........................ 100 4.10.4. Rutina de Interpretación del Mensaje real Recibido .................................... 100 4.10.5. Rutina Periódica de Muestreo TIMER0....................................................... 100 Capítulo 5 APLICACIÓN PARA PC ................................................................ 107 5.1 Elección del Lenguaje de Programación............................................................... 107 5.2 Empezando el Proyecto ........................................................................................ 107 5.3 Creación de la Conexión ...................................................................................... 113 5.4 Compilar y Ejecutar .............................................................................................. 117 5.5 Manual de Usuario ................................................................................................ 118 5.5.1. Guía de instalación......................................................................................... 118 5.5.2. Guía de uso .................................................................................................... 121 Capítulo 6 RESULTADOS EXPERIMENTALES ............................................. 125 6.1 Caracterización del sistema. ................................................................................. 125 6.1.1. Pruebas de funcionamiento ............................................................................ 126

6.1.1.1 Test de la placa...............................................................................126 6.1.1.2 Funcionamiento de los periféricos .................................................128 6.1.2. Limitaciones del sistema ................................................................................ 129 6.1.3. Medidas experimentales................................................................................. 130 Capítulo 7 COSTE ECONÓMICO DEL PROYECTO ....................................... 133 7.1 Costes Directos ..................................................................................................... 133 7.1.1. Costes en Materias primas y componentes .................................................... 133 7.1.2. Costes de amortización de equipos y herramientas........................................ 133 7.1.3. Costes de software y licencias ....................................................................... 135 7.1.4. Costes por mano de obra empleada................................................................ 135 7.1.5. Costes Indirectos ............................................................................................ 136 7.1.6. Costes Totales del Proyecto ........................................................................... 138 7.1.7. Coste Unitario y Amortización del producto ................................................. 138 Capítulo 8 CONCLUSIONES Y LÍNEAS FUTURAS ....................................... 141

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


IV

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

ÍNDICE DE TÉRMINOS ................................................................................... 143 BIBLIOGRAFÍA ............................................................................................... 145 ANEXOS .......................................................................................................... 147 ANEXO I: Esquemas Electrónicos del Analizador Lógico Digital ............... 148 ANEXO II: Mapeo de Puertos del Diseño Completo ..................................... 153 ANEXO III: Costes: componentes y prototipado .......................................... 157 ANEXO IV: Mecanizado de la caja ................................................................. 161 ANEXO V: Creación de un proyecto en VSMStudio ..................................... 165 ANEXO VI: Configuración de los registros................................................... 167 Pin Connect Block: PINSEL0 y PINSEL1 ................................................................. 167 Pin Connect Block: GPIO ........................................................................................... 168 ANEXO VII: Código Fuente del Microcontrolador ........................................ 169 “main.c” ...................................................................................................................... 169 “crt.S” ......................................................................................................................... 181 “lpc2114.h” ................................................................................................................. 190 “linker_flash.ld”.......................................................................................................... 195 “makefile” ................................................................................................................... 196 ANEXO VIII: Código Fuente de la Aplicación para el PC ............................. 199 “Analizador_Logico_DigitalDlg.cpp” ........................................................................ 199 “Analizador_Logico_DigitalDlg.h” ............................................................................ 220 ANEXO IX: Placa de pruebas ......................................................................... 225 INDICE DE FIGURAS ...................................................................................... 231 INDICE DE TABLAS ........................................................................................ 235

Vilariño Valle, Marta


Introducción y Objetivos 5

Capítulo 1 INTRODUCCIÓN Y OBJETIVOS En este capítulo se presenta el desarrollo de este Proyecto Fin de Carrera (PFC) así como los objetivos y requisitos prefijados al iniciarlo y una descripción breve de la tecnología empleada. Un analizador lógico (AL) es una herramienta de medida y prueba que permite solucionar problemas sirviendo para la depuración digital del hardware y del software, así como la verificación del diseño. Los analizadores se emplean en medidas digitales con numerosas señales y requisitos de disparo complejos, que sirven como herramienta para los ingenieros que diseñan circuitos digitales. Históricamente, los analizadores lógicos surgen prácticamente a la par que los primeros microprocesadores comerciales. Aparecen en el mercado cuando se detecta que se requiere la observación de mayor número de señales de las que permiten los osciloscopios. Los analizadores lógicos han ido adaptando y mejorando su velocidad de adquisición y aumentado el número de canales, acordes con los avances tecnológicos digitales. Se han mencionado los osciloscopios pero ¿cuáles son sus similitudes y diferencias?, ¿y las capacidades de cada uno? La diferencia más obvia entre ambos instrumentos es el número de canales disponibles, un osciloscopio puede tener hasta 4 y un analizador entre 30 y 130 canales. Este último instrumento, sólo recibe señales digitales mientras que el osciloscopio visualiza señales de propósito general, principalmente analógicas, y captura muchos puntos permitiendo así el análisis detallado de transiciones entre flancos, eventos de transitorios e incrementos de tiempo pequeños. ¿Cuándo se emplea uno u otro instrumento de medida? Para medir características analógicas (amplitud, potencia, corriente, fases, tiempo entre flancos de subida o bajada, detección de fallos de transitorios, retardos, espectro, etc) de un reducido número de señales se emplearán osciloscopios. Sin embargo, cuando lo que se quiere es depurar, testear y solucionar problemas de muchas señales de un sistema digital, el instrumento adecuado será el analizador lógico digital.

1.1 Presentación del proyecto El desarrollo del proyecto que recoge este documento ha sido propuesto por el Dr. Jesús M. Hernández Mangas [1], profesor perteneciente al Departamento de Electricidad y Electrónica de la Escuela Técnica Superior de Ingenieros de Telecomunicación (ETSIT). 

La primera parte del proyecto consistió en elegir el microprocesador dentro de la tecnología ARM que se adaptaba a los requisitos necesarios, y los componentes que compondrían la Placa de Circuito Impreso (PCB).

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


6

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Registros de Muestreo

ADC

RELOJ MUESTREO

Canales entrada

Selector Reloj

Memoria de Adquisición

Análisis Y Visualización

Lógica de Disparo Control de Memoria

Reloj Interno

Figura 1.1 Diagrama de Bloques de un Analizador Lógico Digital

 

La segunda parte consistió en el diseño electrónico de la PCB y el posterior rutado de ésta, que realizará funciones de analizador lógico digital. En esta parte se incluyen el desarrollo de librerías necesarias. En la tercera parte se desarrolló el programa C del microprocesador y su correspondiente simulación en Proteus. En la cuarta parte se construyó físicamente la placa que, dadas sus pequeñas dimensiones y sensibilidad de las líneas de datos, se ha fabricado en el proveedor Itead Studio. Posteriormente, se soldaron todos los componentes que conforman la PCB. En la quinta parte del proyecto se realizó la aplicación para el ordenador personal (PC) que se comunicará con la PCB diseñada y mostrará las señales de entrada deseadas. En sexto lugar se han comprobado los resultados experimentales de conectar la PCB a la aplicación del PC y ajustar todos los parámetros para su funcionamiento más óptimo, que en este caso será el funcionamiento más rápido sin pérdida de datos.

Por último, se han realizado otros trabajos a mayores en este proyecto, como son el diseño de otra PCB para pruebas y un mecanizado de una caja donde se introducirá la PCB principal.

Vilariño Valle, Marta


Introducción y Objetivos 7

1.2 Objetivos del proyecto El objetivo principal de este PFC es la realización de un analizador lógico digital de tamaño reducido que capture datos de 4 señales de entrada lo más rápido posible, los cuales serán representados en la aplicación gráfica del PC. Para ello, se desarrollará la parte hardware o PCB que será el AL y la aplicación de usuario que mostrará las señales por pantalla en el PC. Las principales funciones que debe cumplir el sistema completo son: 

  

Configuración del analizador por el usuario desde la aplicación del PC para la captura de las 4 señales (canales) de entrada. Entre los posibles parámetros seleccionables están: o puerto COM, o velocidad puerto COM (en baudios), o modo de disparo de cada canal: no disparo, nivel alto, nivel bajo, flanco de subida, flanco de bajada. o frecuencia de muestreo. o Modo de captura: único (llenado del buffer de memoria interno y representarlo una vez tras haber sido transmitido) o continuo (llenado del buffer y representado continuamente). Adquisición de los datos de las 4 señales (canales) de entrada en función de la configuración realizada en la aplicación del PC por el usuario . Almacenamiento de los datos en el buffer de memoria interno. Transmisión de los datos por el puerto serie hacia la aplicación del PC para la representación de las señales en pantalla. La transmisión debe ser segura.

Además de lo mencionado anteriormente, a la consecución de los objetivos planteados, hay que sumarle el esfuerzo de documentar y redactar el documento presente, extraer conclusiones y lecciones aprendidas y proponer líneas futuras de trabajo.

1.3 Especificaciones y requisitos iniciales. A la hora de plantear el alcance del proyecto, se propusieron unos requisitos mínimos alcanzables, tanto en la parte de diseño y desarrollo hardware, como en la implementación de la interfaz gráfica de usuario para PC.

1.3.1. PCB Analizador Lógico Dado el carácter académico del PFC, para el diseño de esquemas y el rutado se ha empleado el programa de diseño electrónico, Proteus, y su extensión para programación del microprocesador, VSMStudio.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


8

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

Entre los requisitos tÊcnicos se encuentran:         

Hasta 4 canales digitales. Alta impedancia de entrada. Niveles TTL (0v – 5v). Frecuencia del cristal de cuarzo externo: 12MHz. Velocidad de muestreo måxima: 2MSps. Buffer de memoria lo mås grande posible: 16KB (RAM). Velocidad de funcionamiento elevada. Para ello configuraremos los registros de desplazamiento en modo serie-paralelo. Bajo consumo de potencia. Bus Serie Universal (USB), para programación y recepción y envío de datos

Teniendo en cuenta los requisitos anteriores, que son los datos mĂĄs restrictivos, calcularemos en las ecuaciones (1.1) y (1.2), el tiempo mĂĄximo que tarda en llenarse la memoria con estos valores. 2đ?‘€

đ?‘šđ?‘˘đ?‘’đ?‘ đ?‘Ąđ?‘&#x;đ?‘Žđ?‘ đ?‘?đ?‘–đ?‘Ąđ?‘ Ă—4 = 8 đ?‘€đ?‘?đ?‘?đ?‘ đ?‘ đ?‘’đ?‘”đ?‘˘đ?‘›đ?‘‘đ?‘œ đ?‘šđ?‘˘đ?‘’đ?‘ đ?‘Ąđ?‘&#x;đ?‘Ž 16đ??žđ??ľ Ă— 8

đ?‘?đ?‘–đ?‘Ąđ?‘ = 128đ??ž đ?‘?đ?‘–đ?‘Ąđ?‘ đ?‘?đ?‘Śđ?‘Ąđ?‘’

128đ??žđ?‘?đ?‘–đ?‘Ąđ?‘ = 16đ?‘šđ?‘ 8đ?‘€đ?‘?đ?‘?đ?‘

(1.1)

(1.2)

(1.3)

Por tanto, de la ecuaciĂłn (1.3) se deduce que, para la velocidad de muestreo mĂĄxima deseable de 2MSps, se tarda 16ms en llenar la memoria de tamaĂąo igual a 16KB (RAM). Entonces, para 1MSps tardarĂ­a en llenarse 32ms, para 1KSps tardarĂ­a 32s, y asĂ­ sucesivamente. Por otro lado, se debe realizar el cĂĄlculo del nĂşmero de elementos que puede almacenar el buffer circular, donde se van a almacenar los elementos que proceden de cada registro de desplazamiento. A partir de la Figura 1.2, teniendo en cuenta que el tamaĂąo total del que se dispone es de 16KB (RAM) y que cada posiciĂłn de memoria ocupa 32 bits, se obtiene el nĂşmero de elementos del buffer (“buffer_elementsâ€?) a partir de la ecuaciĂłn (1.4), obteniĂŠndose un resultado de 4000 elementos para el buffer circular. đ?‘?đ?‘˘đ?‘“đ?‘“đ?‘’đ?‘&#x;_đ?‘’đ?‘™đ?‘’đ?‘šđ?‘’đ?‘›đ?‘Ąđ?‘ = 16đ??žđ??ľđ?‘Śđ?‘Ąđ?‘’đ?‘ Ă— 8

VilariĂąo Valle, Marta

đ?‘?đ?‘–đ?‘Ąđ?‘ đ?‘?đ?‘Śđ?‘Ąđ?‘’ Ă— = 4000 đ?‘?đ?‘Śđ?‘Ąđ?‘’ 32 đ?‘?đ?‘–đ?‘Ąđ?‘

(1.4)


Introducción y Objetivos 9

32 bits (1 muestra) 8 bits wr_idx rd_idx

8 bits

8 bits

8 bits

CANAL CANAL CANAL CANAL 4 3 2 1

0

CANAL CANAL CANAL CANAL 4 3 2 1

1

CANAL CANAL CANAL CANAL 4 3 2 1

2

...

...

...

...

...

CANAL CANAL CANAL CANAL 4 3 2 1

buffer_elements - 1

CANAL CANAL CANAL CANAL 4 3 2 1

buffer_elements

Figura 1.2 Cálculo del tamaño del buffer circular

1.3.2. Interfaz gráfica de usuario para PC Para realizar la aplicación que funcionará de interfaz gráfica manejada por el usuario, que configurará el AL y mostrará los resultados, se ha empleado el entorno de desarrollo wxDevcpp. Los requisitos que debe tener nuestra aplicación son los siguientes:           

Representación de datos de las señales que lleguen a cada uno de los 4 canales de entrada. Cada una en un color diferente. Reconocimiento y selección del puerto COM al que está conectada la placa. Selección de la velocidad, en baudios, de funcionamiento del puerto COM. Configuración de la captura de datos. Disparo seleccionable independiente y distinto para cada canal de entrada. Selección de la frecuencia de muestreo de adquisición de los datos de entrada. Posibilidad para la captura de los datos, así como su reanudación. Posibilidad de aumentar y disminuir la imagen correspondiente a cada señal a partir de un número de muestra concreto. Calcular el incremento de tiempo entre dos puntos dados de las señales. Guardar el registro de la configuración y el proceso de captura, así como las imágenes. Cargar ficheros de datos de otras capturas anteriores.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


10

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Además, la comunicación microprocesador con el PC debe ser segura; para ello se implementará la recepción y envío de tramas de datos mediante el protocolo bytestuffing.

1.4 Estructura de la memoria En los siguientes capítulos se describe el diseño y desarrollo de cada parte del PFC en función de los requisitos iniciales planteados en el punto anterior. En el capítulo segundo se enumerarán los pasos a seguir para preparar el entorno de trabajo, en cuanto a instalación y elección de los entornos de desarrollo que se van a emplear. En el tercer capítulo se documentarán los trabajos realizados en lo referente al diseño electrónico del hardware de la placa, que hará las funciones de Analizador Lógico Digital. En el capítulo cuarto se presenta la elección del dispositivo adecuado a los requisitos establecidos, así como la configuración de los periféricos del mismo (PLL, TIMER0, UART0), de manera que éstos se adapten al funcionamiento deseado. Cada periférico es descrito en detalle a modo de servir de guía para mejoras futuras que puedan detectarse. En el capítulo 5 se describe la aplicación gráfica desarrollada para el PC, que empleará el usuario para configurar el Analizador Lógico y estudiar las señales capturadas. En este capítulo, también se hace un breve resumen de cómo se ha creado el proyecto de interfaz gráfica usando como herramienta el entorno de desarrollo elegido para ello. Además, se recoge un manual de usuario para la instalación y uso de la aplicación desarrollada. En el capítulo 6 se recogen las distintas pruebas realizadas, desde el testeo de la placa diseñada, los problemas encontrados a lo largo del desarrollo del proyecto y los resultados de las pruebas con el sistema global funcionando, configurando distintas capturas de las señales de entrada, en función de las posibilidades que ofrece la aplicación gráfica implementada. En el capítulo 7 se ha hecho un breve estudio económico para valorar los recursos materiales y humanos que serán necesarios para llevar a cabo el proyecto. En el capítulo 8 se concluye la memoria del presente documento con las conclusiones a cerca de los trabajos realizados y se listan posibles líneas de interés para mejoras futuras. Finalmente, se recogen los anexos y la bibliografía que completan este trabajo fin de carrera, donde, entre otra información relevante, se puede consultar el código fuente, tanto del microcontrolador como de la aplicación gráfica.

Vilariño Valle, Marta


Preparación del Entorno de Trabajo 11

Capítulo 2 PREPARACIÓN DEL ENTORNO DE TRABAJO Antes de comenzar a trabajar se debe tener claro de qué herramientas, bien de diseño electrónico bien de programación, se dispone para poder realizar los trabajos que se han propuesto. Existe un amplio abanico de programas, tanto para diseñar la placa de circuito impreso como para implementar el código fuente del microcontrolador, en lenguaje C, y el código fuente de la aplicación gráfica del PC, en leguaje C++. Para reducir las distintas opciones se emplearán herramientas de las que se dispone licencia o que son software libre.

2.1 Elección e Instalación de los Programas Este proyecto abarca, desde el diseño del hardware y la programación del microprocesador, hasta el desarrollo de una interfaz gráfica que controle la placa física que se va a diseñar. En el proyecto se pueden distinguir tres fases claras y cada una requerirá de unos programas instalados:   

FASE 1: Diseño y desarrollo del hardware. FASE 2: Programación y simulación del hardware. FASE 3: Desarrollo de la aplicación para la interfaz gráfica.

Para realizar el diseño hardware del AL se ha decidido emplear el programa Proteus puesto que de éste se tiene licencia en el Departamento de Electrónica. El primer paso será instalar el programa de diseño y simulación electrónica elegido. La versión que se va a manejar en este proyecto es Proteus 7 Professional. Se dispone del entorno de trabajo ISIS, donde se realiza el esquema de nuestra placa de circuito impreso, y, además, también se dispone del entorno de trabajo ARES, donde se hará el rutado de la placa. El segundo paso es instalar los programas necesarios para abordar la fase 2 del proyecto que son: el compilador cruzado para ARM, Yagarto, y el entorno de desarrollo (IDE), VSM Studio. La instalación de los programas indicados debe hacerse en el siguiente orden para evitar posibles problemas de compilación:  Primero, ha de instalarse el compilador cruzado Yagarto: “yagarto-bu-2.21_gcc-4.6.2-c-c++_nl-1.19.0_gdb-7.3.1_eabi_20111119.exe”  Segundo, se han de instalar las herramientas necesarias del compilador: “yagarto-tools-20100703-setup.exe”  Tercero, se instala el entorno de desarrollo (IDE) VSM Studio: “vsmstudiosetup.exe” VSM STUDIO es un IDE desarrollado por Labcenter Electronics como plataforma alternativa para el desarrollo de proyectos de microcontroladores usando diferentes

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


12

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

compiladores o ensambladores. No es un IDE más, como CodeBlocks o Eclipse, que son entornos genéricos, sino que ofrece una configuración más personalizada. VSM Studio fue pensado exclusivamente para el trabajo con los compiladores y ensambladores de microcontroladores. Este IDE está lejos de igualar a MPLAB para PIC y más lejos de Atmel Studio 6 para los AVR, los cuales tienen mayor flexibilidad y soporte y también pueden interactuar con Proteus. Algunos de los compiladores que soporta VSM Studio son: 

  

Para los PIC: CCS C (no incluye dsPIC), MPLAB, C18, MPLAB C30, MPASM, Hi-Tech C para los PIC10/12/16, Hi-Tech C para los PIC18, Hi-Tech C para los dsPIC. Para los AVR: sólo WinAVR y el ensamblador AVRASM. Para los 8051: IAR para los 8051, Keil uVision4 para 8051 y el ensamblador ASEM-51. Para los ARM: IAR para ARM y GCC para ARM.

El tercer paso, para tener listo el entorno de trabajo, será de instalar el programa necesario para el desarrollo de la aplicación gráfica. El IDE elegido es wxDev-C++ versión 7.3.1.3. Se abordará más en detalle en el capítulo correspondiente al desarrollo de la aplicación (Capítulo 5).

2.2 Programación y Simulación con VSM Studio y Proteus Antes de comenzar a programar la aplicación, se han de conocer los pasos que dar antes para crear un proyecto en el VSMStudio, información que puede ser consultada en el Anexo V. Para comprobar el funcionamiento de los programas juntos con un proyecto existente para el microcontrolador empleado, se abrirá de la carpeta del proyecto donde se encuentran los ficheros que se muestran en la Figura 2.1. Primero se lanza el VSMstudio y se observan: unos ficheros fuente (“source files”), ficheros de cabecera (“header files”) y unos ficheros de diseño del Proteus (“design files”). A modo de resumen y sin dar demasiados detalles sobre el tipo de ficheros, en el archivo “main.c” tenemos todo el código hecho y el micro ya configurado. Para compilar y ejecutar un programa hecho para el microcontrolador se accede al menú Project Build Project o también el acceso rápido F7. Si no se han detectado errores ya se puede simular el código yendo al menú Debug Start simulation, o también pulsando la flecha verde que aparece en la parte superior. Inmediatamente saltará el entorno ISIS de Proteus (ver Figura 2.2 ) donde se simulará y depurará el código implementado.

Vilariño Valle, Marta


Preparación del Entorno de Trabajo 13

Figura 2.1 Esquema de ficheros para un proyecto VSMStudio

Figura 2.2 Simulación de código de programa en Proteus

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


14

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

2.3 Programación de la memoria Flash del Microcontrolador Tras simular el programa, el siguiente paso es grabar el programa en el microprocesador para probarlo de manera física. Para ello se empleará el cmd.exe (ver Figura 2.3). Conectando por USB la placa al PC y accediendo a la ruta del proyecto, donde también debe estar incluida la carpeta “bootloader 2114”, para poder grabar el microcontrolador, se accede a la carpeta del proyecto y se escribe el comando “make”, el cual permitirá compilar el proyecto y comprobar que no hay errores.

Figura 2.3 Programación dela memoria flash

Una vez comprobado que no existen errores en el código, se debe grabar el programa en la placa. Para ello hay que asegurarse de que se graba en la memoria flash y no en la memoria RAM. Si se desea que el programa grabado permanezca en la placa, entonces habrá que asegurarse que el fichero “makefile” está correctamente creado para usar el fichero “linker_flash.ld” y el bootloader del lpc2114. Los microprocesadores ARM7 vienen con el bootloader integrado de fábrica, al contrario que los PIC, los cuales vienen “vírgenes” de fábrica. Para grabar el programa en la memoria flash se debe escribir la siguiente línea de comandos: lpc21isp_148x –control code.hex \\.\COMxx 38400 12000

Las opciones que aparecen en la línea de comando son: Code.hex: fichero de código del programa. \\.\COMxx: el puerto COM en el que tenemos conectada la tarjeta. Vilariño Valle, Marta


Preparación del Entorno de Trabajo 15

38400: velocidad del puerto a la que se va a grabar el programa. 12000: velocidad del cristal de cuarzo en miles de hercios (Hz). Mi cristal es de 12MHz. Escribir la línea de comandos cada vez que se quiera grabar en el microprocesador puede ser un poco tedioso así que se ha decidido incluir estas líneas de código en el fichero “makefile” de manera que los comandos que se utilicen serán:  make: para compilar.  make flash: para compilar y grabar el programa en la memoria flash.  make terminal: para ejecutar el programa que se encuentre en la memoria flash empleando el cmd.exe como hyperterminal. Cada vez que se pulse el botón de reset de la placa, el programa se ejecutará desde el principio. El fichero “makefile”, para el código de programa basado en el microcontrolador LPC2114, puede ser consultado en el apartado de anexos (ver anexo VII “makefile” p.212), al final de este documento.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


16

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


Diseño Hardware 17

Capítulo 3 DISEÑO HARDWARE El funcionamiento de la placa, Analizador Lógico Digital, consistirá en la ejecución de distintas tareas, las cuales llevan asociadas un flujo de información gestionado en forma de señales eléctricas por los distintos sistemas de computación electrónicos. La forma en que estos sistemas gestionan y procesan la información es a lo que se denominará arquitectura electrónica. La arquitectura electrónica debe adecuar los distintos sistemas electrónicos según los distintos niveles de abstracción de las tareas que tendrán los siguientes requisitos: 

Tareas a bajo nivel: suelen ser tareas simples a nivel computacional, ligadas a manejo de señales con requerimientos de tiempo estrictos. Son tareas específicas al dispositivo. Tareas a alto nivel: Son computacionalmente exigentes. Son tareas generales que no se implementan sobre el microprocesador, y por ello son más portables. No manejan señales sino datos y suelen implementar procesos concurrentes.

Evaluados estos requisitos para la arquitectura electrónica, parece razonable basarse en un sistema tipo PC (arquitectura Von Newman) que soportará el control a alto nivel, mientras que el control a bajo nivel es realizado por el sistema basado en microprocesador (arquitectura Harvard) con periféricos específicos para cada tarea a desarrollar. La comunicación entre el sistema principal y los demás subsistemas se realizará gracias a puertos de comunicación, que en este caso se tratará del puerto USB.

3.1 Definición de especificaciones Un analizador lógico es un dispositivo de instrumentación que captura señales digitales para su posterior análisis. Al comenzar este proyecto se tomaron las siguientes especificaciones o requisitos de cara a diseñar el analizador.

3.1.1. Especificaciones para la realización del diseño electrónico de la placa y elección del microcontrolador     

4 Canales de entrada de digitales. Alta impedancia de entrada. Funcionamiento con niveles TTL. Velocidad máxima de muestreo de 2MSps, es decir, dos millones de muestras por segundo. Buffer de memoria lo suficientemente grande para alcanzar la velocidad máxima de muestreo. Se optó por un dispositivo con memoria RAM de 16Kbyte.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


18

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

3.1.2. Especificaciones de funcionamiento real deseado del analizador controlado desde la aplicación que controlaremos desde el PC. Deben realizarse las siguientes funciones: 

 

Configuración del analizador: Se podrán seleccionar valores de los siguientes parámetros: o Velocidad: es decir, frecuencia de muestreo a la que queremos adquirir los datos de las señales. o Modo de captura: se podrá seleccionar si se hace un único llenado y representación del buffer de memoria (modo single) o se representan continuamente los datos del buffer (modo continuo). o Disparo seleccionado por cada canal de entrada. Posibilidades:  Sin disparo  Por nivel: alto o bajo  Por flanco: de subida o de bajada Captura de datos. Transmisión.

3.2 Diagrama de bloques El diagrama de bloques de la Figura 3.1 muestra el funcionamiento general del sistema de adquisición de datos funcionando como Analizador Lógico Digital. La tarjeta electrónica desarrollada, se programará y alimentará a través del puerto USB del PC. A continuación se describe la funcionalidad de cada bloque representando.

3.2.1. Red de alimentación y transmisión de datos La red de alimentación, la cual toma la tensión de alimentación de 5V desde el PC, regulará a 3,3V y 1,8V para alimentar al microprocesador a su valor nominal y la alimentación de los periféricos internos del núcleo, respectivamente. Además, para la transmisión de los datos y programación mediante bootloader del micro se necesita el driver FTDI232R que es conectado al puerto USB mediante una red de protección de diodos USBLC6.

3.2.2. Microcontrolador En este bloque se encuentra el microcontrolador, que será el cerebro del sistema. El modelo elegido es un microcontrolador (MCU) ARM7TDMI-S, basado en arquitectura de 32 bit de datos con simulación en tiempo real y embebido (empotrado).

Vilariño Valle, Marta


Diseño Hardware 19

El modelo elegido, que cumple las especificaciones iniciales para el desarrollo del Analizador es el LPC2114 (type number: lpc2114fbd64/01), posee 64 patillas y encapsulado LQFP64 (10x10x1.4mm, SOT314-2).

RED DE ALIMENTACIÓN Y TRANSMISIÓN DE DATOS

ALIMENTACIÓN USB (LM1117DT-xx)

SECCIÓN USB (FTDI232RL)

SEÑALES DE ENTRADA

CANALES DE ENTRADA (4 CANALES)

UART 0

CH 3

RESET

CH 2

GPIO

CH 1

TIMER 0/1

CH 0

MICROPROCESADOR ARM7 de 32 bits (LPC2114)

REGISTROS DE DESPLAZAMIENTO (8 BIT – 74HC595)

12MHz

MICROCONTROLADOR

Figura 3.1 Diagrama de Bloques del Sistema

El MCU LPC2114 dispone de una memoria Flash de 128KB y una memoria RAM de 16KB con posibilidad de configuración “fast GPIO”. Dispone de dos puertos de 32 pines cada uno, que son configurables como GPIO u otras funciones según los registros PINSELx. Posee dos puertos UART para poder transmitir datos y recibir órdenes desde el PC, y dos TIMER, con los que generar las señales de reloj necesarias, que permiten el buen funcionamiento de los registros de desplazamiento para la correcta lectura en los puertos de las señales de entrada. Además, se dispone de un circuito de RESET (para el reinicio del sistema, que borre la memoria flash del micro y estabiliza todas las señales del sistema) y un oscilador externo con un cristal de cuarzo de 12MHz. Esta sección realiza 3 tareas en paralelo: o Muestreo: Generar las señales de reloj que controlan el funcionamiento de los registros de desplazamiento y almacenar datos en el buffer de memoria. o Envío: Leer el buffer de memoria y enviar datos por la UART al PC.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


20

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

o Recepción de comandos: Interrupción por recepción de carácter. Es decir, también se controla si se ha enviado una orden nueva desde la aplicación de usuario en el PC.

3.2.3. Señales de Entrada El sistema dispone de cuatro señales de entrada que se conectarán a los pines correspondientes del microcontrolador. Cada señal de entrada corresponderá a un canal, la cual está directamente a la entrada DS de los registros de desplazamiento. Los registros de desplazamiento reciben además como entradas la señal de reloj SH_CP, generado a partir de un Timer del microcontrolador, y la señal ST_CP, generado por otro Timer o el mismo. Ésta última señal es ocho veces más lenta que la primera. Estos registros de desplazamientos están configurados en formato serie-paralelo, es decir, por cada período de la señal de reloj SH_CP, que se denominará CLK, entra un bit en el registro de desplazamiento, así hasta llenar su buffer de memoria interno de 8 bit. Por cada período de la señal de reloj ST_CP, que se denominará CLK_BY_8, se obtiene el dato válido listo para ser leído en los puertos del microcontrolador y hacer las tareas correspondientes.

3.3 Desarrollo de esquemas Para el diseño de esquemas y realización del esquemático se han empleado la herramienta ISIS, del entorno de diseño hardware y simulación electrónico Proteus, del fabricante Labcenter Electronics. Se ha empleado la versión 7.8 SP2. Se han creado los modelos esquemáticos de los componentes, que no aparecían entre las librerías propias del fabricante. Los esquemas se han realizado de forma modular constando el esquema de los siguientes módulos:   

Microcontrolador USB y Alimentación Registros de Desplazamiento

Finalmente, se han obtenido los esquemas electrónicos que se recogen en el Anexo I de este documento.

3.3.1. Microcontrolador Módulo central de procesamiento, que se conecta con las entradas de datos mediante los pines de los puertos de señales digitales, y con las salidas a través del puerto UART.

Vilariño Valle, Marta


Diseño Hardware 21

Debido a la velocidad de funcionamiento y la longitud de las pistas, se decidió conectar condensadores de desacoplo de valor 100nF en todas las patillas de alimentación del microcontrolador, lo más cerca posible de éstas. Estos condensadores protegerán a los transistores internos del micro de sobrepicos de corriente, fenómeno conocido como “ground bounce”. Este fenómeno es un ruido, que aparece en las señales debido a las peticiones de corriente en las alimentaciones, debido a la conmutación a gran velocidad de los circuitos. Cuanto más alta sea nuestra frecuencia de trabajo, más problemático es este fenómeno, y para evitarlo hay que calcular con cuidado los valores que tendrán los condensadores de desacoplo. Se ha empleado un oscilador externo de 12MHz, frecuencia suficiente para cumplir la especificación de 2MSps. Se ha implementado también un circuito de reset externo mediante un botón mecánico.

3.3.2. USB y Alimentación Este módulo consta de dos partes bien diferenciadas: o Un puerto de comunicaciones que es empleado para conectarse al PC para envío y recepción de datos y programación del dispositivo. o Un bloque de alimentación. Ambos bloques están conectados a través del conector mini USB – tipo B. La entrada del conector a la placa está protegida por un sistema de diodos de supresión del transitorio de tensión (TVS) contra descargas electrostáticas (ESD), para picos de tensión por descargas electrostáticas, y de una ferrita antiparasitaria, para evitar ruidos en la entrada de la alimentación que se pudiesen producir por el cable USB. El dispositivo de comunicaciones FTDI232R convierte las señales de USB a UART, que van directamente al microcontrolador. Para el funcionamiento en modo programación se emplearán las patillas reset y bootloader. Tal y como ocurría en el bloque de microcontrolador, se añadirá a la alimentación un condensador de desacoplo, C14. El bloque de alimentación está compuesto por dos reguladores lineales de voltaje (LDO) de la serie LM1117 con salidas estables a 3,3v y 1,8 voltios, respectivamente, que servirán para alimentar las distintas partes de la electrónica digital. A mayores, se han añadido condensadores de filtrado (C15, C17, C20) y reserva (bulk) (C19, C21). Dado el objetivo docente de la placa se ha añadido un diodo led testigo de alimentación a 3.3v.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


22

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

3.3.3. Registros de Desplazamiento Este bloque conecta el microcontrolador al conector de testeo de señales a través de cuatro registros de desplazamiento (74HC595), configurados en modo serie-paralelo, para aumentar la velocidad de muestreo del analizador. Tal y como ocurría en el bloque del microcontrolador, se añaden a las alimentaciones condensadores de desacoplo (C22 a C25). El conector de testeo de señales es una tira de pines macho de cinco terminales: cuatro para señal y una de masa.

3.4 Desarrollo de librerías Los componentes empleados son bastante comunes y los encapsulados elegidos ya los contiene el programa de diseño Proteus entre sus librerías básicas por defecto. Se han creado algunos componentes esquemáticos que Proteus no contenía como son:    

La red de protección de diodos USBLC6 con encapsulado SOT23-6. El esquemático del FTDI232R con encapsulado SSOP28. los esquemáticos de los reguladores de tensión LM1117DT-3.3 y 1.8, con encapsulado SOT223-3. el encapsulado del conector USB-Tipo B (USB-F-TYPE-MINIB).

Todos estos nuevos modelos esquemáticos y encapsulados se han generado en una librería propia que contiene los siguientes archivos: “libreríasMarta.IDX” y “libreríasMarta.LIB” dentro de la carpeta “MISLIB” en el directorio “LIBRARY” del programa. Por defecto, Proteus recomienda usar “USERDVC” donde almacenar las librerías y modelos nuevos. Para evitar el problema de poder perderlo en alguna desinstalación del programa, se han creado las carpetas “MISLIB” Y “MISMOD”, en el directorio LIBRARY y MODELS, respectivamente. Con esto, se podrán tner todas las librerías y modelos propios, ficheros SPICE, test, etc, dentro de estas carpetas. Para cargar las librerías y modelos propios, debe accederse a la ruta “System  Set Paths…” y añadir la carpeta “MISLIB” en “Library Folders”, y la carpeta “MISMOD” en “Simulation Model and Module Folder”. Aquí se da la posibilidad de dar prioridad a unas carpetas sobre otras. En nuestro caso, las librerías propias se han colocado en último lugar. Una vez hecho esto, se accede a “System  Save Preferences” para guardar dichos cambios.

Vilariño Valle, Marta


Diseño Hardware 23

3.5 Documentación Técnica: Cálculo de consumos, test points y puertos En la documentación técnica del diseño realizado se van a incluir los cálculos de consumo de potencia de cada componente en funcionamiento normal de la placa y el mapeo de puertos, es decir, la información detallada de cada pin de los integrados que forman parte del diseño completo.

3.5.1. Cálculo de consumos de potencia Para el cálculo del consumo de potencia real, se ha hecho una medición desoldando la bobina L1 y usando los pad de la bobina para medir la intensidad entre los puntos A y B de la Figura 3.2, usando un multímetro en serie. Se obtiene una intensidad del orden de 150 mA (IAB) tal y como se aprecia en la Figura 3.3.

Figura 3.2 Cálculo de consumo de potencia

Figura 3.3 Intensidad consumida (mA)

Según esto, se estima que el consumo no llegue a más de 600mW. Por tanto, el consumo se encuentra por debajo del límite proporcionado por los reguladores de la fuente de alimentación. Se puede ver los cálculos realizados en la Tabla 3-1.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


24

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

3.5.2. Mapeo de Puertos En las Anexo Tabla - 1, Anexo Tabla - 2, Anexo Tabla - 3 y Anexo Tabla - 4, que se encuentra en el Anexo II, queda reflejada la descripción de los pines del diseño al completo. En dicha tabla se contemplan los siguientes campos:       

PIN: Número de patilla correspondiente del integrado al que se hace referencia. INTEGRADO: Identificador en el esquema del integrado al que se hace referencia. DESCRIPCIÓN: Función de la patilla. TIPO: La patilla puede ser de entrada (I), salida (O) o de entrada/salida (I/O). UNIDAD: Unidad de medida de la patilla: voltaje, intensidad, potencia, etc. VALORES: Valores máximos, mínimos y típicos de la patilla que contempla cada fabricante en sus hojas de características en la unidad indicada. CONEXIÓN: Se especifican tanto el pin como el integrado al que va conectada la patilla al que el PIN que se está analizando hace referencia. Tabla 3-1 Cálculo Consumo de Potencia

DISPOSITIVO

ID

VOLTAJE (V)

INTENSIDAD (A)

POTENCIA (W)

% DE USO

POTENCIA efectiva CONSUMIDA (W)

RESISTENCIAS 10K

R1

3,3

0,00033

1

0,001089

20

0,0002178

U1 U2-U5 U6 LM1 LM2

3,3 5 5

0,1 0,07 0,015

1 4 1 1 1

0,33 0,02 0,075 0 0

60 50 30 90 90

0,198 0,01 0,0225 0 0

D2

3,3

0,015

1

0,0495

90

0,04455

CIRCUITOS INTEGRADOS LPC2114 74HC595 FT232RL LM1117DT-3.3 LM1117DT-1.8

DIODOS RED LED

TOTALES:

0,475589 potencia máxima

0,2752678 consumo en funcionamiento normal

3.6 Documentación de Fabricación En este apartado se detallarán las características del material que se ha empleado para la fabricación del prototipo, que vendrá dado por el fabricante elegido, puesto que esta tarea se va a externalizar.

Vilariño Valle, Marta


Diseño Hardware 25

3.6.1. Acabado superficial de la placa Existen numerosas opciones de tipos de materiales del acabado superficial de la PCB, que pueden ser de naturaleza orgánica o metálica. Entre las opciones posibles de materiales se pueden enumerar las siguientes, aunque no se va a entrar en detalles, puesto que no se estima oportuno dentro de este proyecto: 

HASL (Hot Air Solder Leveling) con o sin plomo.

  

ENIG (Electroless Nickel Immersion Gold) Estaño por inmersión. Plata por inmersión. OSP (Organic Solderability Preservative).

Por tanto, al diseñar la PCB se tienen que tener en cuenta otros detalles en cuanto a materiales y dimensiones se refiere, que puede alcanzar el fabricante y que se recogen en la Tabla 3-2 y en la ¡Error! No se encuentra el origen de la referencia.. Se ha mandado fabricar la placa a un proveedor externo que cumpla con el requisito de adecuarse a los limitados recursos económicos de los que se disponen para la realización de este proyecto. El proveedor seleccionado es ITEAD Studio [2], que fabricará el producto final con material HASL y empleando dieléctrico tipo FR-4. La máscara de soldadura de la PCB elegida es de color verde y hace la función de capa de lacado que protege las zonas de cobre que no deseamos que sean soldadas. Tabla 3-2 Especificaciones de material y dimensiones de la PCB

ESPECIFICACIONES Weight PCB Layer PCB Material PCB Quantity PCB Size

340.00g 2 Layer FR-4 10 pcs Smaller than 10cm x 10cm

3.6.2. Requerimientos especiales: control de impedancias, reflow Esta placa no requiere líneas de transmisión en las cuales sea necesario controlar sus impedancias, puesto que no tiene antenas ni líneas de alta velocidad que deban controlar su impedancia. Al ser un prototipo soldado a mano, no es necesario el estudio de soldadura por horno o reflow. Es decir, saber qué componentes se sueldan primero y en qué cara de soldadura irían. Todo esto es porque hay componentes que aguantan un reflow y otros dos, por eso Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


26

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

todos los que tengan características comunes irían en la misma cara. La cara con componentes que sólo aguantan un solo horneado, deberá ser la última en introducirse en el horno. Todo ello es para líneas de fabricación y el alcance de este proyecto se centra sólo en las fases de diseño y prototipado.

3.6.3. Stack-up El stack-up (ver Figura 3.4) hace referencia a las especificaciones del sustrato de la placa. Es el corte transversal de la PCB, es decir, el grosor que tiene cada tipo de material que compone la PCB. La parte central del substrato es de material dieléctrico FR-4 de vidrio epoxi de aproximadamente 1,5 mm de espesor, que actúa de aislante entre las dos capas de Cobre a ambos lados del FR-4.

1,6 mm ± 10%

Cu – 35 µm

FR4 – 1.5mm

Cu – 35 µm Figura 3.4 Stack-up (2 capas)

3.7 Contorno ESD Medida contra ruidos electromagnéticos para pasar el marcado CE. Al igual que sucedía con la soldadura por reflow, al tratarse sólo de prototipos sin carácter comercial, no se aplican medidas de protección necesarias en casos de entornos agresivos como los simulados al realizarse pruebas de compatibilidad electromagnética. A pesar de que no se tiene en cuenta, se quería dejar reflejado.

Vilariño Valle, Marta


Diseño Hardware 27

Tabla 3-3 Parámetros del fabricante para la PCB [2]

Parámetros de la PCB para su fabricación a tener en cuenta por el diseñador Layers Material Board Dimension (max) Board Dimension (min) Outline Dimension Accuracy Board Thickness Board Thickness Tolerance Dielectric Separation thickness Conductor Width (min) Conductor Space (min) Outer Conductor thickness Inner Conductor thickness Copper to Edge Plated Component,Plated via Diameter(Mechanical)

41730 FR-4 500mm X1100mm 10mm X10mm ± 0.2mm 0.40mm--2.0mm ± 10% 0.075mm--5.00mm 0.15mm( Recommend>8mil ) 0.15mm( Recommend>8mil) 35um 17um--100um 0.25mm,0.5mm

Plated Hole Diameter Tolerance(Mechanical)

0.08mm

Unplated Hole Diameter Tolerance Hole Space(min) Hole to Edge Annular Ring(min) Aspect Ratio Solder Resist Type Solder Resist Color

0.05mm 0.25mm 0.4mm 0.15mm 0,334027778 Photosensitive ink Black ,Green, White, Blue ,Yellow

Solder Resist Clearance Solder Resist Coverage Plug Hole Diameter Selective Finish Silkscreen line width (mim)

0.1mm 0.1mm 0.3mm--0.65mm HASL, ENIG 6mil

0.3mm--6.30mm

3.8 Definición de forma La placa es rectangular de tamaño 57.5mm x 84.1002mm, con taladros en sus cuatro esquinas con diámetro de 3mm y una corona de 1.7mm. Posteriormente a realizar la placa, se ha realizado un mecanizado simple que queda fuera de los trabajos que se contemplaban en este PFC. Para ello se ha empleado el programa de diseño SolidWorks y se ha fabricado una caja sencilla con aberturas para los conectores y que se ajuste a la PCB. En el Anexo IV podemos ver todas las vistas de la caja realizada de medidas 86x65x14 mm.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


28

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

3.9 Reglas de diseño Para el rutado de la placa que se ha realizado manualmente, además de unas reglas específicas se han tenido en cuenta unas reglas básicas a la hora de realizar dicho rutado. 1. Rutado sencillo con las pistas lo más cortas que sea posible. Para ello se dispondrán y colocarán los footprint de la manera más adecuada, ayudándose de los vectores que proporciona Proteus ARES para la colocación. 2. Los ángulos de las pistas nunca serán de 90º, sino de 45º, evitando así que la anchura producida en los ángulos rectos varíe considerablemente la impedancia de la línea, además de evitar la atracción de otro tipo de ruidos. 3. Las vías tendrán un diámetro de (taladro y corona) v40. 4. El ancho de las pistas depende de la intensidad que circule por ellas. Se tendrá en cuenta que 0,8mm de pista pueden soportar unos 2 amperios, 2mm unos 5 amperios y 4,5 mm de anchura unos 10 amperios. En general se ha optado por una anchura T10 para las alimentaciones y para el resto de pistas siempre que pueda mantenerse. 5. Entre pistas y entre pistas y puntos de soldadura como mínimo se mantendrán 0,8mm, pudiéndose reducir hasta 0.4mm. 6. La distancia mínima entre pistas y los bordes de la placa será de dos décimas de pulgada, unos 5mm. 7. Los componentes se colocarán paralelos a los bordes de la placa. 8. No se pondrán pistas en los bordes de la placa y los puntos de soldadura de los terminales de entrada, salida o alimentación, exceptuando la línea de masa. 9. No pasar pistas entre dos pines de componentes activos. 10. Se pondrá un taladro en cada esquina de la placa de diámetro de 3mm y una corona de 1.7mm para la sujeción de la placa. El rutado se ha realizado con una rejilla de aproximadamente 1.25 mm (50 milésimas de pulgada). En la Figura 3.5 se muestran el conjunto de reglas de diseño mínimo que debe cumplir nuestra placa y se da una breve explicación de cada una de ellas.  Pad-pad clearance: distancia entre huellas, es decir, distancia mínima entre los componentes.  Pad-trace clearance: distancia mínima entre huellas y pistas.  Trace – trace clearance: distancia mínima entre pistas.  Graphics clearance: distancia entre gráficos.  Edge/slot clearance: distancia con el borde de la PCB.

Vilariño Valle, Marta


Diseño Hardware 29

Figura 3.5 Reglas de diseño

La Figura 3.6 de las clases de redes recoge la configuración de pistas y vías y qué capas servirán para trazar pistas. Configuraremos las reglas de diseño para cada tipo de red distinto y las configuraremos de manera independiente. Para la red POWER se asignará un ancho de pista (Trace Style) T10 de 10th de ancho. El siguiente parámetro (Neck style) o estilo de estrechamientos o cuellos de botella, es la anchura máxima de pistas que pasan entre componentes o vías, es decir, se estrechan a su paso entre dos componentes o vías. El parámetro Vía Style se refiere al estilo de la vía que se va a dibujar. Se usarán vías de 0.4mm de diámetro (V40), acorde a las especificaciones que proporciona el fabricante para placa estándar de FR-4 de 1.6 mm de espesor con capas de Cobre de 0.35 µm. En cuanto a la selección del tipo de vía, que no influye en el diseño a dos capas, y el color de las guías para trazado de pistas, no se va a emplear. Se dejará el valor por defecto. La asignación de capas para el auto-enrutado se ve en la parte de la izquierda, donde se especifica en qué capas se van a realizar los trazados de las pistas. Para el diseño, a doble capa, se seleccionará Top y Bottom Copper. La red de clase SIGNAL, que se observa en la Figura 3.7, es la que emplearán todas las pistas que no sean como potencial o tierra. Se ha asumido la regla de diseñadores 8/10, es decir, pistas de 8th de ancho y distancias de 10th sólo en el caso que sea posible debido a las cortas dimensiones de la placa. Complementado con un cuello de botella de 8th y vías de V40 como en el caso anterior. En la Figura 3.8 aparece la configuración por defecto “DEFAULT” empleado por todas las redes y capas que existen en nuestro diseño. Con todo esto ya se concluye la configuración de las reglas de diseño.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


30

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 3.6 Reglas de diseño para clase de red POWER

Figura 3.7 Reglas de diseño para clase de red SIGNAL

3.10 Posicionamiento Una vez hechas todas las especificaciones técnicas de la placa, puede comenzarse el rutado, partiendo de la colocación de componentes.

Vilariño Valle, Marta


Diseño Hardware 31

Figura 3.8 Reglas de diseño para resto de clases de redes

Tal y como se aprecia en la Figura 3.9, se ha colocado el microcontrolador en el centro de la placa rodeado por los registros de desplazamiento lo más cerca posible para evitar pistas muy largas que se comporten como una línea de transmisión. La fuente de alimentación se ha colocado en la parte inferior alejada lo más posible de las líneas de datos. Los condensadores de desacoplo se han colocado lo más cerca posible de las patillas de alimentación correspondientes. El cristal de cuarzo se ha colocado lo más cerca posible de los pines del microcontrolador habilitados para ello. En este punto debería haber sido recomendable añadir un plano de masa para evitar ruidos. Ambos conectores, tira de pines y USB, se han colocado en la parte superior adaptados a la caja. El ESD se ha colocado lo más cerca del conector y con las pistas lo más gruesas que nos ha permitido el espaciado de pines del integrado para evitar daños en la PCB. Asimismo, el driver del USB se ha situado también lo más cerca del conector.

3.11 Rutado Para empezar a rutar la placa se ha empezado rutando las líneas de alimentación, posteriormente, se han rutado las líneas de alta velocidad (oscilador, clk, y clk_by_8) y por último las pistas de datos por ser menos críticas. El diseño definitivo queda como se ve en la Figura 3.10 y la Figura 3.11.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


32

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 3.9 Rutado de la PCB: colocación de componentes

3.11.1. Capa Top En la Figura 3.10 se muestra la apariencia tras el rutado de la capa de arriba de soldadura con el plano de masa correspondiente generado. Todos los componentes se han situado por esta cara, por tanto, se puede apreciar en ella todas las huellas. La mayoría de los componentes elegidos son de montaje superficial SMD.

3.11.2. Capa Bottom En la Figura 3.11 se muestra la apariencia tras el rutado de la capa de abajo de soldadura con el plano de masa correspondiente generado. En esta capa solo se aprecian las vías empleadas para el cambio de capa en el rutado de pistas, y el correspondiente plano de masa generado.

Vilariño Valle, Marta


Diseño Hardware 33

Figura 3.10 Rutado de la PCB: Top Layer

Figura 3.11 Rutado de la PCB: Bottom Layer

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


34

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

En ambas capas, top y bottom, se ha generado un plano de masa con la opción “power plane generator” del menú “tools” de Ares (ver Figura 3.12) para tener caminos de retorno más cortos y para evitar el crosstalk entre líneas.

Figura 3.12 Generar plano de masa

En nuestro caso se van a conectar a masa tanto la capa “top copper” como la “bottom copper” (ver Figura 3.13 y Figura 3.14). El boundary o estilo de los límites elegido es el que viene por defecto (DEFAULT), es decir, es el borde de la superficie de disipación. Para la distancia desde el plano de masa al borde de la PCB (Edge Clearance), se ha optado por dejar el valor por defecto, 25th.

Figura 3.13 Características plano de masa bottom copper

Figura 3.14 Características plano de masa top copper

3.11.3. Visualización 3D Por último, para la visualización en 3D del diseño realizado se accede al menú “Output” y “3D Visualization”. En la, Figura 3.15, Figura 3.16 y Figura 3.17 podemos verse las distintas vistas del diseño en 3D. Vilariño Valle, Marta


Diseño Hardware 35

Figura 3.15 Rutado de la PCB: Visualización 3D (vista superior)

Figura 3.16 Rutado de la PCB: Visualización 3D (vista inferior)

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


36

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 3.17 Rutado de la PCB: Visualización 3D

3.12 Check outs Este es un fichero de errores de incumplimiento de las reglas de diseño de la placa. Se ha pasado el Pre-production Check facilitado por Proteus, obteniendo el resultado mostrado en la Tabla 3-4. Tabla 3-4 Fichero Check-Outs Pre-production check start. File: C:\Documents and Settings\Martita\Mis documentos\Dropbox\PROYECTO Fin de Carrera\HARDWARE Analizador_Logico\DISEÑO FINAL (archivos fabricación, esquemas)\Esquemas corregidos VERSION FINAL\Analizador_Logico.LYT

Date: domingo, 29 de diciembre de 2013, 20:39:23 TEST: Connectivity. For more information, run the connectivity checker. TEST: Object validity. PASS: Objects valid. TEST: DRC valid. PASS: No DRC errors. TEST: Zone overlap. Imaging Copper Layer TOP Imaging Copper Layer I1 Imaging Copper Layer I2 Imaging Copper Layer I3 Imaging Copper Layer I4 Imaging Copper Layer I5 Imaging Copper Layer I6 Imaging Copper Layer I7 Imaging Copper Layer I8 Imaging Copper Layer I9 Imaging Copper Layer I10 Imaging Copper Layer I11 Imaging Copper Layer I12 Imaging Copper Layer I13 Imaging Copper Layer I14 Imaging Copper Layer BOT Processing images

Vilariño Valle, Marta


Diseño Hardware 37

PASS: No overlap detected. TEST: Unplaced components. PASS: All components placed. TEST: Board edge. PASS: Board edge complete. TEST: Components outside board edge. PASS: Components within board edge. TEST: Validate vias. PASS: Via validation. Pre-production check end:

3.13 Documentos de fabricación Son los ficheros necesarios para la fabricación de la PCB que enviaremos al fabricante.

3.13.1. Definición del panel Como la placa es un prototipo y no está pensada para una producción en cadena, no es necesario definir el panel. El fabricante al que se le ha hecho el pedido de la placa, ITEAD Studio, ha usado el panel que hayan considerado.

3.13.2. Output Jobs Los output jobs son los ficheros de fabricación que se entregan al fabricante o a la cadena de producción en caso de contar con ella. Éstos pueden verse accediendo a la herramienta ARES del Proteus en la pestaña Output. Entre estos ficheros están:  Gerber files: Ficheros que contienen toda la información de producción del rutado: máscara, pistas, pasta de soldadura,etc. El estándar de fabricación utilizado por Proteus es el RS-274X.  NC Drills: Fichero que contiene la información de los taladros: posición, tamaño. En el caso de Proteus esta información es generada a la vez que los gerbers.  Pick and Place file: fichero que contiene toda la información para la cama de pinchos de los puntos de testeo de la placa una vez finalizada.  Testpoint Information File: Fichero que contiene la información de los puntos de testeo de la placa una vez finalizada.  BOM: Bill Of Materials. Se obtiene en la herramienta ISIS de Proteus en la pestaña Tools. Se puede exportar en varios formatos. Se ha elegido el formato HTML visto en la Tabla 3-5. Tabla 3-5 Contenido fichero BOM (Bill Of Materials) Bill Of Materials ================= Design: Doc. no.: Revision: Author:

Microcontrolador 1 1 Marta Vilariño

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


38

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Created: 03/12/12 Modified: 29/03/13 QTY PART-REFS --- --------Resistors --------1 R1 1 R2 1 R3

VALUE ----10k 220 270R

Capacitors ---------2 C1,C2 22pF 2 C3,C14 100n 15 C4-C10,C12,C13,C15, C19,C22-C25100nF 1 C11 22uF/10V 1 C16 220nF 4 C17,C18,C20,C21 10uF/16V Integrated Circuits ------------------1 U1 4 U2-U5 1 U6

Farnell 499-390

LPC2114 74HC595 FT232R

Diodes -----1 D1 1 D2 Miscellaneous ------------1 J1 1 J2 1 L1 1 LM1 1 LM2 1 SW1 1 USBLC1 1 X1

CODE ----

PMLL4448 RED LED

CONN-H5 USB-F-TYPE_MINIB MMZ2012R301A LM1117DT-3.3 LM1117DT-1.8 SWITCH SPNO 6MM USBLC6-2 12 MHz

LM1117IMP-XX/NOPB REF. FARNELL LM1117IMP-XX/NOPB REF. FARNELL Farnell: 1295310

3.14 Acopio de material Dados los limitados recursos económicos de los que se dispone para la realización de este PFC, a la hora de realizar el acopio de material se han buscado los proveedores que mejor se ajusten a las necesidades. Para la compra de los componentes electrónicos se ha seleccionado el proveedor FARNELL [3], por su garantía de confianza así como su plazo de entrega corto de 48 horas. Como se van a realizar varios prototipos, se han comprado más unidades de los componentes. En el estudio económico de este documento se detallan más el coste final del proyecto. En la Anexo Tabla - 5 Aprovisionamiento de componentes

Vilariño Valle, Marta


Diseño Hardware 39

del Anexo III se recogen las cantidades y referencias del cada componentes de la PCB de manera detallada, que servirá para el cálculo de coste del proyecto que se detalla en el Capítulo 1, así como el cálculo del coste unitario del producto.

3.15 Ensamblado de prototipo La PCB se ha soldado manualmente con un soldador marca JBC y una estación de soldadura de aire caliente de 380W de potencia y 60W “soldering iron”. Se han empleado pinzas, lupa y estaño con plomo (60/40).

3.16 Validación de prototipo (AMFE: Análisis Modal de Fallos y Efectos) Tras finalizar el proceso de prototipado, se procedió a la validación del hardware, realizando mediciones y pruebas básicas de programación del microcontrolador. Para resumir los resultados de las pruebas e iniciar un sistema de calidad que se propague a los siguientes prototipos, evitando así que se cometan una y otra vez los mismos fallos, se ha realizado un análisis modal de fallos y efectos (AMFE). Este sistema, además, ayudará a incorporar mejoras a largo plazo en el diseño, en caso de que se quiera seguir desarrollando el producto. Se otorga prioridad a unos fallos o posibles fallos, frente a otros en función de las consecuencias de los mismos. La severidad irá de 1 a 10, siendo 1 la menos grave y 10 la más severa. La probabilidad de darse se medirá en la misma manera, siendo 1 un 10% de las PCB testeadas en las que se ha dado el fallo y 10 el 100%. En el caso de la eficacia, se utiliza el 1 para la solución más eficaz y el 10 para la menos eficaz. Con los datos obtenidos se obtendrá un número de prioridad de riesgo (RPN), por el cual se podrán filtrar los fallos obtenidos. En el caso de la PCB realizada, en la Tabla 3-6 se comprueba que el fallo más preocupante es ciertos problemas de programación, achacados a la manufactura manual y a posibles problemas de ruido en el reset del driver USB, remediados de forma sencilla mediante modificaciones a corto plazo.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


40

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Tabla 3-6 Análisis AMFE

Vilariño Valle, Marta


Diseño Software del Microcontrolador 41

Capítulo 4 DISEÑO SOFTWARE DEL MICROCONTROLADOR En este capítulo se va a seleccionar el microcontrolador que mejor se ajuste a los requisitos que se expusieron al principio del presente documento. Una vez elegido, se procederá a hacer un estudio detallado de sus periféricos y cómo ha de configurarse para el gobierno del dispositivo. El punto de partida para la elección del microcontrolador es que el sistema va a realizar unas pocas funciones en tiempo real, por tanto, estamos ante un sistema empotrado para lo que se buscará “el cerebro del sistema” dentro de la tecnología ARM7.

4.1 Microprocesadores ARM7 Los dispositivos ARM7 están especialmente diseñados para aplicaciones empotradas en tiempo real que requieran bajo consumo de potencia. La familia ARM7 está formada por un microprocesador RISC de 32 bits con arquitectura tipo Von Neuman (ver Figura 4.1), es decir, se emplea el mismo espacio de memoria tanto para las instrucciones como para los datos.

CPU

instrucciones datos

MEMORIA PRINCIPAL

PERIFÉRICOS ENTRADA/SALIDA

Figura 4.1 Arquitectura Von Neuman

Otras características destacables de esta familia son:    

   

Posee 32 registros de 32 bits. Los tipos de datos direccionables pueden ser de 8, 16 o 32 bits. Tamaño de instrucciones uniforme y simple: 32 bits. Incorpora un set de instrucciones de 16 bits (2 bytes), denominado Thumb, que son las instrucciones que se usan con más frecuencia. Con ello se consigue disminuir la cantidad de código. Pocos formatos de instrucciones y modos de direccionamiento. Tiene un rendimiento de unos 130 MIPs con un procesador aproximado de 0.13µm. Tecnología CMOS. Alimentación a 5V y 3,3V. Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


42

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

  

Poseen una estructura simple que les confiere una alta velocidad y un bajo consumo de potencia (80mW). Código de programa compatible con las distintas familias de ARM (ARM9, ARM9E, ARM10). Soporta diversos sistemas operativos integrados y de tiempo real: Windows CE, Palm OS, Symbian, Linux.

Existen distintas versiones de la familia ARM7: ARM7TDMI, ARM7TDMI-S, ARM7EJ-S, ARM720T, así como también existen diversos de fabricantes de estos microprocesadores adecuados para la aplicación que se quiere llevar a cabo, como son, Texas Instruments, Atmel o NXP Semiconductors, siendo éste último el fabricante elegido.

4.2 Elección del dispositivo: LPC2114 Para la realización de este trabajo se ha optado por la elección del modelo de microprocesador LPC2114-FBD64 [4], con encapsulado LQFP64, de la versión ARM7TDMI-S de la familia ARM7, el cual posee los módulos necesarios y patillas suficientes para el diseño y desarrollo del Analizador Lógico Digital que se pretende realizar. En la Tabla 4-1 se resumen las principales características de este dispositivo. Este microcontrolador está preparado para procesar en tiempo real con un diseño especial que le dota de rapidez y fluidez de respuesta ante las entradas generadas. Tabla 4-1 Resumen de las características del LPC2114 de NXP

2

1

60

SI

Alimentación entrada/salida (V)

2

Alimentacióndel core (V)

1

-40 a +85 1,8

3,3

Rango de Temperatura (ºC)

6

Vectored Interrupt Controller (VIC)

2

reloj CPU interno - PLL (MHz)

4

I2C

SI

SPI

SI

UART

SI

RTC y watchdog

46

PWM

16

Timer de 32 bits

128

Interfaces Serie

10bit - ADC

Patillas GPIO (I/O)

LQFP64

RAM(Kbyte)

Encapsulado

64

Memoria Flash (Kbyte)

Patillas

Memoria

In-System Programming (ISP) BOOTLOADER In-Application Programming (IAP) EmbeddedICE-RT - habilita breakpoints

LPC2114FBD64/01

Los recursos del microcontrolador que van a utilizarse son:    

TIMER para generar las señales de reloj CLK y CLK_BY_8 que permiten el correcto funcionamiento de los registros de desplazamiento. UART para la transmisión de datos y recepción de comandos. El reloj interno para controlar y sincronizar todo el sistema. VIC para emplear los vectores de interrupción que ejecuten cada acción en el momento adecuado.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 43

4.2.1. Diagrama de bloques En la Figura 4.2 se detalla la arquitectura del microprocesador LPC2114 elegido [4, p. 4].

Debug

High-Speed GPIO (46 pin)

SRAM 16 KB

SRAM Controller

FLASH 128KB

MAM Memory Acelerator

ARM7TDMI-S

AHB Bridge

Emulation Trace Module

JTAG

VCC

ARM7 Local Bus

System Functions

fosc

/reset AHB to APB Bridge

VIC

AHB Bus

External Interrupts

PLL

CCLK

Timers 0,1 I2C

GPIO

APB Bus

ADC SPI 0,1

UART 0,1

32 I/O PINS

PWM

Watchdog RTC System Control

Pin Connect Block Figura 4.2 Diagrama de bloques de la arquitectura del LPC2114

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


44

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.2.2. Información de los pines

/RESET

P1[29]/TCK

VDD (1V8)

VSSA (PLL)

VSS

VSSA

VDD (3V3)

P1[28]/TDI

P1[30]/TMS

XTAL2

P0[18]/CAP1[3]/MISO1/MAT1[3]

XTAL1

P0[19]/MAT1[2]/MOSI1/CAP1[2]

VDDA (1V8)

51

50

49

P0[2]/SCL/CAP0[0]

VDD (3V3)

P1[26]/RTCK

VSS

P0[3]/SDA/MAT0[0]/EINT1

P0[4]/SCK0/CAP0[1]

P1[24]/TRACECLK

P0[1]/RXD0/PWM3/EINT0

P0[6]/MOSI0/CAP0[2]

P1[31]/TRST

P0[7]/SSEL0/PWM2/EINT2

P0[0]/TXD0/PWM1

P1[25]/EXINT0

VSS

P0[5]/MISO0/MAT0[1]

VDD (1V8)

32

Figura 4.3 Pines LPC2114

Vilariño Valle, Marta

P0[9]/RXD1/PWM6/EINT3

33

31

P0[10]/RTS1/CAP1[0]

34

30

P1[23]/PIPESTAT2

35

29

P0[11]/CTS1/CAP1[1]

36

28

P0[12]/DSR1/MAT1[0]

37

27

P0[13]/DTR1/MAT1[1]

38

26

P1[22]/PIPESTAT1

39

25

P0[14]/DCD1/EINT1

40

24

VSS

41

23

VDD (3V3)

42

22

P1[21]/PIPESTAT0

43

21

P0[15]/RI1/EINT2

44

20

P0[16]/EINT0/MAT0[2]/CAP1[2]

45

19

P0[17]/CAP1[2]/SCK1/MAT1[2]

46

16

18

P1[20]/TRACESYNC

47

15

17

48

LPC2114

14

P1[16]/TRACEPKT0

52

13

P0[21]/PWM5/CAP1[3]

53

12

P0[30]/AIN3/EINT3/CAP0[0]

54

11

P0[29]/AIN2/CAP0[3]/MAT0[3]

55

10

P1[17]/TRACEPKT1

P0[28]/AIN1/CAP0[2]/MAT0[2]

56

9

P0[27]/AIN0/CAP0[1]/MAT0[1]

57

8

n.c.

58

7

P0[25]

59

6

VSS P1[18]/TRACEPKT2

60

5

P0[24]

61

4

P1[19]/TRACEPKT3

62

3

P0[23]

63

2

P0[22]/CAP0[0]/MAT0[0]

64

1

P0[21]/PWM5/CAP1[3]

P1[27]/TDO

En la Figura 4.3 se puede ver la información de los pines del microprocesador LPC2114 [4, p. 5] con el formato del encapsulado elegido.

P0[8]/TXD1/PWM4


Diseño Software del Microcontrolador 45

4.2.3. Mapa de memoria Una parte muy importante del microprocesador es el mapa de memoria [5, p. 19] y el direccionamiento de los distintos periféricos de éste.

4.0 GB

0xFFFF FFFF AHB PERIPHERALS 0xF000 0000 0xEFFF FFFF

3.75 GB APB PERIPHERALS

0xE000 0000 0xDFFF FFFF

3.5 GB 3.0 GB

Reservado

0xC000 0000

0x8400 0000 0x83FF FFFF BANCOS DE MEMORIA EXTERNOS (0 a 4) 0x8000 0000 0x7FFF FFFF

2.0 GB BOOTLOADER (8KB)

0x7FFF E000 0x7FFF DFFF Reservado

0x4001 0000 0x4000 FFFF SRAM ( 16 KB ) 0x4000 0000 0x3FFF FFFF

1.0 GB REGISTROS FAST GPIO

0x3FFF C000 Reservado 0x0004 0000 0x0003 FFFF FLASH ( 256 KB – LPC2124 ) 0x0002 0000 0x0001 FFFF FLASH ( 128 KB – LPC2114 )

0.0 GB

0x0000 0000 Figura 4.4 Mapa de Memoria LPC2114 [2]

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


46

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.3 Creación de proyectos y aplicaciones con el ARM Se debe prestar especial atención a los elementos o ficheros de código fuente del microprocesador que compondrán el proyecto, así como el uso de las herramientas que se han elegido.

4.3.1. Lenguaje de programación: El Lenguaje C Para conseguir que la aplicación realice las tareas para las que fue diseñada necesitamos transmitirle las órdenes o funciones, y esto lo conseguimos a través del lenguaje de programación. Para programar el microprocesador se emplearán dos lenguajes en distintos niveles de abstracción: 

Lenguaje ENSAMBLADOR de BAJO NIVEL. Es la implementación más directa del código máquina específico interpretado por un microprocesador y legible por el programador. El paquete de instrucciones, implementados por el fabricante del chip, se definen con los mnemónicos o instrucciones en sí, los registros y las posiciones de memoria. La principal ventaja de este lenguaje es que permite el control con precisión sobre el microcontrolador y permite precisión en las operaciones, así como velocidad, al programador. Sus principales desventajas son que el código no es portable y su mantenimiento (revisión, ampliación, modificación) es más costoso.

Lenguaje C de ALTO NIVEL. Este lenguaje de alto nivel es el más extendido para crear software de sistemas y aplicaciones por su eficiencia y portabilidad. Se caracteriza porque dispone de características propias del bajo nivel y los compiladores suelen ofrecer extensiones de lenguaje que permiten introducir código en ensamblador dentro de código en C. Dispone de otras ventajas como son: 1. Facilidad de programación. Permite la realización de programas modulares y utilización de código y bibliotecas existentes, así como el control de tipos de datos. Por el contrario, el ensamblador no es un lenguaje estructurado y el código de programa es lineal y resta claridad al mismo. 2. Transportabilidad. El lenguaje C permite y asegura la portabilidad entre distintas plataformas hardware y software, es decir, un código implementado en C para plataforma Linux puede reutilizarse, sin apenas cambios, para su utilización en un PIC o un ARM. De ahí el aprovechamiento de algoritmos desarrollados en plataformas diferentes a

Vilariño Valle, Marta


Diseño Software del Microcontrolador 47

los ARM. Sin embargo, el ensamblador es muy dependiente del hardware del fabricante como se ha mencionado, y no permite esta portabilidad. 3. Rápido y eficiente en comparación con otros lenguajes de alto nivel (C++, Phyton, Java, etc). Las aplicaciones de sistemas embebidos poseen código escrito fundamentalmente en C/C++ (por ejemplo, la lavadora de nuestra casa, nuestra cámara de fotos o nuestro smartphone). 4. El tiempo de aprendizaje de este lenguaje es más corto, así como el tiempo de desarrollo de programas, comparado con el ensamblador. 5. El mantenimiento del código es más fácil y se reduce el coste de los programas. Aunque se podría realizar el código de programa del microcontrolador completamente en ensamblador, el uso del lenguaje C es una muy buena alternativa gracias a su rapidez, facilidad y portabilidad, pudiendo crear partes de código con ciertas restricciones en ensamblador e introducirlo directamente dentro del programa en C. Con esto se consigue un código aún más eficiente. Para introducir código ensamblador en el programa en C se usan sentencias como la siguiente:

asm volatile (“mrs r0,cpsr\n bic r0,r0,#0x80\n msr cpsr,r0”);

Por todo ello, el lenguaje C será el lenguaje por defecto para el desarrollo de aplicación del ARM.

4.3.2. Herramientas de desarrollo: El compilador Yagartoy VSMStudio La familia de procesadores ARM dispone del uso de numerosas plataformas de desarrollo para la implementación y desarrollo de aplicaciones: Eclipse+GCC, CrossStudio, Keil, HJ-TAG v2.1, Green Hill Software, Insight Debugger, GNU Debugger, Realview Development Suite, emIDE, etc. La mayoría de ellos basados en compilador GCC. Dado el carácter educativo de este trabajo, se decidió emplear el entorno de desarrollo (IDE) VSMStudio, proporcionado por el mismo fabricante (Labcenter Electronics) del entorno de desarrollo de diseño hardware conocido como Proteus. Para el correcto funcionamiento se requiere un compilador cruzado para la arquitectura ARM denominado YAGARTO. Éste, se ejecuta en un host de Windows e incluye los compiladores GNU C/C++ y se disponen de librerías estándar de C. El compilador lo que hará es traducir un programa escrito en un lenguaje a otro lenguaje de programación, lenguaje de la máquina, y lo prepara para ser ejecutado en el ordenador (ver Figura 4.5).

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


48

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Programa Fuente

COMPILADOR

Programa Objeto

Mensajes de Error

Figura 4.5 Funcionamiento del compilador

4.3.3. Elementos de un proyecto En el Anexo V se recogen los pasos de “cómo crear un proyecto” en VSMStudio. En general, un proyecto GNU-ARM de sistemas embebidos está compuesto de los siguientes archivos: 

 

Archivos de cabecera: A la hora de programar un microcontrolador constantemente se accede a los periféricos o a las características del hardware propias del modelo de microcontrolador empleado. Estos datos se recogen en direcciones de memoria o números de configuración que representan el periférico al que se quiere hacer referencia. Los archivos de cabecera sustituyen esos números por “etiquetas” o “#define” fáciles de recordar e independiente del hardware que se está empleando. Este archivo se denominará lpc2114.h. Archivo de linkado (linker script), linker_flash.ld: Fichero encargado de enlazar las rutas de los archivos existentes en el proyecto y ubicarlos en el fichero de salida así como la distribución de la memoria de éste. También provee a los archivos objetos de constantes con información de posiciones de los bloques, generación de código reubicable, etc. Makefile: Permite automatizar los pasos para crear un binario o librería, partiendo de uno o varios programas destino. Se basa en dependencias. Archivo de cabecera de la aplicación, crt.S: Este archivo es necesario para establecer la posición adecuada de los vectores del microcontrolador, configuración del hardware (PLL para la generación de los relojes de la CPU y bus de periféricos, MAM, UART0), copia de variables pre-inicializadas y código RAM, e invocar a la función main() de la aplicación. Archivo de código fuente, main.c: Programa en C donde se especifica el dispositivo que se va a programar, se inicializan el resto de archivos de cabeceras, librerías, y objetos incluidos en el proyecto. Se configura el dispositivo y se realizan las tareas para la que se ha desarrollado el hardware.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 49

 

Archivos de salida: Es el resultado del makefile y está compuesto por: o Archivo *.elf: archivo binario resultante del enlazado, posee estructura estándar de archivo ejecutable. o Archivo *.hex: Fichero a grabar en la memoria flash del microcontrolador. o Archivos de información, listado en assembler del código, tamaño a ocupar de memoria, posiciones de variables de memoria, etc. Archivo de objetos: Pueden ser de muchos tipos como fracciones de código precompilados. Archivos de librerías: Definen funciones para facilitar procedimientos de cualquier tipo.

La estructura de archivos de un proyecto en VSMStudio se puede ver en la Figura 4.6.

Figura 4.6 Estructura de archivos de un proyecto en VSMStudio

4.4 Configuración del dispositivo LPC2114 La configuración del microcontrolador es la parte más importante a la hora de comenzar a implementar el código de programa. Para realizar una correcta configuración se deben estudiar en detalle los distintos periféricos que van a emplearse.

4.4.1. Hoja de especificaciones del dispositivo Una vez se han definido los requisitos del sistema y se ha elegido el microcontroldor que los cumple y va a aportar el máximo rendimiento, el siguiente paso será familiarizarse 100% con sus características y configurarlo adecuadamente para la aplicación que se desea implementar.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


50

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Para ello se empleará el documento de referencia proporcionado por el fabricante comúnmente conocido como hoja de características o datasheet [4], que en este caso es común para los dispositivos de la familia LPC21xx y LPC22xx. Para una descripción más exhaustiva y detallada se puede acudir al manual de usuario [5].

4.4.2. Arquitectura del LPC2114 El microcontrolador LPC2114 incorpora un procesador ARM7TDMI-S basado en arquitectura RISC de 32 bits y estructura del bus Von Neuman. Ello implica que el micro elegido posee las siguientes características gracias a la arquitectura RISC:       

Instrucciones simples y rápidas (1 ciclo de reloj) de tamaño uniforme, es decir, todas con la misma longitud. Pocos formatos de instrucción. Set de instrucciones ortogonal, es decir, cualquier instrucción puede emplear cualquier operando. Sólo las instrucciones de carga y almacenamiento acceden a memoria de datos. Operaciones aritméticas entre registros. Pocos modos de direccionamiento. Rendimiento elevado.

La arquitectura ARM7TDMI-S, que se puede ver en la Figura 4.7, además permite dos modos de funcionamiento: el ARMI con instrucciones que ocupan 4bytes (32bit), rápidas y potentes, pero con mayor consumo tanto de memoria como de corriente. El modo THUMB con instrucciones que ocupan 2bytes (16 bit) y menor consumo de corriente. Este último modo es empleado en aplicaciones con restricciones de memoria y de gran volumen donde reducir la cantidad de código es importante. Además, el microcontrolador posee una memoria flash que puede emplearse tanto para almacenamiento de código como para almacenamiento de datos. Esta memoria se puede programar de distintas maneras: mediante el puerto serie más conocido por bootloader o mediante JTAG. También existe un CRP (Code Read Protection) que protege el código de programa.

4.5 Configuración y gestión de entradas y salidas digitales Como suele ser habitual en los microcontroladores, cada pin o patilla del encapsulado puede tener varias funciones, es decir, pueden actuar como GPIO, como patilla de transmisión, recepción, etc. [5, p. 100].

Vilariño Valle, Marta


Diseño Software del Microcontrolador 51

4.5.1. Pin Connect Block Este bloque permite la selección de la función que se desea que realice cada patilla, es decir, permite la conexión de un pin del microcontrolador con los periféricos que éste posee internamente.

Interfaz ETM

Lógica de control

Lógica del ICE-RT embebido

ALU – 32 bit

Decodificador THUMB

Multiplicador de elevado rendimiento

Interfaz de BUS

Interfaz del co-procesador

Arquitectura ARM7TDMI Figura 4.7 Arquitectura ARM7TDMI

Es importante tener en cuenta, que una vez se ha seleccionado una función concreta para un pin, por ejemplo, como TIMER0, queda excluido su funcionamiento como cualquier otra función disponible para ese pin, por ejemplo, como entrada-salida de propósito general. 4.5.1.1 Registros PINSEL Para seleccionar la función que realizará cada pin nos servimos de los registros PINSELx. Mediante la correcta elección de los valores de los 2 bits tendremos el periférico deseado conectado al pin en concreto. Los registros PINSEL son registros de 32 bit que dedican dos bits para la configuración de la función deseada en cada pin o patilla de un puerto, por tanto, se necesitan dos registros, PINSEL0 y PINSEL1 para configurar el puerto completamente. Por tanto, PINSEL0 hace el control de los pines P0.0 al P0.15, y el PINSEL1 controla los pines del P0.16 al P0.31.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


52

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

En el diseño electrónico de la PCB realizada, se tendrá en cuenta los pines correspondientes a la UART0, TIMER0 y TIMER1, y el resto de pines serán configurados como GPIO. El valor final de ambos registros tras la configuración será la que se muestra en la Tabla 4-3 y la configuración en formato binario se representa en la Figura 4.8 y la Figura 4.9. Para tener una información más detallada de qué funciones posibles pueden configurarse en los registros PINSEL para futuras modificaciones podemos revisar la Tabla 4-2. Tabla 4-2 Funciones posibles PINSELx BITS PINSELx PIN uC PINSEL 0 1 :0 3 :2 5 :4 7 :6 9 :8 11 : 10 13 : 12 15 : 14 17 :16 19 : 18 21 : 20 23 : 22 25 : 24 27 : 26 29 : 28 31 : 30 PINSEL 1 1 :0 3 :2 5 :4 7 :6 9 :8 11 : 10 13 : 12 15 : 14 17 :16 19 : 18 21 : 20 23 : 22 25 : 24 27 : 26 29 : 28 31 : 30

00

01

P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P0.8 P0.9 P0.10 P0.11 P0.12 P0.13 P0.14 P0.15

GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO

TXD (UART0) RXD (UART0) SCL (I2C) SDA (I2C) SCK0 (SPI0) MISO0 (SPI0) MOSI0 (SPI0) SSEL0 (SPI0) TXD (UART1) RXD (UART1) RTS1 (UART1) CTS1 (UART 1) DSR1 (UART1) DTR1 (UART1) DCD1 (UART1) RI1 (UART1)

P0.16 P0.17 P0.18 P0.19 P0.20 P0.21 P0.22 P0.23 P0.24 P0.25 P0.26 P0.27 P0.28 P0.29 P0.30 P0.31

GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO GPIO Reservado GPIO GPIO GPIO GPIO Reservado

Vilariño Valle, Marta

FUNCIÓN 10 PWM1 PWM3 CAPTURE 0.0 (TIMER 0) MATCH 0.0 (TIMER 0) CAPTURE 0.1 (TIMER 0) MATCH 0.1 (TIMER 0) CAPTURE 0.2 (TIMER 0) PWM2 PWM4 PWM6 CAPTURE 1.0 (TIMER 1) CAPTURE 1. 1 TIMER 1) MATCH 1.0 (TIMER 1) MATCH 1.1 (TIMER 1) EINT1 EINT2

EINT0 MATCH 0.2 (TIMER 0) CAPTURE 1.2 (TIMER 1) SCK1 (SSP) CAPTURE 1.3 (TIMER 1) MISO1 (SSP) MATCH 1.2 (TIMER 1) MOSI1 ( SSP) MATCH 1.3 (TIMER 1) SSEL1 (SSP) PWM5 RD3 (CAN 3) TD2 (CAN 3) CAPTURE 0.0 (TIMER 0) RD2 (CAN 2) Reservado TD2 (CAN 2) Reservado RD1 (CAN 1) Reservado Reservado Reservado AIN0 CAP0.1 (TIMER 0) AIN1 CAPTURE 0.2 (TIMER 0) AIN2 CAPTURE 0.3 (TIMER 0) AIN30 EINT3 Reservado Reservado

11 Reservado EINT0 EINT1 EINT1 Reservado Reservado Reservado EINT2 Reservado EINT3 Reservado Reservado RD4 (CAN 4) TD4 (CAN 4) Reservado Reservado CAPTURE 0.2 (TIMER 0) MATCH 1.2 (TIMER 1) MATCH 1.3 (TIMER 1) CAPTURE 1.2 (TIMER 1) EINT3 CAPTURE 1.3 (TIMER 1) MATCH 0.0 (TIMER 0) Reservado Reservado Reservado Reservado MAT0.1 (TIMER 0) MATCH 0.2 (TIMER 0) MATCH 0.3 (TIMER 0) CAPTURE 0.0 ( TIMER 0) Reservado


Diseño Software del Microcontrolador 53

Tabla 4-3 Valor hexadecimal registros PINSEL

PINSEL0 = 0x00000005; PINSEL1 = 0x00000002; PINSEL 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10

9

8

7

6

5

4

3

2

1

0

bit

0

0

0

0

0

0

0

0

1

0

1

valor

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

GPIO

BOOT

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

CLK_8

GPIO

GPIO

GPIO

RX

TX

P0.15

P0.14

P0.13

P0.12

P0.11

P0.10

P0.9

P0.8

P0.7

P0.6

P0.5

P0.4

P0.3

P0.2

P0.1

P0.0

función pin

Figura 4.8 Configuración registro PINSEL0 PINSEL 1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10

9

8

7

6

5

4

3

2

1

0

bit

0

0

0

0

0

0

0

0

0

1

0

valor

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

CLK

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

GPIO

MAT0.2

P0.31

P0.30

P0.29

P0.28

P0.27

P0.26

P0.25

P0.24

P0.23

P0.22

P0.21

P0.20

P0.19

P0.18

P0.17

P0.16

pin

Figura 4.9 Configuración registro PINSEL1

4.5.2. GPIO El bloque de entradas salidas digitales posee dos puertos de 32 pines cada uno y pueden configurarse en funcionamiento normal o funcionamiento fast GPIO. Para la aplicación, todas las señales provenientes de los registros de desplazamiento serán configuradas como entradas digitales. Los datos recogidos en los puertos se almacenarán en el buffer de memoria en el orden adecuado para posteriormente extraerlos y enviarlos para ser mostrados al usuario. 4.5.2.1 Registros GPIO 4.5.2.1.1 IODIRx: Este registro de 32 bits de lectura/escritura configura los pines GPIO como entrada o como salida. Cada bit corresponde a los 32 pines del puerto correspondiente. Un “1” indica salida y un “0” indica entrada. En este proyecto los pines GPIO que están conectados a las salidas paralelo de los registros de desplazamiento serán configurados como entradas. En la Figura 4.10 y en la Figura 4.11, se muestra la configuración de estos dos registros indicando la función de cada uno de los bits, para tener así una mejor comprensión de dicha configuración.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


54

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

IODIR0 = 0X00018021 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10

9

8

7

6

5

4

3

2

1

0

bit

0

0

0

0

0

1

0

0

0

0

1

valor

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

1

0

0

0

0

CLK

RX TX

RD2- CH2

RD1- CH1

Figura 4.10 Configuración registro IODIR0 IODIR1 = 0X00000000 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10

9

8

7

6

5

4

3

2

1

0

bit

0

0

0

0

0

0

0

0

0

0

0

valor

0

0

0

0

0

0

RD4- CH4

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

RD3- CH3

Figura 4.11 Configuración registros IODIR1

4.5.2.1.2 IOSETx: Este registro de 32 bit controla el estado lógico de las salidas. Es un registro de lectura/escritura. Escribir un “1” en un bit concreto de este registro, provoca la puesta “en alto” (“1”) del pin correspondiente del puerto del bit en el que se escribe. Escribir “0” no tiene ningún efecto en el comportamiento del puerto. 4.5.2.1.3 IOCLRx: Este registro de 32 bit de sólo escritura, también controla el estado lógico de las salidas. Escribir un “1” en un bit concreto de este registro, provoca la puesta “en bajo” (“0”) del pin correspondiente del puerto del bit en el que se escribe y además borra (pone un “0”) en los bits correspondientes en el registro IOSET. Escribir “0” no tiene ningún efecto en el comportamiento del puerto. 4.5.2.1.4 IOPINx: Es un registro de 32 bit de lectura/escritura que permite la lectura del estado actual de los pines del puerto correspondiente configurados como GPIO, independientemente de si el pin en cuestión es entrada o salida. Por ejemplo, si el bit 15 del registro IOPIN0 contiene un “1”, entonces el pin P0.15 se encuentra a 3.3V.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 55

4.5.2.2 Registros FAST GPIO Los registros anteriores tienen sus homólogos localizados en el bus local de la CPU para posibles lecturas y escrituras más rápidas del orden de 3.5 veces más rápido que el funcionamiento habitual del dispositivo. Además, estos registros tienen como característica adicional el direccionamiento de tamaño byte y media palabra (Word). Entre estos registros están: FIODIRx: Controla la dirección de cada pin del puerto. FIOMASK: El registro de máscara permite el tratamiento de grupos de bits de un puerto GPIO de manera separada del resto de bits del mismo. Los bits asignados a “0” pueden ser modificados o borrados. FIOSETx: El funcionamiento de este registro es igual que su homólogo IOSET pero sólo se tienen en cuenta los bits habilitados a “0” en el registro FIOMASK. FIOCLRx: El funcionamiento de este registro es igual que su homólogo IOCLR pero sólo se tienen en cuenta los bits habilitados a “0” en el registro FIOMASK. FIOPINx: El funcionamiento de este registro es igual que su homólogo IOPIN. El valor leído es enmascarado haciendo una función AND con el registro FIOMASK, es decir, valor & FIOMASK. La escritura en este registro sólo se realiza en los bits habilitados con “0” en FIOMASK. Para activar la característica FAST GPIO debemos configurar el registro de control del sistema y estado de los flag, SCS [5, p. 68]. SCS: <Bit 0>: GPIO0M Si GPIO0M=0  Puerto 0 accesible vía APB bus. Si GPIO0M=1  Fast GPIO habilitado en el puerto 0. <Bit 1>: GPIO1M Si GPIO1M=0  Puerto 1 accesible vía APB bus. Si GPIO1M=1  Fast GPIO habilitado en el puerto 1. <Bit 2:31>: reservados

4.6 Configuración del PLL configuración del oscilador del sistema. El oscilador [5, p. 70] es el sistema responsable de generar los pulsos que marcan el funcionamiento de todo el microcontrolador. Por este motivo, configurar el oscilador será equivalente a configurar el “latido” de nuestro microcontrolador y es el primer paso que debe darse.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


56

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.6.1. Descripción del periférico El PLL (Phase Locked Loop), básicamente es un oscilador que realimenta la frecuencia de una señal de entrada, en un rango de 10MHz a 25MHz, para producir una señal de frecuencia mayor que la de entrada. Podemos utilizar dos señales de reloj dando lugar a un reloj secundario y otro primario. En la Figura 4.13 se aprecia el diagrama de bloques de este periférico para así entender mejor el funcionamiento real de éste. La señal de reloj primario puede proceder: 

Del exterior: XTAL1 (input) y XTAL2 (output) conectado a las patillas 62 y 61 del microcontrolador, respectivamente. El cristal puede abarcar valores de 1MHz a 30MHz. Emplearemos la siguiente configuración recogida en la Figura 4.12:

LPC21xx/22x XTAL1

XTAL2 XTAL

Cx1

Cx2

Figura 4.12 Conexión del Oscilador Externo

A partir de aquí la frecuencia de salida del oscilador se denomina “fosc” que es la frecuencia de funcionamiento del procesador ARM. Los valores Fosc=CCLK (reloj de salida del PLL) mientras el PLL no esté conectado y funcionando. Los valores posibles que pueden tomar los condensadores CX1 y CX2 dependen de la frecuencia de oscilación (Fosc) que deseemos. Podemos seleccionar los valores de los condensadores a partir de la Tabla 4-4. El PLL acepta una frecuencia de reloj de entrada con un rango de 10Mhz a 25Mhz. Está frecuencia de entrada se puede multiplicar / ampliar a un rango de frecuencias de 10Mhz a 60Mhz. El elemento fundamental del PLL, como se puede apreciar en la Figura 4.13, es un Oscilador controlado por corriente (CCO) que funciona en el rango de 156MHz a 320MHz. Vilariño Valle, Marta


Diseño Software del Microcontrolador 57

Tabla 4-4 Selección de valores de los condensadores de desacoplo para el oscilador externo en función de la frecuencia

Fosc

1MHz-5MHz

5MHz-10MHz

10MHz-15MHz

15MHz-20MHz

20MHz-25MHz

Condensador de carga del cristal (CL)

Resistencia máxima en serie con el cristal (R s )

10pF 20pF 30pF 10pF 20pF 30pF 10pF 20pF 30pF 10pF 20pF 30pF 10pF 20pF 30pF

<300Ω <300Ω <300Ω <300Ω <300Ω <220Ω <140Ω <220Ω <140Ω <80Ω <160Ω <90Ω <50Ω

Valores recomendados condensadores externos (Cx1 /Cx2 ) 58pF, 58pF 18pF, 18pF 38pF, 38pF 58pF, 58pF 18pF, 18pF 38pF, 38pF 58pF, 58pF 18pF, 18pF 38pF, 38pF 58pF, 58pF 18pF, 18pF 38pF, 38pF 58pF, 58pF

PLLC Etapa de Sincronización del Reloj

PLLE

PSEL (PLLCFG)

PLOCK (PLLSTAT)

Detector de Fase-Frecuencia

Fcco cco

0

Fout

mux

Fosc

1

Divisor por M

CCLK

MSEL (PLLCFG) Figura 4.13 Diagrama de Bloques del PLL

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


58

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

El multiplicador puede tomar un valor desde 1 a 32 aunque en la práctica dicho valor multiplicador no puede ser mayor de 7 en el LPC21xx y LPC22xx debido a la frecuencia superior límite de funcionamiento permitido para la CPU. El CCO funciona en el rango de 156MHz a 320MHz, pero como son frecuencias de funcionamiento muy altas, debemos volver a bajar dicha frecuencia mediante un divisor adicional. El divisor de salida debe configurarse para dividir por 2, 4, 8 o 16 para producir el reloj de salida. El valor mínimo del divisor de salida es 2 para asegurar que la salida del PLL es una señal con un duty_cycle al 50%. Los registros que controlan el PLL son: PLLCON: Registro de control del PLL. Este registro activa el PLL. PLLCFG: Registro de configuración del PLL. Controla los valores del divisor y el multiplicador del PLL. PLLSTAT: Registro de estado del PLL. PLLFEED: Registro de alimentación del PLL. Sirve de protección de los registros PLLCON y PLLCFG. El PLL es apagado y bypaseado (puentearlo, anularlo, que me lo salto, que conecto la entrada y el final del PLL sin pasar por el propio PLL) cuando se produce un reset o se entra en modo power-down. ElPLL sólo puede ser habilitado por software, es decir, una vez arrancado el microcontrolador el programa es quien debe configurar y activar el PLL, esperar a que éste se enganche para finalmente conectar el PLL como una fuente de reloj. Cuando arranco el microcontrolador se hace con el oscilador del sistema sin pasar por el PLL. Pasos de configuración: 1. Configurar y activar el PLL (corresponde al punto 6.9.10) 2. Esperar a que el PLL enganche. 3. Considerar el PLL como una fuente de reloj única del sistema. Este paso consiste en que el sistema pase a controlar el tiempo mediante el PLL en lugar de ser controlado por el cristal. Es decir, el PLL pasa a ser la fuente de reloj empleada para el funcionamiento global del sistema.

4.6.2. Registros del PLL En este apartado se describen los registros del PLL en detalle. 4.6.2.1 PLLCON: Registro de Control del PLL Este registro contiene los bits que habilitan y conectan el PLL. Conectando el PLL se consigue que todas las funciones del micro funcionen gracias al reloj de salida del PLL. Vilariño Valle, Marta


Diseño Software del Microcontrolador 59

Bit PLLCON<0>PLLE: habilita el PLL (PLLE=1 & PLL feed válido) y lo engancha a la frecuencia deseada. Bit PLLCON<1>PLLC: conecta el PLL (PLLE=1 & PLLC=1 & PLL feed válido)  conectará el PLL como fuente de reloj del microcontrolador (CCLK). 4.6.2.2 PLLCFG: Registro de Configuración del PLL Contiene los valores del multiplicador y del divisor del módulo PLL. Sólo tendrán efectos los cambios en este registro siempre y cuando tengamos una secuencia FEED del PLL válida. El proceso de cálculo de la frecuencia del PLL se detalla en el apartado 4.6.3. , donde también se detallan los valores del multiplicador y del divisor que recogen los siguientes grupos de bits. Bits PLLCFG <4:0>MSEL: valor “M” del multiplicador del PLL. Bits PLLCFG <6:5>PSEL: valor “P” del divisor del PLL. 4.6.2.3 PLLSTAT: Registro de estado del PLL Registro de sólo lectura que muestra los parámetros actuales del PLL, es decir, su estado en el momento de la lectura. Los bits o grupos de bits que coinciden en nombre con los registros PLLCON y PLLCFG, no tienen por qué coincidir en su valor. Bits PLLCFG <4:0>MSEL: valor de multiplicador del PLL. Bits PLLCFG <6:5>PSEL: valor del divisor del PLL. Bit PLLCFG <8>PLLE: Habilita el PLL (PLLE=1). Bit PLLCFG <9>PLLC: Conecta el PLL como fuente de reloj del controlador siempre que PLLE=1 y PLLC=1. Siempre que cualquiera de los dos bits vale 0 el PLL es “bypaseado”. Bit PLLCFG <10>PLOCK: Es un bit de monitoreo. Informa de si el PLL está enganchado o no. Si PLOCK=1 entonces el PLL estará enganchado. 4.6.2.4 Registro PLL Feed Para que los valores en los registros PLLCON y PLLCFG tengan efecto debe escribirse una secuencia correcta de feed en el registro PLLFEED. La secuencia correcta consiste en escribir en dos ciclos consecutivos del bus APB (nota: deshabilitadas las interrupciones y dos líneas de código sucesivas):  

Escribir el valor 0xAA en el registro PLLFEED. Escribir el valor 0x55 en el registro PLLFEED.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


60

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

4.6.3. Cålculo de frecuencia del PLL Paråmetros que debemos tener en cuenta:     

Fosc: Frecuencia del cristal externo. En este proyecto 12MHz. Fcco: frecuencia del CCO del PLL. CCLK: frecuencia de salida del mĂłdulo PLL. (si se configura puede ser la fuente de reloj del sistema). M: Multiplicador del PLL que se obtiene del valor MSEL en el registro PLLCFG. P: Divisor del PLL que se obtiene del valor PSEL en el registro PLLCFG.

Frecuencia de salida del mĂłdulo PLL cuando estĂĄ activado y conectado. Dos maneras de calcularlo:

đ??śđ??śđ??żđ??ž = đ?‘€ Ă— đ??šđ?‘œđ?‘ đ?‘?

đ??śđ??śđ??żđ??ž =

đ??šđ?‘?đ?‘?đ?‘œ 2Ă—đ?‘ƒ

(4.1)

(4.2)

Frecuencia del CCO. Dos maneras de calcularlo:

đ??šđ?‘?đ?‘?đ?‘œ = đ??śđ??śđ??żđ??ž Ă— 2 Ă— đ?‘ƒ

(4.3)

đ??šđ?‘?đ?‘?đ?‘œ = đ??šđ?‘œđ?‘ đ?‘? Ă— đ?‘€ Ă— 2 Ă— đ?‘ƒ

(4.4)

Rangos admisibles de cada valor:   

Rango Fosc: de 10MHz a 25MHz Rango CCLK: de 10MHz a Fmax (mĂĄxima frecuencia aceptada por el microcontrolador). Rango Fcco: de 156MHz a 320MHz.

VilariĂąo Valle, Marta


DiseĂąo Software del Microcontrolador 61

4.6.4. Proceso de ajuste de parĂĄmetros del proyecto //Microcontrolador: LPC2114 //Fosc: frecuencia del cristal externo : 12MHz #define #define #define #define #define

FOSC MSEL CCLK PCKDIV PCLK

12000000 //Crystal frequency 5 //PLL multiplier (FOSC*MSEL) //CPU clock= 60 000 000 1 //APB divider (CCLK/PCKDIV) //Peripheral clock

Frecuencia de salida del mĂłdulo PLL: A partir de la ecuaciĂłn (4.8) se obtiene la frecuencia del reloj CCLK obtenida en la ecuaciĂłn (4.5) de valor 60MHz. đ??śđ??śđ??żđ??ž = đ?‘€ Ă— đ??šđ?‘œđ?‘ đ?‘? = đ?‘€đ?‘†đ??¸đ??ż Ă— đ??šđ?‘‚đ?‘†đ??ś = 5 Ă— 12000000 = 60000000 đ??ťđ?‘§

(4.5)

Frecuencia del CCO: A partir de la ecuaciĂłn (4.3) se obtiene la frecuenciaFccode valor 12MHz. đ??šđ?‘?đ?‘?đ?‘œ = đ??śđ??śđ??żđ??ž Ă— 2 Ă— đ?‘ƒ = đ??śđ??śđ??żđ??ž Ă— 2 Ă— đ?‘ƒđ?‘†đ??¸đ??ż (≥ đ?‘ƒđ??śđ??žđ??ˇđ??źđ?‘‰) = 120000000 đ??ťđ?‘§

(4.6)

CĂłdigo en ensamblador de inicializaciĂłn del PLL: /**********************************************************/ /* System init */ /* PLL x 5, PCLK = CCLK */ /* CCLK=60.000MHz, PCLK=60.000MHz */ /* UART0 at38400 bps,8-bit,1-stop, no parity, FIFO on */ /**********************************************************/ ldr r1,=0xE01FC000 mov r2,#0xaa mov r3,#0x55 mov r0,#0x24 @ PLL x 5 strb r0,[r1,#0x84] @ PLLCFG strb r2,[r1,#0x8c] strb r3,[r1,#0x8c] mov r0,#1 @ PLL on strb r0,[r1,#0x80] @ PLLCON strb r2,[r1,#0x8c] strb r3,[r1,#0x8c] 1: ldrh r0,[r1,#0x88] @ PLLSTAT

Escuela TĂŠcnica Superior de Ingenieros de TelecomunicaciĂłn. Universidad de Valladolid


62

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

tst beq mov strb strb strb mov str mov str mov str

r0,#0x400 @ PLOCK on ? 1b r0,#3 @ PLL connected r0,[r1,#0x80] @ PLLCON r2,[r1,#0x8c] r3,[r1,#0x8c] r0,#1 r0,[r1,#0x100] @ APBDIV: PCLK=CCLK/1

r0,#2 @ MAM init r0,[r1] @ MAMCR=2(Fully enabled) r0,#3 r0,[r1,#4] @ MAMTIM=3(3 cycles/flash read)

sub mov str sub mov strb mov baud (PCLK=48 MHz strb mov strb mov strb mov strb

r1,r1,#(0xE01FC000-0xE002C000) @ PINSEL0 r0,#5 @ P0.0, P0.1 as UART r0,[r1] r1,r1,#(0xE002C000-0xE000C000) @ UART0 r0,#0x83 @ r0,[r1,#12] @ LCR=0x83 r0,#98 @ divider for38400 xxx58.9824MHz) r0,[r1] @ DLL r0,#0 r0,[r1,#4] @ DLH r0,#3 r0,[r1,#12] @ LCR=3(8 bit,1 stop, no parity) r0,#7 r0,[r1,#8] @ FCR=7(FIFOs on)

/* copy .datasection(Copy from ROM to RAM)*/ ldr R1,=_etext ldr R2,=_data ldr R3,=_edata 1:cmp R2, R3 ldrlo R0,[R1], #4 strlo R0,[R2], #4 blo 1b mov 2:

/* Clear .bsssection(Zero init)*/ R0, #0 ldr R1,=_bss_start ldr R2,=_bss_end cmp R1, R2 strlo R0,[R1], #4 blo 2b /* pass RAM TOP to appropriate var */ sub ldr str

r0,sp, #USR_STACK_SIZE r1,=_ramtop r0,[r1]

/*Enter the C code */ bl

Vilari帽o Valle, Marta

main

@ should not return, but...


Diseño Software del Microcontrolador 63

_Halt: flush 1:

.global _Halt mov r0,#(16<<20) bl ldr mov strb b

_delay_loop r1,=0xE01FC0C0 r0,#2 r0,[R1] 1b

@ delay to allow for UART @ PCON=2(power down)

Inicialización del PLL en código C: void init_PLL(void) { PLLCFG =0x00000024;//Fijar multiplicador y divisor del PLL para obtener 60MHz. PLLCON =0x00000001;// Habilitar PLL PLLFEED =0x000000AA;// Actualizar registros del PLL PLLFEED =0x00000055; while(!(PLLSTAT &0x00000400))// test del bit LOCK { ; } PLLCON =0x00000003;// Conectar el PLL PLLFEED =0x000000AA;// Actualizar registros del PLL PLLFEED =0x00000055; VPBDIV =0x00000002;//Fijar bus de periféricose VLSI peripheral bus a 30.000Mhz }

4.7 Controlador de los Vectores de Interrupción (VIC) El controlador de interrupciones vectorizadas (VIC) es un módulo que gestiona tanto los tipos de fuentes de interrupción distintas que se van a generar como la prioridad de las mismas.

4.7.1. Descripción del periférico El controlador de interrupciones vectorizadas posee 32 entradas de petición de interrupción y las divide en tres categorías de mayor a menor prioridad: 1. Fast Interrupt Request (FIQ): Si existieran más de una interrupción tipo FIQ, el controlador de interrupciones (VIC) combinará las peticiones para producir la

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


64

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

señal FIQ que envíe al procesador ARM. La latencia más rápida se alcanza cuando sólo existe una petición tipo FIQ. 2. Vectored IRQs: Tienen prioridad media y pueden asignarse a 16 vectores, donde el vector 0 tiene la máxima prioridad y el 15 la menor prioridad. 3. Non-vectored IRQs: tienen la prioridad más baja. El VIC combina todas las peticiones de interrupción anteriormente descritas para producir la señal de atención a la interrupción que enviará al procesador ARM. La rutina de atención a la interrupción puede empezar leyendo el registro del VIC correspondiente y saltando a la dirección que almacena el registro concreto. Si alguna de las interrupciones vectorizadas IRQ solicitan atención, el VIC siempre proporciona la dirección donde comienza la atención a la interrupción IRQ de mayor prioridad entre las que han solicitado atención. En caso contrario, el VIC proporcionará la dirección de la rutina por defecto que comparten las interrupciones no vectorizadas, es decir, las de menor prioridad. Las prioridades de las interrupciones se pueden asignar y ajustar de manera dinámica.

4.7.2. Registros del VIC Todos los registros del VIC son de tamaño “word” y se reflejan en la Tabla 4-6, en la Tabla 4-7 y en la Tabla 4-8 [5, p. 44]. En la Figura 4.14 se puede ver el diagrama de bloques del módulo VIC. A continuación se especificarán y describirán con detalle los registros realmente importantes del módulo VIC para el proyecto que nos ocupa. VicIntEnable: registro de habilitación de interrupción. Este registro controla cuál de las 32 fuentes de interrupción son FIQ y cuales IRQ. Un “1” habilita y un “0” no hace nada. VicIntEnClear: registro de 32 bit de sólo escritura. Un “1” borra el bit correspondiente de habilitación de interrupción del registro VicIntEnable. Un “0” deja el bit correspondiente del registro VicIntEnable sin cambios. VICVectAddr0-15: Estos 16 registros de 32 bit. Cada registro almacena la dirección de las rutinas de atención a la interrupción (ISR: Interrupt Service Routine) de cada uno de las 16 interrupciones vectorizadas IRQ. VICVectAddr: Registro de 32 bit de lectura y escritura. Almacena la dirección donde empieza el servicio de atención a la interrupción IRQ cuando ésta ocurre.

4.7.3. Fuentes de interrupción En la Tabla 4-5 se muestra una lista de cada fuente de interrupción correspondiente a cada periférico del microprocesador. Cada dispositivo periférico tiene una línea de interrupción conectada al VIC, pero además internamente tiene varios flags de interrupción, que pueden corresponder a distintas fuentes de interrupción. En este

Vilariño Valle, Marta


Diseño Software del Microcontrolador 65

proyecto, el TIMER0 y TIMER1 son dos de las fuentes de interrupción. También es fuente de interrupción la UART0, cuando recibe un comando o una orden nueva. TIMER0 corresponde al número en hexadecimal 4 canal del VIC y máscara 0x00000010, y el TIMER1 al número hexadecimal 5 canal del VIC y máscara 0x00000020. Tabla 4-5 Fuentes de Interrupción

WDT

VIC canal 0

BLOQUE

LPC2114 VIC BLOQUE canal SPI0 10

BLOQUE CAN1 TX

VIC canal 20

---

1

SPI1 (SSP)

11

CAN2 TX

21

ARM Core0

2

PLL

12

CAN3 TX

22

ARM Core1

3

RTC

13

CAN4 TX

23

TIMER 0

4

14

Reservado

24

TIMER 1

5

15

FULL CAN

25

UART 0

6

16

CAN1 RX

26

UART 1

7

17

CAN2 RX

27

PWM

8

ADC

18

CAN3 RX

28

I2C

9

CAN

19

CAN4 RX

29

System Control

Tabla 4-6 Mapa de registros del Vectored Interrupt Controller (I)

Registro

Acceso

Dirección

Descripción

VICIRQStatus

RO

0xFFFF F000

Lee el estado de las peticiones de interrupción tipo IRQ.

VICFIQStatus

RO

0xFFFF F004

Lee el estado de las peticiones de interrupción tipo FIQ.

VICRawIntr

RO

0xFFFF F008

Lee el estado de las 32 peticiones de interrupción indepenientemente de si están habilitadas y el tipo de interrupción.

VICIntSelect

R/W

0xFFFF F00C

VICIntEnable

R/W

0xFFFF F010

VICIntEnClr

WO

0xFFFF F014

Clasifica cada cada una de las 32 interrupciones como FIQ o IRQ. Controla cuales de las 32 peticiones de interrupción y las interrupciones software son habilitadas como FIQ o IRQ. Permite borrar uno o varios bits del registro de habilitación de interrupciones.

VICSoftInt

R/W

0xFFFF F018

Contiene el estado de las interrupciones posibles de periféricos.

VICSoftIntClear

WO

0xFFFF F01C

VICProtection

R/W

0xFFFF F020

VICVectAddr

R/W

0xFFFF F030

VICDefVectAddr

R/W

0xFFFF F034

Permite borrar uno o varios bits del registro VICSoftIntClear. Permite acceso limitado a los registros del VIC en modo de privilegio. Almacena la dirección de servicio de atención a la interrupción (ISR) IRQ que se ha generado. Mantiene la dirección de la ISR para las interrupciones IRQ novectorizadas.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


66

Diseรฑo e Implementaciรณn de un Analizador Lรณgico Digital basado en un microprocesador ARM7

Tabla 4-7 Mapa de registros del Vectored Interrupt Controller (II)

Registro

Acceso

Direcciรณn

VICVectAddr0

R/W

0xFFFF F100

VICVectAddr1 VICVectAddr2 VICVectAddr3 VICVectAddr4 VICVectAddr5 VICVectAddr6 VICVectAddr7 VICVectAddr8 VICVectAddr9 VICVectAddr10 VICVectAddr11 VICVectAddr12 VICVectAddr13 VICVectAddr14 VICVectAddr15

R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W

0xFFFF F104 0xFFFF F108 0xFFFF F10C 0xFFFF F110 0xFFFF F114 0xFFFF F118 0xFFFF F11C 0xFFFF F120 0xFFFF F124 0xFFFF F128 0xFFFF F12C 0xFFFF F130 0xFFFF F134 0xFFFF F138 0xFFFF F13C

Descripciรณn Registro de vector de direcciรณn 0. Almacena la direcciรณn de las ISR para las 16 posiles interrupciones IRQ. Registro de vector de direcciรณn 1 Registro de vector de direcciรณn 2 Registro de vector de direcciรณn 3 Registro de vector de direcciรณn 4 Registro de vector de direcciรณn 5 Registro de vector de direcciรณn 6 Registro de vector de direcciรณn 7 Registro de vector de direcciรณn 8 Registro de vector de direcciรณn 9 Registro de vector de direcciรณn 10 Registro de vector de direcciรณn 11 Registro de vector de direcciรณn 12 Registro de vector de direcciรณn 13 Registro de vector de direcciรณn 14 Registro de vector de direcciรณn 15

Tabla 4-8 Mapa de registros del Vectored Interrupt Controller (III)

Registro

Acceso

Direcciรณn

VICVectCntl0

R/W

0xFFFF F200

VICVectCntl1 VICVectCntl2 VICVectCntl3 VICVectCntl4 VICVectCntl5 VICVectCntl6 VICVectCntl7 VICVectCntl8 VICVectCntl9 VICVectCntl10 VICVectCntl11 VICVectCntl12 VICVectCntl13 VICVectCntl14 VICVectCntl15

R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W

0xFFFF F204 0xFFFF F208 0xFFFF F20C 0xFFFF F210 0xFFFF F214 0xFFFF F218 0xFFFF F21C 0xFFFF F220 0xFFFF F224 0xFFFF F228 0xFFFF F22C 0xFFFF F230 0xFFFF F234 0xFFFF F238 0xFFFF F23C

Vilariรฑo Valle, Marta

Descripciรณn Registro de control 0. Controla la prioridad de cada uno de las 16 posibles interrupciones IRQ. El registro 0 es el de mayor prioridad y el 15 el de menor prioridad. Registro de control 1 Registro de control 2 Registro de control 3 Registro de control 4 Registro de control 5 Registro de control 6 Registro de control 7 Registro de control 8 Registro de control 9 Registro de control 10 Registro de control 11 Registro de control 12 Registro de control 13 Registro de control 14 Registro de control 15


Diseño Software del Microcontrolador 67

Figura 4.14 Diagrama de bloques del VIC [2, p. 53]

4.8 Configuración e Interrupción del TIMER0 Y/O TIMER1: El módulo temporizador permite medir un tiempo en función de la frecuencia programada. Durante ese tiempo el temporizador “espera” y luego dispara una “acción” concreta.

4.8.1. Descripción del periférico Todas las características de este periférico son comunes a toda la familia LPC21xx.Este periférico está preparado para contar ciclos de una señal de reloj interna o externa al microcontrolador. Además, permite generar interrupciones si ocurre un determinado

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


68

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

evento en un registro. Para ello dispone de 8 registros, cuatro de match y 4 de capture. El primero sirve para comparar el TC con un valor previamente fijado y conocido, el segundo se incrementa mediante flancos de subida o de bajada. Este bloque está especialmente diseñado para contar ciclos de la señal de reloj de periféricos (PCLK) del microcontrolador o de una señal externa de reloj tal y como se muestra en laFigura 4.15. Es posible generar interrupciones cuando el timer tiene un valor concreto basado en ocho registros, cuatro registros para match y los restantes para capture. Capture se incrementa por medio de flancos, subida o bajada, y match mediante la comparación de un valor previamente fijado y conocido por el timer.

PCLK

PC

NO PC++;

¿PC=PR? SI TCx++; PC=0;

NO ¿TCx=MRx? SI Interrupción por Timer Figura 4.15 Diagrama de flujo de funcionamiento general del TIMER

Para el uso de este módulo se utilizarán los pines CLK y CLK_BY_8 que corresponden con los pines correspondientes a MAT0.2 y MAT0.1 del TIMER0 (patillas 47 y 29 del microprocesador, respectivamente).Para la aplicación se va a trabajar únicamente con el TIMER0 con ambos periféricos configurados en modo “Timer”.

Vilariño Valle, Marta


DiseĂąo Software del Microcontrolador 69

4.8.2. Registros del Timer: 4.8.2.1 TxTCR: Timer Control Register. Activa o inicializa el timer. Ajusta el conteo del timer pudiendo incrementarlo mediante el flanco de subida (edge) o de bajada (rise) de la seĂąal de reloj. Bit TxTCR<0>Counter Enable: Si vale “1â€? activamos el Contador del timer y el contador de preescala. Si vale “0â€? estĂĄn desactivados los contadores. Bit TxTCR<1>Counter Reset: Si vale “1â€? activamos el reset de los contadore del timer y de preescala sincronizados cada flanco de subida del PCLK. Si vale “0â€? el reset de ambos contadores no estĂĄ definido.

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

T0TCR

Figura 4.16 ConfiguraciĂłn del Registro de Control del Timer (Reset)

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

0

1

T0TCR

Figura 4.17 ConfiguraciĂłn del Registro de Control del Timer (Habilitar)

4.8.2.2 TxTC: Timer Counter. Registro contador del Timer. Es un registro de 32 bit y se incrementa cada PR+1 ciclos del PCLK. Este registro es controlado mediante TCR. 4.8.2.3 TxPR: Prescale Register. Introduce el valor del prescaler (divisor del timer). El contador de prescala es igual a este valor. Para elegir el valor de preescala emplearemos la ecuaciĂłn (4.7).

đ?‘‡đ?‘Ľđ?‘‡đ??śđ?‘?đ?‘™đ?‘œđ?‘?đ?‘˜ đ?‘“đ?‘&#x;đ?‘’đ?‘?đ?‘˘đ?‘’đ?‘›đ?‘?đ?‘Ś =

đ?‘ƒđ??śđ??żđ??ž đ?‘‡đ?‘Ľđ?‘ƒđ?‘… + 1

(4.7)

Escuela TĂŠcnica Superior de Ingenieros de TelecomunicaciĂłn. Universidad de Valladolid


70

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.8.2.4 TxPC: Prescale Counter Registro contador de preescala de 32 bit. Se incrementa su valor en uno cada ciclo de PCLK hasta que alcanza el valor almacenado en el registro PR. Cuando PC alcanza el valor de PR, se incrementa el valor de TC y se borra el PC. 4.8.2.5 TxMRx [MR0…MR3]: Match Registers Los registros de matching son habilitados a través del registro MCR para resetear el TC, parar el conteo en TC y el PR, o generar interrupción cuando el registro de matching elegido alcanza el valor del TC. 4.8.2.6 TxMCR: Match Control Register. Registro de Control de matching que se emplea para controlar si se ha producido interrupción y se resetea o no el TC cuando ocurre el matching, es decir, cuando uno de los cuatro registros MR alcanza el valor del TC.En la Figura 4.18se especifican los comportamientos deseados en función del registro MR empleado. Para cada registro MR se configuran las acciones posibles que se recogen en la Tabla 4-9.

Bit 15

...

Bit 12

Bit 11

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

0

0

0

0

0

1

1

0

0

0

0

0

0

reservados

MR3S MR3R MR3I

MR2S MR2R MR2I

MR1S MR1R MR1I

T0MCR

MR0S MR0R MR0I

Figura 4.18 Configuración registro TxMCR

4.8.2.7 TxCCR: Capture Control Register. Controla los flancos de las entradas de captura que son empleados para cargar los registros de captura (CRx) y comprobar si una interrupción se ha producidos cuando la captura ocurre. 4.8.2.8 TxCRx [CR0…CR3]: Capture Register. Registro de captura que es cargado con el valor del contador del timer (TC) cuando se produce un evento en cualquiera de los pines de entrada del micro CAPn.[0,1,2,3]. 4.8.2.9 TxEMR: External Match Register. Este registro controla la funcionalidad de los pines de matching del microcontrolador MATn.0-3 (MAT0.0-3, para el Timer 0 y MAT1.0-3, para el Timer1). Bit TxEMR<0>EM0: Valor lógico de MATn.0. Bit TxEMR<1>EM1: Valor lógico de MATn.1. Bit TxEMR<2>EM2: Valor lógico de MATn.2. Bit TxEMR<3>EM3: Valor lógico de MATn.3. Vilariño Valle, Marta


Diseño Software del Microcontrolador 71

Tabla 4-9 Configuración del registro TxMCR

TxMCR

Control MR0

Control MR1

Control MR2

Control MR3

-

Bit

Símbolo

0

MR0I

1

MR0R

2

MR0S

3

MR1I

4

MR1R

5

MR1S

6

MR2I

7

MR2R

8

MR2S

9

MR3I

10

MR3R

11

MR3S

15:12

-

Descripción Si vale "1" genera interrupción en MR0, cuando MR0 = TC Si vale "1" se produce reset en MR0, cuando MR0=TC Si vale "1"se produce stop en MR0: TC y PC se paran y TCR = 0 si MR0 = TC Si vale "1" genera interrupción en MR1, cuando MR1 = TC Si vale "1" se produce reset en MR1, cuando MR1=TC Si vale "1"se produce stop en MR1: TC y PC se paran y TCR = 0 si MR1 = TC Si vale "1" genera interrupción en MR2, cuando MR2 = TC Si vale "1" se produce reset en MR2, cuando MR2=TC Si vale "1"se produce stop en MR2: TC y PC se paran y TCR = 0 si MR2 = TC Si vale "1" genera interrupción en MR3, cuando MR3 = TC Si vale "1" se produce reset en MR3, cuando MR3=TC Si vale "1"se produce stop en MR3: TC y PC se paran y TCR = 0 si MR3 = TC -

Reset 0 0 0 0 0 0 0 0 0 0 0 0 -

Tabla 4-10 Control de la función de las salidas de matching. Registro TxEMR

Valor 00 01 10 11

Función No hacer nada Clear MATn.m : Pone a "0" Set MATn.m : Pone a "1" Toggle MATn.m : Pone a "0" si vale "1" y pone a "1" si vale "0"

Para el control de las patillas de los registros MATn.m, se configuran dos bit según los valores que vemos en la Tabla 4-10. Bits TxEMR<5:4>EMC0: Control de MATn.0. Bits TxEMR<7:6>EMC1: Control de MATn.1. Bits TxEMR<9:8>EMC2: Control de MATn.2.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


72

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Bits TxEMR<11:10>EMC3: Control de MATn.3. Bits TxEMR<31:12>: Bits reservados.

Bit 31

...

Bit 12

Bit 11

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

0

0

0

1

1

0

0

0

0

0

1

0

0

EM3

EM2

EM1

EM0

reservados

EMC3

EMC2

EMC1

EMC0

T0EMR

Figura 4.19 Configuración registro TxEMR

4.8.2.10 TxIR: Registro de interrupción. El registro de interrupción del timer se emplea para escribir y eliminar interrupciones y también para leer e identificar cuál de las posibles interrupciones está pendiente. Concretamente, la interrupción que genera el TIMER, cuando uno de los GPIO pines (configurado como entrada) detecta que la señal deja de tener un valor HIGH (falling edge 1). En este justo instante el valor del TIMER es almacenado. Cuando se produce una interrupción en el módulo VIC copia en el registro VICVectAddr la dirección correspondiente para que se atienda la interrupción. Tabla 4-11 Configuración del Registro de Interrupciones (TxIR)

Bit

Símbolo Interrupción

Descripción

Reset

0

MR0

Flag de interrupción de match para el canal 0

0

1

MR1

Flag de interrupción de match para el canal 1

0

2

MR2

Flag de interrupción de match para el canal 2

0

3

MR3

Flag de interrupción de match para el canal 3

0

4

CR0

Flag de interrupción de captura para el canal 0

0

5

CR2

Flag de interrupción de captura para el canal 1

0

6

CR3

Flag de interrupción de captura para el canal 2

0

7

CR4

Flag de interrupción de captura para el canal 3

0

Vilariño Valle, Marta


Diseño Software del Microcontrolador 73

4.8.3. Configuración del periférico para la aplicación El diseño del microcontrolador está pensado de manera que configuremos el Timer0que proporciona el LPC2114. La patilla MAT0.2 (pin 46) para CLK y la patilla MAT0.1 (pin 29) para el reloj CLK_BY_8. Sin embargo, durante el desarrollo del código de programa se ha configurado únicamente la patilla 28 con la función de GPIO como salida, es decir, se cambiará el estado de alto a bajo en ese pin en concreto para generar la señal.

Figura 4.20 Esquema electrónico de los pines correspondientes a los relojes

El reloj CLK controlará los registros de desplazamiento. Cada flanco de subida de la señal introducirá un bit en los registros de desplazamiento que, en nuestro caso, están configurados en modo serie (IN) – paralelo (OUT).

Figura 4.21 Diagrama Funcional de los Registros de Desplazamiento

La señal CLK_BY_8 es la señal de reloj lenta, la que se encargará del almacenamiento de los datos. Cada ocho ciclos de la señal CLK tendremos los 8 bit almacenados y listos, es decir, el dato válido, para ser transmitidos y “poner” en los puertos del microprocesador.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


74

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

Nuestro programa manejarĂĄ la constante T, que es el periodo de la seĂąal CLK, siendo 8*T el periodo de CLK_BY_8. Haremos las pruebas con el caso mĂĄs restrictivo.

#define T

5*1e-6 //base de tiempos(en segundos):caso mĂĄs restrictivo

El diagrama de funcionamiento de los relojes es el siguiente: T T/2 CLK 2T

3T

4T

5T

6T

7T

8T

CLK_BY_8

4T

8T

Figura 4.22 Diagrama de funcionamiento de CLK y CLK_BY_8

Partiendo del funcionamiento deseado del diagrama anterior, Figura 4.22, y teniendo el cuenta el diseĂąo hardware de laFigura 4.20, donde CLK corresponde al pin 46 configurado como MAT0.2 , y CLK_BY_8 correspondiente al pin 29 configurado como salida GPIO y no como MAT0.1 que configuraremos como tal en el registro PINSEL0 y PINSEL1. Como ambos relojes se han situado en los match2, se tiene que almacenar el valor a comparar con TC en los registros TxMR2.

PC

Âż PC > PR ?

PC ++;

SI

ON

PCLK (reloj de perifĂŠricos)

TC ++; PC = 0;

Âż TC =TxMR2 ? (T0MR2 = (T/2)*PCLK; T1MR2 =4*T*PCLK;)

SI

InterrupciĂłn TIMER0/1 (CLK/CLK_BY_8)

Figura 4.23 Algoritmo de Funcionamiento del TIMER

Se emplearĂĄ TIMER0 para generar una seĂąal CLK que producirĂĄ interrupciĂłn cada T/2. SegĂşn la Figura 4.23si T0TC=T0MR2, donde đ?‘‡0đ?‘€đ?‘…2 = đ?‘‡â „2 ∗ đ?‘ƒđ??śđ??żđ??ž y T0PR=0 entonces: ďƒź se producirĂĄ la interrupciĂłn por Timer0 y que serĂĄ atendida por la subrutina “irq__tc0â€? . Dicha subrutina se encargarĂĄ de generar la otra seĂąal de reloj,

VilariĂąo Valle, Marta


DiseĂąo Software del Microcontrolador 75

CLK_BY_8. Cada ocho veces que se produce la interrupciĂłn por Timer0, que corresponde a un tiempo 4 ∗ đ?‘‡ ∗ đ?‘ƒđ??śđ??żđ??ž , la seĂąal CLK_BY_8 cambia de valor, es decir, si se encuentra en estado alto “1â€? pasa a estado bajo “0â€?, y viceversa. ďƒź T0TC=0 . A continuaciĂłn se han configurado los valores del resto de registros para obtener el funcionamiento deseado de los relojes. Los pasos a seguir para la configuraciĂłn del Timer son los siguientes: 1. Resetear el Timer. Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

T0TCR

Figura 4.24 ConfiguraciĂłn TxTCR

2. Establecer el valor de preescala. Ya se ha comentado que se ha elegido un valor cero para T0PR y T1PR. AsĂ­ TC se incrementarĂĄ con cada flanco de la seĂąal PCLK. 3. Configurar el registro TxEMR que habilita la acciĂłn a realizar a la salida de las patillas MAT: nada, a “0â€?, a “1â€? o toggle. En este caso, seleccionaremos MAT2 puesto que MAT0.2 controla CLK. Bit 31

...

Bit 12

Bit 11

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

0

0

0

1

1

0

0

0

0

0

1

0

0

EM3

EM2

EM1

EM0

reservados

EMC3

EMC2

EMC1

EMC0

T0EMR

Figura 4.25 ConfiguraciĂłn TxEMR

T0EMR<2> = 1:selecciona EM2(Match2) que controla CLK (MR2=TC provocara un toggle, es decir, la seĂąal cambia de estado cada T/2). T0EMR<9:8> = 11 : selecciona la funciĂłn del Match2-->TOGGLE, cambia estado anterior, en MR2 para obtener CLK. Toma el valor en funciĂłn de la acciĂłn que se desea que realice como se muestra en laTabla 4-10. 4. Configurar el registro TxMCR que establece las acciones a realizar cuando el contador de timer alcanza el valor fijado por el registro de matching elegido MRx. Entre las acciones posibles se encuentran: interrupciĂłn, reseteo del TC o no hacer nada.

Escuela TĂŠcnica Superior de Ingenieros de TelecomunicaciĂłn. Universidad de Valladolid


76

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

Bit 15

...

Bit 12

Bit 11

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

0

0

0

0

0

1

1

0

0

0

0

0

0

reservados

MR3S MR3R MR3I

MR2S MR2R MR2I

MR1S MR1R MR1I

T0MCR

MR0S MR0R MR0I

Figura 4.26 ConfiguraciĂłn TxMCR

Como las patillas de Match 2 son controladas por el registro MR2 sĂłlo se configuran los bits correspondientes a este registro. T0MCR<6>= 1: Habilitar la interrupciĂłn que serĂĄ generada cuandoT0TC alcance el valor de T0MR2. TOMCR<7> = 1: Reset en MR2. T0TC se pone a cero cuando alcanza el valor en T0MR2. T0MCR<8> = 0: Stop en MR2. Si “1â€?cuando TC=MR2 resetea T0TCR=0 y para T0TC y T0PR. 5. Fijar el valor del registro de matching TxMRx con el que se va a comparar el valor actual del contador del timer, TC. Para generar la seĂąal CLK, que debe cambiar cada T/2, siendo T el periodo entre dos flancos de subida. Es decir, cada T/2 de la base de tiempos T, se harĂĄ un toggle. El valor que se compararĂĄ con T0TC es:đ?‘‡0đ?‘€đ?‘…2 = đ?‘‡â „2 ∗ đ?‘ƒđ??śđ??żđ??ž Para generar la seĂąal CLK_BY_8, se desea que cambie cada 4T siendo T el periodo entre dos flancos de subida. Cada ocho interrupciones es cuando se realizarĂĄ la lectura de los puertos, puesto que es en ese momento cuando el dato vĂĄlido estĂĄ almacenado en los registros de desplazamiento. Por tanto, cada dos veces el valor 4 ∗ đ?‘‡ ∗ đ?‘ƒđ??śđ??żđ??ž, la seĂąal de reloj mĂĄs lenta cambiarĂĄ. 6. Definir y asignar la subrutina de atenciĂłn a la interrupciĂłn correspondiente a un registro del VIC. Timer 0: VICVectAddr1 = (unsigned long)irq_tc0;

Cada dos interrupciones de Timer 1 se hace un toggle en la patilla correspondiente a CLK_BY_8. 7. Especificar la prioridad de la interrupciĂłn. Timer 0: Se asigna prioridad 1, en el canal 4. InterrupciĂłn vectorizada (bit5 =1). VICVectCntl1=(4)|(1<<5);

VilariĂąo Valle, Marta


Diseño Software del Microcontrolador 77

8. Habilitar el Timer. Timer 0: T0TCR = 0x01;

9. Habilitar la interrupción para el Timer. Timer 0: VICIntEnable |= 1<<4;

Con todo esto, las subrutinas de configuración del Timer0 es: void config_TIMER0() { T0TCR = 0x02; // Reseteo del timer T0PR=0;//TC se incrementara con cada pulso de PCLK perifericos) T0EMR = 0x00000304; //T0EMR: Selecciona la acción a la salida de las patillas (Match1 y Match2), nada, a 0, a 1 o toggle T0MCR = 0x000000C0; //T0MCR: cuando TC=MRx : interrupción, reset en TC o nada. if (frec==0) T0MR2 = (1*1e-6*PCLK)/4; else T0MR2 = (T*1e-6*PCLK)/2; //TOMR2:controla la acción que se realiza cuando TC=MR2. // ^-----^-----^-----// | | | | | // | | | | | // ----------// <-T/2-> CLK cambia cada T/2 (toggle) de la base de tiempos // <------T-----> CLK produce un flanco de subida cada T: base de tiempos T0TCR = 0x01; // Habilitamos el timer VICIntEnable |= 1<<4; //Habilitamos la interrupción para el TIMER 0 VICIntSelect &=~(1<<4); //timer0 es irq VICVectCntl1=(4)|(1<<5); //interrupcion timer0( en el canal 4)prio.1 VICVectAddr1 = (unsigned long)irq_tc0; }

Y la subrutina de atención a la interrupción del Timer 0 es: void irq_tc0(void) { staticint dato; num_interrupciones--; if(num_interrupciones==0) CLK_by_8 cambia {

//estamos

en

4T

y

la

señal

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


78

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

//rutina del PRODUCTOR: es decir, almaceno una lectura (32bit) en el buffer if( clk8_toggle ==1) { clk8_toggle =0;//cambio el estado de la señal clk_by_8 IOSET0 =1<<5; // Pone P0.5 a ‘1’. dato = leer_puertos(); switch(captura) { case0:// No captura break; case1:// Captura incondicional captura_incondicional: BUFFER[wr_idx]= dato; wr_idx =(wr_idx +1)%buffer_elements; if(wr_idx == rd_idx)// Buffer lleno { captura=0; //parar captura buffer_lleno =1; leido =0; } else { buffer_lleno =0; } break; case2:// Captura condicional:mirar el disparo if(trigger_active(dato)) { captura =1; goto captura_incondicional; } break; } } else { clk8_toggle =1; IOCLR0 =1<<5; } num_interrupciones=8;

// Pone P0.5 a ‘0’.

} T0IR=(1<<2); VICVectAddr=-1;

// Reset MR2 interrupt

}

Se ha optado por establecer el registro de preescala TxPR a cero para que el contador del timer, TxTC, se incremente con cada pulso del reloj de periféricos, PCLK.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 79

4.9 Configuración e Interrupción del puerto serie de comunicación UART. Este módulo permite la transmisión y recepción de envío de datos. Es el módulo que jugará su papel a la hora de realizar la comunicación entre la placa y el PC.

4.9.1. Descripción del periférico El microprocesador LPC2114 posee dos módulos UART (UART0/1) para la comunicación serie asíncrona, con registros de transmisión y recepción de 16 bytes FIFO(First-In, First-Out).Se puede configurar el disparo del receptor FIFO en 1, 4, 8 y 14 bytes. Incorpora un generador de tasa de baudios con capacidad de autobauding. Con el que se puede llegar hasta 115200 baudios de velocidad empleando cristales de cuarzo a partir de valores de 2MHz. El cristal que se ha elegido es de valor 12MHz. Además posee un mecanismo que habilita el control de flujo mediante software y hardware, y las ubicaciones de los registros cumplen el estándar industrial 550. El UART1 se diferencia en que además posee un interfaz para señales modem estándar. Como este módulo no va a ser empleado, queda aquí mencionado sin necesidad de mayor análisis y estudio. Emplearemos la UART0 para transmitir los datos almacenados en el buffer circular de memoria interno, provenientes de los registros de desplazamiento, y para recibir las tramas de datos que atienden a los distintos comandos que se pueden enviar desde la aplicación de usuario del PC. Para la transmisión y recepción se dispone de dos pines:  

RXD0: Entrada Serie de recepción de datos (pin 21, P0.0). TXD0: Salida serie. Salida de transmisión de datos (pin 19, P0.1).

4.9.2. Registros de la UART La UART0 contiene varios registros. El DLAB (U0LCR<7>), bit de acceso a los registros divisores que determinan la tasa de baudios para todas las transferencias de la UART debe ser configurado y para ello se seguirán los siguientes pasos: 1. DLAB = 1. 2. Fijar la tasa de baudios mediante los registros DLL y DLM (en la dirección de memoria 0xE000 C000). 3. DLAB = 0. 4. Leer en la dirección de memoria 0xE000 C000 los accesos al registro U0RBR. 5. Escribir en la dirección de memoria 0xE000 C000 los accesos al registro U0THR.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


80

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.9.2.1 U0RBR: Receiver Buffer Register Este registro es el byte en el “top” de la FIFO de recepción y contiene primer carácter recibido que puede ser leído a través de la interfaz del bus. El LSB, correspondiente al bit 0, representa el primer bit de información recibida, es “el más antiguo”. Si el carácter recibido por la UART es menor de 8 bits, el resto de bits MSB restantes se llenarán con ceros. Este registro es de sólo lectura y puede ser accedido siempre que DLAB=0 (U0LCR<7>).

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

MSB

...

U0RBR

LSB

Figura 4.27 Configuración registro U0RBR

4.9.2.2 U0THR: Transmit Holding Register Este registro es el byte en el “top” de la FIFO de transmisión y contiene el último carácter recibido en el buffer que puede ser escrito a través de la interfaz del bus. El LSB representa el primer bit para transmitir. El byte será enviado cuando se alcance la parte baja de la FIFO y el transmisor esté disponible. Este registro es de sólo escritura y puede ser accedido siempre que DLAB=0 (U0LCR<7>).

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

MSB

...

U0THR

LSB

Figura 4.28 Configuración registro U0THR

4.9.2.3 U0DLL y U0DLM: Divisor Latch Registers Los registros Divisor Latch LSB Register (U0DLL) y Divisor Latch MSB Register (U0DLM) determinan la tasa de baudios múltiplo de 16 con la que va a trabajar la UART0. Ambos registros juntos forman un divisor de 16 bit donde U0DLL contiene los 8 bits inferiores y U0DLM contiene los 8 bits superiores. Un valor 0x0000 será interpretado como 0x0001 para evitar la división por cero. Vilariño Valle, Marta


Diseño Software del Microcontrolador 81

Estos dos registros son de lectura y escritura y para poder ser accedidos el bit DLAB (U0LCR<7>) debe valer uno. Debemos seleccionar los valores adecuados para ambos registros y calcular la tasa de baudios a partir de la Tabla 4-15 y empleando la ecuación (4.8).

𝑈𝐴𝑅𝑇0𝑏𝑎𝑢𝑑𝑟𝑎𝑡𝑒 =

𝑃𝐶𝐿𝐾 16 𝑥 (256 𝑥 𝑈0𝐷𝐿𝑀 + 𝑈0𝐷𝐿𝐿)

(4.8)

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

MSB

...

LSB

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

1

0

MSB

U0DLL

...

U0DLM

LSB

Figura 4.29 Configuración registros U0DLL y U0DLM

4.9.2.4 U0FDR: Fractional Divider Register Este registro controla el reloj del pre-escaler para la generación de la tasa de baudios y puede ser tanto escrito como leído con total libertad. El pre-escaler toma el valor del reloj APB y genera un reloj de salida de acuerdo a los requisitos especificados en U0FDR. Bits U0FDR<0:3>DIVADDVAL: Valor del divisor del pre-escaler para la generación de la tasa de baudios. Si este valor es cero, el generador de tasa de baudios fraccional no afectará al cálculo de la tasa de baudios en la UART. Bits U0FDR<7:4>MULVAL: Valor del multiplicador del pre-escaler para la generación de la tasa de baudios. Para que la UART funcione correctamente este campo debe ser mayor o igual que uno. Bits U0FDR<31:8>: Bits reservados y no se debe escribir uno en ellos. Es importante señalar que si el registro está activo (DIVADDVAL > 0) y DLM=0, entonces el valor en el registro DLL debe ser mayor o igual que 3.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


82

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

Bit 31

...

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

-

0

0

0

0

0

1

0

0

reservados

MULVAL

U0FDR

DIVADDVAL

Figura 4.30 ConfiguraciĂłn registro U0FDR

El valor del registro U0FDR no debe variar para que no exista pĂŠrdida de datos o ĂŠstos lleguen corruptos. Con estos nuevos requisitos, se puede concretar aĂşn mĂĄs el cĂĄlculo de la tasa de baudios a partir de la ecuaciĂłn (4.9), dondePCLK es el reloj de perifĂŠricos y MULVAL Y DIVADDVAL deben cumplir las siguientes condiciones: 1. 0 < MULVAL ≤ 15 2. 0 ≤ DIVADDVAL < 15 3. DIVADDVAL < MULVAL đ?‘ˆđ??´đ?‘…đ?‘‡0đ?‘?đ?‘Žđ?‘˘đ?‘‘đ?‘&#x;đ?‘Žđ?‘Ąđ?‘’ =

đ?‘ƒđ??śđ??żđ??ž 16 đ?‘Ľ (256 đ?‘Ľ đ?‘ˆ0đ??ˇđ??żđ?‘€ + đ?‘ˆ0đ??ˇđ??żđ??ż) đ?‘Ľ (1 +

đ??ˇđ??źđ?‘‰đ??´đ??ˇđ??ˇđ?‘‰đ??´đ??ż đ?‘€đ?‘ˆđ??żđ?‘‰đ??´đ??ż

)

(4.9)

4.9.2.5 U0FCR: FIFO Control Register Este registro controla los buffer FIFO de recepciĂłn y transmisiĂłn.

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

0

0

RX Trigger Level

reservados

TX FIFO RX FIFO Reset Reset

U0FCR

FIFO enable

Figura 4.31 ConfiguraciĂłn registro U0FCR

Bit U0FCR<0>FIFO Enable: Si vale 0 los buffer FIFO estĂĄn deshabilitados. Si vale 1 estĂĄn habilitados los FIFO de transmisiĂłn (TX) y de recepciĂłn (RX) y los bits U0FDR<7:1>. Cualquier transiciĂłn que ocurra en este bit borra automĂĄticamente los buffer FIFO de la UART. Bit U0FCR<1>RX FIFO Reset: Si el bit vale 0 no tiene efecto alguno. Si el bit vale 1 borra todos los bytes en la FIFO de recepciĂłn en la UART. Bit U0FCR<2>TX FIFO Reset: Si el bit vale 0 no tiene efecto alguno. Si el bit vale 1 borra todos los bytes en la FIFO de transmisiĂłn en la UART. Bits U0FCR<5:3>: No se deben escribir unos en estos bits. VilariĂąo Valle, Marta


Diseño Software del Microcontrolador 83

RX Trigger Level (U0FCR<7:6>): Estos dos bits determinan cuántos caracteres recibe la FIFO de RX antes de activar la interrupción. La Tabla 4-12 recoge las configuraciones posibles. Tabla 4-12 Configuración del RX Trigger Level

U0FCR<7:6>

DESCRIPCIÓN

00 01 10 11

1 carácter o 0x01 4 caracteres o 0x04 8 caracteres o 0x08 14 caracteres o 0x0E

4.9.2.6 U0LCR: Line Control Register Este registro determina el formato de los datos que serán transmitidos y/o recibidos.

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

0

0

DLAB

Break Control

Parity Enable

Stop Bit Select

Parity Select

U0LCR

Word Length Select

Figura 4.32 Configuración registro U0LCR

Bits U0LCR<1:0>Word Length Select: Estos dos bit configuran la longitud en bits de la palabra enviada o recibida. Tabla 4-13 Configuración Word Length Select (U0LCR<1:0>)

U0LCR<1:0>

Longitud del carácter

00

5 bits

01

6 bits

10

7 bits

11

8 bits

Bit U0LCR<2>Stop Bit Select: Si es 0 se emplea un bit de parada, si es 1 se utilizan dos bits de parada. Para una longitud de carácter de 5 bits se emplearán 1.5 bits de parada.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


84

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Bit U0LCR<3>Parity Enable: Si es 0 la habilitación y chequeo de paridad está deshabilitad y si es 1 está habilitada. Bit U0LCR<5:4>Parity Select: Estos bits configuran cómo se realiza la paridad de los datos. Tabla 4-14 Configuración Parity Select (U0LCR<5:4>)

U0LCR<5:4>

Descripción

00

Paridad impar: el número de 1's transmitidos en el carácter enviado y el bit de paridad será impar.

01

Paridad par: el número de 1's transmitidos en el carácter enviado y el bit de paridad será par.

10

Paridad pegada: forzar el bit de paridad a 1.

11

Paridad pegada: forzar el bit de paridad a 0.

Bit U0LCR<6>Break Control: Si es 0 la condición de ruptura está deshabilitada. Si es 1 la condición de ruptura está habilitada, lo que significa que el pin TXD0 de la UART se fuerza a 0 cuando en el bit 6 del registro U0LCR esté en alto. Bit U0LCR<7>DLAB: Si vale 0 el acceso a los Registros divisores (DLM y DLL) está deshabilitado. Si vale 1 estará habilitado. 4.9.2.7 U0LSR: Line Status Register Este registro de sólo lectura proporciona información de los bloques UART0 de TX y RX.

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

0

0

0

0

0

0

0

RXFE

TEMT

THRE

BI

FE

PE

OE

RDR

U0LSR

Figura 4.33 Configuración registro U0LSR

Bit U0LSR<0>RDR: Receiver Data Ready. Si vale 0 entonces U0RBR está vacío y si vale 1 U0RBR contiene un dato válido, es decir, hay algo en el FIFO de RX.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 85

Bit U0LSR<1>OE: Overrun Error. En cuanto ocurre la condición de error por overrun este bit se pone a 1. La acción de leer el registro U0LSR borra este bit, es decir, lo pone a 0. Si vale 0 no existe error por overrun. Cuando hay un nuevo carácter en RSR y la FIFO RBR está llena, el carácter se pierde porque no se puede sobrescribir RBR. Bit U0LSR<2>PE: Parity Error. Ocurre error de paridad cuando el bit de paridad de un carácter de recibido tiene un estado lógico incorrecto. Al igual que ocurría en el bit anterior, una lectura en el registro U0LSR pone este bit a cero. El tiempo de detección de un error de paridad depende de U0FCR<0>. Por tanto, si PE=0 no existe error de paridad y si PE=1 hay error de paridad. Bit U0LSR<3>FE: Framing Error. Este error ocurre cuando el bit de parada de un carácter es 0. Tal y como ocurría en los bits anteriores una lectura en el registro U0LSR borra este bit y el tiempo de detección de un error de framing depende de U0FCR<0>. Al ocurrir este error el receptor intentará sincronizarse considerando el bit de parada como bit de partida. Por tanto si FE=0 no existe error de framing y si FE=1 si existe error. Bit U0LSR<4>BI: Break Interrupt. Cuando a RXD0 llega un carácter todo 0’s se produce una interrupción de ruptura. Si BI=1, ha ocurrido interrupción si BI=0 no ha ocurrido la interrupción. Bit U0LSR<5>THRE: Transmitter Holding Register Empty. Se pone a 1 cuando se detecta que UOTHR está vacío, es decir, se puede recibir un dato nuevo y se pone a 0 cuando se escribe en U0THR, es decir, el dato es válido. Bit U0LSR<6>TEMT: Transmitter Empty. Vale 0 cuando U0THR y/o U0TSR contienen un dato válido. Vale 1 cuando ambos registros están vacíos. Bit U0LSR<7>RXFE: Error in RX FIFO. Vale 0 cuando en RBR hay un carácter con algún error (framing error, parity error, break interrupt). Vale 0 si no contiene errores el carácter en RBR. Este bit se borra cuando se lee el registro U0LSR y no existen errores en la UART0.

4.9.3. Cálculo del Baud Rate En un primer momento se va a calcular una tasa de baudios deseada de 38400 a partir de la ecuación (4.9) y teniendo en cuenta que se cumplan las siguientes condiciones: 1. 0 < MULVAL ≤ 15 2. 0 ≤ DIVADDVAL < 15 3. DIVADDVAL < MULVAL

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


86

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

El valor proporcionado por el cristal externo es Fosc = 12MHz. En el apartado de configuración del PLL (4.6) ya se estudió cómo configurar este perifÊrico. Los valores del multiplicador del PLL: MSEL =4= M – 1 y CCLK = Fosc*M. Dando lugar a un valor del reloj de perifÊricos de 60MHz (PCLK = CCLK / PCKDIV) con el divisor APB con valor 1. Para que la UART0 funcione a 38400 cuando el reloj de perifÊricos es de 60MHz la solución se muestra a continuación en la ecuación (4.10). 38400 =

60.000.000 16 đ?‘Ľ (256 đ?‘Ľ đ?‘ˆ0đ??ˇđ??żđ?‘€ + đ?‘ˆ0đ??ˇđ??żđ??ż) đ?‘Ľ (1 +

đ??ˇđ??źđ?‘‰đ??´đ??ˇđ??ˇđ?‘‰đ??´đ??ż đ?‘€đ?‘ˆđ??żđ?‘‰đ??´đ??ż

)

(4.10)

A partir de la ecuaciĂłn (4.10) e igualando DIVADDVAL=0 y U0DLM=0 para simplificar los cĂĄlculos, puesto que con U0DLM es suficiente, se obtiene la ecuaciĂłn (4.11). 60.000.000 16 đ?‘Ľ (đ?‘ˆ0đ??ˇđ??żđ??ż)

(4.11)

60.000.000 = 97,65625 16 đ?‘Ľ 38400

(4.12)

đ?‘ˆ0đ??ˇđ??żđ??ż ≈ 9810

(4.13)

đ?‘ˆ0đ??ˇđ??żđ??ż ≈ 6216

(4.14)

38400 =

đ?‘ˆ0đ??ˇđ??żđ??ż =

De los cĂĄlculos se obtiene que el valor del registro U0DLL para tener una velocidad de 38400 baudios es de 98 en base decimal como se muestra en la ecuaciĂłn (4.13). Como se ha aproximado, se comprueba si el valor es correcto, sirviĂŠndose de las expresiones (4.15) y (4.16). đ?‘ˆđ??´đ?‘…đ?‘‡0đ?‘?đ?‘Žđ?‘˘đ?‘‘đ?‘&#x;đ?‘Žđ?‘Ąđ?‘’ =

VilariĂąo Valle, Marta

60.000.000 16 đ?‘Ľ 98

(4.15)


Diseño Software del Microcontrolador 87

𝑈𝐴𝑅𝑇0𝑏𝑎𝑢𝑑𝑟𝑎𝑡𝑒 =

60.000.000 16 𝑥 98

(4.16)

𝑈𝐴𝑅𝑇0𝑏𝑎𝑢𝑑𝑟𝑎𝑡𝑒 = 38.265,31

(4.17)

Por tanto, para una configuración como la del ejemplo y con el resultado recogido en la ecuación (4.17) tendremos un error del 0,34%, y una configuración de los registros que será: U0FDR= 0x07; U0DLM=0; U0DLL=98; En la Tabla 4-15 se recogen los valores del registro U0DLL para cada tasa de baudios proporcionada por el hiperterminal. Tabla 4-15 Valores recomendados de U0DLL para el cálculo del Baud Rate

UART0 baud_rate

PCLK

1200 2400 4800 9600 19200 38400 57600 76800 115200

60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000

U0DLL 3125 1562,5 781,25 390,625 195,3125 97,65625 65,10416667 48,828125 32,55208333

U0DLL (10) 3.125 1.562 781 391 195 98 65 49 33

U0DLL (16) 00000C35 0000061A 0000030D 00000187 000000C3 00000062 00000041 00000031 00000021

4.9.4. Registros de interrupción Los microprocesadores de la familia ARM tienen más de 20 fuentes de interrupción, sin embargo, sólo son capaces de atender dos interrupciones a la vez. Para conseguir manejar más fuentes de interrupción disponemos del sistema encargado de atender todas y cada una de las fuentes de interrupción (VIC, estudiado en el apartado 4.7), que se pueden generar y asignarles prioridad para que sean atendidas en el orden correcto [6].

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


88

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.9.4.1 U0IER: Interrupt Enable Register Este registro se emplea para habilitar la interrupción por UART0, es decir, cualquier interrupción recibida por el puerto serie. Para acceder a este registro DLAB debe valer 0.

Bit 31

...

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

-

0

0

-

-

-

-

-

1

0

0

RX

THRE

RBR

reservados

ABTO ABEO IntEn IntEn

reservados

U0IER

Figura 4.34 Configuración registro U0IER

Bit U0IER<0>RBR Interrupt Enable: Habilita la interrupción RDA, o lo que es lo mismo, la recepción de datos disponibles por interrupción por la UART0. Además controla el tiempo de recepción de carácter. Si vale 0 la interrupción por RDA está deshabilitada, y si vale 1 está habilitada. Bit U0IER<1>THRE Interrupt Enable: Habilita la interrupción THRE y se puede ver su estado mediante el bit 5 del registro U0LSR. Si vale 0 la interrupción por THRE está deshabilitada, y si vale 1 está habilitada. Bit U0IER<2>RX Line Status Interrupt Enable: Habilita la interrupción según el estado de la línea de recepción de la UART0. El estado de la línea se puede ver en U0LSR<4:1>. Un valor 0 del bit la deshabilita, y un 1 la habilita. Bits U0IER<7:3>: Reservados. No se debe escribir unos en estos bits. Bit U0IER<8> ABEOIntEn: Habilita la interrupción por finalización de tiempo del módulo de auto-baud. Un 0 lo deshabilita y un 1 lo habilita. Bit U0IER<9>ABTOIntEn: Habilita la interrupción por finalización de auto-baud. Un 0 lo deshabilita y un 1 lo habilita. Bits U0IER<31:10>: Reservados. No se debe escribir unos en estos bits. 4.9.4.2 U0IIR: Interrupt Identification Register Registro de sólo lectura que almacena el estado de las interrupciones pendientes y la prioridad de las mismas. Cuando se accede al registro U0IIR todas las interrupciones se quedan congeladas; y si ocurre una interrupción durante el acceso, ésta se tendrá en cuenta en el siguiente acceso a este registro.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 89

El flag de interrupción del puerto serie UART0 se pone a 0 con leer el registro U0IIR.

Bit 31

...

Bit 10

Bit 9

Bit 8

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

0

...

-

0

0

-

-

-

-

0

1

0

0

ABTO ABEO Int Int

reservados

FIFO Enable

reservados

Interrupt Identification

U0IIR

Interrupt Pending

Figura 4.35 Configuración registro U0IIR

Bit U0IIER<0>Interrupt Pending: Si vale 0 al menos hay una interrupción pendiente y si toma el valor 1 indica que no hay interrupciones pendientes. Bits U0IIER<3:1>Interrupt Identification: Identifica la interrupción correspondiente pendiente en la FIFO de recepción. Bits U0IIER<5:4>: Reservados. No se deben escribir unos en estos bits. Bits U0IIER<7:6>FIFO Enable: Estos bits equivalen a lo mismo que el valor en el registro U0FCR<0>. Bit U0IIER<8>ABEOInt: Vale uno si la interrupción por auto-baud está habilitada y se ha finalizado correctamente. Bit U0IIER<9>ABTOInt: Vale uno si la interrupción por auto-baud está habilitada y se ha finalizado el tiempo límite de atención de la interrupción. U0IIER<31:10>: Reservados. No se deben escribir unos en estos bits. Tabla 4-16 Configuración registro U0IIR<3:1>

U0IIR<3:1>

Tipo de Interrupción

011

1 - Receive Line Status (RLS)

010

2a - Receive Data Available (RDA)

110

2b - Character Time-out Indicator (CTI)

resto de combinaciones

reservados

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


90

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

4.9.5. Configuración del periférico para la aplicación Al diseñar el hardware se tomó el módulo UART0 del microcontrolador LPC2114 para la recepción y envío de datos a través del puerto serie y con el puerto USB del ordenador. Se puede apreciar en la Figura 4.36. La comunicación con el puerto USB del ordenador se hará a través de un dispositivo externo, FTDI232RL, que hará de interfaz entre el microcontrolador y el puerto USB del ordenador. Este dispositivo se encargará de convertir los niveles de tensión de entrada/salida necesarios así como del protocolo USB que soporta el propio chip sin necesidad de programación.

Figura 4.36 Esquema electrónico de los pines correspondientes a los pines UART0

Los pasos a seguir para la configuración del módulo UART0 son los siguientes: 1. Determinar el formato de los datos enviados y recibidos. 2. Establecer la tasa de baudios (Baudrate). 3. Establecer la configuración de los buffer FIFO de recepción y transmisión, FIFO RX y FIRO TX, respectivamente. 4. Habilitar la interrupción por recepción de caracter. 5. Definir y asignar la subrutina de atención a la interrupción correspondiente a un registro del VIC. Interrupción con prioridad 0. VICVectAddr0 = (unsigned int) irq_uart0;

6. Especificar la prioridad de la interrupción. VICVectCntl0 = (6)|(1<<5);

Especificamos que la interrupción con prioridad 0 es el módulo UART0, en el canal 6 y vectorizada. 7. Habilitar la UART0. VICIntEnable = (1<<6);

Con todo lo anterior, la rutina de configuración de la UART0 es: void UART0_Init() { U0LCR = 0x83; // 10000011 Line Control Register . // .. Character length 11 = 8 bits // . Stop bits 0 = 1 bit // . Parity enable 0 = No parity

Vilariño Valle, Marta


Diseño Software del Microcontrolador 91

// . Even parity non sense // . Stick parity non sense // . Break control 0 = No break // . DLAB 1 = Access to DLM,DLL //U0DLL = 98; // Baud = 5*12000000/(16* 98) = 38400 U0DLL = 33; // Baud = 5*12000000/(16* 33) = 115200 U0DLM = 0; U0LCR = 0x03; // Same a above, but DLAB = 0 = Normal access to RBR/THR & IER U0FCR = 0x07; // 00000111 FIFO Control Register // . FIFO enable 1 = TX&RX FIFOs enabled // . RX FIFO Reset 1 = Reset RX FIFO // . TX FIFO Reset 1 = Reset TX FIFO // .. RX interrupt trigger level 00 = 1 byte //1:habilitar periferico U0IER = 1; //rbr=1 y THRE = 1 , habilitamos la interrupcion //2:interrup irq o fiq VICIntSelect &=~(1<<6); //UART0 es IRQ meto 0 en canal 6 //3:habilitar interrupcion en el VIC VICIntEnable=(1<<6); //4: interrupción vectorizada o no vectorizada y prioridades VICVectCntl0=(6)|(1<<5); //5: codigo de atención a la interrupción: VICVectAddr0=(unsigned int) irq_uart0; }

La subrutina de atención a la interrupción de la UART0 es: void irq_uart0(void) { char recibido; staticint i=0;// Debe ser static recibido = UART0_getch(); switch(estado) { case0://fuera de la trama , aún no hemos recibido comando de STX=$ if(recibido == FLAG_INI)//inicio de comando enviado: $ { i =0; estado =1; mensaje_recibido=0; } break; case1:// Recibo el dato. Estoy dentro de la trama de datos if(recibido==ESC)//si el siguiente dato es un ESC debo descartarlo y mirar el siguiente { estado =2; break; }; if(recibido==FLAG_FIN)//fin de comando enviado

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


92

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

{ estado =0; mensaje[i]=‘\0’; strncpy(mensaje2,mensaje,i); i =0;//inicializamos i para la siguiente recepción del mensaje mensaje_recibido =1; break; }; mensaje[i++]= recibido; //si caracter válido lo meto aqui directamente en el mensaje // mensaje [i++] --> primero accedo a i y luego incremento i. break; case2:// Decodificando dato if(recibido==ESC){mensaje[i++]= ESC; estado =1;break;}; if(recibido==FLAG_INI){mensaje[i++]= FLAG_INI; estado =1;break;}; if(recibido==FLAG_FIN){mensaje[i++]= FLAG_FIN; estado =1;break;}; estado =0; break; }//switch VICVectAddr=0; }

4.10 Programa de Control del Analizador Lógico El programa de control será el programa principal que será el encargado de realizar las tareas deseadas haciendo uso de todos aquellos dispositivos físicos del microprocesador. El programa se estructura en rutinas, subrutinas y funciones que realizan tareas concretas. El sistema completo lleva a cabo tres procesos de manera lo más concurrente posible asignando el testigo y control del microprocesador al periférico que lo solicite en función de la prioridad de la tarea. Los procesos identificados, recogidos en la Figura 4.37, son: 

Muestreo: Genera la señal de reloj, que es necesaria para el correcto funcionamiento de los registros de desplazamiento, cada un periodo de tiempo fijo en función de la frecuencia de muestreo que configure el usuario. Recepción de comandos: Si ser recibe un carácter por la UART entonces interrumpiremos todo y nos dispondremos a almacenar los datos recibidos para su posterior interpretación. Envío: Una vez se ha llenado el buffer de memoria implementado en el microprocesador enviaremos los datos por la UART al PC para la representación de las señales.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 93

FUNCIONAMIENTO DEL SISTEMA MICROPROCESADOR

MUESTREO

RECEPCIÓN COMANDOS

ENVÍO

Interrupción TIMER0 Ts=1/Fs Fsmax = 2MHz

espera

espera

¿carácter recibido? cada Ts/2

NO

¿buffer memoria lleno?

SI

NO

SI

Interrupción UART0

Enviar Buffer

recibido = mensaje[i] hasta recibir carácter fin_trama($) Figura 4.37 Diagrama de flujo del funcionamiento del Sistema Microprocesador

4.10.1. Recepción y Envío de Tramas de Datos entre el Microprocesador y el PC Para asegurar la comunicación segura de tramas entre el microprocesador y el PC y viceversa se ha implementado la comunicación segura aplicando protocolo byte stuffing.

FLAG Cabecera

Payload

Cola

FLAG

Figura 4.38 Formato de trama de datos

Para la creación de las tramas tendremos en cuenta lo siguiente:  

Empaquetar los bits en tramas, de manera que se puedan distinguir tramas consecutivas. Las tramas a manejar serán de tamaño variable y serán necesario: o Definir el inicio y final de trama.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


94

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

o Elegir un protocolo orientado a carácter. o Los datos transportados serán caracteres de ocho bits codificados en ASCII. o La cabecera puede contener información de control referente al mensaje: longitud, número de elementos del buffer, etc. En el caso de nuestra aplicación, la cabecera de las tramas que envía el PC al microprocesador no contendrá nada, y la cabecera de las tramas enviadas por el AL al PC contendrán una “B” si se trata de datos del buffer circular y una “D” si se trata de información. o La cola contiene información para el control de errores en la recepción y envío de la trama. En nuestro caso es el CRC o checksum y también tiene formato de ocho bits. o Los flag al principio y al final de cada trama la delimitan. Estos flag están formados por caracteres especiales que dependen del protocolo elegido. o Si el flag empleado es parte de la información esto puede ser un problema. Para solventarlo se ha decidido añadir una estrategia a nivel de byte orientado a carácter conocido como byte stuffing. o El byte stuffing consiste en añadir un byte extra, denominado carácter de escape (ESC) con un patrón ya definido. Cada vez que encontramos un flag o un escape en los datos se escapa dicho carácter. Este proceso se puede ver en laFigura 4.39.

Mensaje Original

Mensaje después de stuffing

A

FLAG

A

A

FLAG

A

A

ESC

A

A

ESC

A

A

ESC

FLAG

A

A

ESC

ESC

ESC

FLAG

A

A

ESC

ESC

A

A

ESC

ESC

ESC

ESC

A

Figura 4.39 Funcionamiento Byte Stuffing

Para el caso que nos ocupa se han elegido como FLAG de inicio y fin de trama el carácter ‘$’, y se ha elegido como ESC el carácter ‘#’.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 95

Además, como ya se ha mencionado, en la cola de la trama tendremos un control de errores y se empleará el método de control cíclico redundante o CRC (Cyclic Redundancy Check). El código que implementa este código de detección de errores se contempla en la Tabla 4-17. Tabla 4-17 Función de detección de error

unsignedchar CRC8_caracter(unsignedchar crc,unsignedchar datum,char polinomio)//checksum {//calcula el crc teniendo en cuenta el crc anterior y el caracter actual int j; for(j=0;j<8;j++) { if(((crc^datum)&0x01)==0) crc >>=1;//^: XOR binario else { crc ^= polinomio;//^=: XOR binario con asignación crc >>=1; crc |=0x80; } datum >>=1; } return crc; }

Es importante establecer cómo van a ser las tramas de comunicación entre el microprocesador y el PC que se ajustan al formato recogido en laFigura 4.38. ¿Qué envía el microprocesador al PC? ¿Y el PC al microprocesador? El microprocesador puede enviar información no relevante que puede ser un texto informativo como por ejemplo: “Hola. Estoy conectado”, o también, puede enviar información crítica y relevante como son todos los datos que contiene el buffer de memoria que serán las señales a representar en la aplicación del PC.

ANALIZADOR

Envío del Buffer:

$

B

PC ...datos del buffer ..

CRC

#

(a)

CRC

#

(b)

Envío de tramas de datos no críticas: $

D

...texto/datos ..

Figura 4.40 Formato de envío de tramas del Microprocesador al PC

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


96

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

ANALIZADOR

PC $

...mensaje

..

CRC

#

(c)

Figura 4.41 Formato de recepción de tramas del Microprocesador desde el PC

En la Figura 4.40 y la Figura 4.41 se presentan las tramas que enviaremos en ambas direcciones. Explicamos ahora qué contiene cada campo: a) Envío de buffer: Al enviar esta trama debemos diferenciarla bien de otras tramas de datos que pueda enviar el microprocesador porque contendrá datos críticos para la posterior representación de las señales en la aplicación del PC. La trama se inicia con el carácter ‘$’ y se finaliza con el carácter ‘#’. La cabecera contendrá “B”. La “B” indica que se van a transmitir datos almacenados en el buffer que irá seguido del payload o datos del buffer circular que son los valores lógicos provenientes de los registros de desplazamiento. El payload contendrá los datos del buffer hasta vaciarlo. La cola contiene “CRC” que es el código de control de errores calculado a partir del payload. b) Envío de trama de datos no críticas: Este tipo de tramas son menos críticas que las tramas que contienen datos del buffer circular. Contienen notificaciones de respuesta a los botones que se pulsen desde la aplicación del PC. La trama se inicia con el carácter ‘$’ y se finaliza con el carácter ‘#’. La cabecera contendrá “D”. La “D” indica que se va a transmitir una trama de información y posteriormente se enviará el payload, que es información relevante que tratará la aplicación del PC. El payload contendrá el mensaje de notificación. La cola contiene “CRC” que es el código de control de errores calculado a partir del payload. c) Envío de tramas del PC al microprocesador: Estas tramas que envía el PC y recibe e interpreta el microprocesador contendrán las órdenes a ser ejecutadas. La trama se inicia con el carácter ‘$’ y se finaliza con el carácter ‘#’. La cabecera no contiene ningún valor en este caso aunque se ha contemplado el caso de enviar la longitud del mensaje que se envía en el payload, que es información relevante que tratará la aplicación del PC. El payload contendrá el comando enviado.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 97

La cola contiene “CRC” que es el código de control de errores calculado a partir del payload. Los tipos de comandos que se han implementado que irán en el payload de la trama de datos atienden a la siguiente estructura:  

Un número identificador del comando que especifica el tipo de orden. Un par de corchetes que contendrán valores de parámetros separados por comas. En el caso de no existir parámetros a enviar se enviarán únicamente el par de corchetes.

En la Tabla 4-18 podemos ver todos los comandos que se han considerado relevantes para el buen funcionamiento del sistema. Tabla 4-18 Resumen de Comandos

ETIQUETA STOP RE_ON RE_OFF WHO CAP

ID 1 2 3 4 5

COMANDOS DESCRIPCIÓN Para la tarea que esté haciendo Reanuda la tarea en la que se paró Desconecta el dispositivo Muestra mensaje de identificación Captura datos procedentes de los registros

1. Comando de parada: STOP Este comando da orden de parar la tarea actual que realiza el microprocesador y queda en espera a recibir cualquier otra orden. Este parámetro está pensado para parar la captura de datos, o lo que es lo mismo, el almacenamiento de los bits procedentes de los registros de desplazamiento en el buffer de memoria. Este comando no tiene parámetros. Tabla 4-19 Comando de parada

COMANDO ORDEN PARADA $1[]CRC# ETIQUETA STOP NÚMERO IDENTIFICADOR 1 Parámetro Tipo Unidad Min Max no tiene parámetros

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


98

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

2. Comando de reanudación: RE_ON Este comando no posee parámetros y reanuda la tarea en la que se quedó parado el microprocesador tras haber sido previamente ejecutado el comando parar. Tabla 4-20 Comando de reanudación

COMANDO ORDEN REANUDAR $2[]CRC# ETIQUETA RE_ON NÚMERO IDENTIFICADOR 2 Parámetro Tipo Unidad Min Max no tiene parámetros

3. Comando de desconexión del equipo: RE_OFF Este comando desactiva o finaliza todos los procesos que tienen lugar en el microprocesador. No posee parámetros. Tabla 4-21 Comando de desconexión

COMANDO ORDEN DESCONEXIÓN $3[]CRC# ETIQUETA RE_OFF NÚMERO IDENTIFICADOR 3 Parámetro Tipo Unidad Min Max no tiene parámetros 4. Comando de conexión del equipo: WHO Mediante este comando se comprueba si el Analizador está conectado. Para ello el microprocesador contestará al PC el siguiente texto: “¡¡¡Hola!!! Analizador lógico conectado”, y enviará además el número de elementos con el que se ha configurado el buffer de memoria. Este comando tampoco envía parámetros. Tabla 4-22 Comando de conexión

COMANDO ORDEN CONEXIÓN $4[]CRC# ETIQUETA WHO NÚMERO IDENTIFICADOR 4 Parámetro Tipo Unidad Min Max no tiene parámetros

Vilariño Valle, Marta


Diseño Software del Microcontrolador 99

5. Comando de captura de datos procedentes de los registros: CAP El comando de captura recoge todos los parámetros que aparecen entre corchetes y los almacena en las variables locales adecuadas para proceder a la captura de los datos de las cuatro señales procedentes de los registros de desplazamiento. Los parámetros recogidos son:  modo: Tenemos dos modos posibles: o single (valor 0): se toma una sola muestra por cada canal. o continuo (valor 1): se toman muestras de todos los canales hasta llenar el buffer de memoria.  frec: Frecuencia de muestreo a la que queremos obtener los datos. Hay 22 posibles valores de frecuencia en función del tiempo de muestreo que será el tiempo empleado para producir la interrupción por TIMER0.  disp1, disp2, disp3 y disp4: tipo de disparo que se desea para cada canal a la hora de recoger datos de cada uno de los canales. Los valores posibles de disparo atienden al siguiente significado: o disparo = 0: No disparo. o disparo = 1: Disparo por nivel bajo. o disparo = 2: Disparo por nivel alto. o disparo = 3: Disparo por flanco de subida o disparo = 4: Disparo por flanco de bajada. Tabla 4-23 Comando de captura

COMANDO ORDEN CAPTURA $5[modo,frec,disp1,disp2,disp3,dip4]CRC# ETIQUETA CAP NÚMERO IDENTIFICADOR 5 Parámetro Tipo Unidad Min Max modo int 0 1 frec int Hz 0 21 disp1 int 0 4 disp2 int 0 4 disp3 int 0 4 disp4 int 0 4

4.10.2. Rutina Principal En primer lugar, la rutina principal realiza la configuración de los periféricos, declara e inicializa las variables y estructuras de datos que van a ser empleadas y por último habilita las interrupciones del microprocesador.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


100

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

En segundo lugar, esta rutina entra en un bucle infinito que se ocupa de interpretar cualquier trama de datos recibida del exterior e identificar la orden a ser ejecutada con la correspondiente respuesta en función de la orden recibida. Por otro lado, se ejecuta, siempre y cuando la orden de capturar datos haya sido solicitada, el envío de datos del buffer interno de memoria implementado dentro de la memoria del microprocesador. En la Figura 4.42 se muestra el diagrama de flujo del que parte esta rutina.

4.10.3. Rutina de Recepción de Carácter por Interrupción UART0 Esta rutina se ejecuta de manera asíncrona y se produce cada vez que se recibe un carácter en el puerto UART0 del microprocesador desde el PC. A partir del diagrama de flujo mostrado en la Figura 4.43 esta rutina se encarga de componer el mensaje completo enviado por el PC. Además, puesto que los datos son enviados mediante byte stuffing, será esta rutina la que se encargue de almacenar sólo los datos válidos en el mensaje obviando los datos escapados. Una vez hemos recibido el mensaje o la trama completa nos quedaremos con un mensaje “trama” que atiende al formato de la Figura 4.38.

4.10.4. Rutina de Interpretación del Mensaje real Recibido Esta rutina se lleva a cabo una vez se ha descompuesto la trama de datos recibida. Se analizará el campo payload, que contendrá el comando. Como se aprecia en la Figura 4.44 una vez recibido el mensaje, se evalúa la posición cero de la cadena de caracteres donde tenemos almacenado el mensaje (mensaje[0]). Los valores posibles de comandos varían de 1 a 5. Cada comando atenderá unas órdenes concretas dentro de esta rutina y actualizará las variables correspondientes. En el apartado 4.10.1 Recepción y Envío de Tramas de Datos entre el Microprocesador y el PC quedó explicado el funcionamiento y uso de todos los comandos.

4.10.5. Rutina Periódica de Muestreo TIMER0 Esta rutina de interrupción periódica (por desbordamiento del TIMER0), será la responsable de generar los relojes que aseguran el correcto funcionamiento de los registros de desplazamiento, para así poder generar los datos de los cuatro canales de entrada y recoger los datos válidos en el puerto. En la Figura 4.45 se contempla que la interrupción tendrá lugar cada la mitad del tiempo de muestreo que se haya configurado para la captura de los datos (enviado desde el PC).Esta rutina genera interrupción cada T/2, es decir, la señal de reloj CLK (P0.16) y cada ocho interrupciones, es decir, cada 4T genera la señal de reloj CLK_BY_8 (P0.5) que pondrá los datos válidos en el puerto procedentes de los registros de desplazamiento.

Vilariño Valle, Marta


Diseño Software del Microcontrolador 101

Además, una parte muy importante de esta rutina es la captura y almacenamiento de los datos procedentes de los cuatro canales siempre y cuando se haya recibido el comando de captura enviado desde el PC. La captura puede ser:   

No hay captura y se sale de la rutina sin hacer nada hasta la siguiente interrupción. Captura condicional, es decir, se ha configurado el disparo para alguno de los canales. Captura incondicional, es decir, se va llenando el buffer interno de memoria con los datos recogidos del puerto GPIO en cada interrupción. Una vez lleno el buffer, se actualizan las variables globales que permitirán la transmisión de estos datos hacia el PC para su posterior representación.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


102

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

ANALIZADOR_MAIN.C

Inicialización

Configuración periféricos (GPIO,TIMER0,UART0). Inicializar variables y estructuras de datos (estado,salir,mensaje_recibido, ). Habilitar interrupciones.

Recargar variables

PRODUCTOR

¿mensaje NO recibido? SI

Interpretar trama de datos

CONSUMIDOR

NO ¿buffer lleno? SI Enviar Buffer

NO

¿CRC OK? SI Interpretar mensaje y comando recibido

Figura 4.42 Diagrama de flujo de la rutina principal

Vilariño Valle, Marta


Diseño Software del Microcontrolador 103

RUTINA POR RECEPCIÓN DE CARÁCTER RX_UART0 irq_uart0;

Declaración variables locales

Recojo carácter recibido

estado = 2

estado = 0 ¿ estado ?

estado = 1

NO

NO ¿recibido = #?

¿recibido = $?

NO SI

SI estado = 1 mensaje_recibido = 0 i=0

estado = 2

¿recibido = #?

¿recibido = $? SI

SI

estado = 0 mensaje_recibido = 1 salir = 1 mensaje[i] = \0' i=0

$?

¿recibido Y ¿recibido

mensaje[i++] = # estado = 1

¿recibido = $?

SI mensaje[i++] = $ estado = 1

NO

#?

SI

mensaje[i] = recibido

estado = 0

FIN

Figura 4.43 Diagrama de flujo rutina recepción de carácter RX_UART0

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


104

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

RUTINA INTERPRETAR COMANDO interpreta_mensaje();

Declaración variables locales

¿mensaje recibido?

NO

SI Recoger la primera posición del mensaje (caso_comando)

caso_comando = 1 ¿caso comando? caso_comando = 2 caso_comando = 3

caso_comando = 5

caso_comando = 0 ó caso_comando>7

caso_comando = 4

Parar STOP

Reanudar RE_ON

Desconectar RE_OFF

Conectar WHO

Capturar CAP

DEFAULT

Actualizar variables

Actualizar variables

Actualizar variables

Actualizar variables

Extraer parámetros

Actualizar variables

FIN

Figura 4.44 Diagrama de flujo rutina de interpretación del mensaje y comando recibido

Vilariño Valle, Marta


Diseño Software del Microcontrolador 105

RUTINA PERIÓDICA DE MUESTREO TIMER0 void irq__tc0(void);

Cada T/2 T=1/Fs

num_interrupciones --;

NO ¿num_interrupciones = 0?

SI Generar pulso señal CLK_BY_8 /clk8_toggle

NO

¿clk8_toggle = 1?

clk8_toggle = 1 P0.5 = 0: cambio en señal de reloj CLK_BY_8

SI

dato = Leer puertos;

captura = 2

captura = 0 ¿captura?

captura = 1

No capturar datos

Captura incondicional

Captura condicional con disparo

Almacenar dato en el buffer de memoria

Evaluar disparo dato

NO ¿buffer lleno?

¿cumple condición de disparo?

SI

SI

captura = 0

captura = 1

NO

num_interrupciones = 8

FIN

Figura 4.45 Diagrama de flujo rutina periódica de muestreo TIMER0

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


106

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


Aplicación para PC 107

Capítulo 5 APLICACIÓN PARA PC Otra parte importante que compone este proyecto es la realización de una aplicación de usuario sencilla y muy intuitiva para manejar la placa diseñada. El usuario se servirá de ella para capturar datos y mostrarlos por pantalla. Mediante el uso de la aplicación también se permite al usuario cargar datos de capturas anteriores o guardar datos actuales.

5.1 Elección del Lenguaje de Programación Se ha elegido el lenguaje de programación C++ debido a que es el empleado por el entorno de programación (IDE) escogido, wxDevcpp, en su versión 7.3.1.3., programa gratuito y distribuido bajo licencia GNU [7]. El IDE empleado, basado en el frameworkwxWidgets, posee la librería denominada wxWidgets [8] con gran número de clases y métodos para que el programador realice su aplicación gráfica. Una de las ventajas y motivos por los que se eligió desarrollar la aplicación en esta plataforma y no en otras, como por ejemplo Visual Studio de Microsoft, es por su portabilidad a diferentes plataformas. Esto permitirá implementar la aplicación para Windows, sin embargo, si en un futuro se quisiera implementar para Linux o Mac OS X, con muy pocos cambios podríamos adaptarla para otro SO. Todo ello supone un gran beneficio de coste de desarrollo El instalador puede descargarse de manera gratuita para empezar a trabajar de la página de internet de Sourceforge [9]. En este mismo sitio web encontramos tutoriales para familiarizarnos con este IDE.

5.2 Empezando el Proyecto Una vez instalado el IDE, wxDev-C++ versión 7.3.1.3., se procederá a la familiarización con el entorno de trabajo y creación de la interfaz gráfica para el AL. En la carpeta Examples (acceso a la ruta: archivo abrir proyectoC: archivos de programa dev-cpp Examples wxwidgets widgets) hay varios ejemplos de wxwidgets. En concreto hay uno muy completo llamado wxWidgets que es un ejemplo de muchos componentes básicos configurables en tiempo real. Este ejemplo servirá de documentación para empezar dado que el ingeniero es novel en el lenguaje de programación C++. En dicho ejemplo se tiene casi todo lo necesario para guiarse a la hora de hacer la ventana que compondrá la aplicación. Dentro de la carpeta widgetsse tiene: un fichero “widgets.dev” que es el fichero del proyecto, ficheros “.cpp” que son código (como los “.c” de los microcontroladores) y un fichero “widgets.h” que es el fichero de cabecera de los programas del proyecto.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


108

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Por tanto, al crear un proyecto con el programa wxDev-cpp se tienen ficheros con las siguientes extensiones:  

fichero “nombre.dev”: es el fichero del proyecto fichero “nombre.h”: es el fichero de cabecera del programa. En él están definidas las clases y todos los métodos. Sirve para decir al compilador la estructura del programa. Ficheros “ejemplo.cpp”, “ejemplo2.cpp”, etc: son los ficheros que almacenan el código del programa. Equivalen a los .c de los microcontroladores.

Vamos a crear nuestro proyecto para la aplicación. Abrimos el wxDev-C++ y en el menú Archivo vamos a Nuevo y seleccionamos Proyecto (ver Figura 5.1).

Figura 5.1 Creando un proyecto (I)

Seleccionar “wxwidgets dialog” y asignar un nombre al proyecto: “Analizador _Lógico_Digital” (ver Figura 5.2). A continuación, se guarda el proyecto en la ruta deseada y para ello se ha de crear la carpeta “Analizador Logico Digital v1” donde se alojará nuestro proyecto, denominado “Analizador_Logico_Digital.dev”. A continuación aparecerá la ventana de nuevo cuadro de diálogo y le damos a “Create” (ver Figura 5.3).

Vilariño Valle, Marta


Aplicación para PC 109

Figura 5.2 Creando un proyecto (II)

Figura 5.3 Creación de un proyecto (III)

Finalmente se crean todos los ficheros que conformarán el proyecto y se abre la siguiente ventana que es el editor empleado para ir dando forma a la aplicación (ver Figura 5.4). Sobre el archivo “*.wxform”se irán añadiendo todos los componentes que formarán el layout de la aplicación que se va a crear. A la izquierda tenemos las propiedades y los componentes que podemos incluir y el árbol de archivos que conforman el proyecto justo encima. En la parte inferior las pestañas para depurar y compilar. En cuanto se crea el proyecto se han establecido automáticamente dos objetos:  

Los botones maximizar, minimizar y cerrar. La barra de título.

En la Figura 5.5 se puede apreciar la estructura de ficheros que se ha creado: 

El ficheroAPP será un fichero principal con su correspondiente fichero *.h y su implementación en *.cpp. El fichero *.rc es un fichero de recursos, es decir, un “#include” a los recursos básicos de wx. Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


110

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 5.4 Creación de un proyecto (IV)

Figura 5.5 Creación de un proyecto (V)

 

El wxform es una representación del “Dlg.cpp” para poder hacer el layout de la aplicación sin necesidad de escribir código, es decir, se arrastran botones e se va autogenerando la ventana de la aplicación. Por tanto, todo lo visual lo haremos en la ventana de manera visual, mientras que la programación de las funciones que están por detrás de los botones se programarán directamente en el “Dlg.cpp”o se creará una clase específica para tener el código descentralizado.

Vilariño Valle, Marta


Aplicación para PC 111

En las especificaciones iniciales, se deseaba, como mínimo una ventana de 800x400. Todo ello se puede modificar en el componente correspondiente a la ventana denominado wxdialog, y ajustar el widht y height. En el menú Ver (ver Figura 5.6) se activan las paletas para Components (botones, combobox, etc) y Property Inspector (tiene las propiedades de cada componente).

Figura 5.6 Creación de un proyecto (VI)

Para empezar a incluir botones, paneles, y otros componentes se deseen hay que acudir a la pestaña Components donde se seleccionarán los componentes necesarios a cada momento.En la Figura 5.7 se puede ver un ejemplo de cómo añadir un componente wxPanel.

Figura 5.7 Creación de un proyecto (VII)

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


112

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Como se observa, el puntero del ratón cambia de forma al hacer click en el formulario para añadir el panel. Aparecerá una cajita que puede aumentar o disminuir su tamaño posicionando el puntero sobre los cuadritos negros de las esquinas. Sin embargo, es más recomendable fijar las propiedades del componente con el inspector que ofrece el IDE (ver Figura 5.8). En la ventana Property Inspector y se deben ajustar las propiedades left, top, width y height con los valores 0, 0, 784, 40, respectivamente. Lo que se consigue con esto es pegar el panel arriba a la izquierda. Al ancho le quitamos los 8 píxeles a cada lado del padding de la ventana de diálogo. A continuación, se van añadiendo componentes de botón dentro del panel exactamente de la misma manera que hemos hecho ahora.

Figura 5.8 Creación de un proyecto (VIII)

A continuación, se añaden más botones sobre la barra y en Property Inspectorse puede renombrar la propiedad“Label” y las posiciones relativas al panel. En la propiedad “name”se asigna el nombre a cada componente, lo cual es muy útil cuando existen varios componentes iguales y en un futuro se realicen funciones concretas sobre ese componente mediante programación. Para añadir botones dentro del panel vamos a Components y en la carpeta Common Controls elegimos wxbutton (ver Figura 5.9). La aplicación gráfica se va a componer de objetos como son: wxButton, wxComboBox, wxMessageDialog, wxPanel, wxStaticText, wxTextCtrl, wxSpinCtrl. Para añadir cualquier objeto se arrastra el objetos deseado desde la pestaña Components hasta el dialogo que va a ser la interfaz. La mayor parte de los objetos comparten Propiedades como son: name, allignment, width, height, etc, las cuales podemos modificar accediendo a la pestaña propiedades una Vilariño Valle, Marta


Aplicación para PC 113

vez seleccionado el objeto a modificar.Un ejemplo de código al añadir un objeto nuevo y modificar algunas de sus propiedades es el siguiente:

btn_stop = new wxButton(panel_superior, ID_BTN_STOP, wxT(“STOP”), wxPoint(544, 49), wxSize(76, 25), 0, wxDefaultValidator, wxT(“btn_stop”)); btn_stop->SetFont(wxFont(9, wxSWISS, wxNORMAL, wxNORMAL, false, wxT(“Times New Roman”)));

Figura 5.9 Creación de un proyecto (IX)

Cada cambio que hagamos sobre el fichero *.wxform se verá reflejado en la sección void Analizador_Logico_DigitalDlg::CreateGUIControls(), perteneciente al fichero *.cpp. Por tanto, no se programa nada en lo que a componentes se refiere, sino las funciones o eventos que realizará cada componente tras la compilación del proyecto.

5.3 Creación de la Conexión Ya se ha introducido que la aplicación gráfica debe controlar la placa del AL. Esto se consigue mediante conexión USB entre el microcontrolador ARM7 LPC2114 y el PC. Para ello se ha empleado un wxComboBox que permitirá la conexión a los puertos COM disponibles que encuentre la aplicación y otro wxComboBox que seleccionará la velocidad de funcionamiento en baudios. Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


114

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

Par la apertura del puerto se ha generado el siguiente cĂłdigo: for(int i=1;i<=255;i++) { char ruta_com[50]; sprintf(ruta_com,"\\\\.\\COM%d",i); if(AbrirCOM(ruta_com,115200)==1) { arrayStringFor_cmb_puertoSerie.Add(wxT(ruta_com)); CerrarCOM(); } }

Al conectar la placa del AL y pulsar el botĂłn “CONECTA COMxâ€?, la placa responde un “Analizador LĂłgico CONECTADOâ€? que garantiza y verifica que la conexiĂłn ha sido establecida. Cada botĂłn que sea pulsado enviarĂĄ un mensaje al microprocesador y ĂŠste contestarĂĄ con la informaciĂłn adecuada segĂşn el comando, verificĂĄndose asĂ­ en la aplicaciĂłn que la orden ha sido comprendida y va a ser ejecutada. Se han realizado pruebas a diferentes velocidades de conexiĂłn desde los 9600 hasta los 115200 baudios y se ha comprobado el envĂ­o desde tamaĂąos del buffer pequeĂąos, 500 elementos, hasta el mĂĄximo nĂşmero de elementos del buffer permitidos, 4000 elementos que equivalen a 16000 bytes, donde un elemento equivale a 4 bytes. Con las diferentes pruebas realizadas, se llegĂł a la conclusiĂłn que a la velocidad mĂĄxima que se puede operar es a 115200 baudios, permitiendo transmitir como mĂĄximo 1.843 elementos de buffer, sin ninguna pĂŠrdida en la transmisiĂłn. En total, podemos adquirir un total de 7.372 muestras (ver ecuaciĂłn (5.2)), casi la mitad de muestras que se esperaban almacenar partiendo de la memoria que se tenĂ­a libre para generar el buffer circular de memoria đ?‘?đ?‘˘đ?‘“đ?‘“đ?‘’đ?‘&#x;_đ?‘’đ?‘™đ?‘’đ?‘šđ?‘’đ?‘›đ?‘Ąđ?‘ đ?‘šđ?‘Žđ?‘Ľ = 18423

đ?‘›Âş đ?‘?đ?‘Śđ?‘Ąđ?‘’đ?‘ đ?‘Ąđ?‘&#x;đ?‘Žđ?‘›đ?‘ đ?‘šđ?‘–đ?‘Ąđ?‘–đ?‘‘đ?‘œđ?‘ = 1843 đ?‘’đ?‘™đ?‘’đ?‘šđ?‘’đ?‘›đ?‘Ąđ?‘œđ?‘ ∗ 4

đ?‘›Âş đ?‘?đ?‘–đ?‘Ąđ?‘ đ?‘Ąđ?‘&#x;đ?‘Žđ?‘›đ?‘ đ?‘šđ?‘–đ?‘Ąđ?‘–đ?‘‘đ?‘œđ?‘ = 7372 đ?‘?đ?‘Śđ?‘Ąđ?‘’đ?‘ ∗ 8

đ?‘?đ?‘Śđ?‘Ąđ?‘’đ?‘ = 7372 đ?‘’đ?‘™đ?‘’đ?‘šđ?‘’đ?‘›đ?‘Ąđ?‘œ

đ?‘?đ?‘–đ?‘Ąđ?‘ = 58976 đ?‘?đ?‘Śđ?‘Ąđ?‘’

(5.1)

(5.2)

(5.3)

Tras probar la velocidad, se abordĂł el tema del recepciĂłn y envĂ­o de datos respecto al AL. En un primer momento se probĂł el envĂ­o y recepciĂłn de datos mediante un temporizador wxTimer, pero era demasiado lento y poco eficiente con la consecuente pĂŠrdida de datos.La recepciĂłn de datos se ha realizado mediante programaciĂłn de hilos o threads que controlarĂĄn el puerto serie del PC, ya que si llega un byte y no se ha leĂ­do el

VilariĂąo Valle, Marta


Aplicación para PC 115

anterior, se puede producir un error de sobre-escritura con la pérdida de datos que ello conlleva. Para que el programa funcione de manera “concurrente” el hilo del puerto serie creado pertenece a otra clase que leerá los bytes y los almacenará en un buffer de lectura, cuyo contenido será volcado a otra variable del mismo tamaño y tipo para asegurarnos así que no existe pérdida de datos y se pueda seguir leyendo el puerto sin que exista sobreescritura. //--------------------------------------------------------------------//------ Funciones para el funcionamiento del hilo del puerto serie -//--------------------------------------------------------------------wxThread::ExitCode MyThread::Entry() { int n; char buf[2]; while(!TestDestroy())//mientras no haya destruido el hilo { n = m_pHandler->LeeCOM_TimeOut( buf,1,1);// Lee m_pHandler->checking_mensaje( buf );// Procesa } return(wxThread::ExitCode)0; }//ExitCode MyThr //--------------------------------------------------------------------MyThread::~MyThread() { m_pHandler->m_pThread =NULL; }//~MyThread()

Las funciones de lectura y escritura en el puerto serie son las siguientes: bool Analizador_Logico_DigitalDlg::AbrirCOM(char* COM_PORT,int baud) { idComDev = CreateFile(COM_PORT, GENERIC_READ | GENERIC_WRITE, 0,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if(idComDev ==INVALID_HANDLE_VALUE){ printf(“Error 1, puerto serie\n”); returnfalse; } DCB dcb ={0}; dcb.DCBlength=sizeof(dcb); if(!GetCommState(idComDev,&dcb)) { printf(“Error 2, puerto serie\n”); returnfalse; } dcb.BaudRate =(DWORD) baud;//baudrate:valor dcb.ByteSize =(BYTE)8;//Bits de datos: 8

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


116

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

dcb.Parity =(BYTE) NOPARITY;//No paridad dcb.StopBits =(BYTE) ONESTOPBIT;//1 bit de parada dcb.fAbortOnError = FALSE; dcb.fInX = FALSE; dcb.fOutX = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = FALSE; dcb.fRtsControl =(DWORD) RTS_CONTROL_DISABLE; dcb.fDtrControl =(DWORD) DTR_CONTROL_DISABLE; if(!SetCommState(idComDev,&dcb)) { printf(“Error 3, SetCommStatus\n”); returnfalse; } COMMTIMEOUTS timeouts={0}; timeouts.ReadIntervalTimeout =50; timeouts.ReadTotalTimeoutConstant =50; timeouts.ReadTotalTimeoutMultiplier =10; timeouts.WriteTotalTimeoutConstant =50; timeouts.WriteTotalTimeoutMultiplier =10; if(!SetCommTimeouts(idComDev,&timeouts)) {printf(“Error 4, timeouts\n”);returnfalse;}; returntrue; } //--------------------------------------------------------------------void Analizador_Logico_DigitalDlg::CerrarCOM() { CloseHandle(idComDev); } //--------------------------------------------------------------------void Analizador_Logico_DigitalDlg::EscribeCOM(char*Buffer,int longitud) { DWORD l, n, p =0; if(longitud==0) l = strlen(Buffer); else l = longitud; while(l) { if(!WriteFile(idComDev,&Buffer[p], l,&n,NULL))return; p += n; l -= n; } } //--------------------------------------------------------------------int Analizador_Logico_DigitalDlg::LeeCOM_TimeOut(char*buf,int m,int ms_timeout)// Recibe datos { DWORD p =0,n =0;

Vilariño Valle, Marta


Aplicación para PC 117

while( m && ms_timeout )// Hasta que no recibas algo no retorna { ReadFile(idComDev,&buf[p], m,&n,NULL); p += n; m -= n; ms_timeout--; // Cuando llegue a cero sale Sleep(1);//en segundos } if(ms_timeout)return p;// Hay datos elsereturn0; } //--------------------------------------------------------------------void Analizador_Logico_DigitalDlg::EscribirCOM_hyper(char*buff,int longitud) { EscribeCOM(buff, longitud); hyperterminal->AppendText(buff); }

Como el envío y recepción de los datos es muy sensible y pueden corromperse, se ha empleado para asegurar transmisiones correctas el método bytestuffing y además se envía con cada trama de datos un código CRC de tamaño byte justo antes del byte de fin de trama (‘#’).Si la trama recibida no contiene el mismo CRC entonces habrá habido un error en la recepción y será desechada. Los datos más críticos de recepción son los datos correspondientes a las señales que se van a dibujar.Por eso, antes de enviar ningún dato, la placa AL enviará una trama concreta que significará el inicio del envío de los datos almacenados en el buffer del microcontrolador. Una vez la aplicación reciba esa “trama especial”, a partir de ahí todos los datos recibidos corresponderán a datos sensibles a la representación gráfica.

5.4 Compilar y Ejecutar Una vez creado ellayout y dotado de funciones a todos los componentes de la interfaz ya se puede compilar y ejecutar el proyecto, accediendo al menú Ejecutar Compilar y Ejecutar o mediante el acceso rápido pulsando la tecla F9 (ver Figura 5.10). Con esta opción primero se detectan errores en el código, y si no existen se ejecuta directamente el programa. Una vez terminado, el archivo ejecutable se encuentra dentro de la carpeta donde se ha guardado el proyecto: Output->MingW->Analizador_Logico_Digital.exe. Haciendo doble click sobre este archivo se puede hacer uso de la aplicación.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


118

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 5.10 Compilando y Ejecutando el proyecto

5.5 Manual de Usuario En esta sección se va a describir cómo se realiza la instalación del programa y cómo funciona la interfaz gráfica desarrollada. Asimismo, también se detalla en orden cómo el usuario debe configurar la aplicación para capturar los datos que posteriormente serán dibujados.

5.5.1. Guía de instalación La primera versión del programa soporta versiones de Windows superiores a Windows 98. Para iniciar la instalación se debe abrir el fichero “Analizador Lógico Digital.exe” y aparece la ventana de bienvenida “Analizador_Lógico_Digital_APP” tal y como se detalla en la Figura 5.11.

Figura 5.11 Instalación (bienvenida)

Vilariño Valle, Marta


Aplicación para PC 119

A continuación, se debe hacerclick en el botón “Siguiente” y se accede a la siguiente ventana (ver Figura 5.12) con el fichero “readme.txt” donde se explica el motivo de realización de dicha aplicación.

Figura 5.12 Instalación (readme)

Para continuar con la instalación, se debe seleccionar de nuevo el botón “Siguiente” para poder elegir la ruta donde queremos que se realice dicha instalación. Si se desea modificar la ruta se puede hacer haciendo click en “Visualizar” (ver Figura 5.13 y Figura 5.14).

Figura 5.13 Instalación (destino)

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


120

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 5.14 Instalación (directorio)

Una vez elegida la ruta donde va a instalarse el programa procederemos a iniciar la instalación propiamente dicha pulsando en “Siguiente” de la Figura 5.15 o si por el contrario se desea cancelar la instalación se debe pulsar “Cancelar”.

Figura 5.15 Instalación (progreso instalación)

Una vez terminada con éxito la instalación aparecerá la última pantalla (ver Figura 5.16) donde se pulsará el botón “Finalizar” para salir del instalador. Ahora ya está preparado el usuario para hacer uso de la aplicación.

Vilariño Valle, Marta


Aplicación para PC 121

Figura 5.16 Instalación (finalizar)

5.5.2. Guía de uso En esta sección se va a detallar el uso del programa “Analizador_Lógico_Digital” que posee la distribución que se aprecia en la Figura 5.17, con una zona superior, una zona inferior, y una zona central dedicada a la monitorización gráfica.

Figura 5.17 Layout de la aplicación

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


122

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

En la parte superior izquierda se sitúa un hiperterminal donde se muestran todas las acciones que se van realizando para que el usuario tenga una guía de lo que ha ido configurando. Además, servirá también para depuración de la aplicación. A continuación se detalla el uso de todos los botones que aparecen mediante la explicación de cómo configurar la conexión con la placa AL y la configuración de los parámetros para la captura de las señales de entrada:  El botón “CONECTA COMx” establece la conexión con el AL. Si se ha seleccionado el puerto COM y la velocidad al pulsar este botón se establecerá la conexión y se habilita el botón “DESCONECTA”. Si no se estableciera correctamente la conexión al pulsar este botón aparecerá un mensaje de error. Por tanto, para establecer la conexión segura se realizará lo siguiente: o Justo debajo de la etiqueta “puerto COM”se selecciona el puerto en el que está conectado el AL. Si no apareciera ningún puerto COM se puede pulsar el botón “ACTUALIZA COM”, para hacer una nueva búsqueda de los dispositivos conectados. o Inmediatamente debajo de la etiqueta “Velocidad”, se selecciona la velocidad de transmisión. Las opciones posibles son: 4800, 9600, 19200, 38400, 57600, 115200.  Al pulsar el botón “CONECTA COMx” , si la conexión se ha establecido correctamente, justo inmediatamente debajo del selector de velocidad de transmisión cambiará su estado de Desconectado….. a “conectado…..”. Se habilita el botón “DESCONECTA”.  Al pulsar el botón “DESCONECTA”se para todo lo que estuviera haciendo la aplicación y deshace la conexión. Borra toda la memoria del buffer y devuelve al microcontrolador al estado de espera o reset.  La etiqueta “MODO S|C”permite la seleccióndel tipo de modo de la captura de los datos. Por defecto está seleccionado en modo SINGLE. o Modo SINGLE: captura hasta llenar el buffer de memoria y lo representa en la zona gráfica. o Modo CONTÍNUO: captura muestras hasta llenar el buffer de memoria, lo representa en la zona gráfica y repita la operación hasta que se pulse el botón “STOP”.  La etiqueta “Frecuencia de Muestreo (Hz)” selecciona la frecuencia o velocidad a la que vamos a capturar las muestras. Por defecto está seleccionada el tiempo más crítico o más rápido, es decir, 0.5us que equivale a 2MHz.  La etiqueta “Disparo” selecciona el tipo de disparo elegido para cada una de las 4 señales. Por defecto, si no se elige nada, se tomarán los datos sin condición de disparo. o o o o o

Sin disparo: T_X Disparo por nivel alto: T_0 Disparo por nivel bajo: T_1 Disparo por flanco de subida: T_UP Disparo por flanco de bajada: T_DOWN

Vilariño Valle, Marta


Aplicación para PC 123

 Al pulsar el botón “CAPTURA” se inicia la captura de datos de los 4 canales de entrada en la placa del AL en función de los datos seleccionados en las etiquetas: “MODO S|C”, “Frecuencia de Muestreo (Hz)” y “Disparo”. Una vez se ha llenado el buffer circular se monitorizan las muestras de las señales capturadas en la zona central de la aplicación.  Al pulsar el botón “STOP” se para la lectura de datos por el puerto serie y para de llenar el buffer de datos.  El botón “ZOOM +” aumenta las señales para verlas más en detalle.  El botón “ZOOM –”disminuye las señales para poder visualizarla entera.  La barra de SCROLL inmediatamente de la zona de gráficas permite desplazarse a la izquierda o la derecha de las señales para poder visualizar todas las muestras.  En la zona inferior, disponemos de dos barras de SCROLL pertenecientes al “CURSOR 1” (que se muestra en rojo) y el “CURSOR 2” (que se muestra en azul). La distancia entre ambos cursores obtiene el incremento de tiempo entre dos puntos seleccionados de la gráfica según la frecuencia de muestreo de trabajo. El resultado se muestra en la ventana situada en la parte inferior derecha con el formato “Cursor1 – Cursor 2 = 0.0000000 segundos”. Además, también se muestra la posición de ambos cursores con el formato “Posición Cursor1:” y “Posición Cursor1:”.  El botón “GUARDAR” almacena los siguientes archivos en la ruta en la que se encuentra instalado el programa (comúnmente Output MingW): o “log.txt”: Este archivo de texto contiene todos los datos de configuración y depuración que se han ido mostrando en el hiperterminal. o “SENALES.JPG”: Guarda una captura de lo que se ha monitorizado en la zona gráfica. o “datos.txt”: Fichero de texto que contiene los datos (“1” o “0”) muestreados para cada señal en formato “.csv”, es decir, los datos separados por comas y ordenados desde la señal 1 hasta la señal 4. Ejemplo: “1, 1, 0, 1”.  El botón “CARGAR” permite al usuario cargar ficheros existentes (“datos.txt”) de capturas anteriores, para poder visualizarlas y estudiarlas nuevamente. Para que todo el sistema funcione correctamente la placa del AL y la aplicación del PC deben tener una conexión serie mediante cable del tipo USB 2.0 (extremo del PC) a mini-USB (extremo AL) 5PIN/M.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


124

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


Resultados Experimentales 125

Capítulo 6 RESULTADOS EXPERIMENTALES En este capítulo se enumeran los resultados obtenidos a nivel hardware y software así como las pruebas de funcionamiento realizadas que garantizan el correcto funcionamiento del sistema global que se ha implementado en este proyecto.

6.1 Caracterización del sistema. Una vez soldada la placa prototipo, cuyo resultado real y final se aprecia en la Figura 6.1, correspondiente a la cara de arriba donde están situados los componentes, y en la Figura 6.2, correspondiente a la capa inferior, se puede comparar con el resultado inicial tras el diseño electrónico que se obtenía mediante visualización 3D que veíamos en la Figura 3.15 y en la Figura 3.16 en el Capítulo 1.

Figura 6.1 Placa Prototipo Real (TOP LAYER)

Figura 6.2 Placa Prototipo Real (BOTTOM LAYER)

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


126

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

6.1.1. Pruebas de funcionamiento Se han realizado distintos pruebas para asegurar el correcto funcionamiento del sistema global. Por un lado se ha testeado el funcionamiento de la placa prototipo, y por otro, el funcionamiento de ésta combinada con la aplicación del PC. Entre los test realizados están:   

Test de la placa prototipo: alimentación, reset, cristal de cuarzo, drivers. Funcionamiento de los periféricos: TIMER0, UART0. Comprobación de las limitaciones del sistema en cuanto a la frecuencia de muestreo configurada para el TIMER.

6.1.1.1 Test de la placa Lo primero que se ha comprobado es el correcto funcionamiento de la red de alimentación 5V-3V3-1V8A que se aprecia en la parte inferior del prototipo (ver Figura 6.1). Para ello se ha conectado la placa mediante USB al PC, cuya conexión proporciona tanto la alimentación como la comunicación entre ambos sistemas. Mediante multímetro se ha verificado que se obtienen los valores correctos en cada punto de la red de alimentación y en el resto de puntos de la placa a donde dichas alimentaciones llegan. Se han realizado comprobaciones en las alimentaciones del microcontrolador en las patillas 7, 51, 43, 23 correctamente alimentadas a 3.3V y en las patillas 63,17, 49 correctas a 1,8V. Mediante comprobación con osciloscopio, se ha verificado que la onda que saca el cristal de cuarzo (oscilador externo) es del valor adecuado de 12MHz (ver Figura 6.3). Además, dicha señal también llega correctamente a los pines del microcontrolador correspondientes (patillas 62 y 61). Una posible mejora es poner en paralelo al cristal de cuarzo una resistencia para tener una señal más nítida.

Figura 6.3 Test cristal de cuarzo

Vilariño Valle, Marta


Resultados Experimentales 127

El conector USB, donde llegan los 5V aportados por el PC, tiene las salidas VCC, DM y DP (ver esquemas electrónicos en el Anexo I) que llegan al driver FTDI232RL.Es mediante este chip que se establece la conexión y transmisión de datos, así como la programación del microprocesador desde el PC a la placa. Algunas comprobaciones de los pines del chip:  

La ferrita está bien colocada para evitar ruidos que entren desde el USB, hace de filtro. La red de protección de diodos (USBLC1) protege el circuito de descargas electrostáticas. El chip posee un regulador interno que convierte de 5V a 3.3V. Aquí podría existir una posible mejora, empleando dicho regulador y eliminando uno de los reguladores de la red de alimentación para sacar los 3.3V necesarios para el microcontrolador. Con esta mejora, se abarataría el coste de la placa. VCCIO (pin 4): aguanta un rango de alimentación de 1.8V a 5.25V. Internamente, está conectado a 3V3OUT. Esta alimentación se origina del mismo lugar que VCC (pin 20).

Para comprobar que el microcontrolador se graba correctamente y que el reset funciona como debe se ha comprobado mediante el osciloscopio que la línea de reset (activa a nivel bajo) devuelve valor bajo al pulsar el botón de reset o cuando se graba el microcontrolador como era de esperar. Para comprobar que el microcontrolador se grababa correctamente a través del driver FTDI232RL, se intentó meter un programa de prueba obteniendo un resultado fallido. Para solventar dicho problema se analizaron los siguientes pines que entraban en juego a la hora de programar el dispositivo: 

RESET# (pin 19 del driver): es una patilla activa a nivel bajo que resetea el driver. Si no se necesita se puede dejar desconectada o conectada a VCC por pullup, pero sería recomendable poner una resistencia de pull-up de 1KΩ en ese último caso. Se unió el pin 19 con el pin 20 (VCC) y el microprocesador se grabó correctamente, de lo que se sacó la conclusión de que el reset estaba metiendo ruido. DTR# (pin 2 del driver): Salida de datos. Está unida al pin 57 correspondiente al /RESET del microcontrolador que debe ser invertido. Se comprobó mediante osciloscopio que los niveles eran los correctos (en bajo al pulsar el botón o grabar el microcontrolador y en alto en estado de espera). RTS# (pin 3 del driver): Salida de petición de envío. Se corresponde con la patilla del bootloader. Posiblemente podría ser necesaria una resistencia de pull-up de 10KΩ entre la resistencia R3 y alimentación a 3.3V, que se contemplan dentro de posibles mejoras del diseño, si al conectar el pin 19 a VCC el dispositivo no se programa.

Una vez solucionada la programación del microprocesador, la ingeniero que escribe este documento y que realizó las pruebas y contempló los puntos anteriores expuestos no Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


128

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

estaba conforme con dicha modificación y decidió volver a soldar el microprocesador evitando así otras modificaciones en la zona del driver. Finalmente, tras volver a soldar el chip el dispositivo se grababa correctamente sin necesidad de cambios mayores, pero que se ha querido que queden reflejados en el presente documento. 6.1.1.2 Funcionamiento de los periféricos 

Funcionamiento de la UART0

Las patillas RXD (pin 5) y TXD (pin 1) del driver FTDI232RL, están conectadas a las patillas 19 y 21 del microcontrolador, respectivamente. Esta conexión entre pines es crítica, y mediante multímetro se ha comprobado su continuidad para verificar la conexión de ambos lados. Con un programa sencillo de prueba que graba el programa que envía un “Hola mundo” y que la transmisión y la recepción funcionan como deben.

Figura 6.4 Test funcionamiento UART0 y programación de la placa

Funcionamiento del TIMER0

Una vez que se había comprobado el funcionamiento básico de la placa y que ésta se graba correctamente, se programó la configuración del TIMER0 para la generación de los dos pulsos de reloj (CLK y CLK_BY_8, patillas 46 y 47, respectivamente en el diseño original).Con dicho diseño se debían configurar los dos TIMER 0 y 1, por eso se realizó una modificación del mismo que permitía generar ambos pulsos con el TIMER0. Con dicho cambio, se asignan las patillas (46) y (29) a CLK (MAT0.1) y CLK_BY_8 (P0.5), respectivamente. Vilariño Valle, Marta


Resultados Experimentales 129

Tras programar la rutina del TIMER para un T=0.5µs y la subrutina de atención a la interrupción, al comprobar el “elapsed time” con el simulador de Proteus se alcanzaba un valor de unos 883ns entre interrupciones, que no corresponde en absoluto al tiempo deseado que es 0.25µs (T=0.5µs—T/2=0.25µs). Al parecer, el simulador no sirve para estos valores tan pequeños, puesto que se ha comprobado (en otros miniproyectos de ayuda a familiarizarse con el dispositivo LPC2114) que para tiempos mayores el simulador funciona correctamente. Como el simulador, para el caso más restrictivo (T=0.5µs), no funciona correctamente, se ha comprobado mediante osciloscopio que la señal generada (CLK), tras grabar la placa prototipo, aparece con los tiempos adecuados y correctos y con la frecuencia que se ha programado, según la base de tiempos que se fije desde la aplicación del PC.Se han probado todos los valores posibles que se pueden configurar desde la aplicación del PC y la señal CLK responde perfectamente según el valor programado como se aprecia en la Figura 6.5para una señal CLK de frecuencia de 1MHz mostrada en la parte superior del osciloscopio y la señal CLK_BY_8 en la parte inferior del osciloscopio.

Figura 6.5 Test señales de reloj (CLK y CLK_BY_8)

Por último, y para concluir con las comprobaciones de las señales de reloj, las cuales son críticas para que el funcionamiento de los registros de desplazamiento es correcto, se han testeado las patillas 11 y 12 de cada registro para asegurarse de que las señales CLK y CLK_BY_8, respectivamente, llegan a todos y cada uno de ellos. Asimismo, también se ha comprobado, que tras introducir cuatro señales de entrada, mediante un generador de señal, las patillas correspondientes a las salidas Qx (patillas 15, 1, 2, 3 4, 5, 6 y 7) de los registros cambian su estado (de alta a baja) y que llegan a su vez al microcontrolador.

6.1.2. Limitaciones del sistema Para la realización de pruebas del sistema completo se ha procedido del siguiente modo: la placa prototipo conectada por puerto serie al PC, pudiéndose controlar y enviar órdenes desde la aplicación del PC, y conectada a su vez al generador de señales disponible en el

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


130

DiseĂąo e ImplementaciĂłn de un Analizador LĂłgico Digital basado en un microprocesador ARM7

laboratorio con un rango de frecuencia desde 2Hz a 2MHz, que servirĂĄ para generar las cuatro seĂąales de entrada. Con las pruebas sucesivas cambiando la frecuencia de las seĂąales de entrada se ha observado que para seĂąales menores de 1KHz, el sistema global es demasiado rĂĄpido y los datos representados apenas son visibles debido a que se mostrarĂ­an en la aplicaciĂłn grĂĄfica prĂĄcticamente o en estado alto o en estado bajo. Por ello, y para asegurar que las seĂąales se visualizan por completo en la aplicaciĂłn se requerirĂĄn seĂąales de entrada de frecuencia mayor o igual de 2KHz. AdemĂĄs, se ha de tener en cuenta otra limitaciĂłn que se observaba al realizar las pruebas pertinentes a la hora de establecer la velocidad de la conexiĂłn del puerto serie en el apartado 5.3 del CapĂ­tulo 5. Se llegĂł a la conclusiĂłn de que la velocidad mĂĄxima de funcionamiento posible era de 115.200 baudios con un tamaĂąo mĂĄximo de buffer de 1.842 elementos.

6.1.3. Medidas experimentales En este apartado se muestran distintas demostraciones realizadas con el sistema global en funcionamiento. Estas pruebas se han realizado con seùales de entrada obtenidas a partir de un generador de funciones del laboratorio con un rango de hasta 2MHz. En los experimentos mostrados a continuación se han realizado capturas en modo single y en modo contínuo, así como capturas a distintas frecuencias y con condiciones de disparo distintas. 

Captura en modo “singleâ€? con frecuencia de muestreo de 1MHz y sin disparo en ninguna de las seĂąales de entrada. SeĂąales de entrada de frecuencia 2KHz*(2.0), es decir, 4KHz. Por tanto, si observamos la figura la diferencia entre los dos cursores (rojo y azul) nos da un tiempo de 256Âľs, es decir, una frecuencia igual a đ?‘“đ?‘&#x;đ?‘’đ?‘?đ?‘˘đ?‘’đ?‘›đ?‘?đ?‘–đ?‘Žđ?‘ đ?‘Ľ =

1 256Âľs

= 3.096,25đ??ťđ?‘§ ≈ 4đ??žđ??ťđ?‘§ (ver Figura 6.6).

Figura 6.6 Prueba Captura: F=1MHz, no disparo en seĂąales entrada

VilariĂąo Valle, Marta


Resultados Experimentales 131

Captura en modo “single” con frecuencia de muestreo de 10KHz, con disparo por flanco de subida en la señal 3 y sin disparo en el resto de señales. Con 4 señales de entrada de 202KHz. Cuando se den ambas condiciones de disparo se representarán las señales que se muestran en la Figura 6.7.

Figura 6.7 Prueba Captura: F=10KHz; sx3: disparo nivel alto; sx1, sx2, sx4: no disparo

Captura en modo “continuo” con frecuencia de muestreo de 0.1MHz, disparo por nivel bajo en la señal 4 y sin disparo en el resto. El modo continuo se puede apreciar en la figura puesto que en la zona de monitorización de gráficas se ve cómo tras pintar el buffer y hacer varias capturas estamos en tiempos de representación de “ms”. Cada vez que se llena el buffer de memoria se representan de nuevo las señales (ver Figura 6.8 ).

Figura 6.8 Prueba Captura: F=0.1MHz; sx4:disparo nivel bajo; sx1,sx2,sx3: no disparo

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


132

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Captura en modo “contínuo” con frecuencia de muestreo de 1MHz, con disparo por nivel bajo para la señal 1, nivel alto para la señal 3 y sin disparo para el resto de señales (ver Figura 6.9).

Figura 6.9 Prueba Captura: F=1MHz, sx1: disparo nivel bajo, sx3: disparo nivel alto, sx2, sx4: no disparo

Vilariño Valle, Marta


Coste Económico del Proyecto 133

Capítulo 7 COSTE ECONÓMICO DEL PROYECTO En el presente capítulo se pretende reflejar los recursos que se han empleado en la realización de este proyecto. Al ser éste un proyecto modesto, no existen costes elevados de los recursos empleados, tanto humanos como materiales. A lo largo del capítulo se analizarán los costes, en unidades monetarias, para completar el proyecto. Se distinguirán entre los recursos materiales (medidos en euros) al precio de mercado que tengan en el momento actual de su adquisición, y los recursos humanos (medidos en horas/hombre). Para obtener finalmente unos costes homogéneos se valorarán los recursos humanos a precio de mercado. En la estructuración de los costes se distinguirá entre los costes directos e indirectos del proyecto, clasificados a su vez por su origen. Finalmente, se agregan los costes para obtener el presupuesto total.

7.1 Costes Directos Los costes directos son aquellos directamente identificables y atribuidos al producto final obtenido, como son los materiales directos y la mano de obra directa destinada para la consecución del producto, en este caso el proyecto que nos ocupa. Los costes directos son los que se transfieren al producto final, en nuestro caso, la PCB del Analizador Lógico Digital lista y funcionando, y pueden desglosarse en función del origen del coste como veremos a continuación.

7.1.1. Costes en Materias primas y componentes En este apartado se contemplarán los costos unitarios asociados a cada componente y material electrónico en el momento de la compra para construir la placa de circuito impreso. Lo podemos ver en la Tabla 7-1. El proveedor seleccionado para la adquisición de componentes ha sido Farnell [3]. En el Anexo III se puede ver la lista de componentes y sus referencias obtenidos del proveedor.

7.1.2. Costes de amortización de equipos y herramientas Los costes de amortización son la figura contable que contempla el deterioro producido por el uso o envejecimiento de equipos y herramientas. Ver Tabla 7-2 Costes de amortización.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


134

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Tabla 7-1Costes de material electrónico (Euros)

MATERIAL ELECTRÓNICO Descripción 2 Layer Green PCB 10cmx10cm MAX

Proveedor

Referencia

Coste Unitario (€)

Cantidad

Coste Total (€)

ITEAD Studio

IM120418003

2,578 €

10

25,784 €

Componentes: componentes SMD CONN-H5

Farnell

varias

---

42

21,587 €

Electroson

tira espadines

0,700 €

1

0,700 €

MULTICOMP - MC32599 - CONNECTOR, MINI USB B

Farnell

1696540

1,260 €

1

1,260 €

SWITCH SPNO 6MM

Farnell

1555982

0,146 €

1

0,146 €

Electroson Electroson

-----

2,000 € 3,000 €

Otros materiales: Estaño Flux

1 1 TOTAL (€): TOTAL IVA (21%) (€):

2,000 € 3,000 € 54,48 € 65,92 €

Tabla 7-2 Costes de amortización

AMORTIZACIÓN EQUIPOS Y HERRAMIENTAS Coste Unitario (€/h)

Unidades (h)

Amortización herramientas (estación de soldadura, desoldador, etc)

1,5/h

20

Equipos de medida (multímetro, osciloscopio, etc) Ordenador portátil

0,75/h 0,20/h

50 960 TOTAL:

Descripción

Coste Total (€) 30 37,5 650 717,5

Tabla 7-3 Costes por licencias informáticas

SOFTWARE Y LICENCIAS Descripción

Coste unitario (€/h)

Unidades (h) Coste Total (€)

0,4

1760

650 €

Amortizado Licencia Universidad de Valladolid

900

0€

30

0€

VSM Studio

Gratuito

70

0€

Yagarto

Gratuito

70

0€

50 1760

0€ 0€

15

0€

TOTAL:

650 €

Windows 8.1 Microsoft Office 2010 Proteus 7.9 Professional

WxDevC++ Dropbox SolidWorks

Vilariño Valle, Marta

Gratuito Gratuito Licencia Universidad de Oviedo


Coste Económico del Proyecto 135

7.1.3. Costes de software y licencias En este apartado lo que se pretende reflejar es el coste que suponen las licencias de los programas informáticos empleados para el desarrollo de este trabajo fin de carrera. Podemos ver estos costes asociados en la Tabla 7-3. Para obtener estas cantidades nos hemos basado que suponiendo que las horas laborables de un año son aproximadamente unas 1760 horas. Para obtener el coste unitario se ha supuesto que el factor de utilización del software es de una hora por cada hora de trabajo y además se supone que el ingeniero u operario sólo hace uso del software durante un tiempo determinado que el operario usa de forma práctica.

7.1.4. Costes por mano de obra empleada Las horas de mano de obra se presentan desagregadas por paquetes de trabajo. De esta manera también servirán como registro del esfuerzo realizado en cada grupo de tareas. Para realizar la conversión de horas trabajadas a euros se supondrá que el diseño, construcción y montaje de sistemas, así como su programación y validación ha sido realizado por un Ingeniero Superior en Electrónica. En primer lugar se calculará el coste por hora de un ingeniero. Se supone un año laboral de 1760 horas laborables. Como salario base se supondrá la cantidad 27.000€ brutos anuales de acuerdo a los convenios colectivos laborales vigentes. Sobre este salario base se debe cargar la Seguridad Social a cargo de la empresa, con lo que se obtiene el coste total para la empresa. Ver Tabla 7-4 Costes por hora de Ingeniero. Tabla 7-4 Costes por hora de Ingeniero

COSTES INGENIERÍA Concepto

Importe (€)

Salario bruto anual

27.000,00 €

Seguridad Social a cargo de la empresa (29,7%)

8.019,00 €

Coste anual por empleado

35.019,00 €

Horas laborables/año Coste por hora

1.760 19,00 €

En segundo lugar, también se tendrán en cuenta las horas del tutor dedicadas al desarrollo del proyecto quien se identificará como el Project Manager del mismo.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


136

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Para calcular el coste por hora del Project manager se supondrán al igual que en el caso del ingeniero un año laboral de 1760 horas laborables. Sin embargo, para este caso concreto consideraremos un salario base de 40.000€ brutos anuales de acuerdo a los convenios colectivos laborales vigentes. Sobre este salario también cargaremos la Seguridad Social por cuenta de la empresa. Por tanto, la Tabla 7-4 será modificada obteniendo finalmente la Tabla 7-5 Coste Mano de Obra empleada. Tabla 7-5 Coste Mano de Obra empleada

COSTES INGENIERÍA Concepto

Importe (€) Ingeniero Project Manager

Salario bruto anual

27.000,00 €

40.000,00 €

Seguridad Social a cargo de la empresa (29,7%)

8.019,00 €

11.880,00 €

Coste anual por empleado

35.019,00 €

51.880,00 €

1.760

1.760

19,00 €

29,00 €

Horas laborables/año Coste por hora

En cuanto al esfuerzo realizado en cada paquete de trabajo se tiene el siguiente registro de actividades (ver Tabla 7-7) con su correspondiente duración en el tiempo. Dicho registro es una estimación de duración. Se han dedicado al proyecto un total de 1180,2 horas por parte del ingeniero, que distribuidas en una jornada laboral de 40 horas semanales con un único ingeniero para su ejecución, dan lugar a una duración de 4 meses y 27 días de trabajo.

7.1.5. Costes Indirectos Los costos indirectos son aquellos que no se asignan directamente a la fabricación de la placa de circuito impreso pero si al producto final obtenido. Es decir, no es posible establecer de una forma directa qué cantidad de coste corresponde a un objetivo de coste concreto. Ver Tabla 7-6 Costes Indirectos y Generales. Tabla 7-6 Costes Indirectos y Generales

COSTES INDIRECTOS Y GENERALES Concepto Gastos generales de oficina Gastos generales laboratorio Consumos y suministros Gastos de envío Transportes y desplazamientos TOTAL:

Vilariño Valle, Marta

Importe (€) 83,00 € 50,00 € 348,00 € 30,00 € 500,00 € 1.011,00 €


Coste Económico del Proyecto 137

Tabla 7-7 Registro de Actividades

REGISTRO DE ACTIVIDADES Ingeniero código

TAREA

ESFUERZO (horas)

Project Manager

Coste MO (€)

ESFUERZO (horas)

Coste MO (€)

1 INICIACIÓN 1.1 Comunicación con interesados

1

19,00 €

1

29,00 €

1.2 Reunión de Kick-Off con tutor 2 DISEÑO ELECTRÓNICO

2

38,00 €

2

58,00 €

3

57,00 €

0,3

8,70 €

3 2

57,00 € 38,00 €

2 0

58,00 € 0,00 €

40

760,00 €

0

0,00 €

60 40 0 0 0,3 0,5 1 100 0,4 120

1.140,00 € 760,00 € 0,00 € 0,00 € 5,70 € 9,50 € 19,00 € 1.900,00 € 7,60 € 25,00 €

0,5 0 0 0 0 0 0 0 0 0

14,50 € 0,00 € 0,00 € 0,00 € 0,00 € 0,00 € 0,00 € 0,00 € 0,00 € 0,00 €

1 2 8 16

19,00 € 38,00 € 152,00 € 304,00 €

0,3 0,3 0,3 4

8,70 € 8,70 € 8,70 € 116,00 €

1

19,00 €

1

29,00 €

28 12 4 90 90

532,00 € 228,00 € 76,00 € 1.710,00 € 1.710,00 €

0 0 0 0 0

0,00 € 0,00 € 0,00 € 0,00 € 0,00 €

15 90 33 90

285,00 € 1.710,00 € 627,00 € 1.710,00 €

0 0 0 0

0,00 € 0,00 € 0,00 € 0,00 €

47 8

893,00 € 152,00 €

0 8

0,00 € 232,00 €

240 4.560,00 € 32 608,00 € 1180,2 20.168,80 €

4 0,5 24,2

116,00 € 14,50 € 701,80 €

2.1

Preparación del entorno de trabajo. Instalación del software necesario.

2.2 Definición de especificaciones 2.3 Diagrama de bloques Estudio y análisis del datasheet del microcontrolador y 2.4 resto de componentes. 2.5 Desarrollo de esquemas. 2.6 Desarrollo de librerías. 2.7 Stack-up. 2.8 Contorno ESD 2.9 Definición de forma de la placa 2.10 Reglas de diseño 2.11 Posicionamiento 2.12 Rutado 2.13 Check outs 2.14 Fabricación 3 CONSTRUCCIÓN Y MONTAJE 3.1 Electrónica 3.1.1 Documentos de fabricación 3.1.2 Acopio de material. Compra de componentes. 3.1.3 Ensamblado del prototipo. Montaje de componentes. 3.1.4 Validación del prototipo. Comprobaciones. 3.2 Programación Preparación del entorno de trabajo. Instalación del 3.2.1 software necesario. 3.2.2 Programación de la placa diseñada 3.2.2.1 Estudio del datasheet 3.2.2.2 Herramientas del lenguaje C 3.2.2.3 Configuración del microcontrolador 3.2.2.4 Pruebas en LPC2114 3.2.2.5 Integración en placa desarrollada propia 3.2.3 Programación de la aplicación en el PC 3.2.3.1 Herramientas del lenguaje 3.2.3.2 Pruebas 3.2.3.3 Integración con la placa desarrollada propia 3.2.4 Pruebas finales 4 SEGUIMIENTO Y CONTROL 4.1 Documentación de los trabajos realizados 4.2 Reuniones con el tutor 5 CIERRE DEL PROYECTO 5.1 Redacción de la memoria 5.2 Preparación de la presentación TOTAL:

4,9175 meses

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


138

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

7.1.6. Costes Totales del Proyecto En la Tabla 7-8 Costes Totales del Proyecto, se contempla un resumen de todos los gastos parciales y totales del proyecto donde se recoge que el coste total del proyecto es de veintidós mil seiscientos trece con veintidós euros. Tabla 7-8 Costes Totales del Proyecto

COSTES TOTALES DEL PROYECTO Concepto

Parciales (€)

Totales (€)

Costes materias primas y componentes

65,92 €

Costes de amortización de equipos y herramientas Costes de software y licencias Costes por mano de obra empleada

717,50 € 650,00 € 19,00 € Total Costes Directos: Total Costes Indirectos: TOTAL:

20.168,80 € 21.602,22 € 1.011,00 € 22.613,22 €

7.1.7. Coste Unitario y Amortización del producto En el apartado anterior se han obtenido los costes totales del proyecto, los cuales son equivalentes al desarrollo y fabricación de una placa de circuito impreso. Por tato, los costes iniciales de fabricación del producto ascenderían a 22.613,22€. Para calcular el coste unitario de fabricación (ver Tabla 7-9), en función del número de unidades fabricadas, se ha tenido en cuenta que, a partir de más de 10 unidades, el precio de fabricación de la placa de circuito impreso se dispara. Debido a ello, los precios de fabricación de placa se han consultado en la web de Eurocircuits con plazos de entrega de 15 días laborables, para aproximar así el presupuesto de coste unitario en función del número de unidades. El tooling, o fabricación por primera vez de la PCB, quedaba contemplado en la fabricación del prototipo. Los componentes electrónicos, que ascienden a un número de 44 en cada producto finalizado, llevan asociado cada uno un descuento por parte del proveedor, Farnell. En la Anexo Tabla - 6 y en la Anexo Tabla - 7 del Anexo III, donde se recogen las referencias y el precio unitario en función de la cantidad a la fecha indicada, quedan reflejados los datos a partir de los cuales se han hecho los cálculos. Además, a la hora de calcular el precio final del producto, también se han tenido en cuenta los precios, en función de las unidades, tanto de la manufactura o ensamblado, como del mecanizado y fabricación de la caja que contendrá el producto finalizado. Es importante resaltar que, todos los precios contemplados, cambian en función del catálogo del fabricante. Tras el coste total calculado en función del número de unidades, se va a tener en cuenta, además, un beneficio de venta del 30%, que se incluirá en el coste unitario de venta o precio final del producto.

Vilariño Valle, Marta


Coste Económico del Proyecto 139

Tabla 7-9 Coste Unitario en función de las unidades fabricadas

COSTE UNITARIO UNIDADES 100 500

CONCEPTO 1

10

FABRICACIÓN PCB (CON IVA) (**)

2,58 €

25,78 €

379,59 €

979,09 €

COMPONENTES PCB (CON IVA) (***) MECANIZADO (CON IVA) (****) MANUFACTURA (CON IVA) (*****) COSTE UNITARIO fabricación (€): Beneficio venta (%): COSTE UNITARIO venta (€)[beneficio 30%]:

26,35 € 6,00 € 20,00 € 54,93 € 30 71,41 €

243,75 € 60,00 € 15,00 € 34,45 € 30 44,79 €

1.931,28 € 600,00 € 10,00 € 29,21 € 30 37,97 €

8.088,85 € 2.000,00 € 5,00 € 22,15 € 30 28,79 €

Nº componentes PCB (BOM)

44

1000

10000

1.958,18 €

19.581,80 €

15.715,48 € 141.295,33 € 2.500,00 € 10.000,00 € 5,00 € 5,00 € 20,18 € 17,09 € 30 30 26,23 € 22,21 €

(*) acotación a fecha 05/07/2014 (**) estimación sacado de Eurocircuits (***) estimación sacado de Farnell (****) estimación Supertronic(pedido mínimo:100u.=6€/caja) (*****) estimación

De la Tabla 7-9 se deduce que, a mayor número de unidades fabricadas, más barato será el producto. Los precios unitarios contemplan el IVA. Para amortizar el coste, que ha supuesto el desarrollo del producto y recuperar la inversión inicial, se ha realizado una amortización lineal o de cuota fija. Tal y como se obtuvo en la Tabla 7-8, la inversión inicial para el desarrollo del producto ha sido de 22.613,22€. La vida útil de cada producto se estima en 2 años y su valor residual, es decir, el valor del producto al final de su vida útil, se estima en cero. Con estos datos, se ha decidido amortizar la cantidad de 22.613,22€ / 2 = 11306.61€ anuales. Tabla 7-10 Amortización de la inversión inicial

AMORTIZACIÓN CONCEPTO ( A ) Coste Inicial ( B ) Vida últil estimada ( C ) Valor residual estimado ( D ) Base amortización ( A - C )

Base Imponible 22.613,22 € 2 0,00 € 22.613,22 €

( E ) Cuota de amortización anual estimada (D / B)

11.306,61 €

AÑO

CUOTA

1 2

11.306,61 € 11.306,61 €

AMORTIZACIÓN ACUMULADA 11.306,61 € 22.613,22 €

VALOR NETO 11.306,61 € 0,00 €

Estimando unas ventas en los próximos 3 años de 11.000€, 8.000€ y 7.000€, con unos gastos de explotación de 3.000€, constantes en los 3 periodos anuales de estudio. Se observa que, para un coste de mercaderías de 5.000€, el beneficio generado en el año 1 es de 6.000€, en el año 2 el beneficio es de 3.000€ y el año 3 se producen unos beneficios de 2.000€.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


140

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Si suponemos que todas las ventas se cobran en el mismo periodo en el que se han devengado y que los gastos de cada año también se pagan en el mismo periodo, la tesorería generada en cada uno de los años es de 8.000€, 5.000€ y 4.000€, respectivamente. Para ahorrarnos gastos de distribución e intermediarios se optará por un modelo de negocio en el que la venta sea a través de página web. Tabla 7-11 Cuenta de Resultados

CUENTA DE PÉRDIDAS Y GANANCIAS CONCEPTO (+) Ingresos por venta del producto (A) (-) Coste de mercaderías (B) Gastos de explotación Amortización (11306,61) Beneficio (A-B)

Año 1 11.000 € 5.000 € 3.000,00 € 11.306,61 € 6.000 €

Año 2 8.000 € 5.000 € 3.000,00 € 11.306,61 € 3.000 €

Año 3 7.000 € 5.000 € 3.000,00 € 11.306,61 € 2.000 €

Año 2 8.000,00 € 3.000,00 € 5.000 €

Año 3 7.000,00 € 3.000,00 € 4.000 €

TESORERÍA CONCEPTO Cobros del periodo ( C ) Pagos del periodo (D) Caja generada en el perido (C-D)

Año 1 11.000,00 € 3.000,00 € 8.000 €

Si nos fijamos en los beneficios obtenidos para cada año, eso significa que con un beneficio de venta del 30% y en función del beneficio obtenido en la Tabla 7-11 por cada año, según el número de unidades fabricadas necesitaríamos vender el número de unidades que se recoge en la Tabla 7-12. Tabla 7-12 Estimación de ventas en función de los beneficios

UNIDADES VENDIDAS

Año 1 Año 2 Año 3

1 84,03 42,01 28,01

UNIDADES FABRICADAS 10 100 500 1000

10000

133,96 66,98 44,65

270,09 135,05 90,03

158,01 79,01 52,67

208,41 104,20 69,47

228,73 114,36 76,24

A partir de aquí, y con los datos expuestos, el siguiente paso sería plantear el modelo de negocio a seguir si realmente se decidiera fabricar el producto y venderlo.

Vilariño Valle, Marta


Conclusiones y Líneas Futuras 141

Capítulo 8 CONCLUSIONES Y LÍNEAS FUTURAS Para finalizar este Proyecto Fin de Carrera me gustaría exponer brevemente las conclusiones que he obtenido tras su realización. Tras haber realizado todos los trabajos que exigía el proyecto, puedo concluir que un proyecto de las dimensiones y características propuesto por el profesor Dr. Jesús M. Hernández Mangas, es imposible ser abordado sin el conocimiento de varias disciplinas. Por tanto, ha resultado ser un proyecto multidisciplinar que abarca ámbitos tan distintos como son el desarrollo de esquemas electrónicos y el rutado de la placa de circuito impreso, la fabricación y el testeo del prototipo, así como el soldado del prototipo en SMD, disciplinas todas ellas que no en todos los proyectos van de la mano y, sin embargo, han sido elaboradas por un solo ingeniero. Otras disciplinas requeridas han sido el aprovisionamiento de componentes y materiales, el estudio y programación del firmware del microcontrolador, programación de aplicaciones gráficas para PC e integración de los distintos dispositivos. La realización de una PCB requiere la fabricación de prototipos que tiene asociado un coste, por lo que las tareas de simulación y prototipado son parte muy importante del proceso. En mi caso, el prototipo original apenas contó con 2 fallos que fueron tipificados en el estudio AMFE (soldadura y programación del microcontrolador), sin embargo, como conclusión, la aparición recurrente de errores de hardware podía haber disparado los costes de desarrollo, que se han evitado gracias al desarrollo de esquemas y la simulación. Tanto a nivel hardware como software, he podido comprobar lo sensible y lo costoso de la comunicación entre plataformas: la placa del analizador lógico y el PC; pudiéndose llevar, como en este caso, gran cantidad de horas de desarrollo. El hecho de conseguir una comunicación de tramas de datos segura y con comprobación de errores (checking) que ambos lados pudieran interpretar y recibir correctamente fue clave para conseguir la finalización de este proyecto. Se hicieron numerosas pruebas, añadiendo y quitando campos a la cabecera de las tramas, para finalmente, dejar las tramas de datos lo más sencillas posibles y sacando todos los datos necesarios mediante programa como eran el número de elementos de muestras o la longitud de la trama, sin necesidad de mandarlos en la cabecera de la trama. Tras las pruebas realizadas con el sistema global conectado y funcionando, los resultados obtenidos son buenos y cumplen con las especificaciones de desarrollo propuestas, con ciertas limitaciones ya expuestas. Sin embargo, si lo comparamos con dispositivos comerciales nos encontramos con que el coste económico es mayor y el ancho de banda es menor. A pesar de que el sistema ha sido diseñado con los registros de desplazamiento configurados en modo serie-paralelo para dotarle de rapidez y aumentar su velocidad por 8, no es suficientemente rápido comparado con otros productos similares que existen ya en el mercado a día de hoy. Dado el carácter educacional de este proyecto, concluyo que cumple los objetivos para los que ha sido realizado, aunque desde el punto de vista comercial no tendría sentido.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


142

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Como líneas futuras, una vez adquirido conocimientos profundos de analizadores lógicos y de la tecnología que los rodean, se podría realizar una evolución del producto empleando otro modelo de microcontrolador ARM de 32 bit más potente y con mayor posibilidad de almacenamiento de datos para las capturas realizadas, bien sea mediante la elección de un dispositivo con mayor memoria interna, o bien añadiendo una memoria EEPROM externa o incluso una tarjeta flash, ya sea SD o microSD si los requerimientos de memoria aumentasen tanto que fueran necesario manejar una cantidad de datos de Megas o Gigas. Otra mejora que quizá se aleja de la línea de desarrollo que se ha seguido en este proyecto, sería realizar el diseño con una FPGA (Field Programmable Gate Array) reprogramable, las cuales, para dispositivos pequeños tienen costes de desarrollo y adquisición menores y el tiempo de desarrollo se disminuye considerablemente. Sin embargo, tienen un mayor consumo de potencia. Otra mejora posible que se contempla es la ampliación de la interfaz gráfica para PC que se ha realizado, permitiendo la posibilidad no sólo de mostrar y analizar las señales de entrada, sino además de permitir la decodificación de protocolos de comunicación como I2C, SPI o BUS. El emprendimiento de un proyecto de estas características por un único ingeniero, resulta ser una tarea muy rica en contenidos que me ha ayudado a conocer las distintas fases por las que pasa un proyecto de desarrollo, así como las distintas disciplinas que lo componen.

Vilariño Valle, Marta


Índice de Términos 143

ÍNDICE DE TÉRMINOS

A

J

AL: Analizador Lógico · 7, 9, 11, 13, 109, 115, 116, 119, 124, 125

JTAG · 52

AMFE: Análisis Modal de Fallos y Efectos · 41

M MCU: Microcontrolador · 20

C

MIPs · 43

CCO: Oscilador Controlado Corriente · 60, 62, 63

por

mm: milímetros · 28, 30, 31

P E ESD: Diodos contra Descargas Electrostáticas · 23, 28, 33 ETSIT: Escuela Técnica Superior de Ingenieros de Telecomunicación · 7

F FIFO: Fist In First Out · 81, 82, 84, 85, 86, 87, 91, 92

PC: Personal Computer · 8, 9; Personal Computer (Ordenador Personal) · 8, 9, 11, 12, 19, 20, 21, 22, 23, 72, 81, 109, 116, 125 PCB: Printed Circuit Board · 8; Printed Circuit Board (Placa de Circuito Impreso) · 7, 8, 9, 27, 28, 29, 30, 33, 36, 41, 135 PFC: Proyecto Fin de Carrera · 7, 9, 12, 29, 40

R

G

RAM: Random Access Memory · 10, 16, 19, 21, 50

GNU · 49, 50 GPIO · 52, 54, 55, 56, 57, 74; General Purpose Input/Output · 21

RISC · 43, 52

S

I

SO: Sistema Operativo · 109 IDE: Entorno de Desarrollo Integrado · 49, 109, 114; Integrated Development Environment (Entorno Integrado de desarrollo) · 13, 14, 109 ISR: Interrupt Service Routine · 66

T THUMB · 52 TTL: Transistor-Transistor Technology · 10, 19

Logic

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


144

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

TVS: Transient-Voltage-Suppression · 23

USB: Universal Serial Bus · 10, 16, 19, 20, 22, 23, 24, 33, 40, 41, 92, 125

U

V

UART: Universal Asynchronous Receiver-Transmitter · 21, 22, 23, 44, 81, 82, 83, 84, 86

VIC: Vectored Interrupt Controller · 44, 65, 66, 67, 74, 78, 92

Para hacer el glosario de palabras hemos ido seleccionando cada palabra y referencia_>marcar entrada y luego… insertar índice.

Vilariño Valle, Marta


Bibliografía 145

BIBLIOGRAFÍA [1] J. M. H. Mangas, «Página personal Dr. Jesús M. Hernández Mangas,» [En línea]. Available: http://www.ele.uva.es/ELE_index.html. [2] «ITEAD STUDIO,» Marzo 2013. [En línea]. Available: http://blog.iteadstudio.com/. [3] Farnell plc., «FARNELL,» 2013. [En línea]. Available: http://es.farnell.com/. [4] NXP Semiconductors, «Datasheet LPC2114,» Diciembre 2012. [En línea]. Available: http://www.nxp.com/documents/data_sheet/LPC2114_2124.pdf. [5] NXP Semiconductors, «User Manual LPC2114,» Diciembre 2012. [En línea]. Available: http://www.nxp.com/documents/user_manual/UM10114.pdf. [6] «Sistemas embebidos en Español,» [En línea]. Available: http://fjrg76.wordpress.com/2010/07/10/interrupciones-en-el-lpc2000-i-draft/. [7] gnu.org, «GNU,» [En línea]. Available: http://www.gnu.org/. [8] Soft T., Programing With wxDev-C++. [9] Sourceforge.net, «wxdsgn Sourceforge,» http://wxdsgn.sourceforge.net/?q=node/4.

[En

línea].

Available:

[10] «YAGARTO,» 2013. [En línea]. Available: http://www.yagarto.org/. [11] wxWidgets.org, «wxWidgets Cross-Platform GUI Library,» [En línea]. Available: http://www.wxwidgets.org/docs/. [12] Labcenter Electronics Ltd., «LABCENTER ELECTRONICS,» 2013. [En línea]. Available: http://www.labcenter.com/. [13] «Especificaciones prototipado Itead Studio,» Marzo 2013. [En línea]. [14] ARM Ltd., «ARM,» 2013. [En línea]. Available: http://www.arm.com/. [15] NXP Semiconductors, «NXP Semiconductors,» [En línea]. Available: www.nxp.com. [16] «Interrupciones

ARM7,»

[En

línea].

Available:

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


146

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

http://fjrg76.wordpress.com/2010/07/10/interrupciones-en-el-lpc2000-i-draft/. [17] D. Arroyo Menéndez y L. Palomo de Onís, «Una Introducción a GCC,» 2013. [En línea]. Available: http://www.davidam.com/docu/gccintro.es.html. [18] J. P. L. Veraguas, Compatibilidad Electromagnética - Diseño de Módulos Electrónicos, Barcelona: Marcombo, 2006.

Vilariño Valle, Marta


Anexos 147

ANEXOS

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


148

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

ANEXO I: Esquemas Electrónicos del Analizador Lógico Digital Los esquemas que se muestran en páginas sucesivas son:   

Esquema Electrónico para la sección del Microcontrolador. Esquema Electrónico para la sección de USB y de alimentación. Esquema Electrónico para la sección de los registros de desplazamiento.

Vilariño Valle, Marta


9

8

7

6

5

4

3

2

1

3V3

A

1V8

22pF 0805

C2

22pF 0805

C1

4 3

100nF 0805

C

C9

100nF 0805

C6

100nF 0805

100nF 0805

100nF 0805

C7

100nF 0805

C10

100nF 0805

10k 1206

100n 0805

C3

R1

PMLL4448 SOD80C

C8

C5

C4

12MHz XTAL

12 MHz

X1

D1

SWITCH SPNO 6MM SWITCH6MM

SW1

B

C

Circuito de RESET

Montar los condensadores cerca de los pines correspondientes

reset manual

1 2

/RESET

3V3

B

K A

0

A

D

D

58 59 50 42 25 18 6

63 17 49

7 51 43 23

57

62 61 P0.0/TxD0/PWM1 P0.1/RxD0/PWM3 P0.2/SCL/CAP0.0 P0.3/SDA/MAT0..0/EINT1 P0.4/SCK0/CAP0.1 P0.5/MISO0/MAT0.1 P0.6/MOSI0/CAP0.2 P0.7/SSEL0/PWM2/EINT2 P0.8/TxD1/PWM4 P0.9/RxD1/PWM6/EINT3 P0.10/RTS1/CAP1.0 P0.11/CTS1/CAP1.1 P0.12/DSR1/MAT1.0 P0.13/DTR1/MAT1.1 P0.14/DCD1/EINT1 P0.15/RI1/EINT2

E

P1.16/TRACEPKT0 P1.17/TRACEPKT1 P1.18/TRACEPKT2 P1.19/TRACEPKT3 P1.20/TRACESYNC P1.21/PIPESTAT0 P1.22/PIPESTAT1 P1.23/PIPESTAT2 P1.24/TRACECLK P1.25/EXTIN0 P1.26/RTCK P1.27/TDO P1.28/TDI P1.29/TCK P1.30/TMS P1.31/TRST

P0.27/AIN0/CAP0.1/MAT0.1 P0.28/AIN1/CAP0.2/MAT0.2 P0.29/AIN2/CAP0.3/MAT0.3 P0.30/AIN3/EINT3/CAP0.0

P0.16/EINT0/MAT0.2/CAP0.2 P0.17/CAP1.2/SCK1/MAT1.2 P0.18/CAP1.3/MISO1 P0.19/MAT1.2/MOSI1 P0.20/MAT1.3/SSEL1/EINT3 P0.21/PWM5/CAP1.3 P0.22/CAP0.0/MAT0.0 P0.23 P0.24 P0.25

LPC2114 SQFP64-10X10

VSSA_PLL VSSA VSS VSS VSS VSS VSS

V18A V18 V18

V3A V3 V3 V3

RST

XTAL1 XTAL2

U1

E

F

16 12 8 4 48 44 40 36 32 28 24 64 60 56 52 20

11 13 14 15

46 47 53 54 55 1 2 3 5 9

19 21 22 26 27 29 30 31 33 34 35 37 38 39 41 45

F

CLK

Q4_CH2 Q5_CH2 Q6_CH2 Q7_CH2

Q0_CH2 Q1_CH2 Q2_CH2 Q3_CH2

G

BY:

Marta Vilariño

H

Microcontrolador PATH: Microcontrolador DESIGN TITLE:

J

J

REV:

1

RD2-Canal 2

RD1-Canal 1

RD3-Canal 3

RD4-Canal 4

Q0_CH3 Q1_CH3 Q2_CH3 Q3_CH3 Q4_CH3 Q5_CH3 Q6_CH3 Q7_CH3

FILE NAME:

H

P0.0 - TXD P0.1 - RXD

Q0_CH1 Q1_CH1 Q2_CH1 Q3_CH1 Q4_CH1 Q5_CH1 Q6_CH1 Q7_CH1 BOOTLOADER

CLK_BY_8

Q0_CH4 Q1_CH4 Q2_CH4 Q3_CH4 Q4_CH4 Q5_CH4 Q6_CH4 Q7_CH4

G

of TIME:

1

PAGE:

K

18:42:29

3

29/06/2014

DATE:

K

9

8

7

6

5

4

3

2

1

0

Anexos 149

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


9

8

7

6

5

4

3

2

1

0

6 7 8 9

VCC USBDM USBDP NC GND

1 2 3 4 5

A

B

100nF 0805

C15

FUENTE DE ALIMENTACION

USB-F-TYPE_MINIB USB-F-TYPE-MINIB

GND1 GND1 GND1 GND1

J2

B

3

2

1

DM DP

2

D

C18

C16

22uF/10V TC3216_

100nF 0805

3V3

C11

C13

P0.0 - TXD

P0.1 - RXD

R2

D2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 FT232R SSOP28

TxD DTR# RTS# VCCIO RxD RI# GND NC DSR# DCD# CTS# CBUS4 CBUS2 CBUS3

U6

270R 0805

R3

G

3

OSCO OSCI TEST AGND NC2 CBUS0 CBUS1 GND VCC RESET# GND 3V3OUT USBDM USBDP

28 27 26 25 24 23 22 21 20 19 18 17 16 15

BOOTLOADER

/RESET

C

VI

10uF/16V ELECT-4

E

220nF 0805

RED LED SOD123

F

220 0805

DESIGN TITLE:

G

BY:

Marta Vilariño

PATH:

VO

H

2

100n 0805

C14

10uF/16V ELECT-4

C21

1V8

DM DP

J

H

J

REV:

Microcontrolador Seccion USB y alimentacion

FILE NAME:

10uF/16V ELECT-4

C20

VI

LM1117DT-1.8 SOT223-3 VO

100nF 0805

C12

MMZ2012R301A 0805

L1

F

LM2

10uF/16V ELECT-4

C17

3

4

5

6

E

LM1117DT-3.3 SOT223-3

I/03

VBUS

I/04

D

LM1

USBLC6-2 SOT23-6

I/02

GND

I/O1

USBLC1

C

GND 1

A

GND

Vilariño Valle, Marta 1

1

100nF 0805

C19

of TIME:

2

PAGE:

K

18:42:29

3

29/06/2014

DATE:

K

9

8

7

6

5

4

3

2

1

0

150 Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7


9

8

7

6

5

4

3

2

1

0

B

1 2 3 4 5

A

CONN-H5

J1

B

CH0 CH1 CH2 CH3

Espadines para sonda (4 canales)

A

CH0

C

CH3

CH2

CH1

CLK_BY_8

CLK

C

D

D

10 13

12

11 14

10 13

12

11 14

10 13

12

11 14

10 13

12

11 14

74HC595 SO16

MR OE

ST_CP

SH_CP DS

U5

74HC595 SO16

MR OE

ST_CP

SH_CP DS

U4

74HC595 SO16

MR OE

ST_CP

SH_CP DS

U3

74HC595 SO16

MR OE

ST_CP

SH_CP DS

U2

E

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q7'

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q7'

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q7'

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q7'

E

15 1 2 3 4 5 6 7 9

15 1 2 3 4 5 6 7 9

15 1 2 3 4 5 6 7 9

15 1 2 3 4 5 6 7 9

F

F

Q0_CH4 Q1_CH4 Q2_CH4 Q3_CH4 Q4_CH4 Q5_CH4 Q6_CH4 Q7_CH4

Q0_CH3 Q1_CH3 Q2_CH3 Q3_CH3 Q4_CH3 Q5_CH3 Q6_CH3 Q7_CH3

Q0_CH2 Q1_CH2 Q2_CH2 Q3_CH2 Q4_CH2 Q5_CH2 Q6_CH2 Q7_CH2

Q0_CH1 Q1_CH1 Q2_CH1 Q3_CH1 Q4_CH1 Q5_CH1 Q6_CH1 Q7_CH1

DESIGN TITLE:

G

BY:

Marta Vilariño

PATH:

C23 100nF 1206

C22 100nF 1206

H

H

J

J

REV:

Microcontrolador Registros desplazamiento

FILE NAME:

G

1

100nF 1206

C24

of TIME:

3

PAGE:

K

18:42:29

3

29/06/2014

DATE:

100nF 1206

C25

K

9

8

7

6

5

4

3

2

1

0

Anexos 151

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


152

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


Anexos 153

ANEXO II: Mapeo de Puertos del Diseño Completo

Anexo Tabla - 1 Mapeo de Puertos (I) PIN INTEGRADO 2 3 4 5 6

U1 U1 U1 U1 U1

7

U1

8 9 10 11 12 13 14 15 16

U1 U1 U1 U1 U1 U1 U1 U1 U1

17

U1

18

U1

19

U1

20

U1

21

U1

22

U1

23

U1

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1 U1

41

U1

42

U1

43

U1

44 45 46

U1

47

U1

48

U1

U1

DESCRIPCIÓN

TIPO UNIDAD

Q0_CH2 , bit 0 de la señal del canal 2 Q1_CH2 , bit 1 de la señal del canal 2 Q3_CH3 , bit 3 de la señal del canal 3 Q2_CH2 , bit 2 de la señal del canal 2 VSS, tierra de referencia. V3A, voltaje de alimentación analógica. Condensador de desacoplo 100nF Q2_CH3 , bit 2 de la señal del canal 3 Q3_CH2 , bit 3 de la señal del canal 2

I I I I

I I

Q4_CH2 , bit 4 de la señal del canal 2 Q1_CH3 , bit 1 de la señal del canal 3 Q5_CH2 , bit 5 de la señal del canal 2 Q6_CH2 , bit 6 de la señal del canal 2 Q7_CH2 , bit 7 de la señal del canal 2 Q0_CH3 , bit 0 de la señal del canal 3 V18, tensión de alimentación analógica. Condensador de desacoplo 100nF. VSS, tierra de referencia. P0.0-TXD, Salida de transmisión para la UART0 Q7_CH4 , bit 7 de la señal del canal 4 P0.1-TXD, entrada de receptción para la UART0 V3, voltaje de alimentación. Condensador de desacoplo 100nF Q2_CH4 , bit 2 de la señal del canal 4 VSS, tierra de referencia.

MIN

VALORES TYP MAX

V V V V V

0 0 0 0 0

0

3,3 3,3 3,3 3,3 0

V

2,5

3,3

3,6

V V

0 0

-

I I I I I I

V V V V V V

0 0 0 0 0 0

-

V

-

V

O

CONEXIÓN PIN INTEGRADO 15 1 3 2 -

U3 U3 U4 U3 -

3,3 3,3

2 3

U4 U3

-

3,3 3,3 3,3 3,3 3,3 3,3

4 1 5 6 7 15

U3 U4 U3 U3 U3 U4

1,65

1,8

1,95

-

-

0

0

0

V

0

-

3,3

5

U6

I

V

0

-

3,3

7

U5

I

V

0

-

3,3

1

U6

V

3

3,3

3,6

I

V V

0 0

0

3,3 0

2

U5

Q1_CH4 , bit 1 de la señal del canal 4

I

V

0

-

3,3

1

U5

Q0_CH1 , bit 0 de la señal del canal 1 Q1_CH1 , bit 0 de la señal del canal 1 Q0_CH4 , bit 0 de la señal del canal 4 Q2_CH1 , bit 0 de la señal del canal 1 Q3_CH1 , bit 0 de la señal del canal 1 Q4_CH1 , bit 0 de la señal del canal 1 Q7_CH3 , bit 7 de la señal del canal 3 Q5_CH1 , bit 0 de la señal del canal 1 Q6_CH1 , bit 0 de la señal del canal 1 Q7_CH1 , bit 0 de la señal del canal 1 Q6_CH3 , bit 6 de la señal del canal 3 BOOTLOADER. Necesaria resistencia de 270R para conectar con el FTDI232 VSS, tierra de referencia. V3, voltaje de alimentación. Condensador de desacoplo 100nF Q5_CH3 , bit 5 de la señal del canal 3

I I I I I I I I I I I

V V V V V V V V V V V

0 0 0 0 0 0 0 0 0 0 0

-

3,3 3,3 3,3 3,3 3,3 3,3 3,3 3,3 3,3 3,3 3,3

15 1 15 2 3 4 7 5 6 7 6

U2 U2 U5 U2 U2 U2 U4 U2 U2 U2 U4

I/O

V

0

-

3,3

3

U6

V

0

0

0

V

3

3,3

3,6

I

V

0

-

3,3

5

U4

O

V

0

-

3,3

11

U2, U3, U4, U5

O

V

0

-

3,3

12

U2, U3, U4, U5

I

V

0

-

3,3

4

U4

CLK, reloj registros de desplazamiento. CLK_BY_8, reloj registros de desplazamiento. Q4_CH3 , bit 4 de la señal del canal 3

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


154

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Anexo Tabla - 2 Mapeo de Puertos (II) PIN INTEGRADO 49

U1

50

U1

51

U1

52 53 54 55 56 57 58 59 60 61 62

U1

63

U1

64

U1

1

U6

2

U6

3

U6

4

U6

5

U6

6 7 8 9 10 11 12 13 14 15 16

U6 U6 U6 U6 U6 U6 U6 U6 U6 U6 U6

17

U6

18 19 20 21 22 23 24 25 26 27 28

U6 U6 U6 U6 U6 U6 U6 U6 U6 U6 U6

1

U2

2

U2

3

U2

4

U2

5

U2

6

U2

7

U2

8 9

U2 U2

U1 U1 U1 U1 U1 U1 U1

DESCRIPCIÓN V18, tensión de alimentación analógica. Condensador de desacoplo 100nF. VSS, tierra de referencia. V3, voltaje de alimentación. Condensador de desacoplo 100nF Q6_CH4 , bit 6 de la señal del canal 4

TIPO UNIDAD

I

MIN

VALORES TYP MAX

V

1,65

V

0

0

0

V

3

3,3

3,6

V

0

-

Q5_CH4 , bit 5 de la señal del canal 4 I V 0 /RST, reset I V 0 VSSA_PLL, tierra analógica para el PLL. V 0 VSSA, tierra analógica. V 0 Q4_CH4 , bit 4 de la señal del canal 4 I V 0 XTAL2, cristal de cuarzo externo 12MHz I V 0 XTAL1, cristal de cuarzo externo 12MHz I V 0 V18A, tensión de alimentación analógica. V 1,65 Condensador de desacoplo 100nF. Q3_CH4 , bit 3 de la señal del canal 4 I V 0 P0.1-RXD, Salida de transmisiónd de datos O asíncrona (TXD) /RESET, señal de reseteo del micro I BOOTLOADER. Necesaria resistencia de 270R para conectar con el I/O microcontrolador. VCCIO, alimentación del USB a 5V V 1,8 P0.0-TXD, Salida de transmisión para la O UART0 (RXD) NC GND V NC NC NC NC NC NC NC DP, señal de datos D+ del USB I/O V DM,señal de datos D- del USB I/O V 3V3OUT, provee de la tensión interna del dispositivo de 3,3v. Necesario un O V condensador de desacoplo de 100nF (C14) GND V NC VCC, tensión de alimentación del dispositivo V 3,3 GND V NC NC NC GND, tierra analógica interna para el reloj interno V GND, patilla de TEST que debe estar conectada a tierra para suVfuncionaiento - normal NC NC Q1_CH1 , bit 1 de la señal del canal 1. Salida paralelo. O Q2_CH1 , bit 2 de la señal del canal 1. Salida paralelo. O Q3_CH1 , bit 3 de la señal del canal 1. Salida paralelo. O Q4_CH1 , bit 4 de la señal del canal 1. Salida paralelo. O Q5_CH1 , bit 5 de la señal del canal 1. Salida paralelo. O Q6_CH1 , bit 6 de la señal del canal 1. Salida paralelo. O Q7_CH1 , bit 7 de la señal del canal 1. Salida paralelo. O GND. Ground. V NC. Salida de datos serie. O

Vilariño Valle, Marta

1,8

-

-

3,3

6

U5

0 0 -

3,3 3,3 0 0 3,3 1,8 1,8

5

U5

4 -

U5 -

1,8

1,95

-

-

-

3,3

-

1,95

CONEXIÓN PIN INTEGRADO

5,25

3

U5

19

U1

57

U1

41

U1

-

-

19

U1

0

-

-

-

3,3 3,3

-

2 3

J2 J2

3,3

-

-

-

0

-

-

-

0

5,25 -

-

-

0 0

-

-

-

31

U1

33

U1

34

U1

35

U1

37

U1

38

U1

39

U1

-

-

0

-


Anexos 155

Anexo Tabla - 3 Mapeo de Puertos (III) PIN INTEGRADO 10 11 12 13 14 15 16

U6 U6 U6 U6 U6 U6 U6

17

U6

18 19 20 21 22 23 24 25 26 27 28

U6 U6 U6 U6 U6 U6 U6 U6 U6 U6 U6

1

U2

2

U2

3

U2

4

U2

5

U2

6

U2

7

U2

8 9

U2 U2

10

U2

11

U2

12

U2

13

U2

14

U2

15 16

U2 U2

1

U3

2

U3

3

U3

4

U3

5

U3

6

U3

7

U3

8 9

U3 U3

10

U3

DESCRIPCIÓN

TIPO UNIDAD

MIN

VALORES TYP MAX

NC NC NC NC NC DP, señal de datos D+ del USB I/O V DM,señal de datos D- del USB I/O V 3V3OUT, provee de la tensión interna del dispositivo de 3,3v. Necesario un O V condensador de desacoplo de 100nF (C14) GND V NC VCC, tensión de alimentación del dispositivo V 3,3 GND V NC NC NC GND, tierra analógica interna para el reloj interno V GND, patilla de TEST que debe estar conectada a tierra para suVfuncionaiento - normal NC NC Q1_CH1 , bit 1 de la señal del canal 1. Salida paralelo. O Q2_CH1 , bit 2 de la señal del canal 1. Salida paralelo. O Q3_CH1 , bit 3 de la señal del canal 1. Salida paralelo. O Q4_CH1 , bit 4 de la señal del canal 1. Salida paralelo. O Q5_CH1 , bit 5 de la señal del canal 1. Salida paralelo. O Q6_CH1 , bit 6 de la señal del canal 1. Salida paralelo. O Q7_CH1 , bit 7 de la señal del canal 1. Salida paralelo. O GND. Ground. V NC. Salida de datos serie. O /MR, Master Reset. Conectada a VCC para desactivarla. SHCP. CLK, reloj registros de desplazamiento. I STCP. CLK_BY_8, reloj de almacenamiento de los registros de desplazamiento . I /OE (output enable input) . Conectada a GND para activarla. I CH0. Señal de entrada de datos serie del canal 0. I Q0_CH1 , bit 0 de la señal del canal 1 O VCC. Voltaje de alimentación. Q1_CH2 , bit 1 de la señal del canal 2. Salida paralelo. O Q2_CH2 , bit 2 de la señal del canal 2. Salida paralelo. O Q3_CH2 , bit 3 de la señal del canal 2. Salida paralelo. O Q4_CH2 , bit 4 de la señal del canal 2. Salida paralelo. O Q5_CH2 , bit 5 de la señal del canal 2. Salida paralelo. O Q6_CH2 , bit 6 de la señal del canal 2. Salida paralelo. O Q7_CH2 , bit 7 de la señal del canal 2. Salida paralelo. O GND. Ground. V NC. Salida de datos serie. O /MR, Master Reset. Conectada a VCC para desactivarla. -

CONEXIÓN PIN INTEGRADO

3,3 3,3

-

2 3

J2 J2

3,3

-

-

-

0

-

-

-

0

5,25 -

-

-

0 0

-

-

-

31

U1

33

U1

34

U1

35

U1

37

U1

38

U1

39

U1

-

-

-

-

46

U1

47

U1

-

-

1

J1

30 -

U1 -

3

U1

5

U1

9

U1

11

U1

13

U1

14

U1

15

U1

0

-

0-

-

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


156

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Anexo Tabla - 4 Mapeo de Puertos (IV) PIN INTEGRADO 11

U3

12

U3

13

U3

14

U3

15 16

U3 U3

1

U4

2

U4

3

U4

4

U4

5

U4

6

U4

7

U4

8 9

U4 U4

10

U4

11

U4

12

U4

13

U4

14

U4

15 16

U4 U4

1

U5

2

U5

3

U5

4

U5

5

U5

6

U5

7

U5

8 9

U5 U5

10

U5

11

U5

12

U5

13

U5

14

U5

15 16

U5 U5

DESCRIPCIÓN SHCP. CLK, reloj registros de desplazamiento. STCP. CLK_BY_8, reloj de almacenamiento de los registros de desplazamiento . /OE (output enable input) . Conectada a GND para activarla. CH1. Señal de entrada de datos serie del canal 1. Q0_CH2 , bit 0 de la señal del canal 2 VCC. Voltaje de alimentación. Q1_CH3 , bit 1 de la señal del canal 3. Salida paralelo. Q2_CH3 , bit 2 de la señal del canal 3. Salida paralelo. Q3_CH3 , bit 3 de la señal del canal 3. Salida paralelo. Q4_CH3 , bit 4 de la señal del canal 2. Salida paralelo. Q5_CH3 , bit 5 de la señal del canal 3. Salida paralelo. Q6_CH3 , bit 6 de la señal del canal 3. Salida paralelo. Q7_CH3 , bit 7 de la señal del canal 3. Salida paralelo. GND. Ground. NC. Salida de datos serie. /MR, Master Reset. Conectada a VCC para desactivarla. SHCP. CLK, reloj registros de desplazamiento. STCP. CLK_BY_8, reloj de almacenamiento de los registros de desplazamiento . /OE (output enable input) . Conectada a GND para activarla. CH2. Señal de entrada de datos serie del canal 3. Q0_CH3 , bit 0 de la señal del canal 3 VCC. Voltaje de alimentación. Q1_CH4 , bit 1 de la señal del canal 4. Salida paralelo. Q2_CH4 , bit 2 de la señal del canal 4. Salida paralelo. Q3_CH4 , bit 3 de la señal del canal 4. Salida paralelo. Q4_CH4 , bit 4 de la señal del canal 4. Salida paralelo. Q5_CH4 , bit 5 de la señal del canal 4. Salida paralelo. Q6_CH4 , bit 6 de la señal del canal 4. Salida paralelo. Q7_CH4 , bit 7 de la señal del canal 4. Salida paralelo. GND. Ground. NC. Salida de datos serie. /MR, Master Reset. Conectada a VCC para desactivarla. SHCP. CLK, reloj registros de desplazamiento. STCP. CLK_BY_8, reloj de almacenamiento de los registros de desplazamiento . /OE (output enable input) . Conectada a GND para activarla. CH3. Señal de entrada de datos serie del canal 4. Q0_CH4 , bit 0 de la señal del canal 4 VCC. Voltaje de alimentación.

Vilariño Valle, Marta

TIPO UNIDAD

MIN

VALORES TYP MAX

I

CONEXIÓN PIN INTEGRADO 46

U1

47

U1

I -

I

-

I O O O O O O O O O

V

-

2

U1 -

12

U1

8

U1

4

U1

48

U1

44

U1

40

U1

36

U1

0-

-

I

46

U1

47

U1

I -

I I O O O O O O O O O

V

-

3

J1

16 -

U1 -

28

U1

24

U1

64

U1

60

U1

56

U1

52

U1

20

U1

0-

-

I

46

U1

47

U1

I -

I I O -

3

J1

32 -

U1 -


Farnell Farnell

STMICROELECTRONICS - M74HC595RM13TR - IC, SHIFT REGISTER, 8BIT, SMD

FTDI - FT232RL - IC, USB TO UART, SMD, 28SSOP

Farnell Farnell Farnell Farnell Farnell

TEXAS INSTRUMENTS - LMS8117AMP-3.3/NOPB - IC, V REG, LINEAR, 3.3V, SMD

TEXAS INSTRUMENTS - LM1117MP-1.8/NOPB - IC, V REG, LINEAR, 1.8V, SMD

SWITCH SPNO 6MM

STMICROELECTRONICS - USBLC6-2SC6 - ESD PROTECTION, 3.5PF, 17V, SOT23

XTAL, 12.000MHZ, 18PF, SMD

Otros materiales:

Farnell

TDK - MMZ2012R301A - FERRITE BEAD, 0.15OHM, 600MA, 0805

CONN-H5 MULTICOMP - MC32599 - CONNECTOR, MINI USB B

Electroson Farnell

Farnell

ROHM - SML-210LTT86N - LED, 2X1.2, 660, RED

Otros componentes:

Farnell

NXP - PMLL4448 - DIODE, HIGH SPEED, SOD-80C

Diodos:

Farnell

Farnell Farnell Farnell Farnell Farnell Farnell

Farnell Farnell Farnell

Proveedor

NXP - LPC2114FBD64/01 - MCU, 32BIT, ARM7TDMI-S, 128K, 64LQFP

Circuitos Integrados:

CERAMIC,22pF, 50V,5%, 0805 CERAMIC, 0.1uF, 50V, 0805 CERAMIC, 0.1UF, 16V, 1206 22UF, 16V, RADIAL CAN-SMD 220NF, 50V,0805 ALU ELECT, 10UF, 16V, RADIAL CAN-SMD

Condensadores:

R1:10k, 0.5W,0.1%,1206 R2:220R, 0.5W,0.1%,1206 R3:270R, 0.5W,0.1%,1206

Resistencias:

Descripción

MATERIAL ELECTRÓNICO

1842280

1269406

1555982

1469053

1 1

0,750 € 0,420 €

TOTAL (€): TOTAL IVA (21%)(€):

1 1

1,270 € 0,146 €

1

1

0,085 € 1,000 €

1

1,260 €

1469032

1

0,700 € 1696540 1669724

1 1

4 1

0,173 € 5,330 € 0,033 € 0,290 €

1

2 13 4 1 1 4

1 1 1

9,500 €

0,039 € 0,027 € 0,035 € 0,093 € 0,055 € 0,190 €

0,230 € 0,230 € 0,280 €

Coste Unitario (€) Cantidad

tira espadines

1525567

1097279

1146032

1288450

2115640

2280675 1362552 1759297 2068649 1288261 9696920

1751089 1739004 1751067

Referencia

23,69 € 28,67 €

0,750 € 0,420 €

1,270 € 0,146 €

1,000 €

0,085 €

1,260 €

0,700 €

0,033 € 0,290 €

0,692 € 5,330 €

9,500 €

0,078 € 0,351 € 0,140 € 0,093 € 0,055 € 0,760 €

0,230 € 0,230 € 0,280 €

Coste Total (€)

Anexos 157

ANEXO III: Costes: componentes y prototipado Anexo Tabla - 5 Aprovisionamiento de componentes

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


158

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Anexo Figura. 1 Factura Proveedor de la PCB

Vilari帽o Valle, Marta


NXP - LPC2114FBD64/01 - MCU, 32BIT, ARM7TDMI-S, 128K, 64LQFP STMICROELECTRONICS M74HC595RM13TR - IC, SHIFT REGISTER, 8BIT, SMD FTDI - FT232RL - IC, USB TO UART, SMD, 28SSOP

Circuitos Integrados:

CERAMIC,22pF, 50V,5%, 0805 CERAMIC, 0.1uF, 50V, 0805 CERAMIC, 0.1UF, 16V, 1206 22UF, 16V, RADIAL CAN-SMD 220NF, 50V,0805 ALU ELECT, 10UF, 16V, RADIAL CAN-SMD

Condensadores:

R1:10k, 0.5W,0.1%,1206 R2:220R, 0.5W,0.1%,1206 R3:270R, 0.5W,0.1%,1206

Resistencias:

Descripción

(*) Acotación hecha a fecha: 05/07/2014

7,930 € 0,692 € 5,330 €

0,173 € 5,330 €

4

1

1288450

1146032

Farnell

Farnell

0,158 € 0,364 € 0,144 € 0,097 € 0,057 € 0,276 €

0,230 € 0,230 € 0,240 €

7,930 €

0,079 € 0,028 € 0,036 € 0,097 € 0,057 € 0,069 €

0,230 € 0,230 € 0,240 €

1

2 13 4 1 1 4

1 1 1

2115640

2280675 1362552 1759297 2068649 1288261 9696920

1751089 1739004 1751067

Coste Total (€)

Farnell

Farnell Farnell Farnell Farnell Farnell Farnell

Farnell Farnell Farnell

Coste Proveedor Referencia Cantidad Unitario (€)

1

0,158 € 0,364 € 0,144 € 0,097 € 0,057 € 0,276 €

0,051 € 0,019 € 0,019 € 0,072 € 0,029 € 0,059 €

0,102 € 0,247 € 0,076 € 0,072 € 0,029 € 0,236 €

4,020 € 4,020 € 3,520 € 3,520 €

0,173 € 0,692 € 0,173 € 0,692 €

7,300 € 7,300 € 5,910 € 5,910 €

0,079 € 0,028 € 0,036 € 0,097 € 0,057 € 0,069 €

500

1000

10000

0,048 € 0,247 € 0,076 € 0,053 € 0,029 € 0,236 €

2,310 € 2,310 €

0,173 € 0,692 €

5,200 € 5,200 €

0,024 € 0,019 € 0,019 € 0,053 € 0,029 € 0,059 €

0,197 € 0,197 € 0,139 € 0,139 € 0,199 € 0,199 €

0,038 € 1,040 € 0,032 € 0,040 € 0,018 € 0,216 €

2,150 € 2,150 €

0,173 € 0,692 €

4,680 € 4,680 €

0,019 € 0,080 € 0,008 € 0,040 € 0,018 € 0,054 €

0,030 € 1,040 € 0,028 € 0,029 € 0,017 € 0,204 €

1,720 € 1,720 €

0,173 € 0,692 €

4,210 € 4,210 €

0,015 € 0,080 € 0,007 € 0,029 € 0,017 € 0,051 €

0,197 € 0,197 € 0,180 € 0,180 € 0,117 € 0,117 € 0,085 € 0,085 € 0,190 € 0,190 € 0,170 € 0,170 €

Coste Coste Coste Coste Coste Coste Coste Coste Coste Total Unitario Total Unitario Total Unitario Total Unitario Total (€) (€) (€) (€) (€) (€) (€) (€) (€)

100

UNIDADES

0,230 € 0,230 € 0,207 € 0,207 € 0,230 € 0,230 € 0,188 € 0,188 € 0,230 € 0,230 € 0,210 € 0,210 €

Coste Unitario (€)

10

MATERIAL ELECTRÓNICO

Anexos 159

Anexo Tabla - 6 Cálculo precio unitario componentes en función de las unidades

(I)

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


Vilariño Valle, Marta

TDK - MMZ2012R301A - FERRITE BEAD, 0.15OHM, 600MA, 0805 TEXAS INSTRUMENTS - LMS8117AMP3.3/NOPB - IC, V REG, LINEAR, 3.3V, SMD TEXAS INSTRUMENTS - LM1117MP1.8/NOPB - IC, V REG, LINEAR, 1.8V, SMD SWITCH SPNO 6MM STMICROELECTRONICS - USBLC6-2SC6 ESD PROTECTION, 3.5PF, 17V, SOT23 XTAL, 12.000MHZ, 18PF, SMD CABLE CONA(USB), CONB(MINI-USB): Placa - PC

CONN-H5 MULTICOMP - MC32599 - CONNECTOR, MINI USB B

Otros componentes:

NXP - PMLL4448 - DIODE, HIGH SPEED, SOD-80C ROHM - SML-210LTT86N - LED, 2X1.2, 660, RED

Diodos:

Descripción

(*) Acotación hecha a fecha: 05/07/2014

10

100

UNIDADES 500

1000

10000

0,990 € 0,990 € 0,990 € 0,990 € 11,68 € 14,13 €

0,990 € 0,990 € 13,37 € 16,18 €

1,750 € 1,750 € 1,070 € 1,070 € 15,96 € 19,31 €

1,750 €

21,77 € 26,35 €

1,750 €

1

1651027

Farnell

12,99 € 15,72 €

0,168 € 0,168 € 0,158 € 0,158 € 0,238 € 0,238 € 0,370 € 0,370 € 0,260 € 0,260 € 0,440 €

0,440 €

1

1842280

Farnell

20,15 € 24,38 €

0,316 € 0,316 € 0,236 € 0,236 € 0,393 € 0,393 € 0,632 € 0,632 € 0,431 € 0,431 €

TOTAL (€): TOTAL IVA (21%) (€):

0,072 € 0,072 € 0,043 € 0,043 € 0,074 € 0,074 € 0,146 € 0,146 € 0,111 € 0,111 €

0,718 €

0,718 €

1

1269406

Farnell

0,146 €

0,146 €

1

1555982

Farnell

0,420 € 0,420 € 0,312 € 0,312 € 0,490 € 0,490 € 0,870 € 0,870 € 0,530 € 0,530 €

1,310 €

1,310 €

1

1469053

Farnell

0,348 € 0,348 € 0,339 € 0,339 € 0,434 € 0,434 €

0,023 € 0,023 €

0,360 € 0,360 €

0,676 € 0,676 € 0,590 € 0,590 €

0,400 € 0,400 €

0,990 €

0,990 €

1

1469032

Farnell

0,095 € 0,095 €

0,017 € 0,017 €

0,700 € 0,700 € 0,700 € 0,700 €

0,117 € 0,117 €

0,023 € 0,023 €

0,024 € 0,024 €

0,440 € 0,440 €

0,700 € 0,700 €

0,129 € 0,129 €

0,025 € 0,025 €

0,031 € 0,031 €

0,850 € 0,850 € 0,520 € 0,520 €

0,700 € 0,700 € 0,700 € 0,700 €

0,231 € 0,231 € 0,182 € 0,182 €

0,033 € 0,033 € 0,029 € 0,029 €

0,089 € 0,089 € 0,049 € 0,049 €

0,089 €

0,089 €

1

1,290 €

1,290 €

1

1669724

1696540

Farnell

Farnell

0,700 €

0,700 €

1

0,310 €

0,310 €

1

1525567

Farnell

Electroson tira espadines

0,033 €

0,033 €

1

1097279

Farnell

Coste Coste Coste Coste Coste Coste Coste Coste Coste Coste Coste Coste Proveedor Referencia Cantidad Unitario Total (€) Unitario Total Unitario Total Unitario Total Unitario Total Unitario Total

1

MATERIAL ELECTRÓNICO

160 Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7 Anexo Tabla - 7 Cálculo precio unitario componentes en función de las unidades (II)


Anexos 161

ANEXO IV: Mecanizado de la caja Medidas de la caja diseñada: LARGO x ANCHO x ALTO = 56x65x14 mm

Anexo Figura. 2 Mecanizado de la caja para la PCB - vista isométrica

Anexo Figura. 3 Mecanizado de la caja para PCB - vista isométrica sin tapa superior

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


162

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Anexo Figura. 4 Mecanizado de la caja para PCB - vista superior

Anexo Figura. 5 Mecanizado de la caja para PCB - vista superior sin tapa

Vilari帽o Valle, Marta


Anexos 163

Anexo Figura. 6 Mecanizado de la caja para PCB - vista inferior

Anexo Figura. 7 Mecanizado de la caja para PCB - vista atrás

Anexo Figura. 8 Mecanizado de la caja para PCB - vista frontal

Anexo Figura. 9 Mecanizado de la caja para PCB – Vistas izquierda y derecha

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


164

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


Anexos 165

ANEXO V: Creación de un proyecto en VSMStudio Para crear un proyecto en VSMStudio y poder simular el código en Proteus lo que se debe hacer en primer lugar es abrir el entorno de trabajo VSMStudio y seleccionar el menú File y a continuación New Project. Aparecerá una ventana como la que se muestra en la Anexo Figura. 10 y pulsando Design File podremos seleccionar el fichero de “.dsn” que vamos a emplear para la simulación del código. Como se aprecia en la misma figura, se ha creado el listado de archivos necesarios que compondrán el proyecto.

Anexo Figura. 10 Crear proyecto en VSMStudio

Al pulsar el botón Next aparecen las opciones de elección de la familia y modelo del dispositivo y la frecuencia de funcionamiento del cristal externo (ver Anexo Figura. 11). Una vez elegidas las propiedades del proyecto y tras pulsar el botón OK, se selecciona un nombre para el proyecto, por ejemplo, “analizador_micro.vsmp”, y el directorio donde va a alojarse. El fichero “main.c” que se crea consta de una función main con una única línea para visualizar en el terminal un mensaje.

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


166

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Anexo Figura. 11 Propiedades de un proyecto en VSMStudio

Vilari帽o Valle, Marta


Anexos 167

ANEXO VI: Configuraci贸n de los registros Pin Connect Block: PINSEL0 y PINSEL1

Anexo Figura. 12 Configuraci贸n registros PINSELx

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


168

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Pin Connect Block: GPIO

Anexo Figura. 13 Configuración IODIRx

Vilariño Valle, Marta


Anexos 169

ANEXO VII: Código Fuente del Microcontrolador “main.c” /*-------------------------------------------------------------------------------Proyecto: micro.vsmp Archivo: main.c Descripcion: Programa principal de la aplicacion de funcionamiento de la placa Analizador Lógico Digtal. Incorpora configuracion de periféricos, interrupciones, funciones de envío y recepción de tramas de datos, checksum de datos, máquina de estados. Otros archivos necesarios:crt.S,lpc2114.h,linker_flash.ld,makefile Autor: Marta Vilariño Valle (martaviva@gmail.com) Revisión: v1.0 (2014-07) ---------------------------------------------------------------------------------*/ // Header files #include "lpc2114.h" #include <stdio.h> #include <stdlib.h> #include <string.h> /* PLL */ #define FOSC 12000000 #define M 5 #define MSEL M-1 M*FOSC. MSEL = M-1 #define CCLK (FOSC*M) #define PCKDIV 1 #define PCLK (CCLK/PCKDIV) //MACROS: #define BIT(n) #define BIT_SET(y,mask) #define BIT_CLEAR(y,mask) #define BIT_FLIP(y,mask)

// Crystal frequency // PLL multiplier . Realmente este el valor M--> CCLK = // CPU clock // APB divider // Peripheral clock . PCLK=CCLK=60000000 (1 << (n)) (y |= (mask)) (y &= ~(mask)) //~(a)= complemento a 1 de a (y ^= (mask))

// delays #define _delay_us(n) _delay_loop(CCLK/4000000*n-1) #define _delay_ms(n) _delay_loop(CCLK/4000*n-1) //reset software #define _reset() asm volatile ("b Reset_Code\n"); // =================================================================== //registro U0LSR:sólo lectura #define U0LSR_DR (U0LSR&(1<<0)) #define U0LSR_OE (U0LSR&(1<<1)) #define U0LSR_PE (U0LSR&(1<<2)) #define U0LSR_FE (U0LSR&(1<<3)) #define U0LSR_BI (U0LSR&(1<<4)) #define U0LSR_THR_E (U0LSR&(1<<5)) #define U0LSR_TX_E (U0LSR&(1<<6)) #define U0LSR_RX_ERROR (U0LSR&(1<<7)) //registro U0IER: Registro de habilitación de interrupción por la UART0 #define U0IER_RBR (U0IER&(1<<0)) //bit 0 #define U0IER_THRE (U0IER&(1<<1)) //bit 1 #define U0IER_RX_LINE_STATUS (U0IER&(1<<2)) //bit 2 #define U0IER_ABTOIntEn (U0IER&(1<<8)) //bit 8 #define U0IER_ABEOIntEn (U0IER&(1<<9)) //bit 9 //---------------------------------------------------------------------/* BUFFER CIRCULAR */ #define buffer_elements 500//1843//maximo valor para 16Kb-->4000 ; para 14Kb-->3500 #define MAX_LONG_MENSAJE 100 //Tamaño máximo de un mensaje de comandos

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


170

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

//DISPARO: #define T_X #define T_0 #define T_1 #define T_UP #define T_DOWN

0 1 2 3

//COMANDOS: #define STOP 1 //#define RE_ON #define RE_OFF 3 #define WHO #define CAP //#define CONFIG //#define DEBUG

//no disparo //disparo por nivel bajo //disparo por nivel alto //disparo por flanco de subida 4 //disparo por flanco de bajada //PARAR|PAUSA . Parámetros: 0 2 //REANUDA. Parámetros: 0 //DESCONECTA. Parámetros: 0 4 //CONECTA. Parámetros: 0 5 //CAPTURA. Parametros: N 6 //CONFIGURA. Parámetros: M 7 //DEBUG PARA PRUEBAS

#define MAX_PARAMS #define MAX_DEBUG_PARAMS #define FLAG_INI #define FLAG_FIN #define ESC

'$' '#' 0x21

6 2

//simbolo !

/***********************************************/ /* VARIABLES GLOBALES auxiliares */ /***********************************************/ int modo=1; //si 1: modo continuo , si 0: modo single int frec=1; //almacena valores de 0 a 21, desde 2Mhz(0,5us) hasta 0.2Hz(5seg) //segun el valor de frec iremos al elementos base_de_tiempos[frec] //para establecer el periodo T, es decir, T=base_de_tiempos[frec] int disp1=0; //almacena el valor de disparo seleccionado para la señal 1->trigger[0]=disp1; int disp2=0; //inicialmente el valor 0 indica todos los canales sin disparo. int disp3=0; int disp4=0; //----------------------------------------------------------int T=1; //variable global que establece el valor del Tiempo de muestreo (valor restricitivo=2Mhz)

más

int trigger[4] = { T_X, T_X, T_X, T_X }; //modo de disparo elegido para cada canal int bit_anterior[4] = {0,0,0,0}; //almacena el bit anterior de cada canal : bit_anterior[0] para el canal 0,..etc int base_de_tiempos[] = {1, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000, 5000000}; volatile int captura = 0; //inicializo la variable captura a 0-->no capturo nada volatile int leido =1; //inicializo la variable leido =0 -->no se ha leído el buffer aún volatile int contador=0; volatile int clk8_toggle=0; // valdrá 0 o 1 en función si toca o no cambiar el estado de la señal clk_by_8 volatile int num_interrupciones = 8; volatile int stop=0; //stop=0:boton stop no pulsado; stop=1:boton stop pulsado int BUFFER[buffer_elements]; //declaración del buffer circular int wr_idx=0; //inicialización a la variable de escritura en buffer. El valor que tiene es el de la primera posición a escribir int rd_idx=0; //inicialización de la variable de lectura y extracción en buffer. El valor que tiene es el del primer elemento a ser leído. int buffer_lleno = 0; //1:buffer lleno (wr_idx=rd_idx) y 0:buffer vacío (wr_idx != rd_idx) //recepción y envío de tramas:

Vilariño Valle, Marta


Anexos 171

char mensaje[MAX_LONG_MENSAJE]; //donde vamos a almacenar el comando recibido char mensaje2[MAX_LONG_MENSAJE];//guardo el mensaje recibido "mensaje" en mensaje2 para no perder datos que puedan seguir llegándome int longitud_mensaje=0; //guardo la longitud del mensaje recibido int crc_mensaje_int=0; //guardo el CRC del mensaje recibido int crc_ok=0; //si 1:interpreto el mensaje; volatile int caso_comando=0; int mensaje_recibido=0; // se pone a 1 si se ha recibido un nuevo comando int estado = 0; //tres posibles estados : 0, 1 y 2. Por defecto, estado 0 fuera de trama. // Function prototypes: void _delay_loop(unsigned int); char UART0_getch(); void UART0_putch(char c); void _U0putch_bs(char c); void extraer_parametros2( char *mensaje, int * params); void RecibeTrama(char *mensaje); int leer_puertos(); int trigger_active( int dato ); void EnviarDebug_int(int n); void EnviarDebug(char *s); //--------------------------------------------------------------------------------void irq_tc0 (void) __attribute__ ((interrupt("IRQ"))); void irq_uart0 (void) __attribute__ ((interrupt("IRQ"))); //--------------------------------------------------------------------------------void irq_uart0(void) { char recibido; static int i=0; recibido = UART0_getch(); switch (estado) { case 0: //fuera de la trama if (recibido == FLAG_INI)//inicio de comando enviado: $ { i = 0; estado = 1; mensaje_recibido=0; } break; case 1: // Recibo el dato. if(recibido==ESC) { estado = 2; break; }; if(recibido==FLAG_FIN) //fin de comando enviado { estado = 0; mensaje[i]= '\0'; strncpy(mensaje2,mensaje,i); i = 0; //inicializamos i para la siguiente recepción del mensaje mensaje_recibido = 1; break; }; mensaje[i++] = recibido; //si caracter válido lo meto aqui directamente en el mensaje // mensaje [i++] --> primero accedo a i y luego incremento i. break; case 2: // Decodificando dato if(recibido==ESC) {mensaje[i++] = ESC; estado = 1; break;}; if(recibido==FLAG_INI) {mensaje[i++] = FLAG_INI; estado = 1; break;}; if(recibido==FLAG_FIN) {mensaje[i++] = FLAG_FIN; estado = 1; break;}; estado = 0; break; }//switch VICVectAddr=0;

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


172

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

} //--------------------------------------------------------------------------------void irq_tc0(void) { static int dato; num_interrupciones--; //cuando se alcance el valor 8 entonces tengo que cambiar "toggle" el clk_by_8 , es decir, poner a uno o a cero el pin P0.5 if(num_interrupciones==0) //estamos en 4T y la señal CLK_by_8 debe cambiar { //rutina del PRODUCTOR: es decir, almaceno una lectura (32bit) en el buffer circular. // si captura == 0 no tomo muestras. Si captura == 1 leo los puertos y almaceno en buffer if( clk8_toggle == 1) { clk8_toggle = 0; //cambio el estado de la señal clk_by_8 IOSET0 = 1<<5; // Pone P0.5 a '1'. // como mi señal clk_by_8 sube entonces es cuando tomo los datos del puerto sólo si estoy en modo captura (captura =1) dato = leer_puertos(); switch(captura) //sólo almaceno en buffer si condición de disparo { case 0: // No captura break; case 1: // Captura incondicional captura_incondicional: BUFFER[wr_idx] = dato; //en la posición wr_idx almaceno la nueva muestra_4_canales wr_idx = (wr_idx + 1)%buffer_elements; //aumento una posicion de memoria if (wr_idx == rd_idx) // Buffer lleno { captura=0; //parar captura buffer_lleno = 1; leido = 0; } else { buffer_lleno = 0; } break; case 2: // Captura condicional:mirar el disparo if(trigger_active(dato)) { captura = 1; goto captura_incondicional; } break; } } else { clk8_toggle = 1;//cambio el estado de la señal clk_by_8 IOCLR0 = 1<<5; // Pone P0.5 a '0'. } num_interrupciones=8; } T0IR=(1<<2); // Reset MR2 interrupt VICVectAddr=-1; } //--------------------------------------------------------------------------------void config_TIMER0() { T0TCR = 0x02; // Reseteo del timer //T0PR = ((T/2)*PCLK)-1; // Prescaler a 0 para no modificar la frecuencia T0PR=0; // con PR=0 el TC se incrementara con cada pulso de PCLK (reloj de perifericos) T0EMR = 0x00000304; //T0EMR: Selecciona la

Vilariño Valle, Marta


Anexos 173

acción a la salida de las patillas (Match1 y Match2), nada, a 0, a 1 o toggle //seleccionamos MAT1 (EM1, bit 1 EMR reg) y MAT2 (EM2 bit 2 EMR reg) //T0EMR = 0000 0011 0000 0110 = 0 x 0 3 0 6 //T0EMR<1> = 1:selecciona EM1(Match1) que controla CLK_by_8 (MR1=TC provocara interrupcion) //T0EMR<2> = 1:selecciona EM2(Match2) que controla CLK (MR2=TC provocara un toggle, es decir mi señal cambia de estado cada T/2). //T0EMR<9:8> = 11 : selecciona la función del Match2-->TOGGLE, cambia estado anterior, en MR2 para obtener CLK. //T0EMR<6:7> = 11 : selecciona la función del Match1-->TOGGLE, cambia estado anterior, en MR2 para obtener CLK_by_8. T0MCR = 0x000000C0; //T0MCR: Selecciona las acciones que ocurren cuando TC=MRx : interrupción, reset en TC o nada. //Cuando salta el TIMER0. //TOMCR = 0000 0000 1100 0000 = 0 x 0 0 C 0 //bits TOMCR (7)(6) //TOMCR<6> = 1: si TC=MR2 --> Interrupcion----> CLK se interrumpe cada T/2 //TOMCR<7> = 1: si TC=MR2 --> reset TC (TC=0) ----> para generar siguiente mitad de la sñal Clk if (frec==0) T0MR2 = (1*1e-6*PCLK)/4; else T0MR2 = (T*1e-6*PCLK)/2; //T0MR2 = 30;//MARTA: NO ADMITE 15 ES DECIR 0.5US. dECIRSELO AL TUTR

//TOMR2:controla la acción que se realiza cuando TC=MR2. //yo quiero que cada T/2 la señal CLK cambie de valor, siendo T el período entre dos flancos de subida // ^----^-----^-----// | | | | | // | | | | | // ----------// <T/2-> CLK cambia cada T/2 (toggle) de la base de tiempos // <-----T-----> CLK produce un flanco de subida cada T: base de tiempos T0TCR = 0x01; codigo no aparece

//marta: en otro ejemplo donde se funciona el reloj esta linea de // Habilitamos el timer

VICIntEnable |= 1<<4; // Habilitamos la interrupción para el TIMER 0 VICIntSelect &=~(1<<4); //timer0 es irq VICVectCntl1=(4)|(1<<5); //interrupcion timer0( en el canal 4) con prioridad 1 y vectorizada (bit5 =1) VICVectAddr1 = (unsigned long)irq_tc0; // Definimos la interrupción periódica, a la que llamamos tc0, y le asignamos la prioridad 0 } //--------------------------------------------------------------------------------void UART0_Init() { U0LCR = 0x83; // 10000011 Line Control Register .

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


174

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

// U0LCR: Determina el formato de los datos que serán enviados o recibidos. 3 PARITY_ENABLE 0

//U0DLL U0DLL = U0DLM = U0LCR = U0FCR =

// U0LCR --> 7 6 1:0 // DLAB BREAK_CONTROL STOP_BIT_SELECT WORD_LENGTH_SELECT // 1 0 11 //U0LCR = 1000 0011 = 0x83

5:4

2

= 98; 33; 0; 0x03; 0x07;

PARITY_SELECT 00

0

// .. Character length 11 = 8 bits // . Stop bits 0 = 1 bit // . Parity enable 0 = No parity // . Even parity non sense // . Stick parity non sense // . Break control 0 = No break // . DLAB 1 = Access to DLM,DLL // Baud = 5*12000000/(16* 98) = 38400 // Baud = 5*12000000/(16* 33) = 115200 // Same a above, but DLAB = 0 = Normal access to RBR/THR & IER // 00000111 FIFO Control Register // . FIFO enable 1 = TX&RX FIFOs enabled // . RX FIFO Reset 1 = Reset RX FIFO // . TX FIFO Reset 1 = Reset TX FIFO // .. RX interrupt trigger level 00 = 1 byte

//1:habilitar periferico U0IER = 1; //rbr=1 y THRE = 1 , habilitamos la interrupcion por recepción por al uart0 //2:interrup irq o fiq VICIntSelect &=~(1<<6); //UART0 es IRQ meto 0 en canal 6 , es decir, bit 6. Para FIQ, mayor prioridad meter un 1 en bit 6 //3:habilitar interrupcion en el VIC VICIntEnable=(1<<6); // Habilitamos UART0 //4: interrupción vectorizada o no vectorizada y prioridades VICVectCntl0=(6)|(1<<5); //Especificamos que la interrupción con prioridad 0 es la uart0 en el canal 6 y vectorizada porque el bit 5 vale 1 //5: codigo de atención a la interrupción: VICVectAddr0=(unsigned int) irq_uart0; // Vector de UART0. Interrupcion con prioridad 1 porque en el ejemplo del timer_interrupcion ya he puesto la prioridad cero } //--------------------------------------------------------------------------------int convertir_char_to_int(char c) { int numero=0; numero = c - 48; return (numero); } //--------------------------------------------------------------------------------char convertir_int_to_char(int n) {//sólo me escribe un dígito return(char)(((int)'0')+n); } //--------------------------------------------------------------------------------void copiar_mensaje(char *cadorigen, char *caddestino) { int i = 0; while((cadorigen[i]!='\0')&& (i<MAX_LONG_MENSAJE)) { caddestino[i] = cadorigen[i]; i++; } caddestino[i] ='\0'; } //--------------------------------------------------------------------------------void _U0putch_bs(char c) {//transmisión mediante bytestuffing if (c == FLAG_INI) {

Vilariño Valle, Marta


Anexos 175

UART0_putch(ESC); UART0_putch(FLAG_INI); } else if (c == FLAG_FIN) { UART0_putch(ESC); UART0_putch(FLAG_FIN); } else if (c == ESC) { UART0_putch(ESC); UART0_putch(ESC); } else UART0_putch(c); } //--------------------------------------------------------------------------------unsigned char CRC8_caracter(unsigned char crc, unsigned char datum, char polinomio) //checksum {//calcula el crc teniendo en cuenta el crc anterior y el caracter actual int j; for(j=0;j<8;j++) { if(((crc^datum)&0x01)==0) crc >>=1;//^: XOR binario else { crc ^= polinomio; //^=: XOR binario con asignación crc >>= 1; crc |= 0x80; } datum >>=1; } return crc; } //--------------------------------------------------------------------------------void EnviarBuffer() {//envío de trama de datos mediante bytestuffing: $ |B | datos_del_buffer | CRC | # char crc=0; unsigned char d; UART0_putch(FLAG_INI); //$ _U0putch_bs('B'); do { d = BUFFER[rd_idx]>>24; _U0putch_bs(d); crc = CRC8_caracter( crc, d, 0x18 ); d = BUFFER[rd_idx]>>16; _U0putch_bs(d); crc = CRC8_caracter( crc, d, 0x18 ); d = BUFFER[rd_idx]>>8; _U0putch_bs(d); crc = CRC8_caracter( crc, d, 0x18 ); d = BUFFER[rd_idx]; _U0putch_bs(d); crc = CRC8_caracter( crc, d, 0x18 ); rd_idx = (rd_idx + 1)%buffer_elements; //incremento la posición de memoria para el siguiente elemento a leer } while(wr_idx!=rd_idx); //mientras el buffer no esté lleno _U0putch_bs(crc); UART0_putch(FLAG_FIN); //# } //--------------------------------------------------------------------------------void EnviarDebug(char *s) {//envío de trama de datos mediante bytestuffing: $ | D | texto_informacion | CRC | $ int crc=0, i; int len = strlen(s);

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


176

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

UART0_putch(FLAG_INI); //$ _U0putch_bs('D'); for(i=0;i<len;i++) { _U0putch_bs(s[i]); crc = CRC8_caracter( crc, s[i], 0x18 ); } _U0putch_bs(crc); UART0_putch(FLAG_FIN); //# } //--------------------------------------------------------------------------------void EnviarDebug_int(int n) { char v[10]; int i=0, aux=0; while(n!=0) { aux=n%10; //aux tiene el resto de la division : 2548 tendremos el 8 v[i]=convertir_int_to_char(aux); n=n/10; i++; } v[i]=0; EnviarDebug( v ); } // ---------------------------------------------------------------------------------void calcula_crc() { int i; unsigned char crc_aux, crc; longitud_mensaje=strlen(mensaje2); crc_aux = 0; for(i=0; i<=longitud_mensaje;i++) crc_aux = CRC8_caracter( crc_aux, (unsigned char) mensaje2[i], 0x18 ); crc = mensaje2[longitud_mensaje+1]; if(crc != crc_aux) { //EnviarDebug("Bad CRC"); crc_ok=0; EnviarDebug("mensaje2[0]:"); EnviarDebug_int(convertir_char_to_int(mensaje2[0]));//marta mensaje_recibido = 0; } else { //EnviarDebug("CRC OK"); crc_ok=1; } } // ---------------------------------------------------------------------------------void interpreta_mensaje() { int params[MAX_PARAMS];//Pivote para ir apuntando. Empleado en captura (single|contínuo, Fs, Ns, At, T, disparo). //Interpretar mensaje caso_comando = mensaje2[0]-'0'; switch (caso_comando) { case STOP://1 stop=1; captura=0; //modo=0; buffer_lleno=1; EnviarDebug("PARAR uC"); _reset(); /*

break; ¿?

Vilariño Valle, Marta


Anexos 177

case RE_ON://2 EnviarDebug("Comando REANUDAR"); captura=1; break; */ case RE_OFF://3 EnviarDebug("Comando DESCONECTAR"); /*leido=1; buffer_lleno=1; estado=0; wr_idx=0;rd_idx=0; captura=0;*/ _reset(); break; case WHO://4 leido=1; buffer_lleno=1; estado=0; wr_idx=0;rd_idx=0; captura=0; EnviarDebug("Analizador Logico CONECTADO"); break; case CAP://5 EnviarDebug("Comando CAPTURAR"); stop = 0; //CAPTURAR implica leer y transmitir los siguientes datos: single|contínuo, Fs(frecuencia de muestreo), Ns (número de muestras), At (período), disparo) //formato: CAP[S|C,Fs,Ns,,T,At,D]--->orden_recibida [0 1 2 3 4 5] extraer_parametros2(mensaje2, params); //en params se devuelven los datos del comando modo = params[0]; //si modo=0->single (llena el buffer una vez lo envia y lo pinta). Si modo=1->contínuo(llena el buffer y lo envia,llena el bufer y lo envia y asi sucesivament) frec = params [1]; disp1 = params [2]; disp2 = params [3]; disp3 = params [4]; disp4 = params [5]; trigger[0] = disp1; trigger[1] = disp2; trigger[2] = disp3; trigger[3] = disp4; T = base_de_tiempos[frec]; config_TIMER0(); //reconfigurar timer captura=2; break; default: EnviarDebug("Comando no reconocido"); break; } mensaje_recibido=0; } //--------------------------------------------------------------------------------void extraer_parametros2( char *mensaje, int * params) {//devuelve un entero int i=0; int num_param=0; int prim=1; //detecta el primer carácter cuando por ejemplo ponemos un parámetro como 200 o 24 etc, es decir, cuando detecta el 2 //Inicializamos array de parámetros a -1 for(i=0;i<MAX_PARAMS;i++) params[i]=-1; //Recorremos el mensaje hasta encontrar '[' i=0; while (mensaje[i]!='[') {i++;} i++;

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


178

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

//Procesamos los parámetros while (mensaje[i]!=']' && num_param<=MAX_PARAMS) { if(mensaje[i]==','){ i++; num_param++; prim=1; } if(mensaje[i]!=','){ //Detección de parámetro vacío if(prim) params[num_param]=0; //Si es el primer carácter del parámetro inicializamos params[num_param] a 0 para hacer el calculo bien. params[num_param]=params[num_param]*10 + convertir_char_to_int(mensaje[i]); prim=0; } else{//detecta si el parámetro está vacío, es decir mandar dos comas ",," num_param++; prim=1; } i++; } } //--------------------------------------------------------------------------------int leer_puertos() { int v_puerto0; //de momento para las pruebas pongo un entero. Luego cuando implemente el buffer circular usaré vectores. int v_puerto1; //v_puertox: almacena el valor del PORT 0 y PORT 1 char char char char

sx1; sx2; sx3; sx4;

//señal //señal //señal //señal

v_puerto0 = IOPIN0; v_puerto1 = IOPIN1;

canal canal canal canal

1-REgistro desplazamiento RD1 2-Registro desplazamiento RD2 3- Registro de desplazamiento RD3 4- REgistro de desplazamiento RD4

//almacenamos en otras variables el valor del port 0 y port 1

sx1 = (char)((v_puerto0&0x00003FC0)>>6); sx2 = (char)(((v_puerto0&0x7BC00000)>>22)|(((v_puerto0&0x7BC00000)>>27)<<4)); sx3 = (char)((v_puerto1&(0x00FF0000))>>16); sx4 = (char)((v_puerto1&(0xFF000000))>>24); return (sx4<<24) |( sx3<<16) | (sx2<<8) | sx1 ; } //--------------------------------------------------------------------------------int trigger_active( int dato ) {//selección del disparo de cada canal static int ch0_ok, ch1_ok, ch2_ok, ch3_ok; static int ch0, ch1, ch2, ch3; int i; ch0 = dato &0xFF; ch1 = (dato>> 8)&0xFF; ch2 = (dato>>16)&0xFF; ch3 = (dato>>24)&0xFF; for(i=0;i<8;i++) { ch0_ok = ch1_ok = ch2_ok = ch3_ok = 0; // Compruebo disparo canal 0 switch(trigger[0]) { case T_X: ch0_ok = 1; break; case T_0: ch0_ok = ((ch0 & 0x80)==0)? 1:0; break; case T_1: ch0_ok = ((ch0 & 0x80)!=0)? 1:0; break; case T_UP: ch0_ok = ( ((ch0 & 0x80)!=0)? 1:0) & ((bit_anterior[0]==0)?1:0);

Vilariño Valle, Marta


Anexos 179

break; case T_DOWN: ch0_ok = ( ((ch0 & 0x80)==0)? 1:0) break; } bit_anterior[0] = ch0 & 0x80; ch0 = ch0 << 1; // Compruebo disparo canal 1 switch(trigger[1]) { case T_X: ch1_ok = 1; break; case T_0: ch1_ok = ((ch1 & 0x80)!=0)? 1:0; break; case T_1: ch1_ok = ((ch1 & 0x80)==1)? 1:0; break; case T_UP: ch1_ok = ( ((ch1 & 0x80)==1)? 1:0) break; case T_DOWN: ch1_ok = ( ((ch1 & 0x80)==0)? 1:0) break; } bit_anterior[1] = ch1 & 0x80; ch1 = ch1 << 1; // Compruebo disparo canal 2 switch(trigger[2]) { case T_X: ch2_ok = 1; break; case T_0: ch2_ok = ((ch2 & 0x80)==0)? 1:0; break; case T_1: ch2_ok = ((ch2 & 0x80)!=0)? 1:0; break; case T_UP: ch2_ok = ( ((ch2 & 0x80)==1)? 1:0) break; case T_DOWN: ch2_ok = ( ((ch2 & 0x80)==0)? 1:0) break; } bit_anterior[2] = ch2 & 0x80; ch2 = ch2 << 1; // Compruebo disparo canal 3 switch(trigger[3]) { case T_X: ch3_ok = 1; break; case T_0: ch3_ok = ((ch3 & 0x80)==0)? 1:0; break; case T_1: ch3_ok = ((ch3 & 0x80)!=0)? 1:0; break; case T_UP: ch3_ok = ( ((ch3 & 0x80)==1)? 1:0) break; case T_DOWN: ch3_ok = ( ((ch3 & 0x80)==0)? 1:0) break; } bit_anterior[3] = ch3 & 0x80; ch3 = ch3 << 1;

& ((bit_anterior[0]!=0)?1:0);

& ((bit_anterior[1]==0)?1:0); & ((bit_anterior[1]==1)?1:0);

& ((bit_anterior[2]==0)?1:0); & ((bit_anterior[2]==1)?1:0);

& ((bit_anterior[3]==0)?1:0); & ((bit_anterior[3]==1)?1:0);

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


180

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

// Se cumple la condición ? if ( ch0_ok & ch1_ok & ch2_ok & ch3_ok ) return 1; } // End of for return 0; } //--------------------------------------------------------------------------------void UART0_putch(char c) //escribir un caracter en la uart0 { while(!(U0LSR_THR_E)); // mientras que U0LSR.THRE == 0 U0THR = c; } //--------------------------------------------------------------------------------char UART0_getch() //leer un caracter de la uart0 { while(!(U0LSR_DR)); // mientras que U0LSR.DR == 0 return U0RBR; } //--------------------------------------------------------------------------------///////////////////////////////// The actual MAIN /////////////////////////// int main (void) { PINSEL0 = 0x00000005; //CLK_BY_8-----> P0.5-TIMER0 como salida PINSEL1 = 0x00000002; //CLK-----> MAT0.2-TIMER0 como salida //configuramos los pines del puerto 0 como entradas o salidas según corresponda IODIR0 = 0x00018021; IODIR1 = 0x00000000; UART0_Init(); config_TIMER0();

// Configurar TIMER_0 en modo MATCH

// Enable both IRQ interrupts asm volatile ("mrs r0,cpsr\n bic r0,r0,#0x80\n msr cpsr,r0"); //-------------------------------------------------------------------------//transmisión y recepción de tramas e interpretación de comando recibido //-------------------------------------------------------------------------while(1) { //PRODUCTOR -------if(mensaje_recibido == 1) { calcula_crc(); // extraigo longitud y crc del mensaje if(crc_ok==1) { interpreta_mensaje(); estado = 0; mensaje_recibido = 0; } else { //EnviarDebug("Error"); //se ha recibido mal el mensaje _reset(); } } // CONSUMIDOR ------if(buffer_lleno && (!(leido))) { if(modo==0) //modo single { EnviarBuffer(); captura=0; } else //modo contínuo { do {//hacerlo una vez o más lo de enviar el bufer EnviarBuffer(); if(stop==1) captura=0;//si se pulsa el boton stop se deja de llenar el buffer else captura=2;

Vilariño Valle, Marta


Anexos 181

}while(captura!=0); } leido = 1; buffer_lleno=0; wr_idx=0; rd_idx=0;//ponemos al inicio los punteros del bufer }// if(buffer_lleno && (!(leido))) //si se recibe un comando urgente como stop o desconectar tengo que: //stop: seguir recogiendo datos y guardar la última posición extraída del buffer //desconectar: apagar todo y parar de recoger datos }//end_while(1) }//end_main /****************************************************************/

“crt.S” /***************************************************************************************** *********** crt.s STARTUP ASSEMBLY CODE ----------------------Module includes the interrupt vectors and start-up code. Mostly written by Jesus Arias ****************************************************************************************** **********/ /* Stack Sizes */ .set UND_STACK_SIZE, registers) */ .set ABT_STACK_SIZE, registers) .set FIQ_STACK_SIZE, registers) .set IRQ_STACK_SIZE, registers)*/ .set SVC_STACK_SIZE, registers) */ .set USR_STACK_SIZE,

64

/* stack size for "undef" exceptions is 64 bytes (16

64 */ 64 */ 64

/* stack size for "abort" exceptions is 64 bytes (16

64

/* stack size for "SVC" supervisor (SWI) is 64 bytes (16

64

/* stack size for "user/sys" is 64 bytes (16 registers) */

/* stack size for "FIQ" interrupts

is 32 bytes (8

/* stack size for "IRQ" normal interrupts is 64 bytes (16

/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */ .set MODE_USR, 0x10 /* Normal User Mode */ .set MODE_FIQ, 0x11 /* FIQ Processing Fast Interrupts Mode */ .set MODE_IRQ, 0x12 /* IRQ Processing Standard Interrupts Mode */ .set MODE_SVC, 0x13 /* Supervisor Processing Software Interrupts Mode */ .set MODE_ABT, 0x17 /* Abort Processing memory Faults Mode */ .set MODE_UND, 0x1B /* Undefined Processing Undefined Instructions Mode */ .set MODE_SYS, 0x1F /* System Running Priviledged Operating System Tasks Mode */ .set I_BIT, 0x80 /* when I bit is set, IRQ is disabled (program status registers)*/ .set F_BIT, 0x40 /* when F bit is set, FIQ is disabled (program status registers)*/ .text .arm /**********************************************************************/

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


182

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

/*************** Vector Table & related constants **************/ /**********************************************************************/ _vectors:

ldr PC, Reset_Addr ldr PC, Undef_Addr ldr PC, SWI_Addr ldr PC, PAbt_Addr ldr PC, DAbt_Addr nop /* Reserved Vector (changed to Philips ISP checksum) */ ldr PC, [PC,#-0xFF0] /* LPC21xx vectored interrupt (see VIC in users manual) */ ldr PC, FIQ_Addr /*---------------------------------------------------------------------------*/ Reset_Addr: .word Reset_Code Undef_Addr: .word UNDEF_Routine SWI_Addr: .word SWI_Routine PAbt_Addr: .word PABORT_Routine DAbt_Addr: .word DABORT_Routine FIQ_Addr: .word FIQ_Routine .align 6 // skip the rest of the vector block (64 bytes total) /****************************************/ /* Exception handling */ /****************************************/ _U0prthex: @ 32 bits mov r2,#8 ldr r1,=0xE000C000 @ UART0 THR 1: ldrb r3,[r1,#0x14] @ UART0 LSR, wait until THRE is one tst r3,#0x20 beq 1b mov r0,r0, ror #28 @ ...rol #4 and r3,r0,#0x0f cmp r3,#9 @ 0..9 or A..F ? addgt r3,r3,#7 @ offset from '9'+1 to 'A' in the ASCII code add r3,r3,#'0' @ convert to ASCII strb r3,[r1] @ send through UART0 THR subs r2,r2,#1 @ repeat until no more digits pending bne 1b mov pc,lr _U0puts: ldr r1,=0xE000C000 @ UART0 THR 1: ldrb r2,[r1,#0x14] @ UART0 LSR, wait until THRE is one tst r2,#0x20 beq 1b ldrb r2,[r0],#1 @ get char tst r2,#0xff moveq pc,lr @ return if 0 strb r2,[r1] @ send through UART0 THR b 1b FIQtxt: SWItxt: UNDtxt: PABtxt: DABtxt:

.asciz .asciz .asciz .asciz .asciz

"\r\n#--"\r\n#--"\r\n#--"\r\n#--"\r\n#--.align 2

FIQ interrupt" SWI call" UNDEF exception" Prefetch Abort exception" Data Abort exception"

UNDEF_Routine: stmfd stmfd adr b

sp!,{lr} @ LR is the PC before TRAP sp,{r0-r14}^ @ save USER/SYS registers r0,UNDtxt exception

stmfd stmfd adr b

sp!,{lr} @ LR is the PC before TRAP sp,{r0-r14}^ @ save USER/SYS registers r0,SWItxt exception

SWI_Routine:

Vilari帽o Valle, Marta


Anexos 183

PABORT_Routine: stmfd stmfd adr b

sp!,{lr} @ LR is the PC before TRAP sp,{r0-r14}^ @ save USER/SYS registers r0,PABtxt exception

DABORT_Routine: stmfd stmfd adr b

sp!,{lr} @ LR is the PC before TRAP sp,{r0-r14}^ @ save USER/SYS registers r0,DABtxt exception

FIQ_Routine: stmfd stmfd adr

sp!,{lr} @ LR is the PC before TRAP sp,{r0-r14}^ @ save USER/SYS registers r0,FIQtxt

sub bl adr bl mov adr tst bne adr bl mov add bl ldr bl mov bl subs bne mov bl mrs bl mov bl mrs orr adr add ldrb movs movcc bl cmp bne mov bl and adr mov ldrb cmp moveq bleq add subs bne adr bl b

sp,sp,#60 _U0puts r0,regs _U0puts r4,#16 r5,txtr0 r4,#3 3f r0,crlf _U0puts r0,r5 r5,r5,#10 _U0puts r0,[sp],#4 _U0prthex r0,#' ' _U0putch r4,r4,#1 2b r0,r5 _U0puts r0,spsr _U0prthex r0,#' ' _U0putch r7,spsr r6,r7,r7,lsl #20 r5,flags r4,r5,#7 r0,[r5],#1 r6,r6,lsl #1 r0,#'_' _U0putch r5,r4 4b r0,#' ' _U0putch r7,r7,#0x1F r6,modes r5,#7 r0,[r6],#1 r0,r7 r0,r6 _U0puts r6,r6,#4 r5,r5,#1 5b r0,crlf _U0puts _Halt

exception:

2:

3:

4:

5:

@ SP: pointer to registers @ Exception name @ regs msg

@ register name @ add string lenght @ register values

@ SPSR value

@ SPSR FLAGS

@ SPSR mode

@ New line

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


184

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

crlf: .asciz regs: .asciz txtr0: .asciz txtr4: .asciz txtr8: .asciz txtr12: .asciz status: .asciz flags: .ascii modes: .byte

"\r\n" "\r\n User/Sys regs:" "R0 - R3: " "R4 - R7: " "R8 -R11: " "R12-R15: " "\r\nSPSR : " "NZCVIFT" 0x10 .asciz "USR" .byte 0x11 .asciz "FIQ" .byte 0x12 .asciz "IRQ" .byte 0x13 .asciz "SVC" .byte 0x17 .asciz "ABT" .byte 0x1B .asciz "UND" .byte 0x1F .asciz "SYS" .align 2 /* following code has to be word aligned */

/**********************************************************************/ /************************ Reset Handler ************************/ /**********************************************************************/ .global Reset_Code Reset_Code: /* Setup a stack for each mode */ ldr msr mov sub msr mov sub msr mov sub msr mov sub msr mov sub msr mov

r0, =_stack_end CPSR_c, #MODE_UND|I_BIT|F_BIT sp, r0 r0, r0, #UND_STACK_SIZE CPSR_c, #MODE_ABT|I_BIT|F_BIT sp, r0 r0, r0, #ABT_STACK_SIZE CPSR_c, #MODE_FIQ|I_BIT|F_BIT sp, r0 r0, r0, #FIQ_STACK_SIZE CPSR_c, #MODE_IRQ|I_BIT|F_BIT sp, r0 r0, r0, #IRQ_STACK_SIZE CPSR_c, #MODE_SVC|I_BIT|F_BIT sp, r0 r0, r0, #SVC_STACK_SIZE CPSR_c, #MODE_SYS|I_BIT|F_BIT sp, r0

/* Undefined Instruction Mode /* Abort Mode */ /* FIQ Mode */ /* IRQ Mode */ /* Supervisor Mode */ /* System and User Modes */

/**********************************************************/ /* System init */ /* PLL x 5, PCLK = CCLK */ /* CCLK=60.000MHz, PCLK=60.000MHz */ /* UART0 at 38400 bps, 8-bit, 1-stop, no parity, FIFO on */ /**********************************************************/ ldr mov mov mov strb strb strb mov strb

Vilari帽o Valle, Marta

r1,=0xE01FC000 r2,#0xaa r3,#0x55 r0,#0x24 r0,[r1,#0x84] @ PLLCFG r2,[r1,#0x8c] r3,[r1,#0x8c] r0,#1 r0,[r1,#0x80] @ PLLCON

@ PLL x 5

@ PLL on

*/


Anexos 185

strb strb ldrh tst beq mov strb strb strb mov str

1:

mov str mov str

r2,[r1,#0x8c] r3,[r1,#0x8c] r0,[r1,#0x88] @ PLLSTAT r0,#0x400 @ PLOCK on ? 1b r0,#3 @ PLL connected r0,[r1,#0x80] @ PLLCON r2,[r1,#0x8c] r3,[r1,#0x8c] r0,#1 r0,[r1,#0x100] @ APBDIV: PCLK=CCLK/1

r0,#2 r0,[r1] r0,#3 r0,[r1,#4]

@ MAM init @ MAMCR=2 (Fully enabled) @ MAMTIM=3 (3 cycles/flash read)

sub mov str sub mov strb mov

r1,r1,#(0xE01FC000-0xE002C000) @ PINSEL0 r0,#5 @ P0.0, P0.1 as UART r0,[r1] r1,r1,#(0xE002C000-0xE000C000) @ UART0 r0,#0x83 @ r0,[r1,#12] @ LCR=0x83 r0,#98 @ divider for 38400 baud (PCLK=48 MHz

strb mov strb mov strb mov strb

r0,[r1]

xxx58.9824MHz)

1:

2:

/* copy ldr ldr ldr cmp ldrlo strlo blo

@ DLL

r0,#0 r0,[r1,#4] r0,#3 r0,[r1,#12] r0,#7 r0,[r1,#8]

@ DLH @ LCR=3 (8 bit, 1 stop, no parity) @ FCR=7 (FIFOs on)

.data section (Copy from ROM to RAM) */ R1, =_etext R2, =_data R3, =_edata R2, R3 R0, [R1], #4 R0, [R2], #4 1b

/* Clear .bss section (Zero init) mov R0, #0 ldr R1, =_bss_start ldr R2, =_bss_end cmp R1, R2 strlo R0, [R1], #4 blo 2b

*/

/* pass RAM TOP to appropriate var */ sub ldr str

r0,sp, #USR_STACK_SIZE r1, =_ramtop r0, [r1]

/* Enter the C code */ bl _Halt: mov 1:

main

@ should not return, but...

.global _Halt r0,#(16<<20) @ delay to allow for UART flush bl _delay_loop ldr r1,=0xE01FC0C0 @ PCON=2 (power down) mov r0,#2 strb r0,[R1] b 1b

/********************************************************/

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


186

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

/* Active delay loop */ /* 4 Clock Cycles per loop, R0 = number of loops */ /* Total delay (including call & return) = 4*(N+1) */ /********************************************************/ .global _delay_loop _delay_loop: subs r0,r0,#1 bne _delay_loop bx lr /****************************************/ /* print decimal number */ /****************************************/ @ R0: value to print @ R1: number of digits (0 means minimun number possible) @ R2: pad character for left digits ('0' or ' ', typically). @ R2 negative means to print R0 as a signed value .global _prtnum _prtnum:

1: 2:

3:

stmfd mov movs bpl movs rsbmi bicpl mov mov adds adc cmp subge addge subs bne add strb add cmp bne mov movs bicmi bmi cmp beq mov cmp

sp!,{r4,r5,lr} r4,#0 @ digit counter r2,r2 @ check if negative mode 1f r0,r0 @ check value when in negative mode r0,r0,#0 @ change sign if negative r2,r2,#0x80000000 @ do not print dashes on positive values lr,#32 @ R0/=10, R3=remainder r3,#0 r0,r0,r0 r3,r3,r3 r3,#10 r3,r3,#10 r0,r0,#1 lr,lr,#1 2b r3,r3,#'0' @ convert to ASCII r3,[sp,#-1]! @ store digit in the STACK r4,r4,#1 @ increment digit counter r0,#0 @ repeat until number is zero 1b r3,#'-' r2,r2 @ check if negative mode r2,r2,#0x80000000 @ clear the negative mode for next iterations 3b @ print the dash if negative mode r1,#0 dmpstk r3,r2 @ pad character r1,r4 @ keep printing until the specified number of

digits dmpstk: 4: 5:

bhi 3b @ print the digits from the stack ldr r5,=_vputch ldr r5,[r5] @ pointer to putch ldrb r0,[sp],#1 @ get digit from stack adr lr,5f bx r5 @ call to *(_vputch) subs r4,r4,#1 @ repeat until all digits are printed bne 4b ldmfd sp!,{r4,r5,pc} /*********************************/ /* print hexadecimal numbers */ /*********************************/ @ R0: value to print @ R1: number of digits (0 means minimun number possible) @ R2: pad character for left digits ('0' or ' ', typically)

Vilari帽o Valle, Marta


Anexos 187

.global _prthex _prthex: 1:

2:

stmfd mov and mov add cmp addhi strb add cmp bne cmp beq mov cmp bhi b

sp!,{r4,r5,lr} r4,#0 @ digit counter r3,r0,#0xf r0,r0,lsr #4 r3,r3,#'0' @ convert to ASCII r3,#'9' @ adjust for letters (A-F) r3,r3,#7 r3,[sp,#-1]! @ store digit in the STACK r4,r4,#1 @ increment digit counter r0,#0 @ repeat until number is zero 1b r1,#0 dmpstk r3,r2 r1,r4 2b dmpstk

/******************************************/ /* print string (no new line added) */ /******************************************/ @ R0: pointer to string .global _puts _puts: stmfd sp!,{r4,r5,lr} mov r4,r0 ldr r5,=_vputch ldr r5,[r5] @ pointer to putch 1: ldrb r0,[r4],#1 @ get char cmp r0,#0 ldmeqfd sp!,{r4,r5,lr} bxeq lr adr lr,1b bx r5 @ call to (*_vputch)(r0) /******************************************/ /* printf (more or less) */ /******************************************/ @ R0: pointer to format string @ %u %d %x %c %s %% supported. @ example: %05u means unsigned decimal, 5 digits (if possible), pad with zeroes @ R1,R2,R3: parameters (rest of the parameters in the stack) .global _printf _printf: stmfd sp!,{r1-r3} @ put first 3 parameters into the stack, alongside the rest of them 11: stmfd sp!,{r4-r6,lr} mov r4,r0 @ pointer to format string ldr r5,=_vputch ldr r5,[r5] @ pointer to putch add r6,sp,#16 @ pointer to parameters 1: ldrb r0,[r4],#1 @ get char cmp r0,#0 @ end of string? beq 9f cmp r0,#'%' @ parameter printing? beq 25f 3: adr lr,1b @ return to label 1: bx r5 @ call to (*_vputch)(r0) 25: 2:

mov mov ldrb cmp beq cmp moveq beq

r1,#0 @ default digit counter r2,#' ' @ default pad char r0,[r4],#1 @ get char r0,#'%' @ double %: just print it 3b r0,#'0' @ 0 means pad with '0' r2,r0 2b

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


188

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

cmp

r0,#'9'

@ decimal digit means number of digits (9

max)

9:

suble ble mov ldr cmp beq adr cmp beq cmp beq cmp orreq beq cmp beq b ldmfd ldmfd bx

r1,r0,#'0' 2b r3,r0 r0,[r6],#4 r3,#'c' 3b lr,1b r3,#'s' _puts r3,#'u' _prtnum r3,#'d' r2,r2,#0x80000000 _prtnum r3,#'x' _prthex 1b sp!,{r4-r6,lr} sp!,{r1-r3} lr

@ get parameter @ parameter is a character @ return address for all routines @ parameter is a string @ parameter is a unsigned decimal value @ parameter is a signed decimal value @ parameter is a hexadecimal value

/******************************************/ /* gets with line editing /******************************************/ @ R0: pointer to buffer @ R1: buffer size @ returns: # of bytes in buffer .global _gets _gets: stmfd sp!,{r4-r6,lr} mov r4,r0 @ add r5,r4,r1 @ sub r5,r5,#1 @ mov r6,r0 @ 1: ldr r1,=_vgetch @ adr lr,2f ldr pc,[r1] 2: #ifdef CRLF @ unix, windows, hyperterminal cmp r0,#'\r' @ beq 1b cmp r0,#'\n' @ #else @ Proteus ISIS cmp r0,#'\n' @ beq 1b cmp r0,#'\r' @ #endif bne 3f mov r1,#0 @ strb r1,[r4],#1 sub r0,r4,r6 @ sub r0,r0,#1 @ ldmfd sp!,{r4-r6,lr} @ bx lr 3: cmp r0,#127 @ beq 35f cmp r0,#8 bne 4f 35: cmp r4,r6 @ buffer beq 1b sub r4,r4,#1 adr r0,10f @ adr lr,1b @ b _puts 4: cmp r4,r5 @ beq 1b

Vilari帽o Valle, Marta

*/

pointer to buffer compute top pointer space for zero ending base pointer get character

CR: ignore NL: end of editing NL: ignore CR: end of editing terminate string return # bytes do not include zero ending in count backspace

erase only if there is some data in

print erase string _puts returns to label 1: check for buffer full


Anexos 189

strb r0,[r4],#1 ldr r1,=_vputch adr lr,1b ldr r1,[r1] bx r1 .asciz "\b \b" .align 2

10:

@ store byte @ echo @ *_vputch returns to label 1: @ erase string @ not really required, included just

to be sure... /******************************************/ /* UART0 print character routine /******************************************/ .global _U0putch

*/

_U0putch: ldr ldrb tst beq strb bx

1:

r1,=0xE000C000 @ UART0 THR r2,[r1,#0x14] @ UART0 LSR, wait until THRE is one r2,#0x20 1b r0,[r1] lr

/******************************************/ /* UART 0 read character routine /******************************************/ .global _U0getch

*/

_U0getch: 1:

_putch: ldr _getch: ldr

ldr ldrb tst beq ldrb bx

r1,=0xE000C000 @ UART0 THR r0,[r1,#0x14] @ UART0 LSR, wait until THRE is one r0,#1 1b r0,[r1] lr

.global _putch,_getch r3,=_vputch ldr r3,[r3] bx r3 r3,=_vgetch ldr r3,[r3] bx r3

/******************************************/ /* DATA area /******************************************/ .data @ I/O vectors defaulting to UART character routines @ can be changed to any character printing/reading routines @ the user like .global _vputch,_vgetch _vputch: .word _U0putch _vgetch: .word _U0getch /******************************************/ /* BSS area /******************************************/ .bss .global _ramtop,_curtaskp _ramtop: .space 4 @ top of free ram .end

*/

*/

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


190

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

“lpc2114.h” #ifndef lpc2114_h #define lpc2114_h /******************************************************************************* lpc2114.h - Register defs for Philips LPC2114, LPC2124 THE SOFTWARE IS DELIVERED "AS IS" WITHOUT WARRANTY OR CONDITION OF ANY KIND, EITHER EXPRESS, IMPLIED OR STATUTORY. THIS INCLUDES WITHOUT LIMITATION ANY WARRANTY OR CONDITION WITH RESPECT TO MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE, OR AGAINST THE INFRINGEMENTS OF INTELLECTUAL PROPERTY RIGHTS OF OTHERS. This file may be freely used for commercial and non-commercial applications, including being redistributed with any tools. If you find a problem with the file, please report it so that it can be fixed. Created by Sten Larsson (sten_larsson at yahoo com) *******************************************************************************/ #define REG8 (volatile unsigned char*) #define REG16 (volatile unsigned short*) #define REG32 (volatile unsigned int*) /*############################################################################## ## MISC ##############################################################################*/ /* Constants for data to put in IRQ/FIQ Exception Vectors */ #define VECTDATA_IRQ 0xE51FFFF0 /* LDR PC,[PC,#-0xFF0] */ #define VECTDATA_FIQ /* __TODO */ /*############################################################################## ## VECTORED INTERRUPT CONTROLLER ##############################################################################*/ #define #define #define #define #define #define #define #define #define #define #define

VICIRQStatus VICFIQStatus VICRawIntr VICIntSelect VICIntEnable VICIntEnClear VICSoftInt VICSoftIntClear VICProtection VICVectAddr VICDefVectAddr

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xFFFFF000))) (0xFFFFF004))) (0xFFFFF008))) (0xFFFFF00C))) (0xFFFFF010))) (0xFFFFF014))) (0xFFFFF018))) (0xFFFFF01C))) (0xFFFFF020))) (0xFFFFF030))) (0xFFFFF034)))

#define #define #define #define #define #define #define #define #define #define #define #define

VICVectAddr0 VICVectAddr1 VICVectAddr2 VICVectAddr3 VICVectAddr4 VICVectAddr5 VICVectAddr6 VICVectAddr7 VICVectAddr8 VICVectAddr9 VICVectAddr10 VICVectAddr11

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xFFFFF100))) (0xFFFFF104))) (0xFFFFF108))) (0xFFFFF10C))) (0xFFFFF110))) (0xFFFFF114))) (0xFFFFF118))) (0xFFFFF11C))) (0xFFFFF120))) (0xFFFFF124))) (0xFFFFF128))) (0xFFFFF12C)))

Vilariño Valle, Marta


Anexos 191

#define #define #define #define

VICVectAddr12 VICVectAddr13 VICVectAddr14 VICVectAddr15

(*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xFFFFF130))) (0xFFFFF134))) (0xFFFFF138))) (0xFFFFF13C)))

#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

VICVectCntl0 VICVectCntl1 VICVectCntl2 VICVectCntl3 VICVectCntl4 VICVectCntl5 VICVectCntl6 VICVectCntl7 VICVectCntl8 VICVectCntl9 VICVectCntl10 VICVectCntl11 VICVectCntl12 VICVectCntl13 VICVectCntl14 VICVectCntl15

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xFFFFF200))) (0xFFFFF204))) (0xFFFFF208))) (0xFFFFF20C))) (0xFFFFF210))) (0xFFFFF214))) (0xFFFFF218))) (0xFFFFF21C))) (0xFFFFF220))) (0xFFFFF224))) (0xFFFFF228))) (0xFFFFF22C))) (0xFFFFF230))) (0xFFFFF234))) (0xFFFFF238))) (0xFFFFF23C)))

#define #define #define #define #define #define #define #define #define

VICITCR VICITIP1 VICITIP2 VICITOP1 VICITOP2 VICPeriphID0 VICPeriphID1 VICPeriphID2 VICPeriphID3

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xFFFFF300))) (0xFFFFF304))) (0xFFFFF308))) (0xFFFFF30C))) (0xFFFFF310))) (0xFFFFFFE0))) (0xFFFFFFE4))) (0xFFFFFFE8))) (0xFFFFFFEC)))

#define VICIntEnClr #define VICSoftIntClr

VICIntEnClear VICSoftIntClear

/*############################################################################## ## PCB - Pin Connect Block ##############################################################################*/ #define PINSEL0 #define PINSEL1 #define PINSEL2

(*(REG32 (0xE002C000))) (*(REG32 (0xE002C004))) (*(REG32 (0xE002C014)))

/*############################################################################## ## GPIO - General Purpose I/O ##############################################################################*/ #define #define #define #define #define #define #define #define

IOPIN0 IOSET0 IODIR0 IOCLR0 IOPIN1 IOSET1 IODIR1 IOCLR1

(*((volatile (*((volatile (*((volatile (*((volatile (*((volatile (*((volatile (*((volatile (*((volatile

unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned

long long long long long long long long

*) *) *) *) *) *) *) *)

0xE0028000)) 0xE0028004)) 0xE0028008)) 0xE002800C)) 0xE0028010)) 0xE0028014)) 0xE0028018)) 0xE002801C))

/*############################################################################## ## FAST GPIO - General Purpose I/O ##############################################################################*/ /*****PORT 0*/ #define FIODIR0 #define FIOMASK0 #define FIOPIN0 #define FIOSET0 #define FIOCLR0

(*((volatile (*((volatile (*((volatile (*((volatile (*((volatile

unsigned unsigned unsigned unsigned unsigned

long long long long long

*) *) *) *) *)

0x3FFFC000)) 0x3FFFC010)) 0x3FFFC014)) 0x3FFFC018)) 0x3FFFC01C))

/****PORT1*/

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


192

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

#define #define #define #define #define

FIODIR1 FIOMASK1 FIOPIN1 FIOSET1 FIOCLR1

(*((volatile (*((volatile (*((volatile (*((volatile (*((volatile

unsigned unsigned unsigned unsigned unsigned

long long long long long

*) *) *) *) *)

0x3FFFC020)) 0x3FFFC030)) 0x3FFFC034)) 0x3FFFC038)) 0x3FFFC03C))

/*############################################################################## ## UART0 / UART1 ##############################################################################*/ /* ---#define #define #define #define #define #define #define #define #define #define

UART 0 --------------------------------------------- */ U0RBR (*(REG32 (0xE000C000))) U0THR (*(REG32 (0xE000C000))) U0IER (*(REG32 (0xE000C004))) U0IIR (*(REG32 (0xE000C008))) U0FCR (*(REG32 (0xE000C008))) U0LCR (*(REG32 (0xE000C00C))) U0LSR (*(REG32 (0xE000C014))) U0SCR (*(REG32 (0xE000C01C))) U0DLL (*(REG32 (0xE000C000))) U0DLM (*(REG32 (0xE000C004)))

/* ---#define #define #define #define #define #define #define #define #define #define #define #define

UART 1 --------------------------------------------- */ UART1_RBR (*(REG32 (0xE0010000))) UART1_THR (*(REG32 (0xE0010000))) UART1_IER (*(REG32 (0xE0010004))) UART1_IIR (*(REG32 (0xE0010008))) UART1_FCR (*(REG32 (0xE0010008))) UART1_LCR (*(REG32 (0xE001000C))) UART1_LSR (*(REG32 (0xE0010014))) UART1_SCR (*(REG32 (0xE001001C))) UART1_DLL (*(REG32 (0xE0010000))) UART1_DLM (*(REG32 (0xE0010004))) UART1_MCR (*(REG32 (0xE0010010))) UART1_MSR (*(REG32 (0xE0010018)))

/*############################################################################## ## I2C ##############################################################################*/ #define #define #define #define #define #define #define

I2C_I2CONSET I2C_I2STAT I2C_I2DAT I2C_I2ADR I2C_I2SCLH I2C_I2SCLL I2C_I2CONCLR

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE001C000))) (0xE001C004))) (0xE001C008))) (0xE001C00C))) (0xE001C010))) (0xE001C014))) (0xE001C018)))

/*############################################################################## ## SPI - Serial Peripheral Interface ##############################################################################*/ #define #define #define #define #define #define #define #define

SPI_SPCR SPI_SPSR SPI_SPDR SPI_SPCCR SPI_SPTCR SPI_SPTSR SPI_SPTOR SPI_SPINT

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE0020000))) (0xE0020004))) (0xE0020008))) (0xE002000C))) (0xE0020010))) (0xE0020014))) (0xE0020018))) (0xE002001C)))

/* SPI = SPI0 */

#define #define #define #define #define #define #define

SPI0_SPCR SPI0_SPSR SPI0_SPDR SPI0_SPCCR SPI0_SPTCR SPI0_SPTSR SPI0_SPTOR

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE0020000))) (0xE0020004))) (0xE0020008))) (0xE002000C))) (0xE0020010))) (0xE0020014))) (0xE0020018)))

/* SPI = SPI0 */

Vilari帽o Valle, Marta


Anexos 193

#define SPI0_SPINT

(*(REG32 (0xE002001C)))

#define #define #define #define #define #define #define #define

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

SPI1_SPCR SPI1_SPSR SPI1_SPDR SPI1_SPCCR SPI1_SPTCR SPI1_SPTSR SPI1_SPTOR SPI1_SPINT

(0xE0030000))) (0xE0030004))) (0xE0030008))) (0xE003000C))) (0xE0030010))) (0xE0030014))) (0xE0030018))) (0xE003001C)))

/*############################################################################## ## Timer 0 and Timer 1 ##############################################################################*/ /* ---#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

Timer 0 -------------------------------------------- */ T0IR (*((volatile unsigned long *) 0xE0004000)) T0TCR (*((volatile unsigned long *) 0xE0004004)) T0TC (*((volatile unsigned long *) 0xE0004008)) T0PR (*((volatile unsigned long *) 0xE000400C)) T0PC (*((volatile unsigned long *) 0xE0004010)) T0MCR (*((volatile unsigned long *) 0xE0004014)) T0MR0 (*((volatile unsigned long *) 0xE0004018)) T0MR1 (*((volatile unsigned long *) 0xE000401C)) T0MR2 (*((volatile unsigned long *) 0xE0004020)) T0MR3 (*((volatile unsigned long *) 0xE0004024)) T0CCR (*((volatile unsigned long *) 0xE0004028)) T0CR0 (*((volatile unsigned long *) 0xE000402C)) T0CR1 (*((volatile unsigned long *) 0xE0004030)) T0CR2 (*((volatile unsigned long *) 0xE0004034)) T0CR3 (*((volatile unsigned long *) 0xE0004038)) T0EMR (*((volatile unsigned long *) 0xE000403C)) T0CTCR (*((volatile unsigned long *) 0xE0004070))

/* ---#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

Timer 1 -------------------------------------------- */ T1_IR (*(REG32 (0xE0008000))) T1_TCR (*(REG32 (0xE0008004))) T1_TC (*(REG32 (0xE0008008))) T1_PR (*(REG32 (0xE000800C))) T1_PC (*(REG32 (0xE0008010))) T1_MCR (*(REG32 (0xE0008014))) T1_MR0 (*(REG32 (0xE0008018))) T1_MR1 (*(REG32 (0xE000801C))) T1_MR2 (*(REG32 (0xE0008020))) T1_MR3 (*(REG32 (0xE0008024))) T1_CCR (*(REG32 (0xE0008028))) T1_CR0 (*(REG32 (0xE000802C))) T1_CR1 (*(REG32 (0xE0008030))) T1_CR2 (*(REG32 (0xE0008034))) T1_CR3 (*(REG32 (0xE0008038))) T1_EMR (*(REG32 (0xE000803C)))

/*############################################################################## ## PWM ##############################################################################*/ #define #define #define #define #define #define #define #define #define #define #define #define

PWM_IR PWM_TCR PWM_TC PWM_PR PWM_PC PWM_MCR PWM_MR0 PWM_MR1 PWM_MR2 PWM_MR3 PWM_MR4 PWM_MR5

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE0014000))) (0xE0014004))) (0xE0014008))) (0xE001400C))) (0xE0014010))) (0xE0014014))) (0xE0014018))) (0xE001401C))) (0xE0014020))) (0xE0014024))) (0xE0014040))) (0xE0014044)))

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


194

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

#define #define #define #define #define #define #define #define #define

PWM_MR6 PWM_EMR PWM_PCR PWM_LER PWM_CCR PWM_CR0 PWM_CR1 PWM_CR2 PWM_CR3

(*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE0014048))) (0xE001403C))) (0xE001404C))) (0xE0014050))) (0xE0014028))) (0xE001402C))) (0xE0014030))) (0xE0014034))) (0xE0014038)))

/*############################################################################## ## RTC ##############################################################################*/ /* ---#define #define #define #define #define #define #define #define

RTC: Miscellaneous Register Group ------------------ */ RTC_ILR (*(REG32 (0xE0024000))) RTC_CTC (*(REG32 (0xE0024004))) RTC_CCR (*(REG32 (0xE0024008))) RTC_CIIR (*(REG32 (0xE002400C))) RTC_AMR (*(REG32 (0xE0024010))) RTC_CTIME0 (*(REG32 (0xE0024014))) RTC_CTIME1 (*(REG32 (0xE0024018))) RTC_CTIME2 (*(REG32 (0xE002401C)))

/* ---#define #define #define #define #define #define #define #define

RTC: Timer Control Group RTC_SEC (*(REG32 RTC_MIN (*(REG32 RTC_HOUR (*(REG32 RTC_DOM (*(REG32 RTC_DOW (*(REG32 RTC_DOY (*(REG32 RTC_MONTH (*(REG32 RTC_YEAR (*(REG32

--------------------------- */ (0xE0024020))) (0xE0024024))) (0xE0024028))) (0xE002402C))) (0xE0024030))) (0xE0024034))) (0xE0024038))) (0xE002403C)))

/* ---#define #define #define #define #define #define #define #define

RTC: Alarm Control Group RTC_ALSEC (*(REG32 RTC_ALMIN (*(REG32 RTC_ALHOUR (*(REG32 RTC_ALDOM (*(REG32 RTC_ALDOW (*(REG32 RTC_ALDOY (*(REG32 RTC_ALMON (*(REG32 RTC_ALYEAR (*(REG32

--------------------------- */ (0xE0024060))) (0xE0024064))) (0xE0024068))) (0xE002406C))) (0xE0024070))) (0xE0024074))) (0xE0024078))) (0xE002407C)))

/* ---- RTC: Reference Clock Divider Group ----------------- */ #define RTC_PREINT (*(REG32 (0xE0024080))) #define RTC_PREFRAC (*(REG32 (0xE0024084))) /*############################################################################## ## AE - AD Converter ##############################################################################*/ #define AD_ADCR #define AD_ADDR

(*(REG32 (0xE0034000))) (*(REG32 (0xE0034004)))

/*############################################################################## ## WD - Watchdog ##############################################################################*/ #define #define #define #define

WD_WDMOD WD_WDTC WD_WDFEED WD_WDTV

(*(REG32 (*(REG32 (*(REG32 (*(REG32

(0xE0000000))) (0xE0000004))) (0xE0000008))) (0xE000000C)))

/*############################################################################## ## SCB - System Control Block ##############################################################################*/

Vilari帽o Valle, Marta


Anexos 195

#define #define #define #define #define #define #define #define #define #define #define #define #define

SCB_EXTINT SCB_EXTWAKE SCB_EXTMODE SCB_EXTPOLAR SCB_MEMMAP SCB_PLLCON SCB_PLLCFG SCB_PLLSTAT SCB_PLLFEED SCB_PCON SCB_PCONP SCB_VPBDIV SCS

(*(REG32 (0xE01FC140))) (*(REG32 (0xE01FC144))) (*(REG32 (0xE01FC148))) (*(REG32 (0xE01FC14C))) (*(REG32 (0xE01FC040))) (*(REG32 (0xE01FC080))) (*(REG32 (0xE01FC084))) (*(REG32 (0xE01FC088))) (*(REG32 (0xE01FC08C))) (*(REG32 (0xE01FC0C0))) (*(REG32 (0xE01FC0C4))) (*(REG32 (0xE01FC100))) (*(REG32 (0xE01FC1A0)))

/*############################################################################## ## MAM - Memory Accelerator Module ##############################################################################*/ #define MAM_MAMCR #define MAM_MAMTIM #define MAM_MAMMAP

(*(REG32 (0xE01FC000))) (*(REG32 (0xE01FC004))) (*(REG32 (0xE01FC040)))

#endif /* lpc2114_h */

“linker_flash.ld” /* specify the LPC2468 memory areas

*/

MEMORY { /* flash : ORIGIN = 0, LENGTH = 32K FLASH ROM ram : ORIGIN = 0x40000040, LENGTH = 8k-64 free RAM area */ /*para mi lpc2114 tengo una flash de tamaño 128kb y una ram de tamaño 16kB. ¿para qué ponene 8k-64 en el caso del lpc2103? ¿el que escriba eso su implicacion es que en la compilacion del programa tiene que asignar variables desde el origen en 0x400000040 hasta esa misma posicion mas el 8k-64 para evitar errores? es decir, "alguien" utiliza esa memoria como puee ser el bootloader????*/ flash ram

: ORIGIN = 0, LENGTH = 128K : ORIGIN = 0x40000040, LENGTH = 16K-64

} /* define a global symbol _stack_end

*/

_stack_end = 0x40000000+8k; /* now define the output sections

*/

SECTIONS { . = 0; zero */

/* set location counter to address

_startup : { *(.startup)} >flash .text :

/* the startup code goes into FLASH */ /* collect all sections that should

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


196

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

go into FLASH after startup { *(.text) *(.text.startup) *(.text.memcpy) *(.text.memset) *(.vfp11_veneer) *(.v4_bx) *(.iplt) *(.rel.dyn) *(.rel.iplt) *(.rodata) strings, etc.) */ *(.rodata*) strings, etc.) */ *(.glue_7) what these are) */ *(.glue_7t) what these are) */ _etext = .; after the last code byte */ } >flash

*/ /* all .text sections (code) /* YAGARTO screws it up without this ...*/

.data : sections that go into RAM */ { _data = .; start of the .data section */ *(.data) _edata = .; end of the .data section */ } >ram AT >flash LMA copy into FLASH) */ .bss : sections that go into RAM */ { _bss_start = .; start of the .bss section */ *(.bss) } >ram be cleared in the startup code */ . = ALIGN(4); bit boundary */ _bss_end = . ; the .bss section */ } _end = .; end of application RAM */

“makefile” # tools TOOL = #TOOL = BT2 = #BT2 = ISP = CC LD AR

arm-none-eabi arm-linux ../bootloader2114/bt2.exe -c ../bootloader2114/bt2 ../bootloader2114/lpc21isp_148x

= $(TOOL)-gcc = $(TOOL)-ld -v = $(TOOL)-ar

Vilariño Valle, Marta

*/

/* all .rodata sections (constants, /* all .rodata* sections (constants, /* all .glue_7 sections

(no idea

/* all .glue_7t sections (no idea /* define a global symbol _etext just /* put all the above into FLASH */ /* collect all initialized .data /* create a global symbol marking the /* all .data sections */ /* define a global symbol marking the /* put all the above into RAM (but load the /* collect all uninitialized .bss /* define a global symbol marking the /* all .bss sections */ /* put all the above in RAM (it will /* advance location counter to the next 32/* define a global symbol marking the end of /* define a global symbol marking the


Anexos 197

AS CP OD

= $(TOOL)-as = $(TOOL)-objcopy = $(TOOL)-objdump

# select #LNKSC = LNKSC = #LNKSC =

the proper linker script linker_flash.ld linker_ram.ld linker_dram.ld

CFLAGS = -I./ -fno-common DVERSION=$(VCODE) AFLAGS = -ahls -mapcs-32 CPFLAGS = -O ihex ODFLAGS = -x --syms all:

-O2

-g

-mtune=arm7tdmi

-nostartfiles

-static

-

code.bin code.hex $(BT2) -l code.bin

clean: -rm -f crt.lst main.lst crt.o main.o code.elf code.bin code.hex code.bin: code.elf $(CP) -O binary $< $@ code.hex: code.elf $(CP) -O ihex $< $@ code.elf: crt.S main.c linker_ram.ld Makefile $(CC) $(CFLAGS) -Wl,-Tlinker_ram.ld -o $@ -DCRLF crt.S main.c burn:

coderom.hex $(ISP) -control $< /dev/ttyUSB0 115200 14746

#coderom.hex: coderom.elf coderom.hex: Debug/Debug.elf $(CP) -O ihex $< $@ coderom.elf: crt.S main.c linker_flash.ld Makefile $(CC) $(CFLAGS) -Wl,-Tlinker_flash.ld -o $@ -DCRLF crt.S main.c flash: coderom.hex $(ISP) -control coderom.hex \\\\.\COM3 38400 12000 #$(BT2) terminal: $(BT2)

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid



Anexos 199

ANEXO VIII: Código Fuente de la Aplicación para el PC “Analizador_Logico_DigitalDlg.cpp” ///----------------------------------------------------------------/// /// @file Analizador_Logico_DigitalDlg.cpp /// @author Marta Vilariño Valle /// Created: 21/11/2013 12:38:11 /// @section DESCRIPTION /// Analizador_Logico_DigitalDlg class implementation /// ///-----------------------------------------------------------------#include "Analizador_Logico_DigitalDlg.h" #define Escribir_hyper(s,r) hyperterminal->AppendText("\nInfo: ");hyperterminal>AppendText(s); //Do not add custom headers //wxDev-C++ designer will remove them ////Header Include Start ////Header Include End //---------------------------------------------------------------------------// Analizador_Logico_DigitalDlg //---------------------------------------------------------------------------//Add Custom Events only in the appropriate block. //Code added in other places will be removed by wxDev-C++ ////Event Table Start BEGIN_EVENT_TABLE(Analizador_Logico_DigitalDlg,wxDialog) ////Manual Code Start // EVT_COMBOBOX_DROPDOWN(ID_CMB_PUERTOSERIE, Analizador_Logico_DigitalDlg::cmb_puertoSerieSelected) ////Manual Code End EVT_CLOSE(Analizador_Logico_DigitalDlg::OnClose) EVT_COMMAND_SCROLL_ENDSCROLL(ID_SCROLL_CURSOR2,Analizador_Logico_DigitalDlg::scrol l_cursor2ScrollEnd) EVT_COMMAND_SCROLL_ENDSCROLL(ID_SCROLL_CURSOR1,Analizador_Logico_DigitalDlg::scrol l_cursor1ScrollEnd) EVT_COMMAND_SCROLL_ENDSCROLL(ID_MUEVE_SENAL,Analizador_Logico_DigitalDlg::mueve_se nalScrollEnd) EVT_BUTTON(ID_BTN_ZOOM_MENOS,Analizador_Logico_DigitalDlg::btn_zoom_menosClick) EVT_BUTTON(ID_BTN_ZOOM_MAS,Analizador_Logico_DigitalDlg::btn_zoom_masClick) EVT_BUTTON(ID_BTN_CARGAR,Analizador_Logico_DigitalDlg::btn_cargarClick0) EVT_BUTTON(ID_BTN,Analizador_Logico_DigitalDlg::btn_refrescaClick) EVT_BUTTON(ID_BTN_GUARDAR,Analizador_Logico_DigitalDlg::btn_guardarClick) EVT_BUTTON(ID_BTN_STOP,Analizador_Logico_DigitalDlg::btn_stopClick) EVT_TEXT(ID_CMB_PUERTOSERIE,Analizador_Logico_DigitalDlg::cmb_puertoSerieUpdated1) EVT_BUTTON(ID_BTN_CAPTURA,Analizador_Logico_DigitalDlg::btn_capturaClick) EVT_BUTTON(ID_BTN_DESCONECTA,Analizador_Logico_DigitalDlg::btn_desconectaClick) EVT_BUTTON(ID_BTN_CONECTA,Analizador_Logico_DigitalDlg::btn_conectaClick) END_EVENT_TABLE() ////Event Table End //-----------------------------------------------------------------------------Analizador_Logico_DigitalDlg::Analizador_Logico_DigitalDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { CreateGUIControls(); }

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


200

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

//-----------------------------------------------------------------------------Analizador_Logico_DigitalDlg::~Analizador_Logico_DigitalDlg() { } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::CreateGUIControls() { //Do not add custom code between //GUI Items Creation Start and GUI Items Creation End. //wxDev-C++ designer will remove them. wxArrayString arrayStringFor_cmb_puertoSerie; // Añadir los puertos serie habilitados for(int i=1;i<=255;i++) { char ruta_com[50]; sprintf(ruta_com,"\\\\.\\COM%d",i); // if(AbrirCOM(ruta_com,38400)==1) // { // arrayStringFor_cmb_puertoSerie.Add(wxT(ruta_com)); // //cmb_puertoSerie->SetValue(ruta_com); CerrarCOM(); // } if(AbrirCOM(ruta_com,115200)==1) { arrayStringFor_cmb_puertoSerie.Add(wxT(ruta_com)); CerrarCOM(); } } //Add the custom code before or after the blocks ////GUI Items Creation Start wxInitAllImageHandlers();

//Initialize graphic format handlers

WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(275, 31), wxSize(2, 1)); panel_fondo = new wxPanel(this, ID_PANEL_FONDO, wxPoint(0, 0), wxSize(1127, 469), wxALWAYS_SHOW_SB); panel_fondo->SetForegroundColour(wxColour(192,217,217)); panel_fondo->SetBackgroundColour(wxColour(192,217,217)); panel_fondo->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); panel_superior = new wxPanel(panel_fondo, ID_PANEL_SUPERIOR, wxPoint(0, 0), wxSize(1126, 128)); panel_superior->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); btn_conecta = new wxButton(panel_superior, ID_BTN_CONECTA, wxT("CONECTA COMx"), wxPoint(429, 4), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_conecta")); btn_conecta->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); btn_desconecta = new wxButton(panel_superior, ID_BTN_DESCONECTA, wxT("DESCONECTA"), wxPoint(429, 42), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_desconecta")); btn_desconecta->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); btn_captura = new wxButton(panel_superior, ID_BTN_CAPTURA, wxT("CAPTURA"), wxPoint(535, 4), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_captura")); btn_captura->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); //

wxArrayString arrayStringFor_cmb_puertoSerie; cmb_puertoSerie = new wxComboBox(panel_superior, ID_CMB_PUERTOSERIE, wxT(""), wxPoint(318, 27), wxSize(98, 24), arrayStringFor_cmb_puertoSerie, 0, wxDefaultValidator, wxT("cmb_puertoSerie")); cmb_puertoSerie->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); wxArrayString arrayStringFor_cmb_modo; arrayStringFor_cmb_modo.Add(wxT("SINGLE")); arrayStringFor_cmb_modo.Add(wxT("CONTÍNUO")); cmb_modo = new wxComboBox(panel_superior, ID_CMB_MODO, wxT("cmb_modo"),

Vilariño Valle, Marta


Anexos 201

wxPoint(710, 88), wxSize(98, 24), arrayStringFor_cmb_modo, 0, wxDefaultValidator, wxT("cmb_modo")); cmb_modo->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); btn_stop = new wxButton(panel_superior, ID_BTN_STOP, wxT("STOP"), wxPoint(535, 42), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_stop")); btn_stop->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); wxArrayString arrayStringFor_cmb_v_puertoSerie; arrayStringFor_cmb_v_puertoSerie.Add(wxT("4800")); arrayStringFor_cmb_v_puertoSerie.Add(wxT("9600")); arrayStringFor_cmb_v_puertoSerie.Add(wxT("19200")); arrayStringFor_cmb_v_puertoSerie.Add(wxT("38400")); arrayStringFor_cmb_v_puertoSerie.Add(wxT("57600")); arrayStringFor_cmb_v_puertoSerie.Add(wxT("115200")); cmb_v_puertoSerie = new wxComboBox(panel_superior, ID_CMB_V_PUERTOSERIE, wxT(""), wxPoint(318, 74), wxSize(98, 23), arrayStringFor_cmb_v_puertoSerie, 0, wxDefaultValidator, wxT("cmb_v_puertoSerie")); cmb_v_puertoSerie->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Times New Roman"))); textopuerto = new wxStaticText(panel_superior, ID_TEXTOPUERTO, wxT("Puerto COM"), wxPoint(318, 4), wxDefaultSize, 0, wxT("textopuerto")); textopuerto->SetForegroundColour(wxColour(0,0,0)); textopuerto->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); textoVPuerto = new wxStaticText(panel_superior, ID_TEXTOVPUERTO, wxT("Velocidad"), wxPoint(318, 51), wxDefaultSize, 0, wxT("textoVPuerto")); textoVPuerto->SetForegroundColour(wxColour(0,0,0)); textoVPuerto->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); DEBUG = new wxStaticText(panel_superior, ID_DEBUG, wxT("Desconectado..."), wxPoint(318, 98), wxDefaultSize, 0, wxT("DEBUG")); DEBUG->SetForegroundColour(wxColour(0,0,0)); DEBUG->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false)); wxArrayString arrayStringFor_cmb_frec_muestreo; arrayStringFor_cmb_frec_muestreo.Add(wxT("2MHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("1MHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("0,5MHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("0,2MHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("0,1MHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("50KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("20KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("10KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("5KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("2KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("1KHz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("500Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("200Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("100Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("50Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("20Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("10Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("5Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("2Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("1Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("0,5Hz")); arrayStringFor_cmb_frec_muestreo.Add(wxT("0,2Hz")); cmb_frec_muestreo = new wxComboBox(panel_superior, ID_CMB_FREC_MUESTREO, wxT("cmb_frec_muestreo"), wxPoint(710, 27), wxSize(98, 24), arrayStringFor_cmb_frec_muestreo, 0, wxDefaultValidator, wxT("cmb_frec_muestreo")); cmb_frec_muestreo->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); hyperterminal = new wxTextCtrl(panel_superior, ID_HYPERTERMINAL, wxT(""), wxPoint(1, 4), wxSize(307, 115), wxTE_MULTILINE, wxDefaultValidator, wxT("hyperterminal")); hyperterminal->SetFont(wxFont(11, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Lucida Console")));

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


202

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

texto_disparo = new wxStaticText(panel_superior, ID_TEXTO_DISPARO, wxT("Disparo"), wxPoint(900, 4), wxDefaultSize, wxALIGN_CENTRE, wxT("texto_disparo")); texto_disparo->SetForegroundColour(wxColour(0,0,0)); texto_disparo->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); texto_frec = new wxStaticText(panel_superior, ID_TEXTO_FREC, wxT("Frecuencia de Muestreo (Hz)"), wxPoint(641, 4), wxDefaultSize, 0, wxT("texto_frec")); texto_frec->SetForegroundColour(wxColour(0,0,0)); texto_frec->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); texto_modo = new wxStaticText(panel_superior, ID_TEXTO_MODO, wxT("Modo (S|C)"), wxPoint(709, 65), wxDefaultSize, 0, wxT("texto_modo")); texto_modo->SetForegroundColour(wxColour(0,0,0)); texto_modo->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); wxArrayString arrayStringFor_cmb_disp_1; arrayStringFor_cmb_disp_1.Add(wxT("T_X")); arrayStringFor_cmb_disp_1.Add(wxT("T_0")); arrayStringFor_cmb_disp_1.Add(wxT("T_1")); arrayStringFor_cmb_disp_1.Add(wxT("T_UP")); arrayStringFor_cmb_disp_1.Add(wxT("T_DOWN")); cmb_disp_1 = new wxComboBox(panel_superior, ID_CMB_DISP_1, wxT("cmb_disp_1"), wxPoint(930, 27), wxSize(55, 24), arrayStringFor_cmb_disp_1, 0, wxDefaultValidator, wxT("cmb_disp_1")); cmb_disp_1->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); wxArrayString arrayStringFor_cmb_disp_2; arrayStringFor_cmb_disp_2.Add(wxT("T_X: no disparo")); arrayStringFor_cmb_disp_2.Add(wxT("T_0: nivel bajo")); arrayStringFor_cmb_disp_2.Add(wxT("T_1: nivel alto")); arrayStringFor_cmb_disp_2.Add(wxT("T_UP: flanco de subida")); arrayStringFor_cmb_disp_2.Add(wxT("T_DOWN: flanco de bajada")); cmb_disp_2 = new wxComboBox(panel_superior, ID_CMB_DISP_2, wxT("cmb_disp_2"), wxPoint(930, 51), wxSize(55, 24), arrayStringFor_cmb_disp_2, 0, wxDefaultValidator, wxT("cmb_disp_2")); cmb_disp_2->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); wxArrayString arrayStringFor_cmb_disp_3; arrayStringFor_cmb_disp_3.Add(wxT("T_X")); arrayStringFor_cmb_disp_3.Add(wxT("T_0")); arrayStringFor_cmb_disp_3.Add(wxT("T_1")); arrayStringFor_cmb_disp_3.Add(wxT("T_UP")); arrayStringFor_cmb_disp_3.Add(wxT("T_DOWN")); cmb_disp_3 = new wxComboBox(panel_superior, ID_CMB_DISP_3, wxT("cmb_disp_3"), wxPoint(930, 75), wxSize(55, 24), arrayStringFor_cmb_disp_3, 0, wxDefaultValidator, wxT("cmb_disp_3")); cmb_disp_3->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); wxArrayString arrayStringFor_cmb_disp_4; arrayStringFor_cmb_disp_4.Add(wxT("T_X")); arrayStringFor_cmb_disp_4.Add(wxT("T_0")); arrayStringFor_cmb_disp_4.Add(wxT("T_1")); arrayStringFor_cmb_disp_4.Add(wxT("T_UP")); arrayStringFor_cmb_disp_4.Add(wxT("T_DOWN")); cmb_disp_4 = new wxComboBox(panel_superior, ID_CMB_DISP_4, wxT("cmb_disp_4"), wxPoint(930, 99), wxSize(55, 24), arrayStringFor_cmb_disp_4, 0, wxDefaultValidator, wxT("cmb_disp_4")); cmb_disp_4->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); texto_sx1 = new wxStaticText(panel_superior, ID_TEXTO_SX1, wxT("señal 1"), wxPoint(882, 27), wxDefaultSize, 0, wxT("texto_sx1")); texto_sx1->SetForegroundColour(wxColour(0,0,0)); texto_sx1->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); texto_sx2 = new wxStaticText(panel_superior, ID_TEXTO_SX2, wxT("señal 2"), wxPoint(882, 51), wxDefaultSize, 0, wxT("texto_sx2")); texto_sx2->SetForegroundColour(wxColour(0,0,0)); texto_sx2->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false));

Vilariño Valle, Marta


Anexos 203

btn_guardar = new wxButton(panel_superior, ID_BTN_GUARDAR, wxT("GUARDAR"), wxPoint(1014, 79), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_guardar")); btn_guardar->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); texto_sx3 = new wxStaticText(panel_superior, ID_TEXTO_SX3, wxT("señal 3"), wxPoint(882, 75), wxDefaultSize, 0, wxT("texto_sx3")); texto_sx3->SetForegroundColour(wxColour(0,0,0)); texto_sx3->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); texto_sx4 = new wxStaticText(panel_superior, ID_TEXTO_SX4, wxT("señal 4"), wxPoint(882, 99), wxDefaultSize, 0, wxT("texto_sx4")); texto_sx4->SetForegroundColour(wxColour(0,0,0)); texto_sx4->SetFont(wxFont(10, wxSWISS, wxNORMAL, wxNORMAL, false)); btn_refresca = new wxButton(panel_superior, ID_BTN, wxT("ACTUALIZA COM"), wxPoint(429, 80), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_refresca")); btn_refresca->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); btn_cargar = new wxButton(panel_superior, ID_BTN_CARGAR, wxT("CARGAR"), wxPoint(1014, 32), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_cargar")); btn_cargar->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); btn_zoom_mas = new wxButton(panel_fondo, ID_BTN_ZOOM_MAS, wxT("ZOOM +"), wxPoint(97, 349), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_zoom_mas")); btn_zoom_mas->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); btn_zoom_menos = new wxButton(panel_fondo, ID_BTN_ZOOM_MENOS, wxT("ZOOM -"), wxPoint(1, 349), wxSize(96, 38), 0, wxDefaultValidator, wxT("btn_zoom_menos")); btn_zoom_menos->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxBOLD, false)); Grafica = new wxStaticBitmap(panel_fondo, ID_GRAFICA, wxNullBitmap, wxPoint(0, 130), wxSize(1126, 220) ); Grafica->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); mueve_senal = new wxScrollBar(panel_fondo, ID_MUEVE_SENAL, wxPoint(193, 349), wxSize(933, 38), wxSB_HORIZONTAL, wxDefaultValidator, wxT("mueve_senal")); mueve_senal->Enable(false); mueve_senal->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); scroll_cursor1 = new wxScrollBar(panel_fondo, ID_SCROLL_CURSOR1, wxPoint(193, 387), wxSize(544, 38), wxSB_HORIZONTAL, wxDefaultValidator, wxT("scroll_cursor1")); scroll_cursor1->Enable(false); scroll_cursor1->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); scroll_cursor2 = new wxScrollBar(panel_fondo, ID_SCROLL_CURSOR2, wxPoint(193, 425), wxSize(544, 38), wxSB_HORIZONTAL, wxDefaultValidator, wxT("scroll_cursor2")); scroll_cursor2->Enable(false); scroll_cursor2->SetFont(wxFont(9, wxSWISS, wxITALIC, wxNORMAL, false, wxT("Times New Roman"))); wxedit_cursores = new wxTextCtrl(panel_fondo, ID_WXEDIT_CURSORES, wxT("Muestra el incremento de tiempo entre el cursor 1 y el cursor 2"), wxPoint(737, 387), wxSize(385, 38), 0, wxDefaultValidator, wxT("wxedit_cursores")); wxedit_cursores->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Lucida Console"))); texto_cursor1 = new wxStaticText(panel_fondo, ID_TEXTO_CURSOR1, wxT("CURSOR 1"), wxPoint(52, 399), wxDefaultSize, 0, wxT("texto_cursor1")); texto_cursor1->SetForegroundColour(wxColour(000,000,000)); texto_cursor1->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false)); texto_cursor2 = new wxStaticText(panel_fondo, ID_TEXTO_CURSOR2, wxT("CURSOR 2"), wxPoint(50, 435), wxDefaultSize, 0, wxT("texto_cursor2")); texto_cursor2->SetForegroundColour(wxColour(000,000,000)); texto_cursor2->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD, false));

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


204

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

mensaje_maxcapturas = new wxMessageDialog(this, wxT("\"¡¡UPS!!\r\n Número máximo de capturas alcanzado\""), wxT("Mensaje"), wxOK | wxICON_ERROR | wxCENTRE); mensaje_COM = new wxMessageDialog(this, wxT("¡¡UPPS!! \n \r Puerto COM no encontrado"), wxT("Mensaje"), wxOK | wxICON_ERROR | wxCENTRE); wxedit_cursor1 = new wxTextCtrl(panel_fondo, ID_WXEDIT_CURSOR1, wxT("Posición Cursor1"), wxPoint(737, 425), wxSize(385, 19), 0, wxDefaultValidator, wxT("wxedit_cursor1")); wxedit_cursor1->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Lucida Console"))); wxedit_cursor2 = new wxTextCtrl(panel_fondo, ID_WXEDIT_CURSOR2, wxT("Posición Cursor2"), wxPoint(737, 444), wxSize(385, 19), 0, wxDefaultValidator, wxT("wxedit_cursor2")); wxedit_cursor2->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Lucida Console"))); SetTitle(wxT("Analizador_Logico_Digital")); SetIcon(wxNullIcon); SetSize(8,8,1131,498); Center(); ////GUI Items Creation End Inicializacion(1); PintaBufer(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::Inicializacion(int n) { btn_captura->Disable(); btn_stop->Disable(); btn_conecta->Enable(true); cmb_modo->Enable(true); cmb_frec_muestreo->Enable(true); cmb_disp_1->Enable(true); cmb_disp_2->Enable(true); cmb_disp_3->Enable(true); cmb_disp_4->Enable(true); //valor inicial: cmb_puertoSerie->SetSelection(0); cmb_modo->SetSelection(0); cmb_v_puertoSerie->SetSelection(5); cmb_frec_muestreo->SetSelection(1); //por defecto seleccionamos no disparo en todos los combo_box cmb_disp_1->SetSelection(0); cmb_disp_2->SetSelection(0); cmb_disp_3->SetSelection(0); cmb_disp_4->SetSelection(0); f_seleccionada = cmb_frec_muestreo->GetCurrentSelection(); //scrollbar posicion_scroll=0;posicion_cursor1=0; posicion_cursor2=0; //mueve_senal->SetScrollbar(0,50,100,20,false);//20:tamaño de pagina : cuando no le doy a las flechas sino en el centro //SetScrollbar(rango inicial, tamaño de la barra, rango final, tamaño de pagina, boleano actualiza scroll) mueve_senal->SetScrollbar(0,10,MAX_MUESTRAS+10,20,false);//posicion_scroll llega hasta 100-10,lo máximo que aguanta es 255 mueve_senal->SetThumbPosition(0); scroll_cursor1->SetScrollbar(0,10,MAX_MUESTRAS+10,20,false);//scroll cursor 1: avanzar de 20 en 20 scroll_cursor1->SetThumbPosition(0); scroll_cursor2->SetScrollbar(0,10,MAX_MUESTRAS+10,20,false);//scroll cursor 2 scroll_cursor2->SetThumbPosition(0); strcpy(FLAG_INI,"$"); strcpy(FLAG_FIN,"#"); strcpy(ESC,"!"); longitud_mensaje=0;

Vilariño Valle, Marta


Anexos 205

captura_on=0; inicio_frecuencias_posibles(); zoom = 2; anchura = zoom; muestra_deseada = 0; valor = 0; }//void Inicializacion(); //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::OnClose(wxCloseEvent& /*event*/) { Destroy(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::checking_mensaje(char *c) { //de-estuffing //formato de trama enviado por el PC: //$longitud,.......(mensaje)....,CRC$ //la longitud=strlen(mensae), sin tener en cuenta el fin de cadena. char recibido; //guardo el caracter recibido por la UART int longitud; char crc;//crc_new; static int i=0; static int estado = 0; #define FLAG_INI_C '$' #define FLAG_FIN_C '#' #define ESC_C 0x21 recibido = c[0]; switch (estado) { case 0: //fuera de la trama , if (recibido == FLAG_INI_C)//inicio de comando enviado: $ { i = 0; estado = 1; } break; case 1: // Recibo el dato. Estoy dentro de la trama de datos if(recibido==ESC_C) //si el siguiente dato es un ESC debo descartarlo y mirar el siguiente { estado = 2; break; }; if(recibido==FLAG_FIN_C) //fin de comando enviado { estado = 0; mensaje[i]= '\0'; longitud=i; //posicion del vector longitud_mensaje = longitud-2; //me quedo con los datos (no cuento B, ni CRC , ni \0). i = 0; //inicializamos i para la siguiente recepci贸n del mensaje // Verificar CRC crc=0; for (i=1; (i<longitud-1); i++ ) { crc = CRC8_caracter( crc,(unsigned char) mensaje[i], 0x18 ); } if(crc == mensaje[longitud-1]) // Si CRC correcto proceso { if(mensaje[0]=='D') // DEBUG { mensaje[longitud-1]=0; hyperterminal->SetDefaultStyle(wxTextAttr(*wxRED)); hyperterminal->AppendText("\n < DEBUG:"); hyperterminal->AppendText(&mensaje[1]); }

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


206

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

else if(mensaje[0]=='B') // BUFFER { hyperterminal->AppendText("\n < BUFFER: ..."); #ifdef _debug for(int i=0; i<longitud;i++) hyperterminal->AppendText(wxString::Format("0x%02X ",(unsigned char)mensaje[i+1]));//muestra datos buffer #endif hyperterminal->AppendText("pintando señales ..."); Update(); PintaBufer(); } else {Escribir_hyper("\n < Unknown frame",0);}; } else { #ifdef _debug hyperterminal->AppendText("\n CRC very BAD..."); #endif if(mensaje[0]=='B') // BUFFER { hyperterminal->AppendText("\n < BUFFER2: ..."); #ifdef _debug for(int i=0; i<longitud;i++) hyperterminal->AppendText(wxString::Format("0x%02X ",(unsigned char)mensaje[i+1])); #endif hyperterminal->AppendText("pintando señales ..."); Update(); PintaBufer(); } } break; }; mensaje[i++] = recibido; //si caracter válido lo meto aqui directamente en el mensaje break; case 2: // Decodificando dato if(recibido==ESC_C) {mensaje[i++] = ESC_C; estado = 1; break;}; if(recibido==FLAG_INI_C) {mensaje[i++] = FLAG_INI_C; estado = 1; break;}; if(recibido==FLAG_FIN_C) {mensaje[i++] = FLAG_FIN_C; estado = 1; break;}; estado = 0; break; }//switch } // ----------------------------------------------------------------------------// FUNCIONES DE MANEJO DEL PUERTO COM // ----------------------------------------------------------------------------char Analizador_Logico_DigitalDlg::CRC8_caracter(unsigned char crc, unsigned char datum, char polinomio) {//calcula el crc teniendo en cuenta el crc anterior y el caracter actual int j; for(j=0;j<8;j++) { if(((crc^datum)&0x01)==0) crc >>=1;//^: XOR binario else { crc ^= polinomio; //^=: XOR binario con asignación crc >>= 1; crc |= 0x80; } datum >>=1; } return crc; }

Vilariño Valle, Marta


Anexos 207

// ----------------------------------------------------------------------------bool Analizador_Logico_DigitalDlg::AbrirCOM(char * COM_PORT, int baud) { idComDev = CreateFile(COM_PORT, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if(idComDev ==INVALID_HANDLE_VALUE) { printf("Error 1, puerto serie\n"); return false; } DCB dcb = {0}; dcb.DCBlength=sizeof(dcb); if(!GetCommState(idComDev, &dcb)) { printf("Error 2, puerto serie\n"); return false; } dcb.BaudRate = (DWORD) baud; //baudrate:valor tomado del combo box en funcion de lo que seleccione el usuario dcb.ByteSize = (BYTE) 8; //Bits de datos: 8 dcb.Parity = (BYTE) NOPARITY; //No paridad dcb.StopBits = (BYTE) ONESTOPBIT; //1 bit de parada dcb.fAbortOnError = FALSE; dcb.fInX = FALSE; dcb.fOutX = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = FALSE; dcb.fRtsControl = (DWORD) RTS_CONTROL_DISABLE; dcb.fDtrControl = (DWORD) DTR_CONTROL_DISABLE; if(!SetCommState(idComDev, &dcb)) { printf("Error 3, SetCommStatus\n"); return false; } COMMTIMEOUTS timeouts={0}; timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutConstant = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; if(!SetCommTimeouts(idComDev,&timeouts)) {printf("Error 4, timeouts\n");return false;}; return true; } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::CerrarCOM() { CloseHandle(idComDev); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::EscribeCOM(char *Buffer, int longitud) { DWORD l, n, p = 0; if(longitud==0) l = strlen(Buffer); else l = longitud; while(l) { if(!WriteFile(idComDev, &Buffer[p], l, &n, NULL)) return; p += n; l -= n; }

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


208

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

} //-----------------------------------------------------------------------------int Analizador_Logico_DigitalDlg::LeeCOM_TimeOut(char *buf, int m, int ms_timeout) {// Recibe datos DWORD p =0,n = 0; while( m && ms_timeout ) // Hasta que no recibas algo no retorna { ReadFile(idComDev, &buf[p], m, &n, NULL); p += n; m -= n; ms_timeout--; // Cuando llegue a cero sale Sleep(1); //en segundos } if(ms_timeout) return p; // Hay datos else return 0; } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::EscribirCOM_hyper(char *buff, int longitud) { EscribeCOM(buff, longitud); hyperterminal->AppendText(buff); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::_U0putch_bs(char *c) {//transmisión mediante bytestuffing if (c == FLAG_INI) { EscribirCOM_hyper(ESC, 1); //! EscribirCOM_hyper(FLAG_INI, 1); //$ } else if (c == FLAG_FIN) { EscribirCOM_hyper(ESC, 1); //! EscribirCOM_hyper(FLAG_FIN, 1); //# } else if (c == ESC) { EscribirCOM_hyper(ESC, 1); //! EscribirCOM_hyper(ESC, 1); //! } else EscribirCOM_hyper(c, 1); } // ----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::EnviarTrama(char *mensaje) {//envío de trama de datos mediante bytestuffing: $ |mensaje[parametros] | CRC | # int i; char crc; char longitud = strlen(mensaje); _aux[1] = '\0'; crc = 0; hyperterminal->AppendText(" > "); EscribirCOM_hyper(FLAG_INI, 1); //$ for (i=0; ((i<longitud )&& (i<MAX_LONG_MENSAJE)); i++ )//no mando fin de cadena { _aux[0] = mensaje[i]; _U0putch_bs(&_aux[0]); crc = CRC8_caracter( crc,(unsigned char) mensaje[i], 0x18 ); } _U0putch_bs(&crc); //crc EscribirCOM_hyper(FLAG_FIN, 1); //# } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_conectaClick(wxCommandEvent& event) { char puertoName[50]; int puertobaud; wxString valor_seleccionado_velocidadCOM = cmb_v_puertoSerie->GetValue(); wxString puerto_COM_seleccionado = cmb_puertoSerie->GetValue();

Vilariño Valle, Marta


Anexos 209

strcpy(puertoName,"\\\\.\\"); strcat(puertoName,puerto_COM_seleccionado);//ruta_com=\\\\.\\COMi puertobaud=atoi(valor_seleccionado_velocidadCOM); //Abrimos el puerto COM seleccionado con la velocidad seleccionada if(AbrirCOM(puertoName,puertobaud)==1) { DEBUG->SetLabel("PUERTO COM ABIERTO "); conecta_on=1; //el dispositivo conectado btn_captura->Enable(); btn_conecta->Disable(); //deshabilito el boton CONECTAR cmb_puertoSerie->Disable(); //deshabilito los dos combo_box que seleccionan puerto COM y velocidad cmb_v_puertoSerie->Disable(); // Hilo de recepci贸n ---------------m_pThread = new MyThread(this); m_pThread->Create(); //creamos el hilo una vez estamos conectados al COM if( m_pThread->Run() != wxTHREAD_NO_ERROR ) { wxLogError("Can't create the thread!"); delete m_pThread; m_pThread = NULL; } // Hilo de recepci贸n ---------------Escribir_hyper("Comando WHO-Conectar\n",50); sprintf(mensaje, "4[]"); // DEBUG->SetLabel(mensaje); EnviarTrama(mensaje); } else { mensaje_COM->ShowModal(); } btn_desconecta->Enable(true); //habilito el boton DESCONECTAR } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_desconectaClick(wxCommandEvent& event) { conecta_on=0; btn_desconecta->Disable(); //deshabilito el boton CONECTAR btn_stop->Disable(); Escribir_hyper("\r\nComando RE_OFF-Cancelar/Desconectar\r\n",50); sprintf(mensaje, "3[]"); EnviarTrama(mensaje); DEBUG->SetLabel(mensaje); CerrarCOM(); //Eliminamos el hilo ----------------if (m_pThread) // does the thread still exist? { if(m_pThread->Delete() != wxTHREAD_NO_ERROR ) hyperterminal->AppendText("Can't delete the thread!"); } //Eliminamos el hilo ----------------hyperterminal->AppendText("hilo borrado"); btn_conecta->Show(true); //mostramos el boton CONECTAR btn_conecta->Enable(true); //habilito el boton CONECTAR cmb_puertoSerie->Enable(true); cmb_v_puertoSerie->Enable(true); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_stopClick(wxCommandEvent& event) {// Formato trama al microcontrolador: $1[]$ btn_stop->Disable(); btn_captura->Enable(true); char mensaje2[50];

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


210

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Escribir_hyper("Comando STOP\r\n",20); sprintf(mensaje2, "1[]"); DEBUG->SetLabel(mensaje2); EnviarTrama(mensaje2); captura_on=0; cmb_modo->Enable(); cmb_frec_muestreo->Enable(); cmb_disp_1->Enable(); cmb_disp_2->Enable(); cmb_disp_3->Enable(); cmb_disp_4->Enable(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_capturaClick(wxCommandEvent& event) {//formato trama: $5[modo, frec_muestreo, disparo,...]# if(conecta_on==1) { captura_on = 1; valor = 0; posicion_scroll=0; mueve_senal->SetThumbPosition(0); posicion_cursor1=0; posicion_cursor2=0; scroll_cursor1->SetThumbPosition(0); scroll_cursor2->SetThumbPosition(0); dc.Clear(); btn_stop->Enable(true); modo = cmb_modo->GetCurrentSelection(); frec = cmb_frec_muestreo->GetCurrentSelection(); disparo[0]= disparo[1]= disparo[2]= disparo[3]=

cmb_disp_1->GetCurrentSelection(); cmb_disp_2->GetCurrentSelection(); cmb_disp_3->GetCurrentSelection(); cmb_disp_4->GetCurrentSelection();

Escribir_hyper("Comando CAPTURAR\r\n",50); sprintf(mensaje,"5[%d,%d,%d,%d,%d,%d]", modo, frec, disparo[0], disparo[1], disparo[2], disparo[3] ); EnviarTrama(mensaje); f_seleccionada = cmb_frec_muestreo->GetCurrentSelection(); //posicion del vector //valor en Hz frecuencia_muestreo = (tabla_muestras[f_seleccionada].valor_frec_muestreo); //valor obtenido (las unidades se ponen en texto y se tienen en cuenta para valor real) tiempo_muestreo = 1/(tabla_muestras[f_seleccionada].valor_frec_muestreo); //valor teniendo en cuenta las unidaddes a continuación. tiempo = 1/frecuencia_muestreo; } } //-----------------------------------------------------------------------------void InsertaValorBuffer(char*B,int N,int T, int dato) { // B: búfer : b0,b1,b2,b3, b0,b1,b2,b3, ... // N: número búfer [0..3] // T: número de muestra. No debe superar el máximo // dato: 0 ó 1 if(dato) B[(T/8)*4+N] |= (1<<(T%8)); // Pone uno else B[(T/8)*4+N] &= ~(1<<(T%8)); // Pone cero }//-----------------------------------------------------------------------------int DevuelveValorBuffer(char*B,int N,int T) { // B: búfer : b0,b1,b2,b3, b0,b1,b2,b3, ... // N: número búfer [0..3] // T: número de muestra. No debe superar el máximo if(B[(T/8)*4+N] & (1<<(T%8))) return 1;

Vilariño Valle, Marta


Anexos 211

else return 0; } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::PintaBufer() { #define ALTURA 30 #define ALTO_CANAL 50 #define X0 80 int x, x_old; int lineas_grid=0;//si 1-pinto linea gris , si 0 pinto linea en blanco. Asi reduzco el grid //int pintar_cada=0; int LENX = 1126, LENY = 220, i,b1,b2,b3,b4 ,b1_old=0,b2_old=0,b3_old=0,b4_old=0; //wxMemoryDC dc; valor=0; W=LENX, H=LENY; wxBitmap bitmap(LENX, LENY); wxFont font0(15,wxFONTFAMILY_SWISS,wxNORMAL,wxNORMAL); wxString str; dc.SelectObject(bitmap); dc.SetBackground(*wxWHITE); dc.Clear(); //actualizar el rango de los scroll: //---------------------------------mueve_senal->SetRange(longitud_mensaje*8);//actualizo el rango del scrollbar con el mensaje recibido scroll_cursor1->SetRange(longitud_mensaje*8); scroll_cursor2->SetRange(longitud_mensaje*8); //Pintar mi rejilla: //----------------//dc.SetPen( wxPen(wxT("GREY"),1,wxDOT) );//lapiz de color gris de, anchura 1 y punteado //dc.SetPen( wxPen(wxT(*wxLIGHT_GREY),1,wxSOLID) );//Lapiz gris claro dc.SetPen( wxPen(wxColour( 245, 245,245),1,wxSOLID) ); //gris mega claro dc.DrawLine(X0,0,X0,LENY-8);//primera linea es de separaci贸n for(int x=X0;x<=LENX;x=x+zoom) { if(zoom<7) {//pinto una linea en negro y otra en blanco para no tener un grid tan difuso if(lineas_grid%4==0)//si resto es 0. PInto gris { // dc.SetPen( wxPen(wxT(*wxLIGHT_GREY),1,wxSOLID) );//Lapiz gris claro dc.DrawLine(x,0,x,ALTO_CANAL*4); } lineas_grid++; }//if zoom else dc.DrawLine(x,0,x,ALTO_CANAL*4); }//for pintar_texto_grid(posicion_scroll); //pintar texto en la rejilla //Pintar el texto de Canal x: //---------------------------dc.SetPen( wxPen(wxColour(0,0,0),1,wxSOLID) ); dc.SetFont(font0); dc.DrawText("Canal 1",wxPoint(0,0*ALTO_CANAL)); dc.DrawText("Canal 2",wxPoint(0,1*ALTO_CANAL)); dc.DrawText("Canal 3",wxPoint(0,2*ALTO_CANAL)); dc.DrawText("Canal 4",wxPoint(0,3*ALTO_CANAL)); //Pintar buffer : //----------------x_old = X0; for(i=posicion_scroll;i<longitud_mensaje*8;i++) { x = X0 + (i-posicion_scroll)*(1<<(zoom-1)); // Zoom b1 = DevuelveValorBuffer(&mensaje[1], 0, i);

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


212

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

b2 = DevuelveValorBuffer(&mensaje[1], 1, i); b3 = DevuelveValorBuffer(&mensaje[1], 2, i); b4 = DevuelveValorBuffer(&mensaje[1], 3, i); dc.SetPen( wxPen(wxColour( 0, 0, 0),1,wxSOLID) );//negro dc.DrawLine(x_old,b1_old*ALTURA+ALTO_CANAL*0,x ,b1_old*ALTURA+ALTO_CANAL*0); dc.DrawLine(x,b1_old*ALTURA+ALTO_CANAL*0,x ,b1*ALTURA+ALTO_CANAL*0); dc.SetPen( wxPen(wxColour(255, 0, 0),1,wxSOLID) );//rojo dc.DrawLine(x_old,b2_old*ALTURA+ALTO_CANAL*1,x ,b2_old*ALTURA+ALTO_CANAL*1); dc.DrawLine(x,b2_old*ALTURA+ALTO_CANAL*1,x ,b2*ALTURA+ALTO_CANAL*1); dc.SetPen( wxPen(wxColour( 0,255, 0),1,wxSOLID) );//verde dc.DrawLine(x_old,b3_old*ALTURA+ALTO_CANAL*2,x ,b3_old*ALTURA+ALTO_CANAL*2); dc.DrawLine(x,b3_old*ALTURA+ALTO_CANAL*2,x ,b3*ALTURA+ALTO_CANAL*2); dc.SetPen( wxPen(wxColour( 0, 0,255),1,wxSOLID) );//azul dc.DrawLine(x_old,b4_old*ALTURA+ALTO_CANAL*3,x ,b4_old*ALTURA+ALTO_CANAL*3); dc.DrawLine(x,b4_old*ALTURA+ALTO_CANAL*3,x ,b4*ALTURA+ALTO_CANAL*3); x_old = x; b1_old = b1; b2_old = b2; b3_old = b3; b4_old = b4; } //pintar cursores: //---------------dc.SetPen( wxPen(wxT(*wxRED),1,wxSOLID) );//Lapiz gris claro dc.DrawLine(X0+posicion_cursor1,0,X0+posicion_cursor1,LENY-8);//primera linea es de separación incremento_tiempo = (posicion_cursor1-posicion_cursor2)*tiempo;//en las unidades correspondientes us,ms,s wxedit_cursores->SetValue(wxString::Format(" Cursor1 - Cursor2 = %5.5f%s", incremento_tiempo, tabla_muestras[f_seleccionada].txt_magnitud_tiempo)); wxedit_cursor1->SetValue(wxString::Format(" Posición Cursor1: %d", posicion_cursor1)); wxedit_cursor2->SetValue(wxString::Format(" Posición Cursor2: %d", posicion_cursor2)); //pintar imagen en la pantalla: //----------------------------dc.SelectObject(wxNullBitmap); Pantalla = bitmap; if(Grafica){ Grafica->SetBitmap(bitmap); Grafica->Update(); }//muestro la imagen una vez esta ya completa para que de la sensacion de que lo pinta a la vez } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::pintar_texto_grid(int m) { wxPen lapiz2(wxColour(0, 0, 0), 1, wxDOT);//lapiz negro wxCoord x1; wxCoord y2 = H-15; anchura = (1<<(zoom-1)); if(m == 0) x1 = X0; else x1 = X0+(-m)*zoom; //PINTAR EL TEXTO en funcion de la frec muestreo seleccionada: //ESCALA: // MHz(10^6) --> t=1/f KHz(10^3) Hz Hz //----------------------------------------------------------------------------//(0) 2MHz -> 0.5us (5) 50KHz -> 20us (11) 500Hz -> 2ms (17) 5Hz -> 0.2s //(1) 1MHz -> 1us (6) 20KHz -> 50us (12) 200Hz -> 5ms (18) 2Hz -> 0.5s //(2) 0,5MHz -> 2us (7) 10KHz -> 0.1ms (13) 100Hz -> 10ms(19) 1Hz -> 1s //(3) 0,2MHz -> 5us (8) 5KHz -> 0.2ms (14) 50Hz -> 20ms (20) 0,5Hz -> 2s //(4) 0,1MHz -> 10us (9) 2KHz -> 0.5ms (15) 20Hz -> 50ms (21) 0,2Hz -> 5s // (10) 1KHz -> 1ms (16) 10Hz-> 0.1s f_seleccionada = cmb_frec_muestreo->GetCurrentSelection(); wxString texto_grid;

Vilariño Valle, Marta


Anexos 213

float valor_t_grid=valor; int x; int pintar_cada=4; x=W+(m*zoom); wxFont fuente1(8,wxFONTFAMILY_SWISS,wxNORMAL,wxBOLD); dc.SetFont(fuente1); for (int i=0; i<=x; i=i+zoom) {//escribir el texto en la imagen: texto_grid = wxString::Format("%.1f %s", valor_t_grid, tabla_muestras[f_seleccionada].txt_magnitud_tiempo); //elegimos la variable pintar_cada x lineas del grid en funci贸n del zoom que hayamos seleccionado if (zoom > 20) pintar_cada = 2; if (zoom > 16) pintar_cada = 4; if (zoom < 16) pintar_cada = 8; if (zoom < 10) pintar_cada = 12; //if (zoom < 8) pintar_cada = 10; if (zoom < 5) pintar_cada = 20; if (zoom < 3) pintar_cada = 60; if(i%(zoom*pintar_cada)==0) {//pinto en el grid los numeros correspondientes if((i!=0)||(m!=0)) { if(x1>X0) { dc.SetPen( wxPen(wxT(*wxLIGHT_GREY),1,wxSOLID) );//Lapiz gris claro dc.DrawLine(x1,0,x1,y2);//linea correspondiente al numero dc.SetPen(lapiz2); dc.DrawText(texto_grid, wxPoint(x1-10, y2)); } } }//if switch (f_seleccionada) { case 0: //2Mhz, 0.5us t=1/f = 1/(2 * 1e6) tiempo_muestreo = 1/(tabla_muestras[0].valor_frec_muestreo*tabla_muestras[0].magnitud_frec); segundos valor = 0.5 + valor; //aumentamos 0.5 cada iteraci贸n del for break; case 1: //1Mhz tiempo_muestreo = 1/(tabla_muestras[1].valor_frec_muestreo*tabla_muestras[1].magnitud_frec); segundos valor = 1 + valor; break; case 2: //0.5Mhz tiempo_muestreo = 1/(tabla_muestras[2].valor_frec_muestreo*tabla_muestras[2].magnitud_frec); segundos valor = 2 + valor; break; case 3: //0.2Mhz tiempo_muestreo = 1/(tabla_muestras[3].valor_frec_muestreo*tabla_muestras[3].magnitud_frec); segundos valor = 5 + valor; break; case 4: //0.1Mhz tiempo_muestreo = 1/(tabla_muestras[4].valor_frec_muestreo*tabla_muestras[4].magnitud_frec); segundos valor = 10 + valor; break; case 5: //50Khz tiempo_muestreo =

//valor en

//valor en

//valor en

//valor en

//valor en

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


214

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

1/(tabla_muestras[5].valor_frec_muestreo*tabla_muestras[5].magnitud_frec); //valor en segundos valor = 20 + valor; break; case 6: //20Khz tiempo_muestreo = 1/(tabla_muestras[6].valor_frec_muestreo*tabla_muestras[6].magnitud_frec); //valor en segundos valor = 50 + valor; break; case 7: //10Khz tiempo_muestreo = 1/(tabla_muestras[7].valor_frec_muestreo*tabla_muestras[7].magnitud_frec); //valor en segundos valor = 0.1 + valor; break; case 8: //5Khz tiempo_muestreo = 1/(tabla_muestras[8].valor_frec_muestreo*tabla_muestras[8].magnitud_frec); //valor en segundos valor = 0.2 + valor; break; case 9: //2Khz tiempo_muestreo = 1/(tabla_muestras[9].valor_frec_muestreo*tabla_muestras[9].magnitud_frec); //valor en segundos valor = 0.5 + valor; break; case 10: //1Khz tiempo_muestreo = 1/(tabla_muestras[10].valor_frec_muestreo*tabla_muestras[10].magnitud_frec); //valor en segundos valor = 1 + valor; break; case 11: //500hz tiempo_muestreo = 1/(tabla_muestras[11].valor_frec_muestreo*tabla_muestras[11].magnitud_frec); //valor en segundos valor = 2 + valor; break; case 12: //200hz tiempo_muestreo = 1/(tabla_muestras[12].valor_frec_muestreo*tabla_muestras[12].magnitud_frec); //valor en segundos valor = 5 + valor; break; case 13: //100hz tiempo_muestreo = 1/(tabla_muestras[13].valor_frec_muestreo*tabla_muestras[13].magnitud_frec); //valor en segundos valor = 10 + valor; break; case 14: //50hz tiempo_muestreo = 1/(tabla_muestras[14].valor_frec_muestreo*tabla_muestras[14].magnitud_frec); //valor en segundos valor = 20 + valor; break; case 15: //20hz tiempo_muestreo = 1/(tabla_muestras[15].valor_frec_muestreo*tabla_muestras[15].magnitud_frec); //valor en segundos valor = 50 + valor; break; case 16: //10hz tiempo_muestreo = 1/(tabla_muestras[16].valor_frec_muestreo*tabla_muestras[16].magnitud_frec); //valor en segundos valor = 0.1 + valor; break;

Vilari帽o Valle, Marta


Anexos 215

case 17: //5hz tiempo_muestreo = 1/(tabla_muestras[17].valor_frec_muestreo*tabla_muestras[17].magnitud_frec); //valor segundos valor = 0.2 + valor; break; case 18: //2hz tiempo_muestreo = 1/(tabla_muestras[18].valor_frec_muestreo*tabla_muestras[18].magnitud_frec); //valor segundos valor = 0.5 + valor; break; case 19: //1hz tiempo_muestreo = 1/(tabla_muestras[19].valor_frec_muestreo*tabla_muestras[19].magnitud_frec); //valor segundos valor = 1 + valor; break; case 20: //0.5hz tiempo_muestreo = 1/(tabla_muestras[20].valor_frec_muestreo*tabla_muestras[20].magnitud_frec); //valor segundos valor = 2 + valor; break; case 21: //0.2hz tiempo_muestreo = 1/(tabla_muestras[21].valor_frec_muestreo*tabla_muestras[21].magnitud_frec); //valor segundos valor = 5 + valor; break; default: break; }//switch x1 = x1 + zoom; valor_t_grid = valor; }//for }//pintar_texto_grid() //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::SalvarDatosenFichero(wxString fichero) { wxTextFile File(fichero); int b1, b2, b3, b4;// wxString str; //int to wxSgtring ---- wxString mystring = wxString::Format(wxT("%i"),myint); if(File.Exists()) File.Open(fichero); //si el fichero existe lo cargo else File.Create(fichero); //sino , lo creo

en

en

en

en

en

File.Clear(); //vacía el fichero , borra el contenido si lo había. Si no pongo esto me añadirá al final del fichero for(int i=0;i<longitud_mensaje*8;i++) { b1 = DevuelveValorBuffer(&mensaje[1], 0, i); b2 = DevuelveValorBuffer(&mensaje[1], 1, i); b3 = DevuelveValorBuffer(&mensaje[1], 2, i); b4 = DevuelveValorBuffer(&mensaje[1], 3, i); str = wxString::Format(wxT("%i,%i,%i,%i"),b1,b2,b3,b4); File.AddLine(str); } File.Write(); //escribe lo añadido (addline lo deja en memoria) File.Close(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_guardarClick(wxCommandEvent& event) { wxInitAllImageHandlers(); wxFileDialog* OpenDialog = new wxFileDialog( this, _("Selecciona un fichero"), wxEmptyString,_("datos.txt"), _("Text files (*.txt)|*.txt"), wxFD_SAVE, wxDefaultPosition); // Creamos un dialogo de "apertura de fichero" con solo un tipo de ficheros: *.txt if (OpenDialog->ShowModal() == wxID_OK) // si el usuario da click en "guardar" en lugar

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


216

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

de "cancelar" { wxString fichero = OpenDialog->GetPath(); hyperterminal->SaveFile(fichero,wxTEXT_TYPE_ANY);//salvamos en el fichero "log.txt" todo lo que hay escrito en el hyperterminal } //guardar tambien las imagenes en el formato indicado: wxImage imagen; imagen = Pantalla.ConvertToImage(); //convierto el bitmap a formato imagen wxInitAllImageHandlers(); //imagen.SaveFile("senales.bmp",wxBITMAP_TYPE_BMP); imagen.SaveFile("senales.jpg",wxBITMAP_TYPE_JPEG); SalvarDatosenFichero("log.txt");//salvamos los datos de cada canal de entrada }//btn_guardar //-----------------------------------------------------------------------------/* * btn_cargarClick0 */ void Analizador_Logico_DigitalDlg::btn_cargarClick0(wxCommandEvent& event) { wxTextFile archivo_entrada; //tipo de dato size_t pos=0; char cad[256]; int b1,b2,b3,b4; wxString str; wxString fichero; //abrir un cuadro de diálogo: wxFileDialog* OpenDialog = new wxFileDialog( this, _("Selecciona un fichero"), wxEmptyString,_("datos.txt"), _("Text files (*.txt)|*.txt"), wxFD_OPEN, wxDefaultPosition); // Creamos un dialogo de "apertura de fichero" con solo un tipo de ficheros: *.txt if (OpenDialog->ShowModal() == wxID_OK) // si el usuario cambia de idea //showmodal me muestra el cuadro de dialogo { fichero = OpenDialog->GetPath(); } //wxMessageBox(fichero); if(!archivo_entrada.Open(fichero)) hyperterminal->AppendText("\n < Error al abrir el fichero."); else { /* for(pos=0;pos<1024;pos++) { b1 = pos&1; b2 = pos&2; b3 = pos&4; b4 = pos&8; InsertaValorBuffer(mensaje, 0, pos, b1); InsertaValorBuffer(mensaje, 1, pos, b2); InsertaValorBuffer(mensaje, 2, pos, b3); InsertaValorBuffer(mensaje, 3, pos, b4); } */ for ( str = archivo_entrada.GetLine(0); !archivo_entrada.Eof(); str = archivo_entrada.GetNextLine() ) { strncpy( cad, str.c_str(), sizeof(cad)); //hyperterminal->AppendText(wxString::Format("%s\n",cad)); sscanf(cad,"%d,%d,%d,%d\n",&b1,&b2,&b3,&b4); InsertaValorBuffer(&mensaje[1], InsertaValorBuffer(&mensaje[1], InsertaValorBuffer(&mensaje[1], InsertaValorBuffer(&mensaje[1], pos++; }

Vilariño Valle, Marta

0, 1, 2, 3,

pos, pos, pos, pos,

b1); b2); b3); b4);


Anexos 217

longitud_mensaje=pos/8; PintaBufer(); archivo_entrada.Close(); } }//btn_cargar //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_zoom_masClick(wxCommandEvent& event) { btn_zoom_menos->Enable(true); if(zoom<32) {zoom = zoom +1; } PintaBufer(); if (zoom>=32) btn_zoom_mas->Disable(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::btn_zoom_menosClick(wxCommandEvent& event) { btn_zoom_mas->Enable(true); if(zoom> 1) {zoom = zoom - 1;} PintaBufer(); if(zoom <=1) btn_zoom_menos->Disable(); } //-----------------------------------------------------------------------------void Analizador_Logico_DigitalDlg::inicio_frecuencias_posibles() { //inicializaci贸n de las frecuencias a emplear posibles: tabla_muestras[0].valor_frec_muestreo = 2; tabla_muestras[0].magnitud_frec = 1e6; strcpy(tabla_muestras[0].txt_magnitud_frec, " MHz"); strcpy(tabla_muestras[0].txt_magnitud_tiempo, " us"); tabla_muestras[1].valor_frec_muestreo = 1; tabla_muestras[1].magnitud_frec = 1e6; strcpy(tabla_muestras[1].txt_magnitud_frec, " MHz"); strcpy(tabla_muestras[1].txt_magnitud_tiempo, " us"); tabla_muestras[2].valor_frec_muestreo = 0.5; tabla_muestras[2].magnitud_frec = 1e6; strcpy(tabla_muestras[2].txt_magnitud_frec, " MHz"); strcpy(tabla_muestras[2].txt_magnitud_tiempo, " us"); tabla_muestras[3].valor_frec_muestreo = 0.2; tabla_muestras[3].magnitud_frec = 1e6; strcpy(tabla_muestras[3].txt_magnitud_frec, " MHz"); strcpy(tabla_muestras[3].txt_magnitud_tiempo, " us"); tabla_muestras[4].valor_frec_muestreo = 0.1; tabla_muestras[4].magnitud_frec = 1e6; strcpy(tabla_muestras[4].txt_magnitud_frec, " MHz"); strcpy(tabla_muestras[4].txt_magnitud_tiempo, " us"); tabla_muestras[5].valor_frec_muestreo = 50; tabla_muestras[5].magnitud_frec = 1e3; strcpy(tabla_muestras[5].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[5].txt_magnitud_tiempo, " us"); tabla_muestras[6].valor_frec_muestreo = 20; tabla_muestras[6].magnitud_frec = 1e3; strcpy(tabla_muestras[6].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[6].txt_magnitud_tiempo, " us"); tabla_muestras[7].valor_frec_muestreo = 10; tabla_muestras[7].magnitud_frec = 1e3; strcpy(tabla_muestras[7].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[7].txt_magnitud_tiempo, " ms");

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid


218

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

tabla_muestras[8].valor_frec_muestreo = 5; tabla_muestras[8].magnitud_frec = 1e3; strcpy(tabla_muestras[8].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[8].txt_magnitud_tiempo, " ms"); tabla_muestras[9].valor_frec_muestreo = 2; tabla_muestras[9].magnitud_frec = 1e3; strcpy(tabla_muestras[9].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[9].txt_magnitud_tiempo, " ms"); tabla_muestras[10].valor_frec_muestreo = 1; tabla_muestras[10].magnitud_frec = 1e3; strcpy(tabla_muestras[10].txt_magnitud_frec, " KHz"); strcpy(tabla_muestras[10].txt_magnitud_tiempo, " ms"); tabla_muestras[11].valor_frec_muestreo = 500; tabla_muestras[11].magnitud_frec = 1; strcpy(tabla_muestras[11].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[11].txt_magnitud_tiempo, " ms"); tabla_muestras[12].valor_frec_muestreo = 200; tabla_muestras[12].magnitud_frec = 1; strcpy(tabla_muestras[12].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[12].txt_magnitud_tiempo, " ms"); tabla_muestras[13].valor_frec_muestreo = 100; tabla_muestras[13].magnitud_frec = 1; strcpy(tabla_muestras[13].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[13].txt_magnitud_tiempo, " ms"); tabla_muestras[14].valor_frec_muestreo = 50; tabla_muestras[14].magnitud_frec = 1; strcpy(tabla_muestras[14].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[14].txt_magnitud_tiempo, " ms"); tabla_muestras[15].valor_frec_muestreo = 20; tabla_muestras[15].magnitud_frec = 1; strcpy(tabla_muestras[15].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[15].txt_magnitud_tiempo, " ms"); tabla_muestras[16].valor_frec_muestreo = 10; tabla_muestras[16].magnitud_frec = 1; strcpy(tabla_muestras[16].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[16].txt_magnitud_tiempo, " ms"); tabla_muestras[17].valor_frec_muestreo = 5; tabla_muestras[17].magnitud_frec = 1; strcpy(tabla_muestras[17].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[17].txt_magnitud_tiempo, " s"); tabla_muestras[18].valor_frec_muestreo = 2; tabla_muestras[18].magnitud_frec = 1; strcpy(tabla_muestras[18].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[18].txt_magnitud_tiempo, " s"); tabla_muestras[19].valor_frec_muestreo = 1; tabla_muestras[19].magnitud_frec = 1; strcpy(tabla_muestras[19].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[19].txt_magnitud_tiempo, " s"); tabla_muestras[20].valor_frec_muestreo = 0.5; tabla_muestras[20].magnitud_frec = 1; strcpy(tabla_muestras[20].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[20].txt_magnitud_tiempo, " s"); tabla_muestras[21].valor_frec_muestreo = 0.2; tabla_muestras[21].magnitud_frec = 1; strcpy(tabla_muestras[21].txt_magnitud_frec, " Hz"); strcpy(tabla_muestras[21].txt_magnitud_tiempo, " s");

Vilari帽o Valle, Marta


Anexos 219

}//inicio_frecuencias_posibles(); //-----------------------------------------------------------------------------//------ Funciones para el funcionamiento del hilo del puerto serie ----------//-----------------------------------------------------------------------------wxThread::ExitCode MyThread::Entry() { int n; char buf[2]; while(!TestDestroy()) //mientras no haya destruido el hilo { n = m_pHandler->LeeCOM_TimeOut( buf,1,1); // Lee m_pHandler->checking_mensaje( buf ); // Procesa } return (wxThread::ExitCode)0; }//ExitCode MyThr //-----------------------------------------------------------------------------MyThread::~MyThread() { m_pHandler->m_pThread = NULL; }//~MyThread() //---------------------------------------------------------------------------------/* * cmb_puertoSerieUpdated1 */ void Analizador_Logico_DigitalDlg::cmb_puertoSerieUpdated1(wxCommandEvent& event ) { //refresco el puerto serie cuando lo pulso // Añadir los puertos serie habilitados for(int i=1;i<=255;i++) { char ruta_com[50]; sprintf(ruta_com,"\\\\.\\COM%d",i); if(AbrirCOM(ruta_com,38400)==1) { cmb_puertoSerie->SetValue(ruta_com); CerrarCOM(); } } //Update(); } //-----------------------------------------------------------------------------/* * btn_refrescaClick */ void Analizador_Logico_DigitalDlg::btn_refrescaClick(wxCommandEvent& event) {//al pulsar este botón refresco todo Inicializacion(1); //refresco los combos y permito seleccionar de nuevo //habilito la captura de nuevo btn_captura->Enable(true); // Añadir los puertos serie habilitados for(int i=1;i<=255;i++) { char ruta_com[50]; sprintf(ruta_com,"\\\\.\\COM%d",i); if(AbrirCOM(ruta_com,38400)==1) { cmb_puertoSerie->SetValue(ruta_com); CerrarCOM(); } } Update(); } //-----------------------------------------------------------------------------/* * mueve_senalScrollEnd

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


220

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

*/ void Analizador_Logico_DigitalDlg::mueve_senalScrollEnd(wxScrollEvent& event) {//barra de scroll para desplazarnos por la señal posicion_scroll = mueve_senal->GetThumbPosition(); PintaBufer(); } //-----------------------------------------------------------------------------/* * scroll_cursor1ScrollEnd */ void Analizador_Logico_DigitalDlg::scroll_cursor1ScrollEnd(wxScrollEvent& event) {//SCROLL CURSOR 1 posicion_cursor1 = scroll_cursor1->GetThumbPosition(); PintaBufer(); } //-----------------------------------------------------------------------------/* * scroll_cursor2ScrollEnd */ void Analizador_Logico_DigitalDlg::scroll_cursor2ScrollEnd(wxScrollEvent& event) {//SCROLL CURSOR 2 posicion_cursor2 = scroll_cursor2->GetThumbPosition(); PintaBufer(); }

“Analizador_Logico_DigitalDlg.h” ///----------------------------------------------------------------/// /// @file Analizador_Logico_DigitalDlg.h /// @author Marta Vilariño Valle /// Created: 21/11/2013 12:38:11 /// @section DESCRIPTION /// Analizador_Logico_DigitalDlg class declaration /// ///-----------------------------------------------------------------#ifndef __ANALIZADOR_LOGICO_DIGITALDLG_H__ #define __ANALIZADOR_LOGICO_DIGITALDLG_H__ #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #include <wx/dialog.h> #else #include <wx/wxprec.h> #endif //Do not add custom headers between //Header Include Start and Header Include End. //wxDev-C++ designer will remove them. Add custom headers after the block. ////Header Include Start #include <wx/msgdlg.h> #include <wx/scrolbar.h> #include <wx/statbmp.h> #include <wx/textctrl.h> #include <wx/stattext.h> #include <wx/combobox.h> #include <wx/button.h> #include <wx/panel.h>

Vilariño Valle, Marta


Anexos 221

////Header Include End #include <stdlib.h> #include <time.h> #include <wx/textfile.h> #include <wx/file.h> #include <wx/string.h> #include <wx/event.h> #include <wx/image.h> #include <wx/dcclient.h> #include <wx/textctrl.h> #include <wx/spinctrl.h> #include <wx/pen.h> #include <wx/timer.h> #include <wx/thread.h> #include <wx/math.h> #include <iostream> #include <fstream> #include <wx/filedlg.h> #include <wx/statbox.h> ////Dialog Style Start #undef Analizador_Logico_DigitalDlg_STYLE #define Analizador_Logico_DigitalDlg_STYLE wxALWAYS_SHOW_SB | wxFULL_REPAINT_ON_RESIZE | wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxMINIMIZE_BOX | wxCLOSE_BOX ////Dialog Style End #define MAX_MUESTRAS 100000 #define MAX_LONG_MENSAJE (MAX_MUESTRAS/8 +12) //#define _debug 1 //depuración condicional//si elimino es línea entonces los ifdef endif no funcinoan //si está definida la variable entonces me elimina del cóidgo lo que este entre endif y ifelse class Analizador_Logico_DigitalDlg; class MyThread : public wxThread { public: MyThread(Analizador_Logico_DigitalDlg *handler) : wxThread(wxTHREAD_DETACHED) { m_pHandler = handler; } ~MyThread(); protected: virtual ExitCode Entry(); Analizador_Logico_DigitalDlg *m_pHandler; }; class Analizador_Logico_DigitalDlg : public wxDialog { private: DECLARE_EVENT_TABLE(); public: Analizador_Logico_DigitalDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Analizador_Logico_Digital"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = Analizador_Logico_DigitalDlg_STYLE); virtual ~Analizador_Logico_DigitalDlg(); void btn_stopClick(wxCommandEvent& event); void btn_conectaClick(wxCommandEvent& event); void btn_capturaClick(wxCommandEvent& event); void Analizador_Logico_DigitalDlgActivate(wxActivateEvent& event); //declaraciones de las funciones del puerto COM bool AbrirCOM(char * COM_PORT, int baud); void CerrarCOM();

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


222

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7 void EscribeCOM(char *Buffer, int longitud); int LeeCOM_TimeOut(char *buf, int m, int ms_timeout); void EscribirCOM_hyper(char *buff, int longitud); //funciones para manejo de ficheros void SalvarDatosenFichero(wxString fichero); private: //Do not add custom control declarations between //GUI Control Declaration Start and GUI Control Declaration End. //wxDev-C++ will remove them. Add custom code after the block. ////GUI Control Declaration Start wxTextCtrl *wxedit_cursor2; wxTextCtrl *wxedit_cursor1; wxMessageDialog *mensaje_COM; wxMessageDialog *mensaje_maxcapturas; wxStaticText *texto_cursor2; wxStaticText *texto_cursor1; wxTextCtrl *wxedit_cursores; wxScrollBar *scroll_cursor2; wxScrollBar *scroll_cursor1; wxScrollBar *mueve_senal; wxStaticBitmap *Grafica; wxButton *btn_zoom_menos; wxButton *btn_zoom_mas; wxButton *btn_cargar; wxButton *btn_refresca; wxStaticText *texto_sx4; wxStaticText *texto_sx3; wxButton *btn_guardar; wxStaticText *texto_sx2; wxStaticText *texto_sx1; wxComboBox *cmb_disp_4; wxComboBox *cmb_disp_3; wxComboBox *cmb_disp_2; wxComboBox *cmb_disp_1; wxStaticText *texto_modo; wxStaticText *texto_frec; wxStaticText *texto_disparo; wxTextCtrl *hyperterminal; wxComboBox *cmb_frec_muestreo; wxStaticText *DEBUG; wxStaticText *textoVPuerto; wxStaticText *textopuerto; wxComboBox *cmb_v_puertoSerie; wxButton *btn_stop; wxComboBox *cmb_modo; wxComboBox *cmb_puertoSerie; wxButton *btn_captura; wxButton *btn_desconecta; wxButton *btn_conecta; wxPanel *panel_superior; wxPanel *panel_fondo; wxPanel *WxPanel1; ////GUI Control Declaration End private: //Note: if you receive any error with these enum IDs, then you need to //change your old form code that are based on the #define control IDs. //#defines may replace a numeric value for the enum names. //Try copy and pasting the below block in your old form header files. enum { ////GUI Enum Control ID Start ID_WXEDIT_CURSOR2 = 1107, ID_WXEDIT_CURSOR1 = 1106, ID_TEXTO_CURSOR2 = 1104, ID_TEXTO_CURSOR1 = 1103, ID_WXEDIT_CURSORES = 1102, ID_SCROLL_CURSOR2 = 1101,

Vilari帽o Valle, Marta


Anexos 223

ID_SCROLL_CURSOR1 = 1100, ID_MUEVE_SENAL = 1098, ID_GRAFICA = 1097, ID_BTN_ZOOM_MENOS = 1082, ID_BTN_ZOOM_MAS = 1034, ID_BTN_CARGAR = 1105, ID_BTN = 1099, ID_TEXTO_SX4 = 1083, ID_TEXTO_SX3 = 1074, ID_BTN_GUARDAR = 1072, ID_TEXTO_SX2 = 1069, ID_TEXTO_SX1 = 1068, ID_CMB_DISP_4 = 1067, ID_CMB_DISP_3 = 1066, ID_CMB_DISP_2 = 1065, ID_CMB_DISP_1 = 1064, ID_TEXTO_MODO = 1063, ID_TEXTO_FREC = 1062, ID_TEXTO_DISPARO = 1061, ID_HYPERTERMINAL = 1059, ID_CMB_FREC_MUESTREO = 1058, ID_DEBUG = 1055, ID_TEXTOVPUERTO = 1045, ID_TEXTOPUERTO = 1044, ID_CMB_V_PUERTOSERIE = 1040, ID_BTN_STOP = 1013, ID_CMB_MODO = 1012, ID_CMB_PUERTOSERIE = 1010, ID_BTN_CAPTURA = 1008, ID_BTN_DESCONECTA = 1007, ID_BTN_CONECTA = 1005, ID_PANEL_SUPERIOR = 1004, ID_PANEL_FONDO = 1002, ID_WXPANEL1 = 1001, ////GUI Enum Control ID End ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values }; private: void OnClose(wxCloseEvent& event); void CreateGUIControls(); public: //decalaro variables que serán públicas // Variables necesarias HANDLE idComDev; void btn_desconectaClick(wxCommandEvent& event); void btn_guardarClick(wxCommandEvent& event); void btn_reanudaClick(wxCommandEvent& event); void btn_cargarClick(wxCommandEvent& event); void btn_configClick(wxCommandEvent& event); void btn_zoom_masClick(wxCommandEvent& event); void btn_zoom_menosClick(wxCommandEvent& event); //inicializaciones: void Inicializacion(int n); void inicio_frecuencias_posibles(); //recepción y envío de tramas: void checking_mensaje(char *c); void _U0putch_bs(char *c); void EnviarTrama(char *mensaje); void RecibeTrama(char *mensaje); char CRC8_caracter(unsigned char crc, unsigned char datum, char polinomio); //Funciones para pintar imagenes y desplazar: void PintaBufer(); void pintar_texto_grid(int m);

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


224

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

wxMemoryDC dc;//device context para pintar la grafica sobre el bitmap, es decir, Pantalla wxBitmap Pantalla; int conecta_on; //vale 1 cuando pulsamos conectar int captura_on; //vale 1 si se ha pulsado el botón capturar char mensaje[MAX_LONG_MENSAJE]; //recepción y envio de tramas y datos char mensaje_file[MAX_LONG_MENSAJE]; //cargar datos desde un fichero int longitud_mensaje; char FLAG_INI[2]; //#define FLAG '$' char FLAG_FIN[2]; //#define FLAG '#' char ESC[2]; //#define ESC '!'//0x21 //simbolo ! int zoom;//variable para conocer el valor del zoom aplicable a todas las señales int anchura; //se modifica en funcion del zoom int W,H;//anchura y altura del bitmap int muestra_deseada; float valor;//almacena el valor a escribir en texto_grid; int posicion_scroll; //almacena el valor real de la muestra donde está situado el scroll para pintar la señal del bufer a partir de esa muestra int posicion_cursor1; int posicion_cursor2; float incremento_tiempo; //calcula el incremento de tiempo entre cursor 1 y cursor2 o lo qu es la mismo la distancia entre estos int f_seleccionada; float frecuencia_muestreo; float tiempo; float tiempo_muestreo; float t1_muestreo[MAX_MUESTRAS]; //almaceno los tiempos de muestreo de cada muestra de la señal 1 float t1[MAX_MUESTRAS]; struct base_tiempos{ float valor_frec_muestreo; float magnitud_frec; char txt_magnitud_frec[10]; char txt_magnitud_tiempo[5]; }; base_tiempos tabla_muestras[22]; //almacenaré todos los valores posibles de frecuencias seleccionables desde el combo_box int modo; int frec; int disparo[4]; void btn_refrescarClick(wxCommandEvent& event); void mueve_senalScroll(wxScrollEvent& event); void mueve_senalScrollbar(wxCommandEvent& event); void mueve_senalScrollLineDown(wxScrollEvent& event); void mueve_senalScrollThumbtrack(wxScrollEvent& event); void cmb_puertoSerieSelected(wxCommandEvent& event ); void cmb_puertoSerieUpdated(wxCommandEvent& event ); void cmb_puertoSerieUpdateUI(wxUpdateUIEvent& event); void cmb_puertoSerieUpdated0(wxCommandEvent& event ); void cmb_puertoSerieUpdated1(wxCommandEvent& event ); void btn_refrescaClick(wxCommandEvent& event); void mueve_senalScrollEnd(wxScrollEvent& event); void scroll_cursor1ScrollEnd(wxScrollEvent& event); void scroll_cursor2ScrollEnd(wxScrollEvent& event); void btn_cargarClick0(wxCommandEvent& event); protected: MyThread *m_pThread; friend class MyThread; }; #endif

Vilariño Valle, Marta


Anexos 225

ANEXO IX: Placa de pruebas Se ha realizado una placa de pruebas que genera cuatro seĂąales de frecuencia fija cada una. Se ha optado por diseĂąar con un timer 555 las seĂąales cuadradas a frecuencias constantes. Este diseĂąo se ha realizado en Altium Designer 10. Para realizar esta sencilla placa se han tenido en cuenta las especificaciones generales del 555 recogidas en la Anexo Tabla - 8. El circuito que se ha implementado atiende a las siguientes relaciones matemĂĄticas: đ?‘‡đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = (đ?‘…1 + đ?‘…2) Ă— đ??ś Ă— 0.693

(0.1)

đ?‘‡đ?‘‘đ?‘’đ?‘ đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = đ?‘…2 Ă— đ??ś Ă— 0.693

(0.2)

Con el diodo se consigue tener los mismos tiempos de carga y descarga y las ecuaciones (0.1) y (0.2) serĂĄn actualizadas a las expresiones (0.3) y (0.4), respectivamente. La primera ecuaciĂłn obtiene el tiempo de carga, y la segunda el tiempo de descarga. Para tener un periodo constante, se igualarĂĄn ambas expresiones.

đ?‘‡đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = đ?‘…1 Ă— đ??ś Ă— 0.693

(0.3)

đ?‘‡đ?‘‘đ?‘’đ?‘ đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = đ?‘…2 Ă— đ??ś Ă— 0.693

(0.4)

đ?‘‡ = đ?‘‡đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = đ?‘‡đ?‘‘đ?‘’đ?‘ đ?‘?đ?‘Žđ?‘&#x;đ?‘”đ?‘Ž = đ?‘… Ă— đ??ś Ă— 0.693 => đ?‘… =

đ?‘‡ đ??ś Ă— 0.693

(0.5)

Por tanto para que Tcarga = Tdescarga se debe cumplir que R1 = R2 = R. Con todo esto se obtienen las siguientes cuatro frecuencias fijas de funcionamiento teniendo en cuenta las siguientes restricciones: 1. C = 100nF 2. R1 = R2 = R

Escuela TĂŠcnica Superior de Ingenieros de TelecomunicaciĂłn. Universidad de Valladolid


226

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Frecuencia 1: INTEGRADO U1 𝑅 = 1𝐾Ω => 𝑇1 = 1𝐾Ω × 100𝑛𝐹 × 0.693 = 0,0000693 𝑠𝑒𝑔𝑢𝑛𝑑𝑜

𝐹1 =

1 = 14.430,01 𝐻𝑧 ≈ 𝟏𝟒, 𝟒 𝑲𝑯𝒛 𝑇1

(0.6)

(0.7)

Frecuencia 2: INTEGRADO U2 𝑅 = 820Ω => 𝑇2 = 820Ω × 100𝑛𝐹 × 0.693 = 0,000056826 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠 𝐹2 =

1 = 17.597,58 𝐻𝑧 ≈ 𝟏𝟕, 𝟔 𝑲𝑯𝒛 𝑇2

(0.8)

(0.9)

Frecuencia 3: INTEGRADO U3 𝑅 = 280Ω => 𝑇3 = 280Ω × 100𝑛𝐹 × 0.693 = 0,000019404 𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠 𝐹3 =

1 = 51.535,76 𝐻𝑧 ≈ 𝟓𝟎 𝑲𝑯𝒛 𝑇3

(0.10)

(0.11)

Frecuencia 4: INTEGRADO U4 𝑅 = 480Ω => 𝑇4 = 480Ω × 100𝑛𝐹 × 0.693 = 0,0000033264𝑠𝑒𝑔𝑢𝑛𝑑𝑜𝑠

𝐹4 =

Vilariño Valle, Marta

1 = 30.062,53 𝐻𝑧 ≈ 𝟑𝟎𝑲𝑯𝒛 𝑇4

(0.12)

(0.13)


Anexos 227

Anexo Tabla - 8 Especificaciones Generales del 555

Especificaciones Generales Vcc 5V 10V 15V 500KHz a 2MHz Frecuencia máxima (astable) Nivel de tensión Vc (medio) 3,3V 6,6V 10V Error de frecuencia (astable) ~5% ~5% ~5% Error de temporización (monoestable) ~1% ~1% ~1% Máximo valor de R1+R2 3,4MΩ 6,2MΩ 10MΩ Valor mínimo de R1 5KΩ 5KΩ 5KΩ Valor mínimo de R2 3KΩ 3KΩ 3KΩ Corriente de salida (pin 3) ~200mA ~200mA ~200mA

Notas Varia con el diseño nominal a 25ºC a 25ºC

Una vez realizados los esquemas electrónicos y el rutado de la placa, los resultados se pueden observar en las siguientes figuras:  Diseño de esquemas: ver Anexo Figura. 17.  Rutado a doble cara: ver Anexo Figura. 14.  Visualización 3D de la placa de pruebas: ver Anexo Figura. 16.  Visualización de la placa real montada: ver Anexo Figura. 15. 

Anexo Figura. 14 Layout Placa de Pruebas

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


228

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Anexo Figura. 15 Placa de Pruebas - Placa Real

Anexo Figura. 16 Placa de Pruebas - Visualización 3D

Vilariño Valle, Marta


Anexos 229

Anexo Figura. 17 Esquemas Electr贸nicos - Placa de Pruebas

Escuela T茅cnica Superior de Ingenieros de Telecomunicaci贸n. Universidad de Valladolid



Índice de Figuras 231

INDICE DE FIGURAS Figura 1.1 Diagrama de Bloques de un Analizador Lógico Digital ................................................................ 6 Figura 1.2 Cálculo del tamaño del buffer circular .......................................................................................... 9 Figura 2.1 Esquema de ficheros para un proyecto VSMStudio .................................................................... 13 Figura 2.2 Simulación de código de programa en Proteus ............................................................................ 13 Figura 2.3 Programación dela memoria flash ............................................................................................... 14 Figura 3.1 Diagrama de Bloques del Sistema ............................................................................................... 19 Figura 3.2 Cálculo de consumo de potencia ................................................................................................. 23 Figura 3.3 Intensidad consumida (mA)......................................................................................................... 23 Figura 3.4 Stack-up (2 capas)........................................................................................................................ 26 Figura 3.5 Reglas de diseño .......................................................................................................................... 29 Figura 3.6 Reglas de diseño para clase de red POWER................................................................................ 30 Figura 3.7 Reglas de diseño para clase de red SIGNAL ............................................................................... 30 Figura 3.8 Reglas de diseño para resto de clases de redes ............................................................................ 31 Figura 3.9 Rutado de la PCB: colocación de componentes .......................................................................... 32 Figura 3.10 Rutado de la PCB: Top Layer .................................................................................................... 33 Figura 3.11 Rutado de la PCB: Bottom Layer .............................................................................................. 33 Figura 3.12 Generar plano de masa .............................................................................................................. 34 Figura 3.13 Características plano de masa bottom copper ............................................................................ 34 Figura 3.14 Características plano de masa top copper .................................................................................. 34 Figura 3.15 Rutado de la PCB: Visualización 3D (vista superior) ............................................................... 35 Figura 3.16 Rutado de la PCB: Visualización 3D (vista inferior)................................................................. 35 Figura 3.17 Rutado de la PCB: Visualización 3D......................................................................................... 36 Figura 4.1 Arquitectura Von Neuman ........................................................................................................... 41 Figura 4.2 Diagrama de bloques de la arquitectura del LPC2114................................................................. 43 Figura 4.3 Pines LPC2114 ............................................................................................................................ 44 Figura 4.4 Mapa de Memoria LPC2114 [2] .................................................................................................. 45 Figura 4.5 Funcionamiento del compilador .................................................................................................. 48 Figura 4.6 Estructura de archivos de un proyecto en VSMStudio ................................................................ 49 Figura 4.7 Arquitectura ARM7TDMI ........................................................................................................... 51 Figura 4.8 Configuración registro PINSEL0 ................................................................................................ 53 Figura 4.9 Configuración registro PINSEL1 ................................................................................................ 53 Figura 4.10 Configuración registro IODIR0 ................................................................................................. 54 Figura 4.11 Configuración registros IODIR1 ............................................................................................... 54 Figura 4.12 Conexión del Oscilador Externo ................................................................................................ 56 Figura 4.13 Diagrama de Bloques del PLL ................................................................................................... 57 Figura 4.14 Diagrama de bloques del VIC [2, p. 53] .................................................................................... 67 Figura 4.15 Diagrama de flujo de funcionamiento general del TIMER ........................................................ 68 Figura 4.16 Configuración del Registro de Control del Timer (Reset) ......................................................... 69 Figura 4.17 Configuración del Registro de Control del Timer (Habilitar).................................................... 69 Figura 4.18 Configuración registro TxMCR ................................................................................................. 70 Figura 4.19 Configuración registro TxEMR ................................................................................................. 72 Figura 4.20 Esquema electrónico de los pines correspondientes a los relojes .............................................. 73 Figura 4.21 Diagrama Funcional de los Registros de Desplazamiento ......................................................... 73 Figura 4.22 Diagrama de funcionamiento de CLK y CLK_BY_8................................................................ 74 Figura 4.23 Algoritmo de Funcionamiento del TIMER................................................................................ 74 Figura 4.24 Configuración TxTCR ............................................................................................................... 75 Figura 4.25 Configuración TxEMR .............................................................................................................. 75 Figura 4.26 Configuración TxMCR .............................................................................................................. 76 Figura 4.27 Configuración registro U0RBR ................................................................................................. 80 Figura 4.28 Configuración registro U0THR ................................................................................................. 80 Figura 4.29 Configuración registros U0DLL y U0DLM .............................................................................. 81

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


232

Diseño e Implementación de un Analizador Lógico Digital basado en un microprocesador ARM7

Figura 4.30 Configuración registro U0FDR ................................................................................................. 82 Figura 4.31 Configuración registro U0FCR ................................................................................................. 82 Figura 4.32 Configuración registro U0LCR ................................................................................................. 83 Figura 4.33 Configuración registro U0LSR .................................................................................................. 84 Figura 4.34 Configuración registro U0IER ................................................................................................... 88 Figura 4.35 Configuración registro U0IIR .................................................................................................... 89 Figura 4.36 Esquema electrónico de los pines correspondientes a los pines UART0 ................................... 90 Figura 4.37 Diagrama de flujo del funcionamiento del Sistema Microprocesador ....................................... 93 Figura 4.38 Formato de trama de datos......................................................................................................... 93 Figura 4.39 Funcionamiento Byte Stuffing .................................................................................................... 94 Figura 4.40 Formato de envío de tramas del Microprocesador al PC ........................................................... 95 Figura 4.41 Formato de recepción de tramas del Microprocesador desde el PC .......................................... 96 Figura 4.42 Diagrama de flujo de la rutina principal .................................................................................. 102 Figura 4.43 Diagrama de flujo rutina recepción de carácter RX_UART0 .................................................. 103 Figura 4.44 Diagrama de flujo rutina de interpretación del mensaje y comando recibido .......................... 104 Figura 4.45 Diagrama de flujo rutina periódica de muestreo TIMER0 ...................................................... 105 Figura 5.1 Creando un proyecto (I)............................................................................................................. 108 Figura 5.2 Creando un proyecto (II) ........................................................................................................... 109 Figura 5.3 Creación de un proyecto (III) .................................................................................................... 109 Figura 5.4 Creación de un proyecto (IV) .................................................................................................... 110 Figura 5.5 Creación de un proyecto (V) ..................................................................................................... 110 Figura 5.6 Creación de un proyecto (VI) .................................................................................................... 111 Figura 5.7 Creación de un proyecto (VII) ................................................................................................... 111 Figura 5.8 Creación de un proyecto (VIII) ................................................................................................. 112 Figura 5.9 Creación de un proyecto (IX) .................................................................................................... 113 Figura 5.10 Compilando y Ejecutando el proyecto ..................................................................................... 118 Figura 5.11 Instalación (bienvenida) ......................................................................................................... 118 Figura 5.12 Instalación (readme) ................................................................................................................ 119 Figura 5.13 Instalación (destino) ................................................................................................................ 119 Figura 5.14 Instalación (directorio) ............................................................................................................ 120 Figura 5.15 Instalación (progreso instalación) ............................................................................................ 120 Figura 5.16 Instalación (finalizar) ............................................................................................................... 121 Figura 5.17 Layout de la aplicación ............................................................................................................ 121 Figura 6.1 Placa Prototipo Real (TOP LAYER) ......................................................................................... 125 Figura 6.2 Placa Prototipo Real (BOTTOM LAYER) .................................................................................. 125 Figura 6.3 Test cristal de cuarzo ................................................................................................................. 126 Figura 6.4 Test funcionamiento UART0 y programación de la placa ........................................................ 128 Figura 6.5 Test señales de reloj (CLK y CLK_BY_8) .............................................................................. 129 Figura 6.6 Prueba Captura: F=1MHz, no disparo en señales entrada ......................................................... 130 Figura 6.7 Prueba Captura: F=10KHz; sx3: disparo nivel alto; sx1, sx2, sx4: no disparo .......................... 131 Figura 6.8 Prueba Captura: F=0.1MHz; sx4:disparo nivel bajo; sx1,sx2,sx3: no disparo .......................... 131 Figura 6.9 Prueba Captura: F=1MHz, sx1: disparo nivel bajo, sx3: disparo nivel alto, sx2, sx4: no disparo .................................................................................................................................................................... 132 Anexo Figura. 1 Factura Proveedor de la PCB ........................................................................................... 158 Anexo Figura. 2 Mecanizado de la caja para la PCB - vista isométrica ..................................................... 161 Anexo Figura. 3 Mecanizado de la caja para PCB - vista isométrica sin tapa superior .............................. 161 Anexo Figura. 4 Mecanizado de la caja para PCB - vista superior ............................................................. 162 Anexo Figura. 5 Mecanizado de la caja para PCB - vista superior sin tapa................................................ 162 Anexo Figura. 6 Mecanizado de la caja para PCB - vista inferior .............................................................. 163 Anexo Figura. 7 Mecanizado de la caja para PCB - vista atrás .................................................................. 163 Anexo Figura. 8 Mecanizado de la caja para PCB - vista frontal ............................................................... 163 Anexo Figura. 9 Mecanizado de la caja para PCB – Vistas izquierda y derecha ........................................ 163 Anexo Figura. 10 Crear proyecto en VSMStudio ....................................................................................... 165 Anexo Figura. 11 Propiedades de un proyecto en VSMStudio ................................................................... 166

Vilariño Valle, Marta


Índice de Figuras 233

Anexo Figura. 12 Configuración registros PINSELx ................................................................................. 167 Anexo Figura. 13 Configuración IODIRx .................................................................................................. 168 Anexo Figura. 14 Layout Placa de Pruebas ................................................................................................ 227 Anexo Figura. 15 Placa de Pruebas - Placa Real ........................................................................................ 228 Anexo Figura. 16 Placa de Pruebas - Visualización 3D ............................................................................. 228 Anexo Figura. 17 Esquemas Electrónicos - Placa de Pruebas .................................................................... 229

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid



Índice de Tablas 235

INDICE DE TABLAS Tabla 3-1 Cálculo Consumo de Potencia ...................................................................................................... 24 Tabla 3-2 Especificaciones de material y dimensiones de la PCB................................................................ 25 Tabla 3-3 Parámetros del fabricante para la PCB [2].................................................................................... 27 Tabla 3-4 Fichero Check-Outs ...................................................................................................................... 36 Tabla 3-5 Contenido fichero BOM (Bill Of Materials) ................................................................................ 37 Tabla 3-6 Análisis AMFE ............................................................................................................................. 40 Tabla 4-1 Resumen de las características del LPC2114 de NXP .................................................................. 42 Tabla 4-2 Funciones posibles PINSELx ....................................................................................................... 52 Tabla 4-3 Valor hexadecimal registros PINSEL ........................................................................................... 53 Tabla 4-4 Selección de valores de los condensadores de desacoplo para el oscilador externo en función de la frecuencia .................................................................................................................................................. 57 Tabla 4-5 Fuentes de Interrupción ................................................................................................................ 65 Tabla 4-6 Mapa de registros del Vectored Interrupt Controller (I) ............................................................... 65 Tabla 4-7 Mapa de registros del Vectored Interrupt Controller (II).............................................................. 66 Tabla 4-8 Mapa de registros del Vectored Interrupt Controller (III) ............................................................ 66 Tabla 4-9 Configuración del registro TxMCR .............................................................................................. 71 Tabla 4-10 Control de la función de las salidas de matching. Registro TxEMR .......................................... 71 Tabla 4-11 Configuración del Registro de Interrupciones (TxIR) ................................................................ 72 Tabla 4-12 Configuración del RX Trigger Level .......................................................................................... 83 Tabla 4-13 Configuración Word Length Select (U0LCR<1:0>) .................................................................. 83 Tabla 4-14 Configuración Parity Select (U0LCR<5:4>) .............................................................................. 84 Tabla 4-15 Valores recomendados de U0DLL para el cálculo del Baud Rate .............................................. 87 Tabla 4-16 Configuración registro U0IIR<3:1> ........................................................................................... 89 Tabla 4-17 Función de detección de error .................................................................................................... 95 Tabla 4-18 Resumen de Comandos .............................................................................................................. 97 Tabla 4-19 Comando de parada .................................................................................................................... 97 Tabla 4-20 Comando de reanudación ........................................................................................................... 98 Tabla 4-21 Comando de desconexión ........................................................................................................... 98 Tabla 4-22 Comando de conexión ................................................................................................................ 98 Tabla 4-23 Comando de captura ................................................................................................................... 99 Tabla 7-1Costes de material electrónico (Euros) ........................................................................................ 134 Tabla 7-2 Costes de amortización ............................................................................................................... 134 Tabla 7-3 Costes por licencias informáticas ............................................................................................... 134 Tabla 7-4 Costes por hora de Ingeniero ...................................................................................................... 135 Tabla 7-5 Coste Mano de Obra empleada ................................................................................................... 136 Tabla 7-6 Costes Indirectos y Generales ..................................................................................................... 136 Tabla 7-7 Registro de Actividades .............................................................................................................. 137 Tabla 7-8 Costes Totales del Proyecto ........................................................................................................ 138 Tabla 7-9 Coste Unitario en función de las unidades fabricadas ................................................................ 139 Tabla 7-10 Amortización de la inversión inicial ......................................................................................... 139 Tabla 7-11 Cuenta de Resultados ............................................................................................................... 140 Tabla 7-12 Estimación de ventas en función de los beneficios ................................................................... 140 Anexo Tabla Anexo Tabla Anexo Tabla Anexo Tabla Anexo Tabla Anexo Tabla Anexo Tabla Anexo Tabla -

1 Mapeo de Puertos (I) ...................................................................................................... 153 2 Mapeo de Puertos (II) ..................................................................................................... 154 3 Mapeo de Puertos (III) .................................................................................................... 155 4 Mapeo de Puertos (IV) .................................................................................................... 156 5 Aprovisionamiento de componentes ............................................................................... 157 6 Cálculo precio unitario componentes en función de las unidades (I) .............................. 159 7 Cálculo precio unitario componentes en función de las unidades (II) ............................ 160 8 Especificaciones Generales del 555 ................................................................................ 227

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


236

Dise帽o e Implementaci贸n de un Analizador L贸gico Digital basado en un microprocesador ARM7

Vilari帽o Valle, Marta


237

…Una foto para el recuerdo…

Escuela Técnica Superior de Ingenieros de Telecomunicación. Universidad de Valladolid


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.