Universidad ORT Uruguay
Facultad de Ingeniería
Osciloscopio USB
Entregado como requisito para la obtención del título de Ingeniero en Electrónica
Pablo Rodriguez Hoffman - 139082
Martin Szmulewicz - 139123
Tutor: Ing. Claudio Misail
2006
Abstract
Español
Este proyecto consiste en el desarrollo del prototipo de un dispositivo
digital de captura de señales eléctricas (también conocido con el nombre de
osciloscopio) con conexión a la PC a través del puerto USB.
El osciloscopio posee 2 canales de 8 bit y es capaz de capturar hasta 8
millones de muestras por segundo (MSPS) con la posibilidad de extenderlo
fácilmente a 40 MSPS. Su diseño está basado en un microprocesador central y
varios componentes (controlados por dicho procesador) para llevar a cabo
la tarea de captura.
El microprocesador pertenece a la popular familia de procesadores PIC de
Microchip, en particular a la línea PIC18F que constan de un controlador USB
incorporado.
Entre los componentes se encuentra un conversor analógico digital (para
la digitalización de datos), una memoria SRAM (para usar de buffer) y
contadores de 8-bit (para direccionar la memoria).
Además de la especificación y construcción del hardware, el proyecto también
contiene el diseño e implementación del firmware (programa que corre en el PIC
para controlar los componentes), software (interfaz gráfica que corre en la PC
para controlar el osciloscopio) y el protocolo utilizado para comunicarse entre
ellos.
Todo el proyecto está liberado bajo licencias de libre distribución
(concretamente, GPL y FDL).
English
This project involves the development of the prototype of an electrical signal
acquisition device (also known as oscilloscope) with a PC connection through
the USB port.
The oscilloscope has 2 8-bit channels and is capable of acquiring up to 8
millions of samples per second (MSPS) with the possibility of improving it
(with minimal effort) to work at 40 MSPS. Its design is based on a
central microprocessor and several components (controlled by such processor)
which take of the whole acquisition task.
The microprocessor belongs to the popular family of Microchip PIC processors,
in special the PIC18F line which contains an embedded USB controller.
Among the components there is a analog-digital converter (which digitalize the
data), an SRAM memory (used for buffering) and 8-bit counters (for addressing
the memory).
Besides specification and building of the hardware, the project also contains
the design and implementation of the firmware (program which runs on the PIC to
control the hardware), software (graphical interface which runs on the PC to
control the oscilloscope) and the protocol used to communicate between them.
The project has been entirely released under free distribution licenses
(namely, GPL and FDL).
Distribución de la documentación
Esta documentación se encuentra distribuida en 11 capítulos y 7 apéndices de la
siguiente manera:
Capítulo 1. Introducción
En este capítulo se realiza una introducción al proyecto presentando los
objetivos, motivaciones y aspiraciones del mismo. También cuenta como fue el
proceso de planificación y las herramientas utilizadas para llevarlo adelante.
Capítulo 2. Investigación y análisis
Este capítulo muestra un estudio de las tecnologías existentes en el mercado en
el momento de comenzar el proyecto para tener una noción de las prestaciones y
el precio al cual debíamos aspirar. También se presentan diferentes fundamentos
teóricos relacionados con la implementación del osciloscopio.
Capítulo 3. Bus serie universal (USB)
Este capítulo trata sobre el estándar USB y su funcionamiento, con especial
énfasis en los temas relacionados con la implementación del osciloscopio.
Capítulo 4. Hardware
Este capítulo cubre todos los temas relacionados con el diseño del hardware del
osciloscopio desde la selección de la arquitectura y cada uno de sus
componentes, hasta el análisis de tiempos y el consumo de potencia.
Capítulo 5. Firmware
Este capítulo habla sobre los temas relacionados con la implementación del
firmware, es decir, el programa que corre en el microprocesador y controla el
funcionamiento de la placa. Incluye información sobre la estructura del código
y detalles particulares de la implementación.
Capítulo 6. Software
Este capítulo trata sobre la implementación del software, que es la aplicación
utilizada en el PC para controlar el osciloscopio. Incluye información sobre el
diseño, selección de las herramientas, métodos de programación empleados,
estructura del código e funcionamiento del software.
Capítulo 7. Protocolo de comunicación
Este capitulo contiene la especificación del protocolo de comunicación junto
con los requisitos tenidos en cuenta para su diseño.
Capítulo 8. Fabricación y puesta en marcha
Este capítulo habla sobre temas relacionados con la implementación del
hardware, desde las compras de componentes hasta la fabricación y puesta en
funcionamiento de la placa.
Capítulo 9. Manual de usuario
En este capítulo se presenta el manual de usuario del osciloscopio, el cual
incluye una descripción de sus características y la guía de como utilizar el
software. Está orientado al usuario final del osciloscopio.
Capítulo 10. Temas pendientes y rentabilidad
Este capítulo se enumeran los temas que quedaron pendientes para un desarrollo
posterior del proyecto, junto con un comentario sobre la importancia y dificultad de cada uno. También se presenta un estudio de rentabilidad tentativo, a modo de ejemplo.
Capítulo 11. Autoevaluación y conclusiones
Este capítulo contiene una autoevaluación final del proyecto y las lecciones
aprendidas durante el año de trabajo en el mismo.
Bibliografía
Aquí se presenta la bibliografía completa de todo el material utilizado para elaborar esta documentación.
Apéndice I: Esquemáticos
Este apéndice contiene los esquemáticos completos del osciloscopio, separados
en bloques funcionales.
Apéndice II: Lista de materiales (BOM)
Este apéndice contiene la lista de todos los componentes necesarios para la fabricación del osciloscopio (también conocida como BOM).
Apéndice III. Hojas de datos
Este apéndice contiene enlaces a las hojas de datos de todos los componentes
utilizados o mencionados en la documentación. Por razones de espacio, solo se
publican los enlaces.
Apéndice IV: Glosario
Este apéndice contiene la lista de términos, abreviaciones y siglas utilizadas en la documentación del proyecto, junto con su debida explicación.
Apéndice V. Lista de figuras
Este apéndice contiene una lista de todas las Figuras incluidas en la documentación.
Apéndice VI. Lista de tablas
Este apéndice contiene una lista de todas las tablas incluidas en la documentación.
Apéndice VII. Licencias
Este apéndice contiene las versiones oficiales (en inglés) de las licencias bajo las cuales está liberado este proyecto.
Capítulo 1. Introducción
Contenido de este capítulo
Introducción
En este capítulo se realiza una introducción al proyecto presentando los
objetivos, motivaciones y aspiraciones del mismo. También cuenta como fue el
proceso de planificación y las herramientas utilizadas para llevarlo adelante.
Licencia
La presente documentación se encuentra liberada bajo la licencia
GNU Free Documentation License (FDL).
Asimismo, todo el resto del proyecto se encuentra liberado bajo la licencia
GNU General Public License (GPL), en cuyo contexto "código
fuente" debe entenderse como:
- los esquemáticos del osciloscopio
- el código fuente del firmware
- el código fuente del software
- la especificación del protocolo
Ambas licencias son de libre distribución y se encuentran disponibles en el
Apéndice VII. Licencias
.
Objetivos y motivaciones
El objetivo del proyecto fue el diseño y construcción del prototipo de un
dispositivo digital de captura de señales eléctricas (también conocido con el
nombre del osciloscopio) con conexión a la PC.
Las aspiraciones fueron lograr un osciloscopio lo suficientemente robusto y
confiable como para uso académico, de forma para poder comercializarlo en
liceos, facultades, escuelas técnicas, etc.
El osciloscopio debiera competir en prestaciones contra un osciloscopio típico
de laboratorio universitario, pero con un costo menor. Esto permitiría su fácil
inserción en esta área, e incluso extender su uso a otros niveles educativos
como la educación secundaria.
El producto también será de alto atractivo para entusiastas ya que el diseño
completo del proyecto es libre y abierto lo cual brinda a los usuarios finales
la posibilidad de modificarlo y extenderlo a gusto, sin ninguna restricción.
Las motivaciones principales para desarrollar este proyecto fueron las siguientes:
- tema de gran interés por parte de ambos integrantes del grupo
- alta posibilidad de inserción en el mercado, a nivel educativo
- escasez de proyectos similares en el mundo (osciloscopios abiertos)
Prestaciones
El osciloscopio debería poseer una serie de requisitos básicos para que pueda
ser usado con comodidad, y así poder aspirar a sustituir un osciloscopio
tradicional. Ellos son:
- protección y aislación contra sobrevoltajes
- buena interfaz de control para un manejo confortable
- otras características
- ancho de banda mayor a 10Mhz.
- buen rango de tensiones de entrada.
- ser compacto y fácilmente transportable
- bajo consumo para poder prescindir de una fuente externa y ser alimentado directamente del puerto USB, lo cual le brindaría una gran portabilidad
- funcionamiento multi-plataforma, para poder utilizarlo en Windows, Linux o Mac
- posibilidad de actualización de firmware
Si bien no todas estas características fueron alcanzadas en el prototipo,
las mismas fueron tenidas siempre presentes durante el desarrollo para al menos
poderlas dejar contempladas en el hardware, siempre que fuera posible.
Teniendo en cuenta que hoy en día un osciloscopio analógico típico de uso
académico (Tektronix 2205 / 20 Mhz) está en el entorno de los U$S 600 o más, la
meta fue diseñar y construir un dispositivo que pueda ser comercializado a un
precio menor pero con características similares o, en algunos casos,
superiores, para compensar la robustez de un osciloscopio de marca.
Además de cumplir con los requisitos básicos, se espera que el osciloscopio,
por su naturaleza digital, cuente con algunas prestaciones adicionales como
ser:
- Detección inteligente de transitorios (por software)
- Procesamiento digital de los resultados
- Almacenamiento de señales capturadas (tanto en formato gráfico como numérico) para su posterior procesamiento en programas de cálculo
- Análisis de espectro en tiempo real
Mentalidad y pautas de diseño
La idea sobre la cual trabajamos fue la de realizar el equipo físico lo mas
sencillo posible, volcando todo el procesamiento hacia el lado del PC, siempre
que fuera posible. En otras palabras, el hardware debería encargarse únicamente
de digitalizar los datos y enviarlos al ordenador. Luego el PC es quién se
encargará de analizarlos los datos, procesarlos, realizar cuentas, etc. El
hardware se limitaría a recibir solicitudes de captura y ejecutarlo con ciertos
parámetros como ser: velocidad de adquisición y rango de entrada.
El prototipo implementado está basado en un microcontrolador central que
controla la lógica de funcionamiento de la placa, y es el encargado de comandar
a todos los componentes para llevar a cabo la captura y transferencia de los
datos.
En cuanto a la placa misma, podemos dividirla en varios bloques funcionales, que son los siguientes:
- Bloque de control principal - compuesto por el microprocesador
- Bloque de entrada - encargada de la adquisición y adaptación de la señal
- Bloque de captura - etapa de alta velocidad donde se realizarán la digitalización de las señales y el almacenamiento de las muestras
- Bloque de salida - sonde se realiza la conexión al puerto USB de la PC (incluye protección)
Un dato interesante a destacar es que, para altas velocidades, el bloque de
captura trabaja una velocidad mucho mayor de la que es capaz de controlar el
microprocesador, por lo cual éste no podrá ser usado para controlar
directamente el proceso de captura. Más adelante veremos como se resolvió este
problema.
En cuanto al software, el mismo intentará replicar lo más posible la interfaz
de un osciloscopio estándar para permitir una operación sencilla e intuitiva y
minimizar la curva de aprendizaje. Este posee controles de velocidad de barrido
y rango de tensiones de entrada, con la posibilidad de seleccionar cualquiera
de los dos canales independiente o simultáneamente.
El software será el encargado de enviar el comando apropiado de captura, según
la frecuencia de trabajo (división horizontal) seleccionada, exonerando así al
microprocesador de esta decisión y aliviando su lógica de funcionamiento
haciendo más sencilla su tarea. La aplicación del osciloscopio deberá ser capaz
también de permitir cambiar los parámetros de captura "al vuelo" mientras se
está capturando, sin que el usuario tenga que que detener y volver a disparar
la captura.
El siguiente es un diagrama de la interconexión de los diferentes componentes
de la placa:
Fig 1.1 Diagrama de interconexión de componentes
Si bien se ha logrado prototipo completamente funcional, hay ciertos puntos que
aún quedan pendientes en su implementación, que debieron dejarse de lado por
razones de tiempo. Estos puntos son discutidos con más profundidad a lo largo de
toda la documentación y se encuentran resumidos en el
Capítulo 10. Temas pendientes y rentabilidad
.
Planificación
Las primeras dos semanas del proyecto fueron dedicadas exclusivamente a la
planificación del mismo. En estas semanas se fijaron las pautas generales a
seguir, se definieron las etapas a cubrir, objetivos, plazos y aspiraciones.
Además, se escogió la herramienta a utilizar para el seguimiento y trabajo
conjunto del proyecto.
Herramientas de trabajo
Wiki
Como primera instancia se eligió una herramienta a utilizar para realizar el
seguimiento del proyecto y trabajo en conjunto. Dicha herramienta debía cumplir
los siguientes requisitos:
- versionado: permitir la edición conjunta del contenido guardando un registro de cambios (para tener un seguimiento de los mismos y no perder nada)
- notificaciones: tener un sistema de notificación (via mail) cada vez que se realiza algún cambio
- documentación: servir como herramienta para escribir la documentación de forma colaborativa y simultánea
- seguimiento: permitir llevar una lista de las tareas pendientes y un registro de las tareas terminadas
- accesibilidad: ser accesible sin restricciones desde cualquier plataforma (Windows, Linux, Mac) o lugar de trabajo (ie. accesible desde Internet)
Luego de evaluar estas requisitos se encontró que la herramienta que más se
ajustaba a estas necesidades era una herramienta wiki. El uso de herramientas
wiki ha crecido mucho últimamente en popularidad gracias a proyectos como la
Wikipedia que hacen uso de ellas. Básicamente, una aplicación Wiki permite
tener un sitio web cuyas páginas son editables por los mismos usuarios que las
acceden.
Esto permite editar los documentos y trabajar sobre la información de forma
colaborativa, es decir, editar conjuntamente las páginas sin que ocurran
conflictos ya que todos los cambios quedan registrados. Al realizarse algún
cambio la herramienta wiki notifica de los cambios a las personas suscritas a
dichas páginas para que éstos puedan entrar acceder directamente a la página
que cambió y ver sus cambios. Esto brinda una gran flexibilidad a la hora de
trabajar colaborativamente de forma remota.
Por consiguiente, esta fue la herramienta escogida para el seguimiento y
documentación del proyecto. El Wiki escogido en particular es el ama
TWiki y
fue utilizada para llevar a cabo las siguientes tareas:
- bitácora de reuniones con el tutor
- apuntes y seguimiento de las investigaciones (bitácora de investigación)
- registro de mails importantes relacionados con el proyecto
- tormenta de ideas para el diseño
- documentación (esta documentación fue escrita en TWiki)
- seguimiento del progreso del proyecto con la posibilidad de ver cuales fueron los últimos documentos modificados y que fue lo que cambió
- proveer una web pública del proyecto (para su divulgación y difusión) lo cual es un requisito para proyecto de naturaleza abierta como este.
- almacenamiento de información administrativa (carta del proyecto, pautas, etc)
- seguimiento de compras y presupuesto disponible
A continuación se listan, a modo de ejemplo, algunas de las páginas pertenecientes al TWiki y su función.
Dichas páginas pueden ser accedidas libremente desde Internet. En todo
momento,el sitio web del proyecto estuvo abierto a cualquier persona
interesada. Esto nos pareció una idea interesante desde el principio, no solo
para promocionar el proyecto, sino también para recibir ideas y comentarios de
otras personas, lo cual efectivamente ocurrió.
La siguiente captura de pantalla muestra la página principal de TWiki.

Fig 1.2 Página principal de TWiki (sitio web del proyecto)
Por último, vale mencionar que TWiki es una herramienta de software libre
liberada bajo licencia GPL cuyo código es abierto y está disponible para bajar
en su página web:
http://twiki.org.
CAD electrónico
La segunda herramienta que se seleccionó fue el CAD para diseñar y dibujar los
esquemáticos. Al igual que el Wiki, la elección de un CAD adecuado nos parece
una tarea crucial para asegurar el desarrollo óptimo del proyecto, por lo cual
se optó por dedicar un tiempo considerable a evaluar alternativas.
Los puntos que consideramos importantes a la hora de seleccionar un CAD fueron:
- que la interfaz de uso (para crear pistas, mover e interconectar componentes, buses, etc) del programa fuera ágil e intuitiva
- que tuviera una gran librería de partes y un buen editor de componentes
- que tuviera un simulador potente
- que tuviera la posibilidad de encapsular sub-circuitos como bloques tipo caja negra
Los programas que evaluamos fueron los siguientes:
- Circuit Maker 2000
- CadSoft Eagle
- Orcad 10
- Electronics Workbench Multisim 8
Los resultados de dicha evaluación se detallan a continuación:
1. Circuit Maker 2000
El primer CAD que probamos fue el Circuit Maker 2000, ya que es el CAD
electrónico oficial de la ORT. Si bien la interfaz en si es bastante sencilla
de usar, el simulador que trae es muy pobre. Otra carencia que le encontramos
fue la reducida librería de componentes y una interfaz no muy cómoda para
el diseño de nuevos componentes. Todas estas razones nos llevaron a descartar
el Cicuit Maker como CAD de diseño.
2. CadSoft Eagle
En segunda instancia probamos el Eagle de CadSoft. Este CAD es muy popular entre entusiastas y aficionados ya que posee dos grandes ventajas:
- es gratuito para usos sin fines de lucro (como el nuestro)
- hay versiones para Windows, Linux y Mac
Las características de ser multiplataforma y gratuito le han hecho ganar mucha popularidad en el mercado. Sin embargo (y a diferencia de los otros) no tiene simulador, razón por la cual optamos por descartarlo. Si bien al principio no sabíamos si íbamos a utilizar el simulador, consideramos importante tener prevista esta necesidad a priori.
3. Orcad 10
El Orcad nos pareció un CAD extremadamente potente (incluso más que el
Multisim) y con una muy buena librería de componentes. Sin embargo, el gran
problema que le encontramos fue su interfaz extremadamente compleja y algunas
carencias de la misma como la de la conexión rápida de buses, que el Multisim
sí posee.
4. Electronics Workbench Multisim 8
El Multisim fue el programa que decidimos utilizar como CAD electrónico pues
cuenta con las siguientes características muy útil carentes en todas (o
algunas) de las demás alternativas:
- capacidad de trazar e interconectar rápidamente buses (muy necesario para nuestros esquemáticos)
- interfaz sencilla e intuitiva de manejo, fácil colocación y movimiento de los componentes y sus interconexiones
- poderoso y cómodo editor de partes para poder crear componentes de forma rápida, completa y concisa
- buena librería de componentes
- muy buen simulador: potente y fácil de usar
Cronograma
En las primeras dos semanas de planificación se definieron las etapas del
proyecto junto con el cronograma a seguir. El mismo se presenta a continuación:
| | Jun/05 | Jul | Ago | Set | Oct | Nov | Dic | Ene | Feb | Mar | Abr/06 |
| Planificación | |
| Análisis | | |
| Presentación oral | | |
| Diseño | | |
| Implementación | | |
| Documentación | | |
| Entrega | | |
| Defensa | | |
Fig 1.3 Diagrama de Gantt del proyecto
Del cronograma se pueden distinguir 3 grandes etapas: análisis, diseño e
implementación (que son las etapas donde ocurrió efectivamente el desarrollo del
proyecto) y otras etapas administrativas como la presentación, entrega y
defensa.
Para nuestro asombro, podemos afirmar que el cronograma fue seguido con
bastante rigurosidad, prácticamente sin desvíos respecto a la propuesta
original, con la excepción de la etapa de diseño que se solapó con la de
implementación, aunque esto también había sido previsto y fue comentado en el
documento de presentación.
Referencias
- TWiki (herramienta wiki para seguimiento del proyecto)
- Microchip MPLAB (programador y depurar del PIC18F4550)
- Microchip MPLAB C18
- Electronics Workbench Multisim
- Circuit Maker
- Orcad
- CadSoft Eagle
- Wikipedia
- Licencia GPL (oficial, en inglés)
- Licencia GPL (traducción no oficial al español)
- Licencia FDL (oficial, en inglés)
- Licencia FDL (traducción no oficial al español)
Capítulo 2. Investigación y análisis
Contenido de este capítulo
Introducción
Este capítulo muestra un estudio de las tecnologías existentes en el mercado en
el momento de comenzar el proyecto para tener una noción de las prestaciones y
el precio al cual debíamos aspirar. También se presentan diferentes fundamentos
teóricos relacionados con la implementación del osciloscopio.
Productos existentes
Una parte importante de la investigación fue el estudio de las tecnologías y
productos existentes en el mercado, junto con sus especificaciones y precios.
Si bien el objetivo de nuestro osciloscopio no es competir en un mercado
comercial (sino a nivel académico), es importante conocer el mercado para
saber donde estábamos parados antes de comenzar el proyecto, y así tener una
idea del precio final al cual debíamos aspirar para tenerlo en cuenta a la hora
del cálculo de costos y estudio de rentabilidad.
Una carencia que padecía la mayoría de las productos encontrados, era que no
traían software para Linux, algo que consideramos básico para un ambiente
académico, por lo que el software multiplataforma fue una de las metas
principales desde el principio.
A continuación se listan algunos de los productos que encontramos disponibles
en Internet. La lista fue compilada en abril de 2005 y por lo tanto no
contempla modelos que hayan salido posteriormente. Todos los precios están en
dólares y no incluyen impuestos. No pudimos encontrar ninguno de estos
osciloscopios en el mercado local uruguayo.
Pico Technology
Pico Technology es una empresa que se fundó en 1991 e inmediatamente obtuvo una
gran popularidad por sus osciloscopios y capturadores de datos para PC.
Tiene la de línea productos PicoScope 3000 donde el modelo más económico mide
señales de hasta 50 Mhz (2 canales) y cuesta U$S 760. Tiene un software
propietario para Windows y drivers para C, Pascal, Delphi y Visual Basic.
También tiene un modelo que mide hasta 200 Mhz cuyo costo de es U$S 1530.
TiePie Engineering
TiePie Engineering es una empresa holandesa que desarrolla y vende instrumento
de medida controlados por computadora. Siempre ha trabajado en el mismo rubro
desde su fundación, en el año 1987.
Algunos de los modelos que ofrecen son el Handyscope 4 (HS4) de 50 Mhz, 12 bit
y 4 canales con comunicación USB 2.0. por U$S 765, y el Handyscope 2 (HS2) de
200 kHz y 2 canales por U$S 500.
Tanto el software como el driver viene exclusivamente para Windows.
ETC
ETC es una empresa fundada en 1996 y dedicada al diseño y producción de dispositivos de medida para PC, utilizando FPGAs y CPLDs.
Uno de sus productos es el M521 de 60 Mhz y 2 canales por U$S 550, mientras que
el M524 de 120 Mhz cuesta U$S 780. El software es para Windows y tiene
disponibles drivers para Delphi y Visual Basic con un costo adicional.
Bitscope
Bitscope es una empresa australiana con firmes creencias en el software y
hardware libre, y su osciloscopio es quizás el más peculiar de todos puesto que
es el único que se caracteriza por ser de hardware abierto, lo cual significa
que en su página se encuentran publicados todos los esquemáticos del mismo,
junto con abundante documentación sobre su construcción y decisiones de diseño,
como así también los protocolos usados. Todo esto permite que un usuario, a
partir de la información de la página, pueda construirse el osciloscopio que
ellos venden, siempre y cuando tenga los medios y conocimientos necesarios.
Como fieles adeptos al software libre encontramos esta postura fascinante y no
nos avergüenza confesar que muchas ideas para nuestro osciloscopio fueron
tomadas de allí.
Uno de sus osciloscopios es el BS300 de 75 Mhz y 2 canales por U$S 495. El software, por supuesto, corre tanto en Windows como en linux.
Áreas de diseño
Una de las tareas realizadas en la etapa de análisis fue la de definir las
áreas de diseño que tendríamos que abordar. Finalmente llegamos a la decisión
de que el diseño se dividiría en 3 grandes etapas:
- Diseño del hardware analógico
- Diseño del hardware digital
- Diseño del software
A su vez cada una de ellas se divide en pequeñas sub-etapas de: a) estudio b)
diseño c) realización. En otras palabras, encaramos cada área de diseño como un
pequeño proyecto en sí mismo. Cabe recalcar que las áreas tampoco son temas de
estudio independientes puesto que todas están relacionadas entre si.
La etapa más importante (y la que tuvimos que definir primero) fue la del
Hardware digital puesto que allí se definía la arquitectura del sistema y de
ella dependía todo el resto del diseño como ser: procesador, placa, entorno de
desarrollo, etc.
Diseño del hardware analógico
Esta etapa consistió del diseño y especificación de:
- componentes a usar en la etapa de entrada para adaptación y protección de la misma
- protección de transitorios del puerto USB
- estudio del consumo de potencia y la necesidad de utilizar un regulador (7805 o similar)
Diseño del hardware digital
Esta etapa consistió en:
- selección de la arquitectura a usar
- diseño y selección de todos lo componentes digitales a utilizar
- especificar la interconexión de los componentes (esquemáticos)
Diseño del software
Esta etapa (posiblemente la más larga) consitió en:
- diseño del firmware (software a correr en el microprocesador), algoritmos de captura, etc
- diseño del software a correr del lado del PC para controlar y manejar el firmware del osciloscopio
- especificación del protocolo de comunicación a usar entre el firmware y el software
Bitácora de investigación
La bitácora de investigación es una sección en donde hemos colocado un resumen
de todo lo que hemos investigado en cuanto a tecnologías y diseño. Aquí se
encuentra todo lo relacionado a los diferentes tipos de muestreo, tipos de
memoria, consejos que nos han dado ingenieros, etc.
En este diario se colocaron referencias y pequeños resúmenes de todo lo que se
fue investigando previo a la etapa de diseño.
Todo el resto de los apartados de este capítulo son temas tratados en la
bitácora de investigación. En las referencias se encuentra publicada la
dirección de la bitácora de investigación.
Mecanismos de disparo
En los osciloscopio existen 3 tipos de mecanismos de disparo (trigger) según la finalidad con la que se utilice. Estos son:
- Mecanismo de disparo básico
- Este es el trigger que usan los osciloscopios analógicos para poder mantener fija la imagen que se muestra en la pantalla.
- Mecanismo de disparo por detección de transitorios
- Utilizado por los osciloscopios digitales (con memoria) para capturar eventos anómalos de una señal y desplegar la forma de la señal en el momento en que estos ocurren.
- Disparo externo
- Este es el mecanismo de disparo que permite observar lo que ocurre en una de las puntas del osciloscopio cuando llega un disparo (pulso, transitorio, etc) en la otra punta (de allí el nombre disparo externo).
Tipos de muestreo
Tiempo real
Este método de muestreo es el mas simple de todos y es el único que permite
digitalizar completamente señales no periódicas y transitorias.
Cada muestra y el tiempo en que fue tomada tiene una correspondencia directa con su equivalente en tiempo real.
A mayor tasa de muestreo en comparación al ancho de banda de la señal, se obtiene una mayor definición en el resultado.
Nyquist desarrolló un teorema que dice que para reconstruir una señal de frecuencia Fm, se debe muestrear a un índice mayor a 2Fm. Sin embargo, esto no se aplica tan directamente como parece. Esta teoría se aplica solamente a señales de ancho de banda limitado que no contienen ningún componente sobre la frecuencia Fm, y los bordes rápidos de las señales encontradas en circuitos digitales de alta velocidad pueden contener armónicos significativos sobre sus frecuencias fundamentales. Mas aún, cuando uno muestrea una señal, no lo hace por un tiempo infinito, sino que esta señal se ve acotada en el tiempo. Al recortar esta señal se le agregan componentes de frecuencia mas altas. He aquí entonces el problema de muestrear dichas señales: no se puede muestrear sólo al doble de la frecuencia Fm, sino que hay que hacerlo a una frecuencia mayor. Por lo tanto, no importa cuan rápido se muestree, nunca se podrá recomponer esta señal a la perfección.
Sin embargo, en la práctica se ha encontrado que muestreando a una velocidad cuatro veces mayor que la mayor componente de frecuencia de la señal, se puede obtener un resultado muy confiable y con bajo error.
Si se muestrea a una frecuencia menor a 4Fm pero mayor a 2Fm, obtendremos un resultado mas lejano al ideal, y cuanto mas nos acerquemos al limite de 2Fm, más errores contendrá nuestra reconstrucción. Así mismo, si pasamos por debajo del umbral de 2Fm para la frecuencia de muestreo, el
aliasing es inevitable.

Fig 2.1 Método de muestreo en tiempo real
- Ventajas:
- La única opción para una medida correcta de señales no periódicas.
- Desventajas:
- Ancho de banda relacionado directamente con la tasa de muestreo.
- Susceptible al aliasing a velocidades de muestreo lentas.
Tiempo equivalente
Es muestreo en tiempo equivalente (ver referencias) cuenta con los siguientes
características:
- única forma para 2fs > fm
- solo para señales periódicas
- la señal se va construyendo en barridos sucesivos
- 3 tipos de barridos:
- aleatorio repetitivo
- secuencial
- submuestreo
El muestreo en tiempo equivalente abarca los siguientes tipos:
- Muestreo aleatorio repetitivo
- Muestreo secuencial
- Submuestreo
Muestreo aleatorio repetitivo
Este tipo de muestreo se utiliza para aumentar la frecuencia máxima de medición de la señal de entrada.
El muestreo aleatorio repetitivo captura datos sobre la forma de onda
adquiriendo puntos en más de una ocurrencia del trigger. Esto significa que
la forma de onda en sí misma debe ser repetitiva (periódica) y no un
acontecimiento transitorio, puesto que la tasa de muestreo en estos casos es
típicamente demasiado baja para señales transitivas de alta frecuencia.
En cada ocurrencia del disparador se adquieren algunos puntos de referencia,
luego todos los puntos muestreados se juntan en un cuadro compuesto de la forma
de onda. Cada punto es puesto en su lugar apropiado midiendo el tiempo
transcurrido entre el trigger y la propia muestra.
A medida que muestreamos mas ciclos, más muestras obtenemos, y luego son
ubicadas en un mismo ciclo pero en la posición correspondiente medida a partir
del trigger.

Fig 2.2 Método de muestreo aleatorio repetitivo
- Ventajas:
- Ofrece mayor ancho de banda que el muestreo en tiempo real.
- No es susceptible al aliasing en señales repetitivas.
- Desventajas:
- No es apto para mediciones de señales no periódicas y de alta velocidad.
Muestreo secuencial
Los capturadores digitales de gran ancho de banda tienden a utilizar el muestreo secuencial.
Este método captura una muestra por ciclo (o cada
x cantidad de ciclos) pero con un determinado tiempo muy exacto entre el disparador y el punto de captura.
Para este tipo de muestreo es necesario, al igual que en el caso anterior, una señal periódica.
Cada muestra es tomada pasado cierto intervalo de tiempo luego de disparado el
trigger. Para la siguiente captura, el intervalo de espera es incrementado, y por lo tanto dicha muestra va a ser tomada un instante de tiempo después en el ciclo que la muestra anterior.
Los puntos son tomados siempre en puntos diferentes del ciclo de la señal de entrada, sin importar en qué ciclo fue tomada la muestra. De este modo, al finalizar la captura de todas las muestras, cada una de ellas es posicionada en un único ciclo, pero en la posición que le corresponde a partir del tiempo transcurrido desde el
trigger.

Fig 2.3 Método de muestreo secuencial
- Ventajas:
- Ofrece el mayor ancho de banda disponible (hasta 50Ghz).
- Muy bajo ruido.
- puede utilizar un A/D lento y de alta precisión.
- Desventajas:
- No puede capturar eventos previos al trigger e incluso pasado un mínimo tiempo tras el.
- Susceptible al aliasing a velocidades de muestreo lentas.
- No puede medir transitorios.
Submuestreo
Se conoce que el teorema de Nyquist dice que la frecuencia de muestreo tiene que ser mayor al doble del ancho de banda de la señal a muestrear. Sin embargo muchos confunden
ancho de banda con
frecuencia mas alta. El error aquí es que una señal contenida en los 100Khz, puede tener un ancho de banda de 1Khz. De este modo, según el teorema de Nyquist bien aplicado, se podría muestrear dicha señal a una frecuencia mayor a 2Khz (la que es mucho menor a 200Khz). La imagen siguiente muestra gráficamente cómo se superponen los espectros de señales de gran ancho de banda muestreadas a una frecuencia menor a su ancho de banda.
Este método de explicación es conocido como el método
fanfold.

Fig 2.4 Espectro completo de una señal

Fig 2.5 Efecto del aliasing
Ahora tomamos por ejemplo el caso antes mencionado, de una señal de ancho de banda acotado, y centrado en una frecuencia alta.
A su vez hacemos que pase por filtros para estar seguros de que evitamos el
aliasing, entonces tenemos un resultado fiable de la señal muestreada.

Fig 2.6 Espectro de la señal filtrada

Fig 2.7 La señal muestreada no es afectada
- Ventajas:
- Permite medir señales de alta frecuencia con conversores de baja frecuencia.
- Desventajas:
- La señal debe ser de ancho de banda acotado.
- Necesidad de filtrado anti-aliasing.
- No apto para medición de grandes anchos de banda.
- Carece de sentido en señales de banda base.
Métodos de conversión y transferencia
Los métodos de conversión y transferencia disponibles son los siguientes:
- Tiempo real
- como funciona: la señal se va muestreando y procesando de manera continua, sin interrupciones
- cuello de botella: tasa de muestreo (sample rate) del ADC, y velocidad de transferencia hacia el ordenador.
- cuando y porque se usa:
- para medir transitorios (es la única forma de poder medirlos)
- para medir señales lentas (periódicas y no periódicas)
- Por ráfagas
- como funciona:
- se toman muestras de la señal rápidamente hasta llenar un buffer
- se detiene el proceso de muestreo mientras se procesan (lentamente) los datos
- se vuelve a repetir el proceso
- cuello de botella: velocidad del microprocesador, velocidad transmisión por el bus serie/USB.
- cuando y porque se usa:
- se usa cuando el cuello de botella NO está en el ADC sino en otra etapa posterior (velocidad del microprocesador, transmisión placa-PC, etc)
- se usa para medir señales periódicas rápidas
- se puede usar también para medir señales muy lentas (tanto periódicas como no periódicas)
- no se puede usar para medir señales de frecuencia media
Errores de cuantización
Estos errores son parte de la etapa de conversión de la señal analógica en una representación digital de la misma.
A continuación presentamos los diferentes tipos de errores que encontramos en este proceso.
Error de compensación
El error de compensación esta definido como la diferencia entre la compensación nominal y la que realmente se tiene. Para el caso de un conversor analógico-digital, el punto de compensación nominal es el valor que se tiene en la entrada para obtener una salida igual a cero.
Cuando en la entrada se coloca este supuesto valor y en su salida se obtiene un valor diferente de cero, es justamente cuando existe un error de compensación. Esto bien puede corregirse ajustando los valores de compensación, y si no es posible ajustarlos, entonces se puede realizar en la etapa de análisis de los datos obtenidos, haciendo los ajustes necesarios en estos valores.

Fig 2.8 Error de compensación
Error de ganancia
El error de ganancia se define como la diferencia entre el valor de ganancia nominal (ganancia esperada, calculada) y la ganancia real. Este valor se calcula cuando el error por compensación es nulo, caso contrario se obtendrá un error en un calculo generado por otro error.
La figura siguiente muestra de forma simple el significado de este error.
Cuando se tiene un valor conocido a la entrada del conversor, de espera un valor de salida determinado. Cuando la diferencia entre el valor esperado y el obtenido es constante e igual sin importar cual sea el valor en su entrada, entonces se trata de un error de ganancia. Este error es lineal y constante en todo el rango posible de entrada. Este error también es posible solucionarlo, aunque también se puede corregir en etapas posteriores.

Fig 2.9 Error de ganancia
Error de apertura
El error de apertura es un tipo de error generado en los propios componentes y no es corregible. La incertidumbre en la señal de entrada en el momento en que se muestrea y retiene dicha señal
(sample&hold) esta dado desde el instante en que se la muestrea hasta que se la retiene, antes de pasar al proceso de conversión. El error de apertura puede ser generado por ruidos o también por variaciones en la señal de reloj. Este error también influye en las características finales del sistema.
Este error puede ser reducido si el tiempo de muestreo y retención disminuye. Si este valor es lo más pequeño posible, entonces se tiene mayor certeza de que la conversión realizada es correcta.

Fig 2.10 Error de apertura
Error de no-linealidad diferencial
El error de no-linealidad diferencial
(Differential Nonlinearity | DNL Error)
es la diferencia entre la variación de tensión nominal que genera un cambio en
un bit a la salida del conversor (1 LSB) y la variación real que debe ocurrir.
Es decir, que si el cambio de tensión que debe ocurrir a la entrada para que
haya un cambio en la salida de un bit es exactamente el esperado, entonces el
error DNL es cero. En cambio, si para que haya un cambio en la salida, el
diferencial de tensión a la entrada debe ser mayor (o menor) al que se
especifica, entonces existe este tipo de error. Incluso este tipo de error
puede generar que existan valores binarios de salida que nunca se lleguen a
dar, debido que el rango de entrada tiene como respuesta una menor cantidad de
valores debido al error citado (cuando el diferencial de tensión de entrada es
mayor que el especificado para 1 LSB).

Fig 2.11 DNL Error
Error de no-linealidad integral
El error de no-linealidad integral (Integral Nonlinearity | INL Error )_ esta
definido como la desviación de los valores de la función de transferencia real
sobre una linea recta. Esta línea recta puede ser definida como la mejor
aproximación que minimice estas desviaciones, o bien entre los puntos extremos
de la función de transferencia una vez que se hayan anulado los errores de
ganancia y compensación. Este segundo método es conocido como _linealidad de
punto final_, y es el más usado ya que su verificación es más simple.
En un conversor analógico-digital esta desviación se mide en la transición de
un paso al siguiente (es decir, un aumento en 1 LSB), y el nombre de error
integral proviene de que se trata de la suma de estas desviaciones desde el
nivel más bajo hacia un valor determinado. Con esta definición se puede conocer
entonces el error causado por la no-linealidad integral en cada valor.

Fig 2.12 INL Error
Error de cuantización
El error de cuantización esta basado en la naturaleza de las señales analógicas
y las digitales. Una señal analógica es continua, y puede tener
infinitos
valores (por mas que la señal este acotada), mientras que una señal digital es
discreta, tiene una cantidad
finita de valores posibles.
Aquí entonces radica este error. Al intentar traducir una señal que puede tener
infinitos valores en otra que solo puede tener valores
finitos, esta claro
que se pierde información. La cantidad de valores posibles (o
estados
posibles) que puede tener la señal digital esta relacionada con la cantidad de
bits con la cual ésta se representa. Sin embargo la cantidad de bits es una
cantidad
finita. La única forma de hacer que este error sea nulo, es haciendo
que la cantidad de bits con la que se representa el valor digital sea infinito.
Esto implica que cierto valor digital representa a
muchos (de hecho,
infinitos) valores analógicos posibles. De esta forma, un valor analógico
produce una salida digital, y esa salida digital si se vuelve a convertir a un
valor analógico, puede que no corresponda con el valor original. Cierta
información se ha perdido en este proceso, y esto se conoce como error de
cuantización.
En el caso de un conversor ideal, donde la función de salida puede creerse como
una
escalera perfecta, el error entre la señal real de entrada y su
correspondencia con la salida digital, tiene una función de densidad de
probabilidad uniforme en el caso de que se asume que la entrada es totalmente
aleatoria. Este error varía en el rango de ±1/2 LSB, o bien, ±q/2, donde q es
el ancho de un escalón, tal se muestra en la siguiente figura.

Fig 2.13 Error de cuantificación
Error absoluto
El error absoluto en la exactitud del proceso de conversión es la diferencia
máxima que se encuentra entre el valor analógico de la señal de entrada con el
valor medio que se define para ese mismo código binario de salida. Este error
es absoluto, y es por ello que incluye a todos los errores citados previamente
(compensación, ganancia, no linealidad, e incluso cuantización).

Fig 2.14 Error absoluto
Referencias
- Bitácora de investigación
- Productos disponibles
- Pico Technology
- TiePie Engineering
- ETC
- BitScope
- Tipos de muestreo
- Errores de cuantización
- Figuras
Capítulo 3. Bus serie universal (USB)
Contenido de este capítulo
Introducción
Este capítulo trata sobre el estándar USB y su funcionamiento, con especial
énfasis en los temas relacionados con la implementación del osciloscopio.
El estándar USB
El bus serie universal (Universal Serial Bus, o simplemente USB) es un estándar
diseñado para conectar dispositivos, a través de un bus serie. Fue
originalmente pensado para conectar dispositivos a computadoras, eliminando la
necesidad de conectar tarjetas PCI (o similares), como así también conectar y
desconectar los dispositivos sin tener que reiniciar la PC (hot-swap). Sin
embargo, hoy en día también se utiliza en consolas de juegos e incluso en
algunos equipos de audio y video.
El diseño del protocolo USB está a cargo del USB Implementers Forum (USB-IF),
una organización compuesta por varias empresas del ramo de la computación y la
electrónica, entre las que se encuentran Apple Computer, Hewlett-Packard,
Microsoft e Intel.
La versión actual del protocolo USB es la 2.0, pero su especificación a tenido
varias revisiones a lo largo de la historia, las cuales se muestran en la
siguiente tabla.
| Estándar | Publicación | Detalles |
| USB 0.9 | Noviembre, 1995 | Primer borrador |
| USB 1.0 | Enero, 1996 | Velocidad baja y velocidad completa |
| USB 1.1 | Setiembre, 1998 | Añade detalles y precisiones a la versión 1.0. |
| USB 2.0 | Abril, 2000 | Incorpora modo de alta velocidad |
Tabla 3.1 Revisiones del estándar USB
La versión 1.1 es el estándar mínimo que debe cumplir todo dispositivo USB hoy
en día. La última versión (2.0) soporta tasas de transferencia de altas
velocidades, comparables (o incluso superiores) a la de un disco duro o
almacenamiento magnético, lo cual ha permitido ampliar el uso del USB a
aplicaciones de video y almacenamiento masivo. Una de las razones a la cual se
atribuye su gran popularidad es que todas las versiones del protocolo son
compatibles hacia atrás. Es decir, que cualquier dispositivo 2.0 puede ser
conectado a un dispositivo 1.0, aunque funcionará la velocidad del más lento.
Las tres velocidades de transferencia soportadas son:
| Velocidad | bytes/s | bits/s |
| Baja | 183 Kbytes/s | 1.5Mbit/s |
| Velocidad completa | 1.4 Mbytes/s | 12Mbit/s |
| Alta velocidad | 57 Mbytes/s | 480 Mbit/s |
Tabla 3.2 Velocidades de transferencias USB
El tipo de Alta velocidad fue introducido en la revisión USB 2.0, mientras que
los otros ya existían desde la 1.0. Los de baja velocidad generalmente son
dispositivos de interacción con la computadora como ratones, teclados y
joysticks.
Topología
USB tiene un diseño asimétrico ya que consiste de un host controlador conectado
a múltiples dispositivos conectados en daisy-chain.
USB conecta varios dispositivos a un_host controlador a través de un cadenas de
hubs. Los hubs (al igual que en redes) son dispositivos que permiten, a partir
de un único punto de conexión, poder conectar varios dispositivos, es decir,
disponer de varios puntos de conexión. De esta forma se crea una especie de
estructura de árbol. El estándar admite hasta 5 niveles de ramificación por
host controlador con un límite absoluto de 127 dispositivos conectados al mismo
bus (incluyendo los hubs). Siempre existe un hub principal (conocido como el
hub raíz) que está conectado directo al host controlador.
Un mismo dispositivo USB puede cumplir varias funciones. Por ejemplo, un mouse
puede ser también lector de tarjetas, y de esa forma sería como dos
dispositivos conectados al bus USB. Por lo tanto es muy común hablar de
funciones en lugar de dispositivos.
Funcionamiento
Los dispositivos (o mejor dicho, las funcionas) tienen asociados unos canales lógicos unidireccionales (llamados
pipes) que conectan al host controlador con una entidad lógica en el dispositivo llamada
endpoint. Los datos son enviados en paquetes de largo variable (potencia de 2). Típicamente estos paquetes son de 64, 128 o más bytes.
Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada dirección, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de entrada y 16 de salida). La dirección se considera siempre desde el punto de vista del host controlador. Así un endpoint de salida será un canal que transmite datos desde el host controlador al dispositivo. Un endpoint solo puede tener una única dirección. El endpoint 0 (en ambas direcciones) está reservado para el control del bus.
Cuando un dispositivo es conectado al bus USB, el host controlador le asigna una dirección única de 7 bit (llamado proceso de enumeración) que es utilizada luego en la comunicación para identificar el dispositivo (o, en particular, la función). Luego, el host controlador consulta continuamente a los dispositivos para ver si tiene algo para mandar, de manera que ningún dispositivo puede enviar datos sin la solicitud previa explícita del host controlador.
Para acceder a un endpoint se utiliza una configuración jerárquica de la siguiente manera: un dispositivo/función conectado al bus tiene un único descriptor de dispositivo, quien a su vez tiene uno (o varios) descriptores de configuración. Estos últimos guardan generalmente el estado del dispositivo (ej: activo, suspendida, ahorro de energía, etc). Cada descriptor de configuración tiene uno (o más) descriptores de interfaz, y éstos a su vez tienen una configuración por defecto (aunque puede tener otras). Y éstos últimos finalmente son los que contienen los endpoint, que a su vez pueden ser reutilizados entre varias interfaces (y distintas configuraciones).
Como puede verse, la comunicación USB es bastante compleja y extremadamente más complicada que una simple comunicación serie.
Tipos de transferencia
Los canales también se dividen en cuatro categorías según el tipo de transmisión:
- transferencias de control - usado para comandos (y respuestas) cortos y simples. Es el tipo de transferencia usada por el pipe 0
- transferencias isócronas - proveen un ancho de banda asegurado pero con posibles pérdidas de datos. Usado típicamente para audio y video en tiempo real
- transferencias interruptivas - para dispositivos que necesitan una respuesta rápida (poca latencia), por ejemplo, mouse y otros dispositivos de interacción humana
- transferencias masivas - para transferencias grandes y esporádicas utilizando todo el ancho de banda disponible, pero sin garantías de velocidad o latencia. Por ejemplo, transferencias de archivos.
En realidad las transferencias interruptivas no son tales ya que los dispositivos no pueden enviar datos sin recibir autorización del host controlador. Por lo tanto, las transferencias interruptivas simplemente le dan más prioridad al sondeo del host controlador.
Señalización y conectores
Las señales USB son transmitidas en un par trenzado (cuyos hilos son
denominados D+ y D-) utilizando señalización diferencial half-duplex
minimizando el ruido electromagnético en tramos largos. El diseño eléctrico
permite un largo máximo de 5 metros, sin necesidad de un repetidor
intermediario.
Existen dos tipos de conectores: estándar y mini. Los estándar son los que
típicamente encontramos en un computador y vienen en dos tipos: A y B. El tipo
A es el que es chato y se encuentra del lado del host controlador, mientras que
el tipo B es el cuadrado y se encuentra del lado del dispositivo. Todos los
cables son machos, mientras que los enchufes (ya sea en la computadora o los
dispositivos) son hembra. No existen intercambiadores de género puesto que las
conexiones cíclicas no están permitidas en un bus USB. Los conectores mini
siguen la misma política que los estándar pero son utilizados para dispositivos
pequeños como Palm y celulares.
Los pines de un cable USB son los siguientes:
| Pin | Color | Función |
| 1 | Rojo | V.BUS (4.4 - 5.25 V) |
| 2 | Blanco | D- |
| 3 | Verde | D+ |
| 4 | Negro | Tierra |
| 5 | en corto con pin 4 en conector Mini-A, utilizado para USB On-The-Go |
Tabla 3.3 Pines del bus USB
A continuación se muestra un diagrama de los conectores (las medidas están en mm) y los números de los pines se corresponden con la tabla anterior.

Fig 3.1 Conector USB tipo A (izquierda) y tipo B (derecha)

Fig 3.2 Conector USB Mini tipo A (izquierda) y tipo B (derecha)
Potencia
El bus USB suministra 5V de continua regulados por cada uno de sus puertos,
entre los pines 1 y 4. Por lo tanto, dispositivos de bajo consumo de potencia
(que de otra forma vendría con un fuente de alimentación) puede obtener de allí
la corriente necesaria para el funcionamiento. El límite de corriente
suministrada es de 500mA por cada puerto. Además, el estándar exige no más de
5.25V en ningún caso, ni menos de 4.375V en el peor caso. Típicamente el
voltaje se mantiene en los 5V.
Algunos hubs se alimentan directamente del bus USB, en cuyo caso la corriente
total de todos los dispositivos conectados a él no puede superar los 500mA. Sin
embargo, la especificación permite solo un nivel de hub alimentados por el bus,
de forma que no es posible conectar un hub sin alimentación a otro hub sin
alimentación. Los hubs con alimentación propia no tienen esta restricción y
generalmente son necesario para conectar dispositivos de alto consumo como
impresoras o discos duros.
Cuando un dispositivo es conectado le reporta al host controlador cuanta
potencia va a consumir. De esta manera el host controlador lleva un registro de
los requisitos de cada puerto y cuando un dispositivo se excede
generalmente se apaga, cortándole el suministro de corriente, de forma de no
afectar al resto de los dispositivos. El estándar exige que los dispositivos se
conecten en un modo de bajo consumo (100 mA máximo) y comuniquen al host
controlador cuanta corriente precisan, para luego cambiar a un modo de alto
consumo (si el host se lo permite).
Los dispositivos que superen los límites de consumo deben utilizar su propia
fuente de poder.
Los dispositivos que no cumplan con los requisitos de potencia y consuman más
corriente de la negociada con el host, pueden dejar de funcionar sin previo
aviso o, en algunos casos, dejar todo el bus inoperativo, dependiendo del tipo
de host controlador usado.
Clases de dispositivos
Los dispositivos que se conectan puede tener sus propios drivers
personalizados. Sin embargo, existen lo que se llaman clases de dispositivos
que son pequeños estándar para distintos tipos de dispositivos y especifican
como deben compartirse los dispositivos en términos de los descriptores de
interfaz y de dispositivo, endpoints, etc. Esto permite que todos los
dispositivos sean fácilmente intercambiables y/o sustituibles puesto que hablan
el "mismo idioma". Por su parte, los sistema operativos solo tienen que
implementar drivers genéricos para todas las clases conocidas de dispositivos
lo cual alivia el alto costo de desarrollar y mantener un driver particular
para cada producto y modelo.
En conclusión, las clases de dispositivos son una estandarización de funcionalidades a un nivel superior al del bus BUS y que utiliza a éste último como medio de comunicación e intercambio de datos.
Tanto los descriptores de dispositivos como los descriptores de interfaz tiene un byte que identifica la clase. En el primer caso, todo el dispositivo/función pertenece a la misma clase, mientras que en el segundo un mismo dispositivo puede tener diferentes clases, cada una asociada a su descriptor de interfaz.
Dado que el identificador de la clase es un byte, existe un máximo de 253 clases diferentes (0x00 y 0xFF están reservados). Los códigos de las clases son asignados por el el USB Implementers Forum, y a continuación se presenta una lista de los más comunes.
| Código | Clase |
| 0x00 | Reservado. Usado en el descriptor de dispositivo para indicar que la clase está identificada en el (o los) descriptores de interfaz |
| 0x01 | Dispositivo de audio. Por ejemplo; tarjetas de sonidos |
| 0x03 | Dispositivo de interfaz humana (HID). Por ejemplo: mouses, teclados, joystick |
| 0x07 | Impresoras |
| 0x08 | Dispositivo de almacenamiento masivo. Por ejemplo: discos duros, lectores de memoria, cámaras digitales, reproductores MP3 |
| 0x09 | Hubs |
| 0x0A | Dispositivo de comunicación (CDC por sus siglas en inglés). Por ejemplo: módems, tarjetas de red |
| 0x0E | Dispositivo de video. Por ejemplo: webcams |
| 0xE0 | Controladores inalámbricos. Por ejemplo: adaptadores Bluetooth |
| 0xFF | Reservado. Usado para indicar que el dispositivo tiene un driver personalizado propio que no pertenece a ninguna clase |
Tabla 3.4 Clases de dispositivos USB
Nuestro osciloscopio USB, en particular, pertenece a la clase CDC (0x0A).
Referencias
- USB Implementers Forum (USB-IF)
- Especificación USB 2.0
Capítulo 4. Hardware
Contenido de este capítulo
Introducción
Este capítulo cubre todos los temas relacionados con el diseño del hardware del
osciloscopio desde la selección de la arquitectura y cada uno de sus
componentes, hasta el análisis de tiempos y el consumo de potencia.
Selección de la arquitectura
La primera decisión importante que tuvimos que tomar en la etapa de análisis
fue definir la arquitectura sobre la cual íbamos a construir el osciloscopio.
Es una decisión crucial porque todo el resto del diseño (selección de
componentes, etc) depende de ella.
El elemento más importante de la arquitectura es el microcontrolador a usar,
pues define el juego de instrucciones disponibles, el lenguaje a utilizar, etc.
En nuestro caso la decisión estuvo entre las siguientes 3 arquitecturas:
- usar un único integrado con conversor analógico-digital (ADC) y USB incluido
- usar un sistema linux embedded similar a un PC de bajo porte
- armar una placa con un microprocesador controlador y diferentes componentes específicos para cada tarea (ADCs, memoria, etc)
Arquitectura: Chip único
La opción de utilizar un único chip que ya tuviera integrado el ADC y el
controlador USB resultó muy tentadora al principio pues simplificaba
enormemente muchas otras decisiones de diseño. Un integrado en particular que
analizamos fue el C8051F065 de Silicon Laboratories (ver referencias) el cual
contaba con un ADC de 1MSPS/16 bits y un micro 8051. Su costo es de U$S 24 (el
integrado), más U$S 300 (placa de desarrollo). Además habría que comprarle un
bridge UART-USB (U$S 5) con su correspondiente placa de desarrollo (U$S 50).
Sin embargo, al profundizar el estudio nos dimos cuenta que la meta de los 20
MHz era inalcanzable siguiendo este camino, puesto que los ADC que vienen
incorporados en este tipo de chips ronda en los 500 KSPS - 1 MSPS y, aun
aplicando técnicas de submuestreo (y suponiéndolas exitosas) la frecuencia
máxima que era posible muestrear estaba muy lejos del mínimo requerido.
Ademas esta alternativa tenía la desventaja de la falta de flexibilidad, puesto
que de haber escogido este modelo hubiéramos realizado un diseño completamente
atado al integrado en cuestión y para nada extensible.
Por lo tanto, debido a estas dos desventajas (velocidad de captura y
portabilidad del diseño) decidimos descartar esta alternativa.
Arquitectura: Linux Embedded
Otra opción que investigamos muy a fondo es la posibilidad de utilizar una
arquitectura del tipo linux embedded, en el cual el sistema consta básicamente
de un PC, pero con menor potencia de procesamiento.
En éste área analizamos en particular el procesador ETRAX de la compañía Axis
(ver referencias). El procesador ETRAX es un procesador de 32 bits que trabaja
a 100 MHz y está diseñado para correr el sistema operativo Linux. Esto nos
brinda una flexibilidad enorme a la hora de desarrollar sobre dicha
arquitectura ya que Linux es una plataforma muy popular y con excelente
documentación lo cual nos brinda la sencillez de poder desarrollar en lenguaje
C sobre una plataforma robusta y probada, como es el caso de linux.
La gente de Axis pone a disposición una placa de desarrollo que es apropiada
para una gran variedad de aplicaciones, entre ellas nuestro proyecto. La misma
cuenta de:
- 2 puertos USB
- 1 puerto ethernet
- 2 puertos seriales
- 8 contactos secos
Fig 4.1 Placa de desarrollo ETRAX
Otra de las grandes ventajas de este enfoque es la de poder implementar un
osciloscopio de red autónomo ("standalone"), es decir, que funcione
independiente de una PC, al cual nosotros llamamos "Osciloscopio IP". La
interfaz por excelencia en este tipo de dispositivos hoy en día es la Web, y
este caso no sería la excepción. Alguien con una Palm y acceso a la red del
osciloscopio podría perfectamente manejarlo. La misma aplicación se puede
extender para casos en los que el usuario no se encuentra físicamente en el
mismo lugar que el osciloscopio de forma que alguien pueda dejar conectado el
osciloscopio en el laboratorio y luego obtener muestras desde la casa.
Sin embargo, debido a la naturaleza de nuestro proyecto es indispensable
discutir sobre dos temas: por un lado, como se hará la conexión de los ADC
(conversores analógicos-digitales), ya que la placa de desarrollo no viene con
ADC incluidos, y por otro como se hará para asegurar el funcionamiento en
tiempo real del dispositivo. Estos puntos se discuten a continuación:
Conexionado de los ADC
Debido a la alta velocidad de trabajo requerida para los conversores
analógico-digital (40 Mhz) la única forma de conectar el ADC es utilizando DMA,
de forma que los datos sean transferidos directamente a memoria, sin pasar por
los registros del procesador, lo cual enlentecería el proceso impidiendo llegar
a la velocidades necesarias. El ETRAX en particular viene con dos canales DMA
externos que son ideales para conectar los dos ADC que va a tener nuestro
osciloscopio.
Los canales de DMA externo del ETRAX pueden trabajar de dos formas diferentes:
en modo negociación (
handshake) y en modo ráfagas (
burst). Sin embargo, aún
trabajando en modo ráfagas un ciclo completo de DMA dura no menos de 5 ciclos
de reloj, lo cual nos reduce la frecuencia de muestreo máxima a 20 Mhz,
restringiendo así a 10 MHz el ancho de banda máximo de las señales a medir.
Linux en tiempo real
Debido a las exigencias tan estrictas de tiempo, uno de los requisitos para
poder implementar el osciloscopio con el ETRAX es la utilización de un linux
compilado para poder poder trabajar en tiempo real (característica no
disponible en los linux estándar). Actualmente existen varias distribuciones de
linux en tiempo real (real-time linux). Dos de las más conocidas son: RTLinux y
RTAI. RTLinux nació como un proyecto de código abierto pero luego se hizo
comercial, cerrando el código y la comunidad de software libre que lo apoyaba.
De esta, mucha gente que trabaja en RTLinux se volcó a trabajar en otro
proyecto muy similar ya existente llamado RTAI en el cual la permanencia del
código bajo licencia libre es uno de sus principios básicos. Hoy en día RTAI es
la distribución de real-time linux con mas movimiento, aunque RTLinux sigue
siendo la preferencia para proyectos crítico de medicina y aeronáutica.
Afortunadamente, un par de ingenieros neozelandeses ya portó el RTAI para el
ETRAX como tesis de maestría (ver Referencias) y por lo tanto lo tendríamos
disponible para usar en el proyecto en el caso de que optáramos por esta
arquitectura.
Ventajas y prestaciones adicionales de un Osciloscopio IP
La interfaz web podría tener un menú de
captura fuera de línea, es decir, una
página donde se llena el formulario con los parámetros de la captura y luego se
envía la solicitud de captura, devolviendo el osciloscopio inmediatamente los
datos medidos, ya sea en forma de un imagen o una tabla de datos en formato CSV
(para abrir en planillas de cálculo, por ejemplo).
También dentro de la interfaz web se podría proveer una
aplicación Java para
controlar el osciloscopio, evitando de esta forma tener que instalar un
software en las PCs donde se lo quiera usar: bastaría solo con tener Java
instalado, lo cual es algo muy común en las PCs de hoy en día y además le
agregaría la ventaja de ser multiplataforma (correría en Windows, Linux y Mac).
Otra idea interesante disponible en el caso de utilizar el procesador ETRAX es
la de tener la posibilidad de conectarle al osciloscopio un disco duro USB
(tipo pendrive) y realizar captura de datos allí para luego analizarlos
posteriormente en una PC.
Otras ventajas de esta arquitectura son las siguientes:
- es algo innovador (no hemos encontrado ningún proyecto similar existente)
- deberíamos tener menos imprevistos armando el sistema con el ETRAX puesto que hay menos partes de hardware para implementar y la placa de desarrollo ya viene diseñada para trabajar a altas frecuencias (100 Mhz)
- la sencillez y flexibilidad de programación que brinda el poder programar C bajo un entorno linux
Conclusión
Aunque nos fue muy difícil, puesto que esta alternativa resultaba muy
tentadora, tuvimos que descartar puesto que el costo de la placa de desarrollo
(U$S 300) era muy elevado y, para el presupuesto asignado del proyecto, nos dejaba con muy poco margen para imprevistos.
Arquitectura: Microprocesador y componentes separados
Por último, la tercera arquitectura analizada fue la de utilizar un
microprocesador que se encargue de implementar la lógica y controlar la placa,
y utilizar otros componentes (más veloces) para la captura de datos.
En nuestro caso, el microprocesador analizado fue un PIC18F4550 y consta de las siguientes ventajas:
- viene con controlador USB integrado lo cual deja resuelto el tema la comunicación USB
- es de uso muy popular lo cual brinda gran versatilidad al diseño
- bajo costo de producción (costo del micro: U$S 6 en USA)
- bajo costo de desarrollo (hay esquemáticos de programadores disponibles para construirlos uno mismo, y depuradores de hardware por U$S 50)
Por todas estas razones, ésta fue la arquitectura elegida para implementar el
hardware del osciloscopio.
Vale mencionar que este PIC también contiene un ADC pero es de muy baja
velocidad. Por lo tanto, se deberá usar ADCs externos (cada uno con su memoria
buffer) para realizar las capturas a alta velocidad.
Finalmente, para poder controlar y direccionar las memorias se utilizaran
contadores binarios en cascada que serán controlados desde el propio PIC.
Funcionamiento y diagrama de bloques
Como se mencionó en la parte anterior, el hardware constará de:
- un microprocesador central para controlar el resto de los componentes e implementar la lógica de captura
- dos conversores analógico-digitales para digitalizar los datos
- dos memorias SRAM para usar como buffers de captura
- dos contadores de 8-bit para direccionar las memorias
A continuación se muestra el diagrama de bloques del sistema con sus
componentes y la interconexión de los mismos.

Fig 4.2 Diagrama de bloques
Si bien el PIC puede trabajar hasta 48 Mhz, su capacidad de procesamiento no le
permite capturar y almacenar lo datos a muy altas frecuencias. Por lo tanto, es
necesario que los conversores analógico-digitales (ADCs) se conectan directo a
las memorias, y que a su vez sean direccionadas a través dos contadores
rápidos. Estos contadores son comandados por el PIC.
La memoria es entonces direccionada a través del contador por dos razones:
- porque el PIC no posee una cantidad suficiente de patas para controlar simultáneamente las memorias y el resto de la lógica
- porque al capturar es necesario direccionar a altas velocidades (40 Mhz) imposibles de alcanzar por el PIC
Los buffers tri-state se utilizarán para seleccionar cual memoria leer (puesto
que solo se usaran 8 patas del PIC para el bus de datos) y para presetear los
contadores.
Por lo tanto, al correrse el proceso de adquisición el PIC habilita los
contadores que comienzan contar de forma creciente mientras los ADC muestrean
los datos y estos son almacenados en las direcciones de memoria presentadas por
los contadores. El hecho de que haya 2 contadores es porque no existen
contadores de 16 bits tan rápidos (40 Mhz) y tuvimos que colocar 2 de 8 bit en
cascada para controlar las memorias (RAM1/RAM2), dado que 8 bits no eran
suficientes.
El microprocesador PIC18F4550
El PIC18F4550 es un microprocesador de propósito general versátil y económico.
Pertenece a la popular familia de procesadores PICmicro de la empresa
norteamericana Microchip cuya sede se ubica en Chandler, Arizona (USA).
Fig 4.3 PIC18F4550 - empaquetado DIP-40
Lo particular del procesador PIC18F4550 es que es uno de los PICs que viene con soporta nativo para USB, lo cual quiere decir que incluyen un controlador USB interno que ya brinda patas de salida para conectar directo a la PC, sin la necesidad de
pull-ups o ninguna circuitería externa.

Fig 4.4 Características del PIC
Soporta cristales y osciladores de varias frecuencias como entrada y tiene
post-scaler de manera que el procesador pueda trabajar a una frecuencia de 48
Mhz, independiente del oscilador que se conecte. Para ello debe configurarse (a
través de los configuration bits) el oscilador que se le ha conectado. Trabajar
a 48 Mhz es un requisito para poder transferir a full-speed por el puerto USB.
El controlador USB, por lo tanto, transfiere a full-speed (1.5 Mbytes/seg) por
USB y es compatible con el estándar USB 2.0.
También cuenta con 35 patas de entrada/salida digitales de propósito general
(ver pinout más adelante) y viene disponible en varios empaquetados, entre
ellos DIP-40 lo cual lo hace una alternativa muy popular entre desarrolladores
entusiastas y aficionados. Los puertos de entrada/salida son todos compatibles
con la tecnología TTL. Cuando se los utiliza como salida, se comporta como un
CMOS, siendo compatible con TTL, de modo de poder manejar cualquier tipo de
tecnología. Sin embargo cuando son configurados los puertos como entrada, hay
dos comportamientos posibles: puede ser exclusivamente TTL, o puede ser
configurado para TTL o CMOS. Dado que ciertos puertos de entrada son solamente
compatibles con la tecnología TTL, es que se ha optado por realizar toda la
circuitería con tecnología TTL. Vale destacar que la única excepcion a esto es
la etapa de entrada, en donde se han utilizado componentes CMOS, algunos con
compatibilidad TTL y otros no. Esto se ha dado de este modo por la
disponibilidad de los componentes, pero previo a una cuidadosa revisión para
asegurar de que no existan problemas. Existen otras razones adicionales que
hacen a la tecnología TTL la más adecuada para este caso, esto se explica a
continuación, en la elección de los componentes.
En cuanto a memoria, posee 32Kb de flash para almacenamiento de programas, 2Kb
de SRAM para memoria volátil, y 256 bytes de EEPROM (memoria no-volátil) para
almacenamiento permanente de datos como configuraciones y demás.
Las instrucciones son de 1 byte de longitud con la excepción de algunas que
ocupan 2 bytes (CALL, MOVFF, GOTO, LSFR). Utiliza el mecanismo de pipelining
para la ejecución de código por lo cual hace que las instrucciones consecutivas
se ejecutan en 4 CLK (períodos de reloj) y las que contengan saltos adicionan 4
CLK extras.
Otras características interesantes que posee son timers, interrupciones
(externas e internas por timers) con dos niveles de prioridad y disparadas
tanto por nivel como por flanco, un comparador analógico con un generador de
voltaje de referencias de 16 niveles (útil para implementar un trigger de
hardware por nivel).
Por último, el PIC también cuenta con un conversor analógico de 10-bit pero que
para nuestro osciloscopio es insuficiente debido a la alta velocidad de captura
necesaria. Ya que, si bien el oscilador es de 48 Mhz, entre los tiempo de
ejecución de las interrupciones y otros delays (bucles, etc) no se pueden
obtener velocidades de captura mayores a 200 KHz.
Pinout
A continuación se presenta el pinout del PIC18F4550, en empaquetado DIP-40. En particular se puede reconocer las pines D- y D+ de la conexión USB (patas 23 y 24).

Fig 4.5 Pinout del PIC18F4550
Selección de componentes
Recordamos lo mencionado en las características del PIC: Los puertos de
entrada/salida del PIC son todos compatibles con la tecnología TTL. Cuando se
los utiliza como salida, se comporta como un CMOS, siendo compatible con TTL,
de modo de poder manejar cualquier tipo de tecnología. Sin embargo cuando son
configurados los puertos como entrada, hay dos comportamientos posibles: puede
ser exclusivamente TTL, o puede ser configurado para TTL o CMOS. Dado que
ciertos puertos de entrada son solamente compatibles con la tecnología TTL, es
que se ha optado por realizar toda la circuitería con tecnología TTL. Vale
destacar que la única excepcion a esto es la etapa de entrada, en donde se han
utilizado componentes CMOS, algunos con compatibilidad TTL y otros no. Esto se
ha dado de este modo por la disponibilidad de los componentes, pero previo a
una cuidadosa revisión para asegurar de que no existan problemas.
Otra de las razones por la cual se ha elegido a TTL, y tan importante como la
mencionada, es la velocidad de las compuertas.
A modo de ejemplo podemos tomar las compuertas NAND. En tecnología TTL (74F00),
el tiempo de propagación de entrada a salida típico es de 3ns. Esto mismo para
tecnología CMOS (74HC00) es de 7ns y 10ns para los compatibles con TTL
(74HCT00).
Conversor analógico-digital | Tecnologías
Aproximaciones sucesivas (SAR)
Los conversores por registros de aproximaciones sucesivas (SAR -
successive approximation register) son frecuentemente la arquitectura elegida por las aplicaciones de media a alta resolución a tasas de muestreo medias. Los conversores SAR tienen una resolución entre los 8 y 18 bits, y usualmente no superan las 10 millones de muestras por segundo (10MSPS). Una de sus ventajas es su bajo consumo.
Este tipo de conversores funcionan de una manera similar a una balanza de
escalas, como las antiguas. Es decir, de un lado se coloca el peso desconocido,
y del otro se van colocando diferentes pesos conocidos, hasta que se logra el
equilibrio. Finamente, el peso desconocido se obtiene por la suma de los pesos
conocidos colocados en el otro plato de la balanza. De igual forma ocurre con
los ADC del tipo SAR. El voltaje analógico desconocido a la entrada es
comparado con diferentes tensiones sucesivas generadas por el ADC. Una vez
completadas todas las comparaciones, el resultado de cada comparación es
exactamente la salida que entrega el conversor. Sin embargo, al tratarse de un
componente electrónico de alta velocidad, estas comparaciones ocurren mucho mas
rápido que lo que esperamos de una balanza real.
Dado que estos tipos de conversores utilizan la técnica del
sample & hold (muestreo y retención), la arquitectura en ningún momento asume nada sobre la naturaleza de la señal de entrada, y por lo tanto esta señal no tiene que ser continua. Esto hace que los SAR sean una arquitectura ideal para aplicaciones donde se debe muestrear muchas señales y se utiliza un multiplexor a la entrada del mismo, o bien cuando las muestras no son tomadas una seguida de la otra sino que son tomadas cada algunos segundos o mas, o también donde se requiera una conversión rápida.
El tiempo de conversión se mantiene constante en todos los casos, y tiene una demora desde la adquisición hasta la conversión comparada a los conversores del tipo
pipeline o
delta-sigma. Los conversores SAR son ideales para aplicaciones de tiempo real, tales como el control industrial, control de motores, instrumentos portables o a batería, y equipos de adquisición de datos o señales.
Fig 4.6 Diagrama del conversor SAR
Delta-Sigma
Los conversores
delta-sigma se destacan por su alta resolución, y son ideales para la conversión de señales con un ancho de banda amplio (desde tensión continua hasta una frecuencia de algunos mega ciclos). Básicamente, estos conversores la señal de entrada es sobremuestreada (oversampling) por un modulador y luego filtrada y decimada por un filtro digital, produciendo una conversión de muy alta resolución a tasas de muestreo relativamente bajas.
La conversión propuesta por los conversores
delta-sigma permiten que
la resolución pueda ser negociada por velocidad o consumo. Es decir que si se precisa mucha resolución en la conversión, entonces el dispositivo será mas lento y consumirá mas potencia, mientras que si se requiere menos definición, entonces se pueden lograr tiempos de conversión más bajos o un consumo de potencia más bajo. Además, muchos de estos dispositivos permiten que este comportamiento pueda ser programado. Esto hace que este tipo de conversores sea muy flexible y permita en un mismo aparato diferentes tipos de uso de acuerdo a los requerimientos.
Dado que estos conversores sobremuestrean la señal de entrada, pueden lograr un filtrado
anti-aliasing en la etapa del filtrado digital. Los diseños modernos con técnicas VLSI (Very Large Scale Integration, integración en escala muy grande) han llevado el costo de filtros digitales complejos muy por debajo del costo de su equivalente analógico. Por ejemplo, el filtrado de ruido de línea simultaneo en 50Hz y 60Hz que antes no era provisto, ahora se tiene integrado directamente en estos conversores.
Entre las aplicaciones típicas para los conversores
delta-sigma se encuentran el audio, procesos de control industrial, e instrumentos médicos entre otros.
Investigaciones e innovaciones recientes en cuanto a las arquitecturas de los ADC han conducido a una arquitectura donde se usan los principios de oversampling y pipeline simultáneamente. Estos conversores de alta velocidad ahora permiten conversiones en el rango de los MSPS (millones de muestras por segundo) manteniendo la alta resolución que antes se obtenía pero a baja velocidad, o incluso una resolución aún mayor. Estas innovaciones permiten que con conversores con tanta definición y de tan alta velocidad puedan ser aplicados en comunicaciones y en la proyección de imágenes en la medicina.
Prácticamente todos los conversores
delta-sigma tienen entradas diferenciales. Esto significa que en realidad la medición se toma por la diferencia de voltaje entre las 2 entradas, en vez de la diferencia entre un voltaje y tierra (0v). La estructura de las entradas diferenciales permiten que estos conversores sean ideales para medir fuentes del tipo de las termocuplas o sensores del tipo puente, en donde no existe un voltaje común, sino que el mismo dispositivo genera un diferencial de potencial entre sus bornes. En la mayoría de los casos no se precisan amplificadores de entrada para estas aplicaciones.
A diferencia de los conversores SAR, donde la señal de entrada es muestreada y luego analizada para obtener el resultado, los
delta-sigma miden la señal de entrada durante un pequeño lapso de tiempo y luego a su salida se obtiene en código digital el valor promedio de la señal durante ese tiempo. Es importante recordar la forma en que estos conversores operan, particularmente en diseños que incorporan multiplexación y sincronización.
Es relativamente fácil (y es una práctica común) sincronizar varios conversores
delta-sigma para que muestreen simultáneamente, pero es mas difícil sincronizar uno de estos conversores con un evento externo. Los conversores
delta-sigma son poco sensibles al
jitter en los pulsos de reloj (variación de su periodo), y esto esta dado por el hecho de que el
oversampling efectivamente promedia las demoras de estos pulsos y por lo tanto logra una reducción del impacto del
jitter en el ruido.
Muchos de estos conversores incluyen entradas con buffers (adaptadores de impedancia) y amplificadores de ganancia programable (PGA - programmable gain amplifiers). Los buffers de incrementan la impedancia de entrada permitiendo una conexión directa con una fuente cuya salida sea también de alta impedancia, evitando la necesidad de componentes intermediarios. La ventaja de poseer un PGA interno es que cuando se mide una señal de poca amplitud estos amplificadores logran que se pueda obtener la misma resolución que cuando se tratan señales de mayor amplitud. Los sensores del tipo puente son un claro ejemplo de una fuente de señal que puede aprovechar las ventajas de los PGA dentro del conversor.
Todo ADC requiere de una referencia para la señal de entrada, pero en especial para los de alta resolución, el bajo ruido y la baja deriva son críticos, y es por esto que la mayoría de los conversores
delta-sigma tienen entradas diferenciales.
Fig 4.7 Diagrama del conversor Delta-Sigma
Pipeline
La mayoría de los conversores del rango de las decenas de millones de muestras por segundo están basados en una arquitectura del tipo
tubería (pipeline). Los conversores
pipeline consisten en "N" etapas en cascada. La operación continua de todas las etapas de la tubería hacen que este tipo de arquitectura alcance velocidades de muestreo altas. Cada una de estas etapas son idénticas en su esencia, alineadas una detrás de otra, y diseñadas para convertir sólo una parte de la muestra analógica de entrada. El resultado digital de la comparación hecha por cada una de las etapas es alineada luego para obtener la salida en paralelo de estos resultados. En cierta forma, sería como colocar tantos ADC de 1 bit de resolución como bits de resolución se deseen obtener. Por cada ciclo de reloj se obtiene una nueva muestra. Sin embargo, dado este tipo de construcción, es evidente que se tiene un retardo desde que se tomó la muestra hasta que se obtiene la salida, pero en la mayoría de las aplicaciones esto no es una limitación ya que dicho retardo, expresado en ciclos de reloj, es constante y conocido.

Fig 4.8 ADC tipo Pipeline
Una de las características principales que permiten que los ADC tipo
pipeline tengan un desempeño dinámico tan bueno a altas frecuencias radica en que la señal de entrada sea del tipo diferencial. Esta configuración de entrada tiene como resultado optimizar su rango dinámico, dado que esto lleva a señales de menor amplitud y una reducción en los armónicos de orden par. La mayoría de los conversores
pipeline de alta velocidad usan una fuente de alimentación simple, haciendo que sea necesario que la señal de entrada opere en
modo común, y que este valor se encuentre típicamente en el medio del voltaje de alimentación. Este requerimiento de
modo común debe entrar en consideración cuando se define la circuitería de entrada.
Los conversores del tipo
pipeline son los mas utilizados cuando se trata de muestrear a velocidades de entre unos pocos MSPS y los 100MSPS. La complejidad de esta arquitectura crece linealmente (no exponencialmente) con la cantidad de bits de resolución que se exigen, y esto es justamente debido al tipo de construcción en tubería. Con característica se logran tener conversores de alta velocidad y alta resolución, aún manteniendo un bajo consumo. Los
pipeline son útiles en un amplio rango de aplicaciones, más notablemente en el área de las comunicaciones digitales, donde la performance dinámica del conversor suele ser más importante que las especificaciones tradicionales sobre tensión continua, como ser la no-linealidad diferencial (DNL - differential non-linearity), y la no-linealidad integral (INL - integral non-linearity).
Los conversores
semi-flash utilizan una arquitectura de varios
pipelines integrados en una
flash para lograr una mejor performance que la
flash en cuanto a velocidad y reduciendo drásticamente su consumo.

Fig 4.9 Semiflash ADC
Flash
Los conversores del tipo
flash, también conocidos como conversores paralelos, son la arquitectura más rápida en conversores A-D.
Para aplicaciones que no requieren una resolución muy alta, sino mas bien media, típicamente 8 bits, pero que tengan la capacidad de muestrear señales de cientos de MHz o aún mayores, la arquitectura flash puede que sea la única alternativa viable. Sin embargo estos conversores tienen un consumo de potencia mayor que las otras arquitecturas y también tienen un costo mayor, lo que hace que estos conversores sean usados exclusivamente para altas frecuencias y donde no pueda ser usado otro tipo de arquitectura.
Las aplicaciones típicas para estos conversores son:
- Adquisición de datos
- Comunicaciones satelitales
- Procesamiento de radares
- Discos de datos de alta densidad
Cómo su nombre lo indica, utiliza una arquitectura de conversión en paralelo. Cada comparador representa 1 LSB
(Least Significant Bit), y su funcionamiento se puede comparar a un termómetro de mercurio, donde la columna de mercurio aumenta hasta el valor de apropiado de temperatura. Se puede observar en el siguiente gráfico dicho comportamiento, donde el valor de tensión de una señal generaría una salida de los comparadores del estilo
"0000111111111", y luego esta salida es enviada a un codificador binario tal que se represente en potencias de 2 el valor obtenido. Existen tantos comparadores como divisiones o resolución se deseen, es decir que si se desean
N bits, entonces el conversor tendrá 2^N-1 comparadores.
El siguiente gráfico explica la arquitectura:

Fig 4.10 ADC tipo Flash
Dado que todos los conversores actúan en paralelo, solo se requiere de un tick de reloj para convertir la señal de entrada.
El voltaje de referencia de cada conversor es de 1 LSB mayor al del comparador que lo precede, siendo para el primer comparador exactamente 1 LSB.
Este tipo de conversores requiere que el
jitter del reloj sea lo mas pequeño posible para asegurar la mejor performance. De acuerdo a las especificaciones de cada caso, se debe utilizar un
track & hold, el cual en la mayoría de los casos es necesario. Existen conversores de este tipo que ya incluyen esta funcionalidad dentro del mismo integrado.
Conversores integrados
Dada la baja velocidad de conversión de esta arquitectura, este tipo de conversores no será estudiado.
Comparación y elección

Fig 4.11 Comparación ADC

Fig 4.12 Resolución Vs. Velocidad de muestreo
| | SAR | Delta-Sigma | Pipeline | Flash |
| Velocidad | ~ 10MSPS | < 1MSPS | ~ 100MSPS | > GSPS |
| Resolución | hasta 16 bits | entre 10 y 16 bits | entre 8 y 14 bits | hasta 8~10 bits |
| Consumo | Bajo (~10mW) | Muy bajo (~1mW) | Medio (~100mW) | Alto (~1000mW) |
Tabla 4.1 Comparación de tipos de muestreo
- Texas TLC 5540
- 8-Bit Resolution
- Differential Linearity Error
- ±0.3 LSB Typ, ±1 LSB Max (25°C)
- ±1 LSB Max
- Integral Linearity Error
- ±0.6 LSB, ±0.75 LSB Max (25°C)
- ±1 LSB Max
- Maximum Conversion Rate of 40 Megasamples Per Second (MSPS) Max
- Internal Sample and Hold Function
- 5-V Single Supply Operation
- Low Power Consumption: 85 mW Typ
- Analog Input Bandwidth: ≥75 MHz Typ
- Internal Reference Voltage Generators
- Hoja de datos: ver apéndice III.
- Texas ADS831
- High SNR: 49dB
- Internal or external reference option
- Single-ended or differential analog input
- Programmable input range: 1Vp-p /2Vp-p
- Low Power Consumption: 275mW
- Low DNL: 0.35LSB
- Single +5V supply operation
- SSOP-20 Package
- Hoja de datos: ver apéndice III.
- Texas THS0842
- Dual Simultaneous Sample and Hold Inputs
- Differential or Single-Ended Analog Inputs
- 8-Bit Resolution 40 MSPS Sampling Analog-to-Digital Converter (ADC)
- Single or Dual Parallel Bus Output
- Low Power Consumption: 275 mW Typ Using External References
- Wide Analog Input Bandwidth: 600 MHz Typ
- 3.3 V Single-Supply Operation
- 3.3 V TTL/CMOS-Compatible Digital I/O
- Internal or External Bottom and Top Reference Voltages
- Adjustable Reference Input Range
- Power-Down (Standby) Mode
- Hoja de datosver apéndice III.
- Analog Devices AD9057
- 8-Bit, Low Power ADC: 200 mW Typical
- 120 MHz Analog Bandwidth
- On-Chip 2.5 V Reference and Track-and-Hold
- 1 V p-p Analog Input Range
- Single 5 V Supply Operation
- 5 V or 3 V Logic Interface
- Power-Down Mode: <10 mW
- 3 Performance Grades
- (40 MSPS, 60 MSPS, 80 MSPS)
- Hoja de datos: ver apéndice III.
- Analog Devices AD9059
- Dual 8-Bit ADCs on a Single Chip
- Low Power: 400 mW Typical
- On-Chip 2.5 V Reference and Track-and-Hold
- 1 V p-p Analog Input Range
- Single 5 V Supply Operation
- 5 V or 3 V Logic Interface
- 120 MHz Analog Bandwidth
- Power-Down Mode: <12 mW
- Hoja de datos: ver apéndice III.
Entre los dispositivos seleccionados, hemos llegado a la conclusión que el
conversor que utilizaremos es el TLC5540 de Texas Instruments. Las
características que nos han hecho decidir por éste son su bajo consumo, su bajo
precio, la alta disponibilidad, y como ventaja adicional por sobre el resto de
los conversores, encontramos suficiente documentación sobre su uso, e incluso
su uso en aplicaciones similares a este proyecto.
La única contra que tiene este conversor, pero que es igual en cualquiera de
los casos, es que no se encuentra disponible en encapsulado DIP, lo que
prácticamente nos obliga a comprar un adaptador SOIC - DIP. Este zócalo
adaptador sólo lo hemos conseguido en Estados Unidos, y lamentablemente no
tiene un bajo precio. El tema del precio esta directamente relacionado con que
estos casos ocurren solamente en etapa de desarrollo (de lo contrario se
tendría el zócalo necesario para dicho encapsulado), la cuales obviamente no es
un caso común ni masivo. Sin embargo consideramos a este problema como
temporal, ya que de concluir satisfactoriamente el diseño y la prueba en la
placa, se construirá un circuito impreso en donde se va a prever el encapsulado
de cada componente sin necesidad de zócalos adaptadores.
Memoria
El funcionamiento de una memoria esta basado en celdas y el interior de cada
chip se puede imaginar como una matriz o tabla en la cual cada celda es capaz
de almacenar un bit. Es decir, que las memorias se basan en celdas para
almacenar cada bit, y dichas celdas están organizadas en
arreglos, tal sería
la forma de una matriz, en donde se tienen filas y columnas, y cada celda tiene
una ubicación única, descripta por el numero de columna y numero de fila. El
numero que identifica a cada ubicación se conoce como
dirección. Luego, a
partir de una dirección se calcula cuál es la fila y columna correspondiente,
con lo que ya se puede acceder a la celda deseada.
Las memorias de RAM
(Random Access Memory) son memorias volátiles, esto
significa que se pierde la información cuando no se le brinda alimentación y se
clasifican en dos categorías básicas: la RAM estática y la RAM dinámica, las
cuales se describen en las siguientes secciones.
Para este tipo de memorias, aún cuando su funcionamiento es secuencial y en
cada avance de reloj se avanza en un bit la dirección de memoria, se debe
utilizar una lógica externa de control en donde dicha dirección se incremente.
Ante esta característica, hemos encontrado una memoria que tiene una pequeña
lógica interna que permite evitar el uso de componentes externos.
Memorias de acceso programable
Se trata de una memoria capaz de realizar operaciones lógicas no complejas,
como ser el autoincremento de la dirección de memoria a la cual se accede.
Este tipo de dispositivo sería realmente útil ya que simplificaría la etapa de
control de memoria. Una arquitectura de este tipo fue encontrada en la
búsqueda de soluciones pero, si bien se encuentra fabricada, aún no existían
producto disponibles con esta tecnología. Por lo tanto, continuamos analizado
las diferentes posibilidades dentro de las memorias estándar en el mercado
(siguiente apartado).
Memoria RAM estática
El componente principal de estas memorias es el
flip-flop. Se compone de 4 transistores MOSFET o CMOS en un arreglo tal que cuando se le da un valor en una de sus entradas, este valor es conservado hasta que se quite la alimentación o se le cargue un nuevo valor.
Este tipo de memoria conocida como SRAM
(Static Random Access Memory) se compone de celdas de
flip-flops. En la siguiente figura se observa la estructura típica de una celda de memoria de una SRAM.

Fig 4.13 Celda SRAM
En la figura se pueden ver las 4 conexiones necesarias. El pin de entrada indica que es allí en donde se coloca el dato que se desea almacenar. Luego un pulso en
"W" (Write) hará que el dato sea cargado en en flip-flop. Finalmente, para volver a obtener el dato guardado, se debe dar tensión en
"R" (Read), y en la salida tendremos el dato que anteriormente se había almacenado.

Fig 4.14 Arreglo SRAM
Memoria RAM dinámica
Las memorias DRAM
(Dynamic Random Access Memory) son similares a las memorias
estáticas, pero su diferencia radica en que en vez de utilizar flip-flops,
utilizan condensadores. La utilización de condensadores implica que haya que
cargarlos, pero también implica que éstos se descarguen.
Es decir, que para el funcionamiento correcto de estas memorias, una vez que se
posiciona en la dirección deseada y se le carga el valor que se quiere
almacenar, es estrictamente necesario volver a recurrir a la misma dirección
después de cierto lapso de tiempo (este tiempo depende exclusivamente de cada
memoria) para volver a cargar el capacitor con el dato que éste tenía antes de
que por efecto de la descarga, éste pierda el dato almacenado.
El uso de condensadores en vez de transistores hace que su tamaño sea
considerablemente menor, haciendo posible la construcción de memorias de mucha
mayor capacidad.

Fig 4.15 Celda DRAM
La operación de la celda es similar a la de un interruptor, cuando el estado en
la fila se encuentra en alto, el transistor entra en saturación y el dato
presente en el bus interno de la memoria (columna) se almacena en el
condensador, durante una operación de escritura y se extrae en una operación de
lectura. El inconveniente que tiene este tipo de memorias consiste en que hay
que recargar la información almacenada en las celdas, por lo cual estas celdas
requieren de circuitería adicional para cumplir esta función. En la siguiente
figura se observa la celda completa con sus aditamentos donde se puede
identificar la forma en que se desarrollan las operaciones de escritura,
lectura y recarga.
La siguiente figura muestra que cuando dicha celda se encuentra seleccionada
por la columna y fila correspondiente, entonces un pulso en el bit de recarga
hará que el mismo valor que ya tiene (obtenido desde el dato de salida) es
vuelto a cargar como entrada de datos y se vuelve a cargar el condensador. La
señale R/W
(Read/Write) habilita a que se cargue el condensador con el valor
que se encuentra en el pin de entrada de datos, o bien habilita la lectura
mediante el pin de salida de datos con el valor que esta cargado en el
condensador. Vale aclarar que si se ha demorado en hacer una recarga de datos y
el tiempo límite desde la ultima carga del condensador ha sido superado,
entonces el dato que se leerá será erróneo.
Fig 4.16 Funcionamiento DRAM
Comparación y elección
El primer punto que se debe analizar es si la memoria que utilizaremos será del tipo estática o dinámica.
A continuación presentamos un cuadro comparativo de las principales características de una y otra arquitectura.
| Memoria | Ventajas | Desventajas |
| SRAM | La velocidad de acceso es alta | Menor capacidad, debido a que cada celda de almacenamiento requiere mas transistores |
| Para retener los datos solo necesita estar energizada | Mayor costo por bit |
| Son mas fáciles de diseñar | Mayor consumo de Potencia |
| DRAM | Mayor densidad y capacidad | La velocidad de acceso es baja |
| Menor costo por bit | Necesita recargar de la información almacenada para retenerla |
| Menor consumo de potencia | Diseño complejo |
Tabla 4.2 Comparación de tipos de memorias
Dado que el costo de los componentes no es alto (básicamente por que su capacidad de almacenamiento no es alta tampoco), utilizaremos memorias estáticas, ya que son de más fácil uso, y no requieren de una lógica externa para que la información guardada se mantenga.
Las características determinantes para la elección de la memoria son su capacidad y su velocidad. Hemos hecho una búsqueda de memorias de diferentes tamaños y velocidades en el mercado, y a continuación destacamos cada una con sus características principales:
- Texas BQ4011
- Data retention in the absence of power
- Automatic write-protection during power-up/power-down cycles
- Industry-standard 28-pin 32K x 8 pinout
- Conventional SRAM operation; unlimited write cycles
- 10-year minimum data retention in absence of power
- Battery internally isolated until power is applied
- Hoja de datos: ver apéndice III.
- Cypress CY7C199
- High speed — 10 ns
- Fast tDOE
- CMOS for optimum speed/power
- Low active power — 467 mW (max, 12 ns “L” version)
- Low standby power - 0.275 mW (max, “L” version)
- 2V data retention (“L” version only)
- Easy memory expansion with CE and OE features
- TTL-compatible inputs and outputs
- Automatic power-down when deselected
- Hoja de datos: ver apéndice III.
- Cypress CY7C109B
- High speed — tAA = 12 ns
- Low active power — 495 mW (max. 12 ns)
- Low CMOS standby power — 55 mW (max.) 4 mW
- 2.0V Data Retention
- Automatic power-down when deselected
- TTL-compatible inputs and outputs
- Easy memory expansion with CE1, CE2, and OE options
- Hoja de datos: ver apéndice III.
- ALSC AS7C256A
- Industrial and commercial temperature options
- Organization: 32,768 words × 8 bits
- High speed
- 10/12/15/20 ns address access time
- 5, 6, 7, 8 ns output enable access time
- Very low power consumption: ACTIVE
- Very low power consumption: STANDBY
- Easy memory expansion with CE and OE inputs
- Hoja de datos: ver apéndice III.

Fig 4.17 Arquitectura de la memoria Cypress CY7C-109B
Una vez que se tiene un estimado de las memorias que se podrían utilizar y su
precio, se tuvo que hacer la evaluación del tamaño y la velocidad que el
proyecto requería.
Dado que se tiene como objetivo tener una velocidad de trabajo del orden de los
40Mhz, la memoria debe tener tiempos de acceso menores a 20~25 ns.
En cuanto al tamaño que ésta debe tener, consideramos que con mil muestras
sería en principio suficiente para el objetivo buscado. Sin embargo, si se
considera la opción del disparo por hardware para obtener las muestras,
entonces se precisarían mas muestras, para poder tener muestras previas y
siguientes sobre un hecho que puede no repetirse, con lo cual, se podría pedir
que la memoria sea capaz de almacenar diez mil muestras.
Ahora las opciones serían a partir de los 16K x 8 bits como mínimo. La
intención de largo alcance del proyecto y la escalabilidad y flexibilidad
deseada, hacen que dentro de lo posible, las características limitantes sean
las menores posibles y se puedan tener los mejores componentes. Por esta razón
es que a partir de un mínimo de 16K pasamos a tener en cuenta las memorias de
32K. Además, una memoria que exceda los mínimos nos permite tener un registro
mucho mayor sobre cada muestreo o captura que se realiza. Si en vez de mostrar
en pantalla lo que se ha capturado, se desea transferirlo a un archivo para su
posterior análisis, entonces esta ventaja pasa a ser fundamental, donde una
captura pasa a ser prácticamente un historial sobre el muestreo realizado. Una
memoria de 32K nos permite una flexibilidad y posibilidad de realizar muchas
operaciones sin que el tamaño de la memoria sea una limitante.
Al igual que en el caso de los conversores analógico-digital, entre los
encapsulados disponibles no se encuentra el DIP, por lo que será necesario
comprar un zócalo adaptador. De todos modos, esto es solamente temporal, porque
en el caso de la construcción de una placa impresa (PCB) este problema queda
solucionado.
Luego de analizadas las opciones y verificar su precio, hemos observado que la
diferencia de costo entre una memoria de 32K y una memoria que cuadriplique su
tamaño, es decir 128K, era de aproximadamente un 15% superior, pero en precios
tan bajos, esto pasa a ser casi despreciable, por lo que directamente optamos
por excedernos en demasía con la memoria y dejar que este componente sea lo
suficientemente grande como para que el día que los alcances del proyecto
crezcan, no sea una limitante.
Otra razón por la que hemos elegido la memoria de Cypress es su disponibilidad
y precio. Luego de buscar en el mercado uruguayo los componentes citados y ver
que no había ninguno en plaza, se buscó en Buenos Aires, Argentina. La memoria
de Cypress era una de las tres memorias seleccionadas que se podía conseguir en
dicho mercado, pero teniendo ventaja en su precio. Es por esta razón por la
cual decidimos utilizar la citada memoria. Esta ventaja nos dio tiempo para
poder probarla y estudiarla mientras se construía la placa. Además, existe
mucha documentación valiosa sobre su uso y funcionalidad.
Amplificadores de entrada
Los amplificadores de entrada son utilizados principalmente para separar la
etapa de entrada de la de adquisición y hacer una adaptación de impedancias.
Esto independiza a estas etapas.
Todos los amplificadores seleccionados tienen características muy similares, y
todos son aptos para el proyecto, sin embargo el MAX477 tiene como ventaja el
encapsulado DIP, que el resto no lo tiene disponible. Esta característica nos
simplifica en costo y tiempo, y es por eso que lo hemos elegido. La
estabilidad en cuanto a las variaciones de parámetros
(offsets) es superior
frente al resto, mientras que el ancho de banda y rango de tensiones es similar
a los otros amplificadores.
- Maxim MAX477
- High Speed
- 300MHz -3dB Bandwidth (AV = +1)
- 200MHz Full-Power Bandwidth (AV = +1,VO = 2Vp-p)
- 1100V/μs Slew Rate
- 130MHz 0.1dB Gain Flatness
- Drives 100pF Capacitive Loads Without Oscillation
- Low Differential Phase/Gain Error: 0.01°/0.01%
- 8mA Quiescent Current
- Low Input-Referred Voltage Noise: 5nV/√Hz
- Low Input-Referred Current Noise: 2pA/√Hz
- Low Input Offset Voltage: 0.5mV
- 8000V ESD Protection
- Voltage-Feedback Topology for Simple Design Configurations
- Short-Circuit Protected
- Hoja de datos: ver apéndice III.
- Texas OPA695
- GAIN = +2 BANDWIDTH (1400MHz)
- GAIN = +8 BANDWIDTH (450MHz)
- OUTPUT VOLTAGE SWING: ±4.2V
- ULTRA-HIGH SLEW RATE: 4300V/μs
- RD-ORDER INTERCEPT: > 40dBm (f < 50MHz)
- LOW POWER: 129mW
- LOW DISABLED POWER: 0.5mW
- Hoja de datos: ver apéndice III.
- Texas OPA691
- FLEXIBLE SUPPLY RANGE:
- +5V to +12V Single-Supply
- ±2.5V to ±6V Dual-Supply
- UNITY-GAIN STABLE: 280MHz (G = 1)
- HIGH OUTPUT CURRENT: 190mA
- OUTPUT VOLTAGE SWING: ±4.0V
- LOW dG/dφ: 0.07%/0.02°
- LOW SUPPLY CURRENT: 5.1mA
- LOW DISABLED CURRENT: 150μA
- WIDEBAND +5V OPERATION: 190MHz (G = +2)
- Hoja de datos: ver apéndice III
- Texas OPA830
- HIGH BANDWIDTH:
- 250MHz (G = +1)
- 110MHz (G = +2)
- LOW SUPPLY CURRENT: 3.9mA (VS = +5V)
- FLEXIBLE SUPPLY RANGE:
- ±1.4V to ±5.5V Dual Supply
- +2.8V to +11V Single Supply
- INPUT RANGE INCLUDES GROUND ON SINGLE SUPPLY
- 4.88V OUTPUT SWING ON +5V SUPPLY
- HIGH SLEW RATE: 550V/ns
- LOW INPUT VOLTAGE NOISE: 9.2nV/√Hz
- Hoja de datos: ver apéndice III
Las características que nos han hecho elegir el MAX477 de Maxim son mas bien
prácticas que técnicas. Es decir, cualquiera de estos amplificadores satisfaría
los requisitos, sin embargo, el amplificador de Maxim gana en precio,
disponibilidad, y por sobre todo, es el único que se encuentra disponible en
encapsulado del tipo DIP. Este encapsulado es nuestro preferido y facilita su
conexión y posible reemplazo, sin necesidad de utilizar zócalos especiales, los
cuales en ciertos casos son difíciles de conseguir y pueden ser muy caros.
Contadores
Un contador es básicamente un circuito secuencial temporizado. Un contador
binario de
n bits puede contruirse con
n flip-flops en cascada. Los
flip-flops que se utilizan son flip-flops tipo T, el cual cambia de estado (0 o
1) en cada flanco ascendente de su entrada de reloj. A continuación se puede
observar la operación básica de un contador de 4 bits.

Fig 4.18 Estructura de un contador
Dentro de la familia de contadores, hemos encontrado de hasta 8 bits que
trabajen a la frecuencia especificada (40Mhz) y es por esta razón que debimos
colocar dos contadores. También consideramos útil que los mismos sean
contadores hacia adelante y hacia atrás. Si bien puede que no lo utlicemos en
este momento, consideramos que es de buen diseño poder prever futuros usos y
dar la posibilidad de expandir a funcionalidad de los componentes. Así también
hemos elegido un contador que tenga una señal de habilitación de
funcionamiento, es decir, que si el dispositivo no se encuentra habilitado, por
mas que tenga señal de reloj y se intente avanzar en la cuenta, no lo va a
hacer ya que como se espera, éste no se encuentra habilitado. Dado que el
direccionamiento de las memorias es de 16 bits, se deben utilizar dos
contadores en cascada para obtener el funcionamiento deseado.
Entre los dispositivos TTL de alta velocidad hemos encontrado el siguiente:
- 74F269 (ver hoja de datos en apéndice III)
Hemos elegido este por ser el mas estándar y utilizado mundialmente. Nos provee
las características necesarias para el proyecto, y es de alta disponibilidad,
bajo precio, y existe mucha documentación sobre su uso. Consideramos que
siempre que se puedan utilizar componentes masivos y siempre que cumplan con
las especificaciones, sería un buen punto a tener en cuenta para tomar la
decisión sobre su uso.
Buffers bidireccionales 8-bit
Son conocidos también como
transceptores, y son básicamente 2 separadores de
tres estados. Estos separadores de tres estados hacen que en funcionamiento
normal, cada bit de salida tenga exactamente el mismo valor que en su
correspondiente entrada. Sin embargo, cuando se los pone en el tercer estado
(tri-state), su salida pasa a ser de alta impedancia, tal como si no
existiese conexión alguna. De esta forma se permite a algún otro dispositivo
escribir en ese bus. Los transceptores, o buffers bidireccionales, hacen uso
de esta característica para escribir a uno u otro lado del bus. Es decir que
pueden hacer que un bus de entrada se convierta en uno de salida y viceversa.
Tiene como objetivo poder separar a dos sub-circuitos que tengan funciones
tanto de lectura como de escritura, entonces mediante este dispositivo es
posible que ambos se comuniquen, tomando previa decisión de quién es el que
escribe y quién es el que lee.

Fig 4.19 Buffer bidireccional
Al igual que en la elección del contador, hemos tomado el mismo criterio de
utilizar un componente masivo. La línea 74F de Fairchild Semiconductors es la
óptima para estos casos.
El componente seleccionado en este caso fue entonces el 74F245.
Protectores USB
Estos protectores USB son supresores de transitorios de tensión que puedan ocurrir en la línea de comunicación. Estos ruidos pueden provenir de cualquier fuente, y pueden provocar daños a los equipos en ambos extremos del bus USB si son de magnitud y duración suficiente.
Estos son protectores para USB 1.1, y nos son aptos para las altas velocidades del USB 2.0 dada su alta capacitancia de entrada.

Fig 4.20 Circuito de protección USB
Hemos buscado circuitos integrados que provean esta funcionalidad, y la única
fabrica que provee componentes específicamente con este fin es Texas
Instruments. Los modelos disponibles que hay son: SN75240, SN65240, y SN65220.
Entre estos componentes, el único del cual teníamos disponibilidad y solamente
en los Estados Unidos, es del SN65240. Este integrado difiere del SN65220 en
que el primero tiene dos supresores mientras que el segundo tiene uno solo. Es
evidente que esta característica no afecta en absoluto el diseño ni el
funcionamiento del circuito.
- Texas SN65220/SN65240/SN75240 (ver hoja de datos en apéndice III)
Osciladores programables
Hemos evaluado también la utilización de un oscilador integrado programable en
vez de cristales. Éstos tienen la ventaja de tener menor radiación, menor
amplitud en componentes de mayor frecuencia, requieren menor cableado, tienen
mayor estabilidad, y también evitan tener que comprar varios cristales para
diferentes frecuencias cuando se pueden obtener a partir de un mismo integrado.
Sin embargo los encapsulados en los que se consiguen estos integrados tienen un
montaje mas complicado, y los cristales son de uso mucho más masivo y común que
estos integrados. Hemos tenido en nuestro poder muestras de estos componentes,
pero aún así tomamos la decisión de optar por un cristal, ya que tienen muy
alta disponibilidad en cualquier mercado (incluso el local), son baratos, fácilmente reemplazable, y proveen una forma segura y conocida de manejo. Además, se
cuenta con extensa documentación sobre su uso. Creemos todas éstas razones
suficientes para haber tomado la elección del cristal.
A continuación presentamos un ejemplo de oscilador programable.
- Linear Technology LTC6905 (ver hoja de datos en apéndice III)
Etapa de entrada y acondicionamiento de señal
Diseño
La etapa de entrada consta de 2 amplificadores operacionales, y un selector de rango de voltaje, o mejor dicho, de ganancia de la etapa.
Directamente de la entrada de medición, la señal entra en el primer amplificador operacional. Este se encarga de disminuir los voltajes de la señal de entrada, es decir, tiene ganancia mucho menor que la unidad para adaptar una señal de entrada que se encuentre sobrepasando los niveles máximos de tensión aceptable.
También este primer amplificador se encarga de sumar una tensión media a la señal de entrada, de modo de que luego esta señal se encuentre centrada en el valor de tensión medio entre los rangos de entrada de los conversores A/D.
La señal de entrada original se supone centrada en 0v y el osciloscopio debería ser capaz de medir señales tanto positivas como negativas. Dado que la alimentación de todos los circuitos es de 0-5v, para lograr medir señales que sean negativas a la entrada del osciloscopio debemos de sumarle una tensión continua, la cual haría que una entrada de 0v se encuentre en el valor de tensión que se encuentre justo en el medio del rango de voltajes del conversor A/D.
Una vez que la señal es "pequeña" y esta centrada, pasa a un segundo amplificador, el cual tiene una ganancia bastante alta para adaptar esta señal a valores de tensión que maximicen el rango de conversión del ADC.
La ganancia de este segundo amplificador esta dada por la selección de resistencias en su nodo de realimentación. La selección de la resistencia a utilizar esta comandada por patas de control del PIC.
Se trata de 2 patas de control, las cuales nos dan un total de 4 posibles selecciones.
Estas 2 señales de control del PIC van a un decoder/demux, el cual a partir de estas 2 señales genera 4, las cuales son mutuamente excluyentes. Luego estas van a un juego de 4 llaves analógicas. De este modo, solo una de las 4 llaves estará seleccionada a la vez.
Es aquí donde se selecciona el camino que seguirá el nodo de realimentación y ganancia del segundo amplificador, seleccionando a través de cada uno de los 4 caminos una resistencia en particular, de modo de seleccionar la ganancia deseada de esta etapa.
Por más información, ver los esquemáticos de la etapa de entrada en el
Apéndice 1.
La siguiente es una foto de la etapa de entrada final.

Fig 4.21 Etapa de entrada del osciloscopio
Componentes utilizados
Amplificador operacional: MAX477
En un principio habíamos elegido al MAX477 (ver
selección de componentes).
Este amplificador no lo habíamos utilizado sino hasta casi llegado el final del
proyecto, ya que dados los tiempos que se han manejado, no habíamos llegado al
diseño e implementación de la etapa de entrada.
Al probar el funcionamiento del MAX, hemos experimentado que, dada su altísima
ganancia, este provocaba oscilaciones en su salida. También el hecho de
amplificar con gran ganancia señales pequeñas, la distorsión que se obtenía a
su salida era muy considerable. Esta distorsión era básicamente oscilaciones
pequeñas sobre la señal original.
Al cambiar este operacional por un 741 (muy popular dentro del ambiente
electrónico), observamos que su comportamiento se acercaba más al esperado. Las
oscilaciones ya no existían y por lo tanto se obtenía una señal mucho mas
limpia. Sin embargo la ganancia era mucho menor que la del MAX, y esto
provocaba que las resistencias elegidas para la selección de rangos
prácticamente no provoquen diferencia alguna en la ganancia de este segundo
amplificador, en especial a altas frecuencias. Esto implicaba tener una señal
mucho mas limpia a la salida de la etapa de entrada pero sin control sobre la
selección de rangos.
Así también, al utilizar el 741 el ancho de banda se ve drásticamente reducido,
ya que este operacional no esta preparado para trabajar a las altas frecuencias
a las cuales va a ser sometido el osciloscopio. Además, al tener un ancho de
banda menor, la ganancia de este operacional es modificada de acuerdo a la
frecuencia de la señal de entrada, haciendo que a partir de una frecuencia
media se comporte de forma no-lineal.
Luego hemos optado por probar con otro operacional, en este caso, un OP37 de
Texas Instruments, pero sin lograr un resultado satisfactorio.
Finalmente hemos probado con una combinación de 741 y MAX, pero dejamos este tema como mejora pendiente para el futuro (ver
Capítulo 10. Temas pendientes y rentabilidad
).
Decodificador binario: 74HCT139
Este decodificador binario cumple 2 funciones básicas: decodificar un numero
binario representado en 2 bits en un juego de 4 bits de control, y,
adicionalmente (por la naturaleza de un decodificador), estos bits son
mutuamente excluyentes, necesario para el control de las llaves analógicas.
Es necesario utilizar inversores a la salida de estas señales de control ya que
el decodificador controla señales
activo-bajas, mientras que el integrado de
llaves analógicas utiliza una lógica
activo-alta. El inversor en cuestión, el
74HC240 es un inversor de 8 pares de entradas/salidas.
Llaves analógicas: 74HC4066
Este integrado contiene 4 llaves analógicas. Cada una de estas llaves consta de
un par de transistores que permiten o no la comunicación directa entre sus 2
puntas y es habilitado mediante una pata de habilitación independiente para
cada uno de estos circuitos.
Cuando esta llave se encuentra habilitada, su resistencia es de aproximadamente
50 ohm, mientras que cuando se encuentra deshabilitada, su resistencia tiende a
infinito. Todas estas compuertas son independientes, y es por esto que se
necesita del decodificador, el cual hace que las señales de control sean
mutuamente excluyentes, de modo que nunca pueda estar seleccionado más de un
canal simultáneamente.
Un detalle a tener en cuenta es que los voltajes en sus pines de entrada/salida
no pueden superar por mucho a Vcc ni caer muy por debajo de tierra. Esto
implicaría una conducción forzada de los transistores.
Frecuencia máxima de trabajo
La frecuencia máxima de trabajo del osciloscopio puede calcularse a partir de
las frecuencias máximas de los componentes que lo integran. Las compuertas
lógicas simples generalmente no son el problema, puesto que éstas, siendo de
naturaleza TTL, tiene un ancho de banda muy superior al del resto de los
componentes.
Por eso, para calcular la frecuencia máxima de trabajo del osciloscopio
estudiaremos la frecuencia máxima que soporta cada uno de sus componentes. Sin
embargo, no todos los componentes cumplen un papel relevante en el cálculo de
la frecuencia máxima de trabajo. Por ejemplo, la velocidad máxima de trabajo
del PIC es independiente de la velocidad máxima de trabajo del osciloscopio
puesto que en las capturas a alta velocidad el PIC no juega ningún papel, más
que el de disparar la captura. Por lo tanto, el análisis de la máxima
frecuencia de trabajo debe realizarse a partir de los componentes que están
involucrados directamente en la capturas a a alta velocidad, a saber:
- Conversores AD
- Contadores
- Memorias
- Amplificadores de entrada
De las hojas de datos de dichos componentes podemos extraer sus frecuencias
máximas de trabajo, las cuales son:
| Componente | Modelo | Frecuencia máxima |
| Contador | 74F269 | 100 Mhz |
| Memoria | CY7C-109B-25 | 40 MHz (ciclo lectura/escritura: 25 us max) |
| Conversor AD | TLC5540 | 40 MHz |
| Amplificador | MAX477 | 300 Mhz |
Tabla 4.3 Frecuencia máxima de componentes
Como se puede observar en la tabla las dos limitantes son el conversor AD y la
memoria, siendo ésta última la menos importante puesto que se puede reemplazar
por el modelo CY7C-109B-15 (de igual pinout) que trabaja hasta 66 Mhz. El
conversor AD, en cambio, no tiene un sustituto inmediato conocido.
Por consigue, de éste análisis se desprende que la frecuencia máxima de trabajo
del osciloscopio es de 40 Mhz. Para lograr dicha frecuencia se deberá utilizar
un cristal de 40 Mhz y será necesario contar con un PCB bien diseñado a los
efectos de minimizar ruidos e interferencias, que son muy dañinos a dichas
frecuencias.
_En nuestro caso particular (en el cual no dispusimos del tiempo y los medios
necesarios para fabricar un PCB) la frecuencia máxima a la cual pudimos hacer
trabajar la placa fue
8 Mhz ya que, para frecuencias superiores (probamos con
un cristal de 20MHz) el funcionamiento de la placa era erróneo o nulo.
Atribuimos estos problemas a la falta de haber diseñado un circuito impreso
apropiado, y llegamos a la conclusión de que para trabajar a tan altas
frecuencias la distribución y el diseño físico de la placa cumple un papel
fundamental, cosa que no ocurre a bajas frecuencias donde solo es necesario
que los componentes estén conectados correctamente._
Por más información referirse a el
Capítulo 8. Fabricación y puesta en marcha
donde se pueden ver fotos de la placa.
Análisis de tiempos
En esta parte se realizará un análisis, estudio, y verificación de los
requerimientos de tiempos de los componentes para garantizar el correcto
funcionamiento del equipo a las velocidades esperadas. Esto se hará sobre los
componentes que forman parte de las operaciones de alta velocidad, ya que aquí
es donde se considera crítico el tema de los tiempos.
Para comenzar, debemos especificar las limitaciones máximas y mínimas de los
componentes:
- Microcontrolador PIC 18F4550
- velocidades aceptadas del reloj externo (usado para el control de alta velocidad):
- 4, 8, 12, 16, 20, 24, 40, y 48 MHz.
- Buffer bidireccional 74F245
- tiempo de propagación:
- típico: 4 ns.
- máximo: 7 ns.
- Compuertas NAND 74F00
- tiempo de propagación:
- típico: 3.5 ns.
- máximo: 6 ns.
- Contadores 74F269
- tiempo de propagación:
- típico: 4 ns.
- máximo: 10 ns.
- frecuencia máxima de operación:
- Conversor AD TLC5540
- frecuencias de operación:
- mínimo: 5 MHz.
- máximo: 40 MHz.
- retardo de salida (tiempo de conversión)
- típico: 9 ns.
- máximo: 15 ns.
- Memoria CY7C109B-20
- tiempo de acceso:
- tiempo de retención de la dirección:
- tiempo de retención del dato (durante la escritura):
Dados los límites del PIC y del conversor AD, se puede ver cómo la velocidad
del oscilador externo, que es quién controla la señal de reloj de los
componentes de alta velocidad, debe ser entre 5 y 40 MHz. Por esta razón
consideramos apropiado comenzar con las pruebas con una señal de reloj de 8
MHz, para luego aumentar esta velocidad.
El estudio que realizamos a continuación será sobre el proceso de escritura, ya
que es donde se utilizan los componentes a máxima velocidad.

Fig 4.22 Diagrama de tiempos de escritura a memoria a 40Mhz
La señal de reloj esta tomada a la salida del inversor que va directo al
cristal, ya que esta es la señal común que controla a los circuitos externos.
El reloj que llega a los contadores es invertido 3 veces, por lo que la salida
del contador será estable transcurridos 15ns desde el flanco negativo del
reloj. Este tiempo esta determinado por la suma del retardo
entrada/salida de
los 3 inversores más el tiempo de respuesta de los contadores (tambien sumados,
ya que se encuentran en cazcada).
Los datos, que son obtenidos a la salida del conversor, estarán disponibles
12.5ns después del flanco negativo del clock, ya que se trata de los 4ns de
retardo del inversor más los 9ns de tiempo de respuesta del conversor.
De esta forma es que se tienen los datos y la dirección estables transcurridos
solamente 2.5ns a partir del flanco positivo del reloj, ya que estas señales
son manejadas por el flanco negativo del reloj.
Finalmente, la escritura se realiza en el flanco negativo de la señal
WR\.
Esta señal pasa por un solo inversor, es por esto que el flanco negativo de la
señal de control se encuentra a 3.5ns del flanco positivo del reloj.
El diagrama muestra que se cumplen todos los requerimientos necesarios para que
al instante de escritura en la memoria, los datos y la dirección se encuentren
disponibles previamente, y que también estén fijos durante el tiempo que lleva
este proceso (12ns).
De igual forma se puede inferir que mientras que el reloj se encuentre dentro
de las velocidades permitidas (5 a 40Mhz), el circuito funciona de igual forma.
Luego, para el proceso de lectura no se utiliza el conversor, pero sí los
contadores (para direccionar la memoria). Este proceso no es sincrónico (no
utiliza la señal de reloj), sino que una vez que se direcciona la memoria 12ns
después se encuentran los datos disponibles. Dado que la velocidad de
procesamiento del microcontrolador no llega a estos tiempos de respuesta, esta
determinado que cuando éste intente obtener los datos del bus, éstos ya van a
estar disponibles.
Para concluir, podemos decir que el estudio de tiempos que hemos realizado nos
asegura de que los componentes van a funcionar a las velocidades esperadas sin
inconvenientes, ya que cumplen con los requisitos necesarios para los procesos
de escritura a alta y baja velocidad, como también para la lectura de los
datos.
Consumo de potencia y alimentación
Para decidir si es necesario alimentar la placa con una fuente externa (o si
basta con la potencia entregada por el puerto USB) basta con estudiar el
consumo de los diferentes componentes activos que integran el osciloscopio, los
cuales se presentan en la siguiente tabla (todos los valores están en mA).
| Comp. | Típica | Máxima | Cantidad | Típica | Máxima |
| PIC18F4550 | 200 | 300 | 1 | 200 | 300 |
| 74F269 | 113 | 135 | 2 | 226 | 270 |
| TLC5540 | 17 | 27 | 2 | 34 | 54 |
| CY7C-109B | 80 | 100 | 2 | 160 | 200 |
| MAX477 | 100 | 120 | 2 | 200 | 240 |
| 74F245 | 95 | 120 | 2 | 190 | 240 |
| 74HC4066 | 20 | 20 | 2 | 40 | 40 |
| Total | 1050 | 1344 |
Tabla 4.4 Consumo de potencia de componentes activos
En esta tabla se omitieron algunos componentes cuyo consumo es despreciable (74HCT240, 74HCT139).
A partir de los valores típicos y máximos totales de la tabla se puede concluir
(alimentación de 5V) que el consumo de potencia del osciloscopio ronda entre
los 5 y 7 watts.
Dado que un puerto USB es capaz que suministrar un máximo de 500 mA de
corriente por cada dispositivo conectado al bus, resultó indispensable el uso
de una fuente externa para alimentar la placa. Para ello utilizamos decidimos
utilizar un regulador 7805 y optamos por una fuente de 9V DC pues es el voltaje
mínimo necesario para el funcionamiento del 7805 (y por lo tanto el que disipa
menos calor) y además permitiría la posibilidad de ser reemplazado por una
batería de 9V, en caso de ser apropiado y/o necesario.
Trigger externo por hardware
Otro de los temas que quedó pendientes fue la implementación de un trigger
externo por hardware, lo cual permitiría, por ejemplo, disparar la captura de
datos por un canal al recibir un pulso recibido por el otro canal.
Para implementar esta característica se puede usar el módulo comparador que
viene incluido en el PIC. Dicho módulo permite disparar una interrupción cuando
la señal de entrada supera un nivel dado de voltaje. El voltaje de referencia
puede suministrarse con otra señal externa o utilizar un generador interno de
referencia, de 4 bits. Por lo cual es posible generar 16 valores de
referencias. A su vez, también es posible configurar el comparador para
disparar por flanco positivo o negativo.
En definitiva, utilizando el módulo comparador del PIC es posible construir un
trigger por hardware de 16 niveles. El módulo comparador incluye dos
comparadores independientes.
Las salidas AOUT1 y AOUT2 de la etapa de entrada se encuentran conectadas a los
pines RA0 y RA1 del PIC. Estos pines son las entradas a los dos comparadores
del PIC. El módulo comparador del PIC puede funcionar en varias
configuraciones. En particular, para nuestro caso utilizaríamos el modo de
cuatro entrada multiplexadas a dos comparadores (CM2:CM0 = 110) como se muestra
en el siguiente diagrama:

Fig 4.23 Comparador para el trigger por hardware
Por más información consultar la hoja de datos del PIC (capítulo 15).
Características del módulo comparador
Las especificaciones del módulo comparador del PIC son las siguientes:
- puede usar una referencia interna de voltaje programable
- 2 rangos
- rango bajo: 0 -- 0.667 ΔV
- rango alto: 0.25 ΔV -- 0.75 ΔV
- ΔV seleccionable. Valores posibles:
- ΔV = Vdd - Vss
- ΔV = Vref+ - Vref-
- Tiempo de ajuste del voltaje de referencia: 10 us (max)
- Entradas analógicas (deben estar entre Vdd y Vss)
- RA0 (entrada al primer comparador)
- RA1 (entrada al segundo comparador)
- RA2 (Vref-)
- RA3 (Vref+)
- Salidas digitales (no se usan en nuestro caso)
- RA4 (salida comp1)
- RA5 (salida comp2)
- Tiempo de respuesta del comparador: 400ns (max)
Tiempos y demoras
Para esta característica, el tiempo cumple un papel crucial. Por lo tanto,
debemos es necesario estudiar detenidamente los tiempos involucrados, a saber:
- tiempo de respuesta del comparador (400 ns max)
- tiempo de atención a la interrupción
- tiempo de ejecución de las instrucciones necesarias (depende del código)
Por lo tanto, para lograr un comportamiento satisfactorio en el trigger de
hardware será necesario medir y cuantificar de la forma más precisa posible
dichos tiempos.
Por otro lado, es claro que la suma de dichos tiempos generará una demora
inaceptable para altas frecuencias, por lo cual resulta inviable disparar el
proceso de captura a través de la interrupción.
Por lo tanto, lo que haremos será
detener la captura, en lugar de empezarla.
Esto permitirá conservar las muestras capturadas en el momento exacto que
ocurrió el trigger, que es justamente el objetivo de un trigger externo.
También es evidente que no detendremos la captura en el momento exacto que
recibimos la interrupción del comparador, puesto que querremos obtener una
cantidad considerable de muestras posterior al momento del disparo para poder
observar que ocurrió después del mismo. Por lo tanto, una vez que recibamos la
interrupción del comparador se esperará un tiempo arbitrario (a definir) antes
de detener los comparadores. Para implementar esta demora arbitraria se
utilizará alguno de los timers internos del PIC.
En definitiva, la demora total entre el momento que llega el trigger por la
señal de entrada y el momento en que se detienen los contadores es la suma de
las siguientes demoras:
- demora de respuesta del comparador (400 ns máx)
- demora de atención a la interrupción (ver hoja de datos del PIC)
- demora en ejecutar las instrucciones para configurar el timer (ver demora de instrucciones en hoja de datos del PIC)
- demora arbitraria (a definir, según el caso)
- demora en ejecutar las instrucciones para detener los contadores
Para que el algoritmo funcione correctamente todas estas demoras deberán ser
cuantificadas con precisión. Para ello será necesario analizar una por una las
instrucciones ejecutadas. Si nuestro código estuviera escrito en assembler,
esto sería tedioso pero trivial. Sin embargo, como nosotros programamos en
lenguaje C, será necesario compilar el programa, y utilizar la vista de código
ensamblado disponible en el MPLAB (en el menú View - Disassembly listing).
Algoritmo de trigger por hardware
Una vez calculada apropiadamente la demora total estaremos en condiciones de
poder implementar el mecanismo de gatillado por hardware, a través del
siguiente algoritmo:
- se mantiene al PIC capturando de forma continua
- cuando llega el disparo externo el comparador (que habrá sido programado acorde previamente) éste genera una interrupción
- en la rutina de atención a la interrupción se espera un tiempo suficiente como para llenar gran parte de la memoria, pero no demasiado como para que los contadores den una vuelta completa y sobreescriban las muestras capturadas en el momento que ocurrió el trigger
- luego de terminada dicha espera se detienen los contadores y se retroceden una cantidad N, donde N es el producto entre la frecuencia del oscilador y la demora total (calculada en la parte anterior) Para ello serán necesarios lo siguientes pasos:
- cambiar la dirección del contador (pin UPDN del bloque de adquisición)
- seleccionar CKLO como entrada de clock (a través de CKSEL)
- enviar N ticks a CKLO (pin RC0 del PIC)
- se lee la cantidad de muestras solicitadas y se transfieren al PC
Este algoritmo es fácilmente adaptable (cambiando el N) para transferir una
cantidad determinada de muestras previas al disparo del trigger para poder
observar que ocurría antes de que éste ocurriese, lo cual puede ser útil en
muchos casos.
Temas pendientes
Por razones de tiempo no fue posible implementar esta característica en el
firmware del osciloscopio. Sin embargo, el hardware fue dejado previsto de
manera que solo queda pendiente la implementación del algoritmo en el firmware.
Herramientas de programación
Una vez seleccionada la arquitectura hay que analizar cómo es que esta se programa.
Al tratarse de un PIC, normalmente se utilizaría el
PICSTART Plus, de Microchip. Sin embargo, el modelo que hemos seleccionado es el
único que no funciona con este programador. Así mismo, una ventaja que teníamos si este programador nos sirviese, es que tendríamos uno disponible a nuestro alcance, sin la necesidad de comprar uno. Al momento de realización del proyecto, se estimaba que en el futuro una actualización iba a permitir utilizar dicho PIC, pero dado que aún esto no había ocurrido, corrimos con la necesidad de conseguir o construir nuestro propio programador.
La solución que encontramos fue el programador y depurador ICD2.
Hemos conseguido uno a bajo precio en los Estados Unidos, pero al verse demorado este proceso, especialmente en que llegue a nuestras manos, optamos por comenzar construyendo nuestro propio programador.
PG2C (Programador PIC de interfaz serie)
Este simple programador es el que nos permitió comenzar con la programación y prueba del microcontrolador. Antes de tener en nuestras manos el ICD2, debimos construir nuestro propio programador para poder comenzar con el proyecto.
A continuación mostramos el esquemático del programador:

Fig 4.24 Programador serie
Para poder programar el PIC, se debe usar el software PicPgm (
http://www.members.aon.at/electronics/pic/picpgm/index.html).
La simpleza del circuito nos permitió comenzar rápidamente con la programación y prueba del PIC, sin embargo esta herramienta no nos iba a servir a futuro cuando comenzáramos con la fabricación de la placa, ya que nos exigía extraer el microcontrolador para su programación, y no contaba con una herramienta de depurado, lo que creemos indispensable para la etapa de desarrollo e implementación.
CUI (Create USB Interface)
Este pequeño circuito nos daba la posibilidad de programar el PIC vía USB. Se trata de pocos componentes, y de un firmware que debe correr en el PIC para permitir la conexión USB. Cabe aclarar que en una primera etapa, para poder cargarle dicho firmware al PIC, se debe poseer de un programador estándar. Una vez que el PIC esta programado con este
programa base se puede cargar nuevos programas en el sin necesidad de un programador.
Esto nos permite realizar actualizaciones del firmware en el PIC sin necesidad de que nosotros o el usuario final posea un programador.

Fig 4.25 Create USB Interface
ICD2 (In Circuit Debugger)
Este equipo nos permite la programación del PIC, pero adicionalmente permite depurar el programa directamente dentro del microprocesador. De esta forma no se trabaja sobre una
simulación de cómo podría funcionar el sistema, sino que efectivamente se trabaja en tiempo real sobre el sistema real.
Hemos elegido el
Easy ICD2, el cual es un ICD2 completamente compatible y similar al fabricado por Microchip, pero a un costo mucho menor.

Fig 4.26 In Circuit Debugger
Como se puede observar, el dispositivo consta de dos partes. La primera y principal es la que provee la interfaz hacia el PC, permitiendo la comunicación y programación. La segunda placa es simplemente una interfaz de conexión con el PIC. Esto permite, tal cual luego hemos hecho, realizar la conexión y programación directamente sobre nuestra placa de desarrollo, sin tener que extraer el PIC y colocarlo en el zócalo de programación. Es decir, realizando las conexiones pertinentes, se puede conectar directamente el programador a nuestro circuito y programar y depurar directamente allí.
Esta es la razón principal por la cual hemos escogido esta herramienta.
Características principales:
- Interfaz ,S-232 para conexión al PC
- Depurado en tiempo real
- Firmware actualizable desde el PC
- LEDs indicadores de diagnostico (Power, Busy, Error)
- Depurado con detenciones programadas y monitoreo de variables
Referencias
- Arquitecturas
- Procesador ETRAX de Axis
- Referencia de diseño del ETRAX
- RTAI - distribución de linux en tiempo real
- RTAI portado para ETRAX
- Silicon Laboratories
- PIC18F4550
- Conversores analógico-digitales
- Resolución
- Conversores SAR
- Conversores Delta-sigma
- Conversores Pipeline
- Conversores Flash
- Conversores Integrados
- Memorias
- Memorias de Acceso Aleatorio
- La memoria RAM
- SRAM
- DRAM
- Memorias de acceso programable (patente)
- Osciladores programables
- Silicon oscillators can offer advantages over crystals
- Using the DS1086 as a Microcontroller Clock to Reduce EMI
- Figuras
- Hojas de datos
Capítulo 5. Firmware
Contenido de este capítulo
Introducción
Este capítulo habla sobre los temas relacionados con la implementación del
firmware, es decir, el programa que corre en el microprocesador y controla el
funcionamiento de la placa. Incluye información sobre la estructura del código
y detalles particulares de la implementación.
Herramientas de trabajo
El firmware es el programa que corre internamente en el PIC y sirve para
controlar el osciloscopio. Fue escrito enteramente en C utilizando el Microchip
MPLAB C18, un compilador de C provisto por el mismo fabricante del PIC que
soporta el estándar de C ANSI '89 y que viene pensado para trabajar de forma
conjunta con el MPLAB IDE, que es el entorno de desarrollo de Microchip. A
través del mismo MPLAB IDE es se realiza la programación, simulación, y
depuración paso a paso (por hardware) del PIC.

Fig 5.1 Captura de pantalla del MPLAB IDE
Una característica destacable del MPLAB C18 es la posibilidad de generar
binarios optimizados (tanto en espacio, como cantidad de instrucciones) para
PICs de la familia PIC18F (por ejemplo, nuestro PIC18F4550) utilizando
las instrucciones extendidas provistas por dicha arquitectura.
El MPLAB C18 está disponible para bajar gratuitamente de la página de Microchip
(ver link en referencias). Sin embargo, la versión gratuita (llamada versión
estudiantil) tiene una duración de 60 días. A partir de esos 60 días, el
programa seguirá funcionando pero sin las optimizaciones antes mencionadas, por
lo cual el compilador generará binarios que seguirán funcionando pero ocuparán
más espacio (al no estar optimizados) y utilizarán más instrucciones para
realizar el mismo trabajo.
Clase de dispositivo
El estándar USB contempla varias clases de dispositivos para funcionalidades
encontradas comúnmente en los dispositivos. Por ejemplo, existe un clase para
las cámaras digitales, otra para los escáners, otra para las impresoras, etc.
Las clases de dispositivos fueron inventadas para mejorar la interoperabilidad
de los dispositivos. Así, cualquier sistema operativo que tenga un driver para
trabajar con cámaras digitales puede leer fotos de la cámara digital que esté
diseñada para cumplir las especificaciones de dicha clase de dispositivos. Por
más información, ver el capítulo sobre USB.
En particular, para nuestro osciloscopio optamos por usar la clase de
dispositivo CDC (Communication Device Class) que básicamente emula una conexión
serie sobre el puerto USB. La razón por la cual optamos esta clase fue que el
mecanismo de una conexión serie nos pareció un enfoque simple y efectivo para
intercambiar simultáneamente información de control y datos. Además, al no
haber ninguna clase prevista para un osciloscopio USB, una comunicación serie
es el método más directo de implementar un driver propio puesto que solo basta
con enviar y recibir cadenas de caracteres. En conclusión, escogimos la clase
CDC por su
sencillez y flexibilidad.
Firmware CDC
La comunicación USB se realiza mediante la ayuda del firmware CDC, un framework
que brinda Microchip para poder establecer una comunicación (a través del
puerto USB) de forma simplificada. El firmware CDC encapsula varias funciones
ocultando toda la complejidad necesaria para la comunicación USB de forma de
proveer una
comunicación serie tradicional entre el PIC y el PC. También se
encarga automáticamente de establecer la conexión con el host controlador USB y
negociar la comunicación, el consumo de potencia, etc.
Existen diferentes firmwares previstos para otras funcionalidades, como por
ejemplo el de almacenamiento masivo (Mass Storage) para hacer un lector de
tarjetas o el de dispositivos de interacción humana (Human Interface Device o
HID) pensado para hacer un mouse o similar. Inprovee también un firmware más
abierto para realizar una comunicación más avanzada.
Algunas de las características del firmware CDC son las siguientes:
- Tasa de transferencia máxima de 80 kbytes/s
- Las librerías compiladas ocupan un tamaño relativamente chico (4 Kb)
- Resuelve toda la comunicación en software (no requiere de ningún hardware extra especial)
- El flujo de datos es manejado enteramente por el protocolo USB (no es necesario usar control de flujo por software ni hardware)
- Negocia la potencia a usar por el dispositivo USB, conectándose primero a baja potencia (50 mA) y luego solicitando más, como lo exige el estándar USB
Por más información, ver el
Capítulo 3. Bus serie universal (USB)
.
Captura de datos
Modos de captura
Debido a la naturaleza de los diversos integrados que componen el osciloscopio
fue necesario incorporar en el firmware tres modos de funcionamiento diferentes
para poder cubrir todo el rango de frecuencias en la etapa de adquisición.
En el siguiente diagrama puede observarse un bosquejo del funcionamiento de
cada uno de estos modos, y a continuación se explican detalladamente estos
modos de funcionamiento junto con las limitantes para cada caso.

Fig 5.2 Diagrama de funcionamiento del firmware (modos de captura)
Captura a alta velocidad (comando AQHI)
La captura a alta velocidad se realiza utilizando los contadores para controlar
las memorias, por lo cual es posible alcanzar velocidades de hasta 40 Mhz, que
es la velocidad máxima de funcionamiento del conversor analógico-digital.
En este modo tenemos dos limitantes:
- por arriba, el factor limitante es la velocidad máxima de trabajo del
conversor conversor AD, puesto que los contadores y las memorias pueden
trabajar a velocidades aún mayores.
- por abajo, la limitante es el tamaño de la memoria, puesto que el proceso de adquisición se ejecuta siempre a la velocidad del oscilador (en nuestro caso 8 Mhz) por lo cual la frecuencia mínima a muestrear (si tomamos como requisito capturar al menos 4 ciclos de la señal) sería: f = fs / 65536 muestras / 3 ciclos, lo cual en nuestro caso (fs = 8Mhz) da cerca de un 1 Khz.
Sin embargo, en este modo de captura no se tiene ningún control sobre las
memorias durante el proceso de captura: el PIC simplemente dispara los
contadores y queda esperando a ser interrumpido por los contadores una vez que
finaliza el proceso de captura y las memorias están llenas.
En este modo de captura la señal se muestrea en "ventanas", por lo cual solo
sirve para señales periódicas.
Estos son los pasos seguidos por el PIC para ejecutar una captura a alta velocidad:
- es presetean los contadores a cero
- se libera el bus de datos
- se setean los contadores para que cuenten hacia adelante (UPDN=1)
- se selecciona el clock rápido en el bloque de control de memoria (CKSEL=0)
- se habilita escritura del ADC en el bus (ADCOE=0)
- se habilita escritura de memoria (WR=0)
- se activan contadores (CKEN=0)
- se espera a ser interrumpido por el segundo contador lleno
- se transfieren los datos almacenados en la memoria por el puerto USB
Interrupción por contador lleno
Como se mencionó anteriormente, en el modo de captura a alta velocidad el PIC
dispara el los contadores y estos se encargan de direccionar la memoria
mientras los conversores AD colocan los valores digitalizados en los pines de
datos de la memoria.
Debido a que el PIC, una vez que dispara los contadores, pierde el control
sobre ellos se precisa un mecanismo para poder detener el proceso de captura.
Para ello se ha conectado la pata TC del contador alto al PIC, de forma de que
interrumpa al PIC cuando el contador se llene. La pata TC del contador, como
puede observarse en la hoja de datos, vale cero únicamente cuando la salida del
contador es 11111111, por lo cual se ha configurado el PIC para ser
interrumpido por nivel en el pin donde se ha conectado el TC del contador. No
cualquier pin del PIC puede ser utilizado para interrumpirlo. En particular,
solo los pines RBx son capaces de brindar esa funcionalidad, por lo cual hubo
que utilizar uno de éstos.
Al ser interrumpido, el PIC procede inmediatamente a deshabilita los contadores
para evitar que se sobreescriban la mayor cantidad de valores (puesto que los
contadores se resetean y la memoria se empieza a escribir a partir de la
posición 0).
Otra forma de atacar este problema podría haber sido conectar la pata TC
directamente a la pin que habilita los contadores de manera que al activarse TC
automáticamente se deshabiliten los contadores. Esta solución efectivamente
impediría que ningún valor de la memoria se sobreescribiese. Sin embargo, dado
la gran cantidad de valores los pocos que resultan sobreescritos no afectan
en absoluto para fines prácticos.
Sin embargo, éste mecanismo de detención por hardware resulta de mayor utilidad
si se desea implementar un trigger por hardware, ya que en este caso las
primeras muestras son muy relevantes.
Captura a media velocidad (comando AQME)
La captura a media velocidad se realiza controlando la escritura a memoria
desde el PIC. En este modo también se capturan ventanas de la señal, para luego
transferir los datos por el puerto USB, en una etapa posterior.
En este caso tenemos una limitante superior que es la velocidad de
procesamiento del PIC. Este valor puede calcular exactamente partiendo de las
instrucciones que son ejecutadas entre dos capturas consecutivas del PIC, y
utilizando la cartilla de instrucciones del PIC donde viene especificada la
duración de cada una. También sabemos que el PIC trabaja siempre a 12 MIPS, por
lo cual es un calculo tedioso pero no presenta ninguna complicación. En nuestro
caso, el código está escrito en C por lo cual habría que estudiar el código
assembler generado por el compilar C18. De todas formas, encontramos de forma
empírica que dicha limitante rondaba en los 6 Khz (tomando como requisito la
captura de 4 ciclos de reloj).
Supongamos que se solicita una captura de media velocidad de N muestras. Los pasos seguidos por el PIC para realizar dicha captura son los siguientes:
- acq_sample = N
- se presetean los contadores a cero
- se libera el bus de datos
- se selecciona el clock lento en el bloque de control de memoria (CKSEL=1)
- se habilita la escritura del ADC en el bus (ADCOE=0)
- se habilita escritura de memoria (WR=0)
- se ejecuta un tick en el contador bajo (CKLO = 0, CKLO = 1, CKLO = 0)
- acq_sample = acq_sample - 1
- si acq_sample > 0 entonces se va al paso 7, sino se sigue de largo
- se transfieren los datos almacenados en la memoria (hasta la posición N) por el puerto USB
NOTA: Debido a que el conversor AD trabaja a una frecuencia
mínima de 5 Khz
Captura a baja velocidad (comando AQLO)
Si bien la captura a media velocidad no tiene una frecuencia mínima definida,
es de especial interés tener un mecanismo de captura en "tiempo real" para
señales de muy baja frecuencia, y es por ello que existe el modo de captura a
baja velocidad.
A diferencia de los 2 modos anteriores, la captura a baja velocidad captura y
transfiere los datos directamente por el puerto USB, sin pasar por la memoria.
Esta captura en tiempo real (es decir, sin usar ventanas) permite ver una
captura continua de señales de baja frecuencia.
La limitante en este caso es la velocidad de transferencia por el puerto USB
junto con la velocidad de procesamiento del PIC para llevar a cabo todas las
tareas. El resultado empírico nos da una frecuencia máximo de trabajo de 4 Hz.
La captura a baja velocidad permite dibujar la señal en pantalla en el momento
que se está capturando lo cual brinda una funcionalidad análoga a las provistas
por los osciloscopios tradicionales.
Dado su naturaleza, este modo de captura es invocado de forma diferente que el
resto. En este caso la captura se "inicia" ejecutando el comando AQLO y
continua indefinidamente (transfiriendo datos por el puerto USB) hasta que es
detenido con el comando STOP.
Este es un bosquejo de los pasos a seguir para realizar esta captura.
- se presetean los contadores a cero
- se libera el bus de datos
- se setea el PIC para que lea del BUS de datos
- se habilita la escritura del ADC en el bus de datos (ADCOE=0)
- se lee el bus de datos y se almacena su contenido en un buffer
- se transfiere el valor del buffer por el puerto USB
- se espera una cantidad de tiempo determinada por el parámetro pasado al comando AQLO
- se vuelve al paso 5, a menos que se haya recibido un comando STOP
Modos de captura según la frecuencia de trabajo
A continuación se presenta en una tabla un resumen de todos los modos de
captura junto con sus respectivas frecuencias de trabajo, como así también las
limitantes para cada caso.
Tabla 5.1 Modos de captura - frecuencias límite
La selección del modo captura depende de la frecuencia que se desea observar, y
por consiguiente es responsabilidad de la aplicación que controla el
osciloscopio solicitar el modo adecuado de captura para la frecuencia deseada.
Divisor horizontal (HDIV)
El funcionamiento de los modos de captura mencionados anteriormente puede ser
afectado ligeramente utilizando el divisor horizontal. Este divisor es
configurado a través del comando HDIV (ver Protocolo de comunicación) y es el
que permite cubrir todo el rango de frecuencia.
El efecto del parámetro HDIV es el de retrasar el tiempo entre dos muestras. En
todos los casos, HDIV=0 indica que no habrá ningun retraso y por lo tanto es la
captura más rápida a ese modo de trabajo. Este se aplica de forma diferente
según el modo de captura, a saber:
- en la captura a alta velocidad se utiliza para leer la memoria: la memoria es leída salteando HDIV posiciones entre cada lectura. Por ejemplo, para HDIV=5 se leerán (y transferirán) las muestras grabadas en las direcciones: 0, 5, 10, 15, etc.
- en la captura a media velocidad el parámetro HDIV es utilizado también par a leer la memoria, de análoga a la captura de alta velocidad
- en la captura a baja velocidad el parámetro HDIV es utilizado para generar una demora arbitraria entre dos transferencias consecutivas de datos, lo cual resulta en un muestreo a más baja velocidad.
Otros parámetros de captura
Además del parámetro HDIV existen otros parámetros que afectan las rutinas de
adquisición de datos. Ellos son:
- CHAN - selecciona el canal a muestrear
- DUAL - habilita el muestreo de ambos canales
- CHOP - selecciona como serán muestreados ambos canales (solo para modo DUAL)
- VDV1 - selecciona la escala de voltaje a utilizar en la etapa de entrada del canal 1
- VDV2 - selecciona la escala de voltaje a utilizar en la etapa de entrada del canal 2
Resumen de las funciones del firmware
El firmware está compuesto por varias funciones que interactúan entre si para
hacer posible su funcionamiento. A continuación se listas estas junto con una
descripción de la tarea que desempeñan.
Funciones de inicialización
-
InitializePorts()
- inicializa todos los pines del PIC para su correcto funcionamiento con el osciloscopio
-
ResetParams()
- resetea los parámetros de configuración del osciloscopio (escala vertical, modo dual, modo binario, etc) a su valor por defecto (ver protocolo de comunicación)
-
BusFree()
- libera el bus de datos, colocando todos los dispositivos conectados a él en modo lectura
Funciones de selección y configuración de canales
-
SetChan(unsigned int chan, BOOL write)
- activa el canal especificado en el parámetro
chan y lo pone en modo lectura (si write es FALSE) o en modo escritura (si write es TRUE)
-
SetVdiv(unsigned int can, unsigned int vdiv)
- selecciona la división de voltaje a usar en el canal especificado
Funciones de comunicación por puerto USB
-
SendResp(unsigned int code)
- envía una respuesta sin datos por el puerto USB siguiendo el protocolo dde comunicación.
code es el código de respuesta a enviar (ver protocolo de comunicación)
-
SendRespData(char* data)
- envía respuesta OK e inmediatamente los datos pasados por el parámetro data, siguiendo el protocolo de comunicación.
-
SendRespLen(unsigned int code, unsigned int len)
- similar a
SendResp, pero en este caso también el largo de los datos en la respuesta.
-
SendSample(byte data)
- envía el valor de una muestra capturada (pasada en el parametro
data) siguiendo el protocolo de comunicación. El envío se realiza en formato binario o ASCII según como esté configurado el modo binario.
-
SendData()
- utiliza
SendSample para transferir todo el contenido de la memoria. El límite de muestras a enviar viene dada por el parámetro del comando que solicito la captura. El comportamiento de esta función también depende del modo de funcionamiento DUAL/ALT/CHOP.
Funciones de lectura y ejecución comandos
-
CmdGet()
- recibe, parsea y reconoce un comando recibido por el puerto USB, siguiendo el protocolo de comunicación
-
CmdRun()
- ejecuta el comando antes recibido por
CmdGet, devolviendo respuestas de error cuando corresponda (comando desconocido, respuesta fuera de rango, etc)
-
DoAQHI()
- es llamada desde la rutina de interrupción disparada luego de finalizada la captura a alta velocidad. Se encarga de transferir los datos capturados (usando
SendRespLen y SendData)
-
DoAQME()
- ejecuta la captura de datos a media velocidad, siguiendo el procedimiento indicado arriba en Modos de captura, y tomando en cuenta los parámetros de configuración del osciloscopio (modo dual, chop, etc)
-
DoAQLO()
- ejecuta la captura de datos a baja velocidad, siguiendo el procedimiento indicado arriba en Modos de captura, y tomando en cuenta los parámetros de configuración del osciloscopio (modo dual, chop, etc)
-
DoWRLO()
- ejecuta el comando WRLO (función de depuración utilizada para escribir la memoria a baja velocidad)
-
DoWRHI()
- ejecuta el comando WRHI (función de depuración utilizada para escribir la memoria a alta velocidad)
-
DoDUMP()
- ejecuta el comando DUMP que vuelca el contenido de la memoria. Por tratarse de un comando de depuración, no utiliza la función
SendData para enviar los datos sino que implementa el envío de datos de forma completamente independiente
-
DoSTOP()
- ejecuta el comando STOP que detiene todo comando de captura en curso
Funciones de manejo del contador
-
CntPreset(int cnt_pres)
- presetea los contadores al valor pasado por el parámetro
cnt_pres
-
CntTick()
- realiza un tick en el reloj del contador bajo, haciéndolo incrementarse
-
CntStep()
- ejecuta repetidamente la función
CntTick según el valor actual del parámetro de configuración del osciloscopio HDIV
Manejo de interrupciones
El manejo de las interrupciones a nivel del firmware se hace de la siguiente forma.
Instalación de la ISR
Para instalar la rutina de atención a la interrupción (ISR) es necesario
colocar un comando de salto en una posición específica de la memoria. Para ello
es necesario utilizar la directive
#pragma code que provee el compilador C de
Microchip. Esto se hace de la siguiente manera:
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm goto cntfull_isr _endasm
}
El efecto de utilizar la directiva
#pragma code es que el código de la
función interrupt_at_high_vector es colocado en la dirección de memoria 0x08
que es la dirección de memoria donde comienza a ejecutar el PIC una vez que
recibe la interrupción. A su vez, también se puede observar el uso de las
directvias
_asm y
_endasm que lo que hacen es permitir ingresar código
assembler dentro del código C. Esto es necesario en este caso puesto que las
instrucciones a colocar en la dirección 0x08 no pueden superar los 2 bytes
puesto que se solaparían con las siguientes bytes de memoria que son reservados
para otras operaciones. Por lo tanto, la forma de asegurar que este problema no
ocurra es incrustar código assembler cuyo largo es conocido.
Rutina de atención a la interrupción
Luego, ya dentro de la propia rutina de atención a la interrupción se ejecuta
lo siguiente:
volatile BOOL cntfull = FALSE;
void cntfull_isr(void) {
INTCON3bits.INT2IF = 0;
cntStop();
cntfull = TRUE;
}
La primer línea baja el flag de atención a la interrupción, la segunda detiene
los contadores, y la tercera setea el flag de contador lleno que luego es
detectado desde el programa principal para ejecutar la transferencia de las
muestras adquiridas.
Uso del calificador volatile
Vale recalcar que la variable cntfull debe ser declarada con el calificador
volatile. La razón de esto se explica a continuación:
La mayoría de los compiladores de C (entre ellos, el MPLAB C18) realizan
optimizaciones a la hora de generar el código assembler (a partir del código
C), como por ejemplo, el cacheo del valor de una variable si se da cuenta de
que el valor de la misma no cambia entre dos puntos dados del código. Sin
embargo, el valor de la variable cntfull es modificado dentro de la rutina de
atención a la interrupción, que a su vez es disparada (de forma "impredecible"
y completamente asíncrona) por un evento de hardware, por lo cual su contenido
puede cambiar de forma impredecible y sería incorrecto cachear su valor. Por
lo tanto, el calificador
volatile le indica al compilador que no debe
realizar ninguna optimización de este tipo para esta variable, y que cada vez
que se precise obtener su valor debe ir a consultarlo directamente a memoria.
Una forma de entender mejor este problema es a partir del siguiente código de ejemplo:
while(1) {
if (cntfull) {
SendData()
}
}
En el caso de que la variable cntfull no hubiese sido declarada como
volatile
el compilador hace lo siguiente al compilar dicho código: como detecta que la
variable cntfull no es modificada dentro del loop (ni dentro de la rutina
SendData?) directamente toma el valor inicial que tenía la variable al comenzar
el loop y trabaja con ese valor constante durante todo el loop, lo cual resulta
en que la función
SendData? nunca se ejecuta (o se ejecuta siempre!).
El uso del calificador
volatile es muy común en el diseño de sistema de
tiempo real y sistemas embebidos (como es nuestro caso).
Comunicación USB
A continuación se presentan las funciones utilizadas para la implementación del
a comunicación USB en el firmware, junto con sus limitaciones.
Funciones de transferencia USB
Toda la comunicación a través del puerto USB se realiza utilizando un juego de
funciones que provee el firmware CDC. Ellas son las siguientes:
| Función | Descripción |
putrsUSBUSART | Escribe un string terminado-nulo de la memoria de programa al puerto USB |
putsUSBUSART | Escribe un string terminado-nulo de la memoria de datos al puerto USB |
mUSBUSARTTxRom | Escribe un string de largo conocido de la memoria de programa al puerto USB |
mUSBUSARTTxRam | Escribe un string de largo conocido de la memoria de datos al puerto USB |
mUSBUSARTIsTxTrfReady | Devuelve TRUE si el driver está pronto para escribir datos en el puerto USB |
getsUSBUSART | Lee un string del puerto USB |
mCDCGetRxLength | Devuelve el largo del último string leído del puerto USB |
Tabla 5.2 Funciones de transferencia USB
Para que la comunicación USB funcione correctamente y el dispositivo no pierda la conexión con el computador, el firmware CDC impone algunas restricciones que es necesario seguir estrictamente. Dichas restricciones se discuten a continuación:
Cuidados a tener en cuenta
Si bien las funciones de comunicación USB son cómodas de usar, éstas presentan
algunas limitaciones que se listan a continuación.
Por más información consultar el Application Note de Microchip:
Como migrar aplicaciones de UART RS-232 a USB con un mínimo esfuerzo (ver Referencias).
Chequear si está disponible para enviar
Antes de enviar cualquier string por el puerto USB es necesario chequear que se
encuentra listo para enviar más datos, utilizando la función
mUSBUSARTIsTxTrfReady.
No utilizar código bloqueante
Dado que las funciones del puerto USB se ejecutan en la rutina
UsbTasks() (cada vez que se entra al loop principal) se debe evitar a toda costa utilizar funciones bloqueantes que dependan del estado del puerto USB puesto que éste no se actualiza hasta que se vuelve a correr el loop, y por lo tanto resultaría en una situación de deadlock.
A modo de ejemplo, el siguiente código es incorrecto:
while(!mUSBUSARTIsTxTrfReady());
putrsUSBUSART("Hola mundo");
La forma correcta sería la siguiente:
if (mUSBUSARTIsTxTrfReady()) {
putrsUSBUSART("Hola mundo");
}
Como todo el código se corre continuamente dentro de un loop infinito, en principio, el resultado de ambos códigos es el mismo, pero en caso de que el código sea más complicado puede requerir un análisis más profundo.
Envío de datos
Las funciones de envío de datos (
putsUSBUSART,
putrsUSBUSART,
mUSBUSARTTxRam y
mUSBUSARTTxRom) no son funciones bloqueantes ni tampoco
envían los datos inmediatamente, sino que habilitan determinados registros e
inicializan una máquina de estados para la transferencia que se ejecutará
posteriormente, una vez que se vuelva a iniciar el loop principal (dentro de
la rutina
CDCTxService() que se llama desde
UsbTasks()).
Debido a esto, llamadas consecutivas a dichas funciones no funcionan pues la última llamada siempre sobreescribe a la anterior. La forma correcta de enviar varios strings consecutivamente es usando una máquina de estado o implementando rutinas que almacenen los datos en un buffer intermediarios. A continuación se muestran los dos casos:
Llamadas consecutivas (incorrecto)
if(mUSBUSARTIsTxTrfReady()) {
putrsUSBUSART("Hola mundo");
putrsUSBUSART("Hola de nuevo");
}
Usando máquina de estado (correcto)
byte state = 0;
if(state == 0) {
if(mUSBUSARTIsTxTrfReady()) {
putrsUSBUSART("Hola mundo");
state++;
}
} else if(state == 1) {
if(mUSBUSARTIsTxTrfReady()) {
putrsUSBUSART("Hola de nuevo");
state++;
}
}
Usando buffer intermedio (correcto)
if (mUSBUSARTIsTxTrfReady()) {
putsUSBUSART(io_buffer);
SendToBuffer("Hola mundo");
SendToBuffer("Hola de nuevo");
}
En este caso la función
SendToBuffer() concatenaría los strings en un buffer intermedio para ser enviando en la siguiente transferencia (a correrse en el próximo ciclo). Dicha función debe ser implementada por separado.
Este último fue la solución que adoptamos para manejar los envíos por el puerto USB, y dicha funcionalidad se encuentra implementada en
oscusb/osc/usbtx.c.
Driver
Vendor ID y Product ID
El estándar USB exige que todos los dispositivos, durante la etapa de
negociación, se identifiquen con un
Vendor ID y un
Product ID (en adelante,
VID y PID). Dicho par de valores sirve para conocer el fabricante del
dispositivo (VID) y el modelo particular del producto que se ha conectado
(PID). Por lo tanto, modelos diferentes de un mismo producto generalmente
tienen PIDs diferentes.
La utilidad principal de estos valores no es solamente la de identificar el
dispositivo, sino la de encontrar y cargar los drivers apropiados para el
mismo. Por consiguiente, cada driver que viene con Windows (o que bajamos de
Internet) viene programado (al igual que el dispositivo) con uno o más PID y
VID para los cuales sirve dicho driver. Esta es la forma que tiene Windows (o
el sistema operativo en cuestión) de saber si el driver seleccionado es
correcto.
En el caso de que el driver ya venga con el sistema operativo, el par VID/PID
bastará para identificar el driver que es necesario cargar y por lo tanto
cuando se conecta un dispositivo con VID/PID conocido el sistema lo detecta
automáticamente e inmediatamente queda listo para usar. Sin embargo, en el caso
de que el VID/PID no sea reconocido, el sistema operativo solicitará al usuario
que suministre los drivers. Un ejemplo de esto es la conocida pantalla de Nuevo
Hardware Detectado de Windows.
Driver para Windows 98/2000/XP
Como ya mencionamos anteriormente, el osciloscopio utiliza el estándar CDC para comunicarse con la PC por el puerto USB. Los sistemas operativos Windows, desde la versión 98SE, ya traen incluido un driver para control dispositivos CDC. Dicho driver es el archivo
usbser.sys que, en Windows XP por ejemplo, se encuentra en
c:\windows\system32\drivers.
Todos los dispositivos que utilizan dicho driver (por ejemplo, adaptadores Serie-USB) automáticamente agregan un puerto COM virtual al sistema, mientras están conectados, de forma que cualquier aplicación puede trabajar directamente con el puerto virtual como si se tratase de cualquier puerto serie real.
Nuestro osciloscopio, al utilizar el estándar CDC, hace uso de dicho driver y, por consiguiente, no requiere de un driver extra a partir de Windows 98SE en adelante.
Sin embargo, Windows a priori no sabe que driver debe asignar a nuestro osciloscopio porque no reconoce el par VID/PID con el cual éste se identifica. Por lo tanto, es necesario indicarle a Windows que driver debe utilizar para nuestro VID/PID. Esto se hace a través de un archivo .inf donde se especifica, entre otras cosas:
- PID/VID del dispositivo
- el driver a utilizar (en este caso
usbser.sys)
- nombre con el que aparecerá el osciloscopio en la lista de dispositivos conectados (en este caso, dentro de Puertos de Comunicaciones)
Archivo INF
A continuación se muestra el archivo inf del osciloscopio:
; Archivo INF para la instalacion del osciloscopio USB utilizando
; el driver USB CDC ACM
;
; Proyecto de fin de carrera 2005 - Universidad ORT
;
; Pablo Hoffman - Martin Szmulewicz
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MCHP%
LayoutFile=layout.inf
DriverVer=08/17/2001,5.1.2600.0
[Manufacturer]
%MFGNAME%=DeviceList
[DestinationDirs]
DefaultDestDir=12
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_05F9&PID_FFFF
;------------------------------------------------------------------------------
; Windows 2000/XP Sections
;------------------------------------------------------------------------------
[DriverInstall.nt]
CopyFiles=DriverCopyFiles
AddReg=DriverInstall.nt.AddReg
[DriverCopyFiles]
usbser.sys,,,0x20
[DriverInstall.nt.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[DriverInstall.nt.Services]
AddService=usbser, 0x00000002, DriverService
[DriverService]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\usbser.sys
;------------------------------------------------------------------------------
; String Definitions
;------------------------------------------------------------------------------
[Strings]
MCHP="pablohoffman.com"
MFGNAME="pablohoffman.com"
DESCRIPTION="Osciloscopio USB"
SERVICE="USB RS-232 Emulation Driver"
En la línea:
%DESCRIPTION%=DriverInstall, USB\VID_05F9&PID_FFFF
Se puede observar la definición del VID y PID, en este caso
VID=05F9 y
PID=FFFF. Dichos valores deben coincidir con lo valores del firmware (ubicados en oscusb/autofiles/usbdsc.c), para Windows reconozca el dispositivo y automáticamente le asigne el driver
usbser.sys.
Driver para Linux
Linux, al igual que Windows, trae incluidos muchos drivers, entre ellos uno para dispositivos CDC. Por lo tanto, lo que hicimos fue utilizar un VID y PID conocidos para que linux lo reconociera y entonces asignara el driver apropiado al dispositivo. Esta es la razón por la cual elegimos los números VID=05F9 y PID=FFFF, no fue una decisión arbitraria.
Trabajando con esos valores, Linux automáticamente detecta el dispositivo (una vez conectado) y le asigna un archivo (
/dev/ttyACM0) que puede ser utilizado para comunicación en forma serie como cualquier puerto serial estándar (
/dev/ttySxx). Es importante tener en cuenta que el kernel de Linux debe estar compilado para soportar dispositivos CDC (cualquier kernel actual ya viene preparado).
De esta forma queda resuelta la comunicación USB desde Linux sin tener proporcionar un driver especial o siquiera un archivo INF (como en el caso de Windows).
Estructura del código fuente
Esta es una descripción de los archivos y directorios del código fuente del firmware. Las entradas que terminan en / son directorios, mientras que el resto son archivos.
| Archivo/directorio | Función que implementa |
| oscusb/autofiles/ | Archivos descriptores del dispositivo USB |
| oscusb/inf/ | Archivo INF que describe el dispositivo para windows (driver Windows 2000/XP) |
| oscusb/system/ | Librerías del firmware CDC |
| oscusb/_output/ | Archivo de salida del compilador y el enlazador |
| oscusb/main.c | Archivo principal desde donde arranca a correr el firmware |
| oscusb/oscusb.mcp | Archivo Project del MPLAB IDE |
| oscusb/oscusb.mcw | Archivo Workspace del MPLAB IDE |
| oscusb/oscusb.lkr | Archivo de comandos para el enlazador |
| oscusb/io_cfg.h | Definición básica de patas del PIC para el funcionamiento de la comunicación USB (definidas por el firmware CDC) |
| oscusb/osc/interrupt.c | Control y manejo de interrupciones |
| oscusb/osc/osc.c | Control y manejo del osciloscopio |
| oscusb/osc/usbtx.c | Control de transferencias por el puerto USB |
| oscusb/osc/osc_io.h | Definición de patas de E/S y macro del PIC para el osciloscopio |
Tabla 5.3 Archivos del firmware
Limitaciones del MPLAB C18
Loop infinito
Un requisito de los programas escritos en C para el PIC es que no pueden
terminar nunca puesto que si terminan el PIC automáticamente se resetea. Por lo
tanto, todos los programas deben correr en un loop infinito. El nuestro no es
una excepción y efectivamente así lo hace. Por lo tanto, existen dos grandes
rutinas principales:
- una rutina de inicialización (
OscInit())
- una rutina que se ejecuta repetidamente en un loop infinito (
OscLoop())
La rutina
OscInit() se encarga de inicializar los puertos y las
interrupciones del PIC para el funcionamiento correcto del osciloscopio y se
llama desde la rutina
InitializeSystem(), quien a su vez también inicializa
el firmware CDC para la comunicación USB.
Inmediatamente después de inicializado el sistema, se entra en un loop infinito que corre dos rutinas indefinidamente:
- la rutina
UsbTasks() que mantiene viva la conexión USB y envía/reciba los datos que haya pendientes
- la rutina
OscLoop() que contiene toda la lógica principal del osciloscopio
Dado que el firmware de nuestro osciloscopio corre sobre el firmware CDC fue
necesario hacer un par de modificaciones mínimas al mismo para contemplar el
funcionamiento paralelo de ambos (firmware CDC y firmware del osciloscopio).
Para lograr ello solo bastó modificar el archivo principal (
main.c) y colocar
allí las llamadas a las funciones antes mencionadas (
OscInit() y
OscLoop())
en el lugar apropiado.
Variables y manejo de memoria
Si bien el compilador C18 de Microchip se ajusta bastante bien al estándar ANSI '87, vale recalcar que tiene algunas particularidades que es necesario tener en cuenta a la hora de escribir código, como ser el manejo de las variables en memoria.
En concreto, las variables pueden estar almacenadas tanto en memoria RAM como en memoria ROM. El compilador C18 soporta un par de calificadores (no contemplados en el estándar de C)
rom y
ram que permiten especificar donde se guardará la variable. Por ejemplo:
rom int version;
ram char[10] command;
El problema es que las funciones de manejo de string no permiten trabajar con variables ubicadas en distintas memorias. Por lo tanto, la función
strcmp() no permite comparar una cadena almacenada en la ROM con otra cadena almacenada en la RAM.
Todas las variables definidas sin el calificador
rom/ram quedan por defecto almacenadas en la RAM, mientras que las constantes como
"Hola mundo" quedan almacenadas en la ROM.
Tomemos como ejemplo el siguiente código:
#include <string.h>
char cadena[10] = "hola";
bool comparo() {
if (strcmp(cadena, "hola")) {
return TRUE;
} else {
return FALSE;
}
}
En principio, la función
comparo() debería retornar TRUE. Sin embargo, debido a los problemas mencionados del almacenamiento en la RAM/ROM, retorna FALSE puesto que
strcmp() no sabe comparar datos de la RAM (
cadena) con datos de la ROM (
"hola"). Por lo tanto es necesario reescribir el código de la siguiente manera para su correcto funcionamiento:
#include <string.h>
char cadena[10] = "hola";
bool comparo() {
char hola[5] = "hola";
if (strcmp(cadena, hola)) {
return TRUE;
} else {
return FALSE;
}
}
Y por lo tanto así es como está implementado (en osc.c) la comparación de los datos entrantes del puerto USB para detectar el comando que fue solicitado.
Trabajar de esta forma resulta bastante tedioso y perdimos bastante tiempo para darnos cuenta de donde estaba el problema. Incluso fue necesario el uso del debugger por hardware. Además, nos parece que estos problemas deberían estar resueltos a nivel del compilador.
Configuration bits
Los
configuration bits sirven para configurar el modo de funcionamiento del
PIC (por ejemplo, la frecuencia del oscilador) y deben asignarse durante la
programación. La configuration bits son seteados por el MPLAB durante la
programación y se pueden asignar de 2 formas:
- a través de la lista de configuration bits del MPLAB (en Configure -> Configuration bits)
- a través de macros en el propio código, utilizando la declaración
#pragma config
A continuación se muestra la pantalla de selección de los Configuration bits del MPLAB (opción 1).

Fig. 5.3 Configuration bits del PIC 18F4550
Nosotros preferimos asignar los Configuration bits a través de definiciones en el propio código, para no depender de la configuración del entorno de trabajo del MPLAB. Dichas definiciones se encuentran en el archivo
oscusb/osc/confbits.h.
Actualizaciones de firmware
Otra característica muy importante a implementar, en lo que se refiere al
firmware, es la posibilidad de poder actualizar el firmware a través del mismo
puerto USB, sin necesidad de recurrir a un programar. Esta característica, si
bien no es de gran utilidad para el desarrollo del prototipo, será de vital
importancia a la hora de fabricar el producto para su distribución masiva.
Afortunadamente, esta característica viene de regalo con el firmware CDC de
Microchip, que a su vez utiliza el Microchip Bootloader (ver Referencias), que
es quien provee el mecanismo de re-programación del PIC a través del mismo
puerto USB.
El único requisito necesario es conectar un pulsador al pin RB4 del PIC (lo
cual está hecho en nuestro osciloscopio). Luego, para que el PIC entre en modo
programación ha que prenderlo (o resetearlo) con dicho pulsador presionado.
Luego, basta con utilizar la aplicación PDFSUSB.exe incluída en el Framework
USB de Microchip (del cual el Firmware CDC es parte) para re-programar el
dispositivo utilizando a través del puerto USB.
Referencias
- Microchip C18
- Firmware CDC
- Especificación de la clase de dispositivo CDC
- Informacion sobre configuration bits y #pragma config
- Como migrar aplicaciones de UART RS-232 a USB con un mínimo esfuerzo (application note de Microchip)
- Uso de los calificadores const y volatile en C
- Microchip USB bootloader (para actualizaciones de firmware)
Capítulo 6. Software
Contenido de este capítulo
Introducción
Este capítulo trata sobre la implementación del software, que es la aplicación
utilizada en el PC para controlar el osciloscopio. Incluye información sobre el
diseño, selección de las herramientas, métodos de programación empleados,
estructura del código e funcionamiento del software.
Selección de las herramientas
La primera decisión a la hora de desarrollar la aplicación para controlar el osciloscopio fue la selección de las herramientas a utilizar, en particular:
- el lenguaje de programación a usar
- el toolkit gráfico (librería para el manejo de ventanas y creación de la interfaz gráfica)
- las librerías a utilizar para controlar diversos aspectos de la aplicación
- el entorno de desarrollo a utilizar para crear la aplicación gráfica
Lenguaje de programación
Para tomar la decisión del lenguaje a utilizar para la elaboración del sofate del software gráfico que se instalará en el PC para el control del osciloscopio desarrollado se han tenido en cuenta los siguientes requisitos:
Los siguientes fueron los requisitos tenidos en cuenta:
- Debe tener interfaz gráfica
- Debe ser multi-plataforma (Windows, Linux, Mac OS X)
- Debe ser de rápido desarrollo
- Debe poder comunicarse con puertos virtuales de Windows (para hablar con el driver RS232-USB de CDC de Microchip) de forma sencilla
- Debe ser un lenguaje gratuito que no requiera de licencias para compilar o distribuir el código compilado
El lenguaje que seleccionas para programar la aplicación fue python, ya que es
un lenguaje robusto y extremadamente portable (multi-plataforma,
requisito 2)
puesto que existen interpretadores para todas las plataformas, dos de las
cuales (Linux y Mac OS X) ya lo traen incluido dentro del propio sistema
operativo. Además, es un lenguaje interpretado lo cual elimina los tediosos
ciclos de edición-compilación-enlazado-ejecución y permite un desarrollo rápido
y ágil (
requisito 3). Por eso es comúnmente utilizado en el prototipado de
aplicaciones, y lo hace ideal para nuestro caso.
Además python cuenta con una extensión llamada pySerial que permite el acceso transparente a puertos series (virtuales o reales) de Windows y, a la vez, a puertos series en linux, lo cual nos permite desentendernos del problema de la comunicación (
requisito 4).
Otras aplicaciones como Java, si bien son portables, exigen más tiempo de diseño e implementación (pues el lenguaje es más estricto) y requieren tener instalada una máquina virtual Java (JRE o JDK) en la máquina del cliente donde se vaya a correr la aplicación. Al hacerlo en python se puede evitar esa restricción compilando la aplicación para que corra nativamente en cada arquitectura y sistema operativo.
La plataforma .Net de Microsoft no es portable para sistemas operativos fuera de windows y además su licencia tiene algunas restricciones respecto al código generado con ella, por lo cual fue descartada inmediatamente.
Toolkit gráfico
En cuanto al toolkit gráfico a decisión no fue tan sencilla.
Las bindings más populares disponibles para python son:
- tkInter - para trabajar con el toolkit tk
- GTK+ - utilizando los bindings PyGTK
- qt - utilizando los bindings PyQt
- wxWidgets - utilizando los bindings wxPython
tkinter
Tk es el toolkit nativo de python para trabajar con interfaces gráficas, pero
la razón de esto es que era el mejorcito que existía en el momento que python
fue diseñado, y de eso hace mucho tiempo. Tk tiene dos grandes desventajas:
requiere mucho código para implementar cosas simples y ademas no es muy
presentable. Por estas razones, tkinter fue descartado inmediatamente.
GTK+
A través de los bindings PyGTK se puede utilizar el popular toolkit GTK+ de la Free Software Foundation. Sin embargo lo descartamos por las siguientes razones:
- GTK no es muy lindo estéticamente en Windows
- GTK no tiene implementación para Mac OS X
- GTK no tiene un buen entorno rápido de desarrollo (RAD) para el diseño de ventanas
qt
Qt es muy portable (Windows, Linux, Mac) y estéticamente muy prolijo. Sin embargo, lo descartamos puesto que su licencia es ligeramente restrictiva para aplicaciones Windows (no así para Linux/Mac) y además la versión disponible actualmente (8 Feb 2006) de PyQt (los bindings de qt para python) no soporta la última versión de qt (4.x) sino que solo soporta hasta la 3.x, y además no soporta python 2.4 (hasta 2.3).
wxWidgets
wxPython usa el toolkit wxWidgets que es bastante prolijo y muy portable (Windows, Linux y Mac). Además tiene las siguientes ventajas:
- cuenta un muy buen diseñador rápido de ventanas (llamado Boa Constructor) que es gratuito y libre
- tiene una excelente documentación
- tiene una gran popularidad entre los toolkit GUI para python, lo cual significa que tiene un gran soporte comunitario (foros, etc)
Por estas razones es que decidimos adoptar wxPython como toolkit gráfico para la aplicación del osciloscopio.
Librerías
Otras librerías a utilizar son las siguientes:
pySerial
La librería pySerial permite comunicarse con los puertos de la PC de forma transparente, sencilla y (lo que es más importante) independiente de la plataforma.
pyWin32
La librería pyWin32 son bindings para poder acceder a la API de win32 desde python. La razón por la cual la usamos es que el pySerial la necesita para acceder a los puertos serie en Windows.
NumPy
La librería NumPy provee funciones para calculo de transformada discreta de Fourier (FFT) la cual es usada para mostrar el espectro de la señal en el software.
Entorno de desarrollo
El entorno de desarrollo utilizado para crear la aplicación gráfica fue el Boa
Constructor. Entre sus características se encuentra el desarrollo rápido (drag
and drop) de ventanas y sus componentes (botones, barras de estado, etc), como
así también la posibilidad de depurar el programa gráfico utilizando
breakpoints y las herramientas típicas de depuración.
Un dato curioso es que, además de ser un entorno de desarrollo para wxPython, el Boa Constructor también está escrito en python utilizando wxPython.
Compilador
Para la plataforma Windows en particular se utilizó el compilador py2exe para
compilar la aplicación a un archivo ejecutable (EXE) que no dependiera de
ninguna otra librería externa brindándole así al osciloscopio una gran
portabilidad y facilitando su distribución.
Para los sistemas operativos Linux y Mac esto no es necesario puesto que dichos
sistemas operativos ya vienen con python integrado y puede correr
cualquier programa escrito en ese lenguaje, sin necesidad de compilarlo
previamente. Esto incluso es una gran ventaja puesto que, al no tener que ser
compilado, la aplicación es independiente de la arquitectura. De esta forma,
tenemos una aplicación que es, a la vez, multi-plataforma e independiente de la
arquitectura. Todo gracias a python.
Resumen
Este es un resumen del lenguaje, librerías y herramientas utilizadas para desarrollar el software:
| Lenguaje | python |
| Librerías | pySerial NumPy pyWin32 (solo windows) |
| Entorno de desarrollo | Boa Constructor |
| Compilador | py2exe (solo Windows) |
Tabla 6.1 Herramientas de desarrollo del software
Estructura del software
Clases
Dado que python es un lenguaje preferentemente orientado a objetos, el software
se compone de varias clases, las cuales a su vez contienen métodos que son las
funciones encargadas de implementar las diferentes funcionalidades. A
continuación se presenta un resumen de las mismas.
Las clases que componen el software son las siguientes:
Osc
La clase Osc es la encargada de la comunicación con el osciloscopio. Implementa
el protocolo de comunicación (como se encuentra especificado en el capítulo 7)
proveyendo primitivas para el envío y recepción de comandos al osciloscopio.
El constructor de la clase acepta como parámetro el puerto serie donde se
encuentra el osciloscopio.
Las funciones de esta clase son:
- Clase Osc
-
connect() intenta conectarse al osciloscopio. Devuelve TRUE en caso de lograrlo, o FALSE en caso contrario.
-
getVersion() devuelve la versión de firmware del osciloscopio
-
getPort() devuelve el puerto por el cual se encuentra conectado el osciloscopio
-
getData() devuelve los datos obtenidos por el último comando de datos (ej. AQHI, AQME, AQLO)
-
getSample() se bloquea hasta recibir un byte del osciloscopio y, una vez recibido, lo devuelve. Utilizado para capturas de baja velocidad en tiempo real
-
stop() envía un comando STOP al osciloscopio y limpia el buffer de entrada
-
acquire(type, chan, vdv1, vdv2, dual, chop) solicita una captura de datos al osciloscopio. Una vez finalizada la misma retorna TRUE (si la captura fue exitosa) o FALSE si hubo algún error. Para obtener los datos capturas usar la función getData(). Los parámetros que acepta esta función son los siguientes:
-
type - el tipo de captura a realizar (AQHI, AQME, AQLO)
-
chan - el canal a utilizar (1 ó 2)
-
vdv1 - el divisor vertical a usar en el canal 1 (0, 1, 2 ó 3)
-
vdv2 - el divisor vertical a usar en el canal 2 (0, 1, 2 ó 3)
-
dual - habilita (1) o deshabilita (0) el modo dual
-
chop - habilita (1) o deshabilita (0) el modo chop
-
debug() escribe en un archivo el texto pasado como parámetro. Utilizado para dejar un registro de la comunicación con el osciloscopio con fines depurativos.
-
send(cmd, param, retry) envía un comando al osciloscopio. Los parámetros que acepta son:
-
cmd - el comando a enviar (string de 4 caracteres, obligatorio)
-
param - el parámetro del comando (número entero, opcional)
-
retry - indica si debe reintentar enviar el comando en caso de error (por defecto es TRUE).
-
disconnect() se desconecta del osciloscopio
Frame1
La clase Frame1 es la encargada de desplegar la ventana del osciloscopio en
pantallas, así como también de llevar a cabo todas las funciones de interacción
con el usuario.
Las funciones de esta clase son las siguientes:
-
cleantrigger() aplica el trigger por software descartando las muestras irrelevantes del principio
-
triggerlevelup() rutina que implementa el algoritmo de trigger por software. Es utilizada por la función cleantrigger.
-
updatevalues() actualiza los parámetros numéricos de la señal (voltaje medio, voltaje pico-pico y voltaje eficaz)
-
updatefft() actualiza los análisis espectrales de las señales
-
updatedivs() actualiza los valores seleccionables de divisiones de voltaje para la vista actual (en modo dual separado dichos valores se duplican)
-
updatetriggers() actualiza los valores seleccionable de los triggers de voltaje
-
updatezeros() actualiza el nivel de los ceros en el display del osciloscopio. Dicho nivel depende del modo dual y de si se está utilizando etapa de entrada
-
savetofile() guarda las muestras recibidas en el archivo especificado en la interfaz gráfica
-
acqstart() inicia el proceso de captura de datos. Es ejecutada al activar el botón de captura.
-
acqstop() detiene el proceso de captura. Es ejecutada al desactivar el botón de captura.
-
connectosc() intenta conectarse al osciloscopio barriendo todos los puertos disponibles en la PC. Devuelve TRUE si pudo conectarse, o FALSE en caso contrario.
-
doconnect() se conecta al osciloscopio utilizando la función connectosc() y actualiza los controles de la aplicación según la conexión allá sido exitosa o no.
Además de las funciones ya mencionadas esta clase tiene otras rutinas especiales que son disparadas por eventos de la aplicación, desde la pulsación de un botón hasta la llegada de los datos del osciloscopio. En particular, las más importantes son las siguiente:
-
OnOscDisplayPaint() es disparada cuando el display necesita actualizarse, ya sea porque la ventana se movió o porque llegaron nuevas muestras del osciloscopio
-
OnAqcuireData() es disparada cuando llegan nuevos datos del osciloscopio. Se encarga de actualizar todos los displays y valores a través de las funciones update*
AcquireThread
La clase AcquireThread es la encargada de llevar a cabo la captura de datos. Corre en forma paralela a la clase Frame1 y se comunica con ésta a enviándole mensaje, los cuales también son clases (AcquireEvent).
Esta clase tiene una única función (
run()) en donde se realiza la comunicación con el osciloscopio (a través de la clase Osc) y se ejecuta toda la lógica necesaria para procesara una nueva secuencia de muestras del osciloscopio.
AcquireEvent
La clase AcquireEvent es el tipo de objeto utilizado para el transporte de las muestras del osciloscopio entre la clase AcquireThread y la clase Frame1. Por consiguiente, carece de funciones.
Archivos
La estructura del código fuente es bastante simple y consta de los siguientes archivos:
-
oscapp.py - este es el código que dispara toda la aplicación. Es el que llama a la ventana (ver clase Frame1) para controlar el programa
-
oscframe.py - aquí está el código que define el comportamiento, la apariencia y el funcionamiento de la ventana de la aplicación. En este archivo se encuentran implementadas las clases: Frame1, AcquireThread y AcquireEvent
-
osc.py - aquí se encuentra el código de comunicación con el osciloscopio. En este archivo está implementada la clase Osc
-
setup.py - este archivo no es código del progama, sino que son las directivas utilizadas para compilar el programa en Windows utilizando el compilador py2exe
Funcionamiento del software
Una programa gráfico en wxPython consta de una
Aplicación y varios
Frames,
que pertenecen a ella. Estos frames son justamente las diferentes ventanas de
la aplicación. Como en nuestro caso el software tiene una sola ventana, el
mismo tiene un solo
Frame.
Al disparar la aplicación (
oscusb.py), ésta abre el frame por defecto
(
oscframe.py) que es la ventana que se ve cuando se ejecuta el programa.
El comunicación con el osciloscopio se realiza a través del driver que se
encuentra implementado en el archivo
oscctrl.py como una clase de python y es
utilizado desde oscframe.py para enviar comando y recibir datos.
Control de la interfaz gráfica
La creación de la ventana se realiza (al igual que en cualquier aplicación
gráfica) creando un cuadro (o
Frame) el cual controla el funcionamiento de la
ventana de la aplicación gráfica. A dicho cuadro se le asignan controles
(botones, etiquetas, cuadro para ingresar texto, etc) en coordenadas
específicas. Las coordenadas pueden darse en pixels o en proporciones, lo cual
permite que la ventana puede mantener su aspecto al ser maximizada o cambiada
de tamaño.
A los diferentes controles (por ejemplo, botones) se les define un
comportamiento a través de eventos que son disparados cuando se realiza una
acción sobre ellos (por ejemplo, pulsar un botón).
Al ser disparados, dichos eventos llaman a una función especificada predefinida
al crear el Frame.
Asimismo, otros controles son de salida (por ejemplo, el display del
osciloscopio) los cuales pueden ser modificados arbitrariamente desde el código
aplicación a través de métodos que éstos proveen (por ejemplo, dibujar una
línea, cambiar el color de fondo, etc).
Conexión con el osciloscopio
La comunicación con el osciloscopio se realiza a través de la clase provista
por el driver (
oscctrl.py) al dispararse ciertos eventos.
Actualmente la aplicación sigue el siguiente mecanismo para conectarse con el osciloscopio:
- Intenta conectarse al primer puerto serie disponible en el PC (COM1 en caso de Windows, /dev/ttyACM0 en caso de linux)
- Si logra conectarse envía un comando VERS (ver Capítulo 7 - protocolo de comunicación), de lo contrario prueba con el siguiente puerto disponible que encuentra
- Si obtiene respuesta al comando VERS, entonces considera que la comunicación con osciloscopio se ha realizado exitosamente y despliega la versión de firmware del mismo (la cual fue obtenida en la respuesta del comando VERS).
Este este mecanismo de barrido fue por un razón de comodidad ya que, debido a
que osciloscopio genera dinámicamente un puerto serie virtual cada vez que se
conecta, éste no siempre era el mismo, aún cuando se conectase el osciloscopio
en el mismo puerto USB. Por lo tanto, el barrido nos ahorró el tiempo de estar
buscando y configurando el puerto virtual del osciloscopio.
Sin embargo, a pesar de contar con dichas ventajas, reconocemos que el
mecanismo de barrido debe ser sustituido en el producto final puesto que, al
enviar información a todos los puertos, puede interferir con el funcionamiento
de algún dispositivo conectado al PC por puerto serie.
Para este problema existen dos soluciones, una trivial y una prolija:
- la solución es trivial consiste simplemente en colocar (en la aplicación) un selector del puerto serie a utilizar para el osciloscopio.
- la solución prolija consiste en desarrollar un driver USB personalizado para el osciloscopio que no involucre puertos serie virtuales de por medio.
El único otro momento donde el programa se comunica con el osciloscopio es al
pulsar el botón
Capturar en el cual envía un comando de captura, precedido
por los comandos de configuración de los parámetros de captura (HDIV, DUAL,
etc).
Desplegado de muestras en pantalla
La graficación de las muestras recibidas del osciloscopio es realizada a través
del objeto
wxDC de la librería wxWidgets el cual (a diferencia de usar el API
de win32, por ejemplo) lo hace independiente de la plataforma.
A continuación se muestra un esbozo reducido de la rutina de graficación:
size = dc.GetSize()
dc.SetPen(wx.GREEN_PEN)
top = min(len(data), size.x)
lastx, lasty = 0, 0
vdiv = vdivs[self.vdivch.GetSelection()]
for i in range(0, top):
val = (data[i] - 128) / 255 / vdiv
x = i
y = int(size.y/2*val)
if x > 0:
dc.DrawLine(lastx, lasty, x, y)
lastx = x
lasty = y
dc.SetPen(wx.NullPen)
Se puede observar que se utilizan las funciones
SetPen y
DrawLine del
objeto wxWC que permiten seleccionan el color del trazo y dibujar una línea
entre dos puntos, respectivamente.
Comunicación con el osciloscopio
En particular, resulta de especial importancia comentar sobre el uso de hilos
para la comunicación con el osciloscopio, ya que de lo contrario la aplicación
funcionaría muy lenta y poco responsiva. Esto es porque, al activar la captura
el programa está continuamente enviando comandos de captura al osciloscopio y
recibiendo sus datos. Entonces, si esto se hace en primer plano (que es la
forma trivial de hacerla) el programa queda colgado esperando los datos del
osciloscopio hasta que estos llegan, para finalmente los graficarlos. El
problema es que, como el tiempo de transferir los datos del osciloscopio al PC
es mucho mayor comparado con el resto de los tiempos, el programa está
continuamente esperando datos del osciloscopio y mientras esto sucede la
ventana no responde lo cual resulta en una efecto extremadamente molesto para
la usuario y deja la aplicación inusable.
Para solucionar este problema se utilizó la tecnología de hilos en el cual, al
presionar el botón de captura la aplicación dispara una especie de sub-programa
(llamado hilo) que corre paralelamente a la aplicación y se encarga de
comunicarse con el osciloscopio para adquirir los datos y, una vez que los
obtiene, notifica del suceso al programa principal a través de un evento, con
el cual también le transfiere los datos. La aplicación principal, al recibir
el evento con los datos, lo único que tiene que hacer es extraer los datos y
graficarlos, lo cual es un proceso muy rápido y por lo tanto la ventana no
queda congelada.
Como ya se mencionó anteriormente, python es un lenguaje fuertemente orientado
a objetos. Por lo cual, en el escenario de captura antes descripto, cada rol es
cumplido por una clase. Ellas son:
- el funcionamiento del programa principal está a cargo de la clase
Frame1
- el sub-programa que se corre en un hilo corre es la clase
AcquireThread
- el evento que genera el hilo (
AquireThread) y lo envía al programa principal (Frame1) es la clase AcquireEvent
- finalmente, la clase encargada de comunicarse con el osciloscopio es
Osc
En el siguiente diagrama se muestra la interacción que ocurre entras las
diferentes clases del software, para llevar a cabo la adquisición de datos del
osciloscopio.

Fig 6.1 Interacción entre las clases del software
Los números rojos indican (de forma ordenada) todos los pasos ejecutados por
cada una de las clases, para obtener una secuencia de muestras del osciloscopio
y desplegarlas en pantalla.
Esto ocurre cuando el usuario activa el botón Capturar de la interfaz y
continúa corriendo ininterrumpidamente hasta que el botón es desactivado. Por
lo tanto, mientras el botón Capturar esté activado, los pasos del 1 al 8 se
ejecutan cíclicamente.
Como puede verse también en el diagrama, la clase
Frame1 (que es la controla
el funcionamiento de la interfaz) sigue interactuando con el usuario
independientemente del resto de las clases. Solo interrumpe brevemente el
control de la interfaz cuando llega el evento
AquireThread, del cual extrae
los datos y los grafica en la pantalla. Si el botón Capturar sigue activado,
inmediatamente dispara un nuevo hilo de captura (
AquireThread) y regresa a
su tarea de controlar la interfaz. Como el proceso de atender el evento y
desplegar los datos ocurre muy rápido, el usuario no se percata de la demora y
obtiene la impresión de que la interfaz nunca se cuelga, que es justamente el
objetivo de usar los hilos.
Hilo de captura
Todo el funcionamiento mencionado en la sección anterior se realiza utilizando
la clase
Thread de python y extendiéndola. Esto es lo que hace la clase
AcquireThread, que hereda de la clase
Thread.
El código de la clase
AcquireThread es muy simple y se muestra continuación:
class AcquireThread(Thread):
def __init__(self, notify_window):
Thread.__init__(self)
self._notify_window = notify_window
def run(self):
win = self._notify_window
osc = win.osc
hd = win.hdivch.GetSelection()
size = 512
if win.osc.acquire(count=size):
chardata = win.osc.getData()
data = []
for c in chardata:
data.append(ord(c))
wx.PostEvent(self._notify_window, AcquireEvent(data))
else:
wx.PostEvent(self._notify_window, AcquireEvent(None))
De particular interés son las lineas
wx.PostEvent donde se dispara el evento
una vez terminada la captura de datos. En caso de haber algún error (segunda
línea de
wx.PostEvent) el hilo envía None en lugar de los datos lo cual
notifica al programa principal que hubo un error al capturar los datos.
Para la notificación y comunicación de datos entre el hilo de captura y la
aplicación se utiliza la clase
wx.pyEvent de wxPython, extendiéndola para que
permita enviar los datos dentro de si misma. El código de dicha clase se
presenta a continuación:
class AcquireEvent(wx.PyEvent):
def __init__(self, data):
wx.PyEvent.__init__(self)
self.SetEventType(EVT_RESULT_ID)
self.data = data
Notar que aquí la única extensión que se le hizo a la clase base (
wx.PyEvent)
fue la de agregarle un campo de datos (
data) el cual es usado para
transportar los datos del osciloscopio.
Manual de uso
El manual de uso del software se encuentra en el capítulo 9.
Código fuente
El código fuente del software se encuentra disponible para bajar en la siguiente página:
http://pablohoffman.com/oscusb/software/
Referencias
- Lenguaje python
- Librería pySerial
- Librería NumPy
- Librería PyQt
- Librería PyGTK
- Toolkit qt
- Toolkit GTK+
- GNU
- Boa Constructor (entorno de desarrollo)
- Librería wxPython
- Librería wxWidgets
- Librería pywin32
- Compilador py2exe
- Instrucciones para empaquetado multiplataforma
Capítulo 7. Protocolo de comunicación
Contenido de este capítulo
Introducción
Este capitulo contiene la especificación del protocolo de comunicación junto
con los requisitos tenidos en cuenta para su diseño.
Requisitos
Al diseñar el protocolo de comunicación, se tuvieron en cuenta los siguientes
requisitos:
- comunicación lineal (comando, respuesta) - para que pueda ser fácilmente adaptado a una conexión serie
- comandos y respuestas ASCII - el formato de los comandos y respuestas debe ser tal que pueda ser controlado y depurado desde una terminal de texto ASCII (como Hyperterminal o similar)
- posibilidad de transferencia binaria - para acelerar las transferencias entre la PC y el osciloscopio
- comandos y respuestas simples - puesto que la capacidad de procesamiento del PIC es reducida, el protocolo debe ser fácilmente parseable.
Para cumplir con el cuarto requisito se decidió que los comandos constaran de
un largo fijo de 4 caracteres.
Introducción
El protocolo es bien simple y consta de un único tipo de interacción: *comando
y respuesta*. Cada comando puede tener uno o ningún parámetro. Los comandos son
enviados desde el PC al osciloscopio y son seguidos obligatoriamente por una
respuesta (del osciloscopio al PC). No se puede enviar un nuevo comando hasta
no haber recibido la respuesta del anterior, salvo por el comando STOP que
cancela el comando en curso.
A continuación se presenta un diagrama de dicha interacción:
Diagrama de la interacción
comando
| PC | ---------------------> | Osciloscopio |
respuesta
| PC | <--------------------- | Osciloscopio |
Comandos
Los comandos tienen la finalidad de enviar una solicitud al osciloscopio para que realice una acción y devuelva una respuesta, ya sea para confirmar el comando recibido, o para devolver el dato solicitado en el comando.
Formato de comandos
El formato de los comandos es el siguiente:
| COMANDO | espacio | PARAMETRO | \n |
4 bytes 1 byte 0..n bytes 1 byte
CMD_ID = identificador del comando en ASCII (4 caracteres)
PARAMETRO = parámetro del comando (un número en formato ASCII).
si el comando no tiene parámetros este valor es ignorado.
espacio = un espacio (caracter ASCII 32)
\n = fin de linea (caracter ASCII 10)
Comandos de captura
Los siguientes comandos sirven para solicitar una captura de datos al
osciloscopio. Por más información sobre los distintos tipos de captura consulte el
Capítulo 5 - Firmware.
AQHI
Ejecuta una captura de alta velocidad con los parámetros pre-fijados (a través de los comandos STxx) y devuelve los valores.
Si el formato binario esta habilitado (BINA 1) los datos se devuelven como bytes adyacentes en formato binario. El valor de cada byte puede ser de 0-255 que equivale justamente a los 8 bits de resolución del osciloscopio.
Si el formato binario está deshabilitado (BINA 0) los datos se devuelven como
números en formato ASCII separados por un espacio. Por ejemplo: 34 123 243.
Todos esos números están entre 0 y 255.
Los parámetros de la captura pueden ser ajustados a través de los comandos
HDIV, VTRI, VDIV, DUAL y CHOP.
- Parámetro: cantidad de muestras a devolver.
- Valores posibles: 1 - 65535
- Valor por defecto: 65535
AQME
Similar a AQHI, pero la captura se ejecuta a media velocidad (las escrituras a memoria son controladas por el PIC).
- Parámetro: cantidad de muestras a devolver.
- Valores posibles: 1 - 65535
- Valor por defecto: 65535
AQLO
Similar a AQHI y AQME, pero la captura se realiza en tiempo real, transfiriendo
las muestras a medida que se van capturando. Este comando soporta el valor
especial 0 como parámetro lo cual significa seguir capturando sin detenerse, o
hasta recibir un comando STOP, en lugar de transferir una cantidad pre-definida
de valores.
- Parámetro: cantidad de muestras a devolver o selección del modo de captura
- Valores posibles:
- 1 - 65535 - cantidad muestras a devolver
- 0 = captura continua (sigue capturando hasta recibir un comando STOP)
- Valor por defecto: 0
Comandos de configuración
Los comandos de configuración permiten configurar diversos aspectos del
funcionamiento de la captura de datos y deben ser enviados antes del comando de
captura.
CHAN
Selecciona el canal a usar para capturar los datos. Solo tiene validez cuando el osciloscopio funciona en modo simple canal (DUAL=0).
- Valores posibles del parámetro:
- 1 - canal 1 (valor por defecto)
- 2 - canal 2
ADDR
Especifica la dirección a partir de la cual se leerá el contenido de la memoria
en los comandos de captura, y también en el comando DUMP. Este comando está
pensado para fines depurativos.
- Valores posibles del parámetro: 1 - 65535
HDIV
Especifica la división horizontal a usar. Sirve para enlentecer el comando de captura y así obtener una serie de muestras más espaciadas en el tiempo.
- Valores posibles del parámetro: 0 - 65535
VDV1
Selecciona la escala de voltaje a usar en el canal 1.
- Valores posibles del parámetro:
- 0 - ±5V (valor por defecto)
- 1 - ±10V
- 2 - ±20V
- 3 - ±40V
VDV2
Selecciona la escala de voltaje a usar en el canal 2.
- Valores posibles del parámetro:
- 0 - ±5V (valor por defecto)
- 1 - ±10V
- 2 - ±20V
- 3 - ±40V
BINA
Configura el modo binario de transferencia de los comandos de captura
(AQHI/AQME/AQLO). Los formatos disponibles son: binario y ASCII. El formato
binario es más eficiente en cuanto a velocidad. El formato ASCII es legible en
una terminal de texto como Hyperterminal.
- Valores posibles del parámetro:
- 0 - deshabilitar modo binario
- 1 - habilitar modo binario (valor por defecto)
DUAL
Configura el modo dual de captura.
- Valores posibles del parámetro:
- 0 - habilita captura de un único canal (valor por defecto)
- 1 - habilita captura de ambos canales
CHOP
Configura la forma en que serán recibidas las muestras del osciloscopio. Si
está habilitado, se recibirá una muestra por cada canal alternadamente. Por el
contrario, si está deshabilitado, se recibirán primero todas las muestras del
canal 1 y luego todas las muestras del canal 2.
Esta opción tiene validez únicamente cuando está habilitado el modo Dual.
- Valores posibles del parámetro:
- 0 - deshabilita el modo chop (valor por defecto)
- 1 - habilita el modo chop
Comandos de control
Los siguientes comandos sirven para controlar el estado del osciloscopio.
STOP
Detiene el comando de captura en curso. Pensado para utilizar principalmente
con el modo continuo del comando AQLO.
RSET
Resetea el osciloscopio, volviendo todas los parámetros de configuración a su
valor por defecto.
Comandos de diagnóstico
Los siguientes comandos sirven para monitorear el estado del osciloscopio y obtener información sobre el mismo.
PING
Devuelve OK si el osciloscopio está activo.
VERS
Devuelve la versión de firmware del osciloscopio, en formato ASCII 8-bit.
Comandos de depuración
Los siguientes comandos sirven para depurar el osciloscopio y están pensados
para ser usados únicamente para testear el correcto funcionamiento del mismo.
No tienen ninguna utilidad para la aplicación que interactuará con el usuario
final.
WRLO
Escribe una señal cuadrada en la memoria a baja velocidad (controlada por el PIC). El parámetro pasado es la cantidad de muestras a escribir. Esta función existe únicamente para fines depurativos.
- Valores posibles del parámetro: 0 - 65535
WRHI
Escribe un mismo valor en todas las posiciones de la memoria a alta velocidad
(controlado por el contador). El parámetro pasado es el valor a escribir. Esta
función existe únicamente para findes depurativos.
- Valores posibles del parámetro: 0 - 255
DUMP
Vuelca el contenido de la memoria, para el canal seleccionado con el comando
CHAN y a partir de la dirección especificada con el comando ADDR. El parámetro
pasado es la cantidad de muestras a volcar.
- Valores posibles del parámetro: 1 - 65535
Respuestas
La respuesta es la reacción del osciloscopio a un comando. Todos los comandos
devuelven una respuesta. Para enviar un nuevo comando se debe esperar a recibir
la respuesta del último comando enviado, salvo por el comando STOP que cancela
el comando actual.
Existen dos tipos de respuestas:
- respuestas con datos - son aquellas que devuelven valores
- respuestas sin datos - son aquellas que no devuelven valores
Formato de respuestas
El formato de las respuestas es el siguiente:
Respuestas con datos:
| CODIGO | espacio | NOMBRE | espacio | LARGO | \n | DATOS | \n |
| 4 bytes | 1 byte | n bytes | 1 byte | n bytes | 1 byte | n bytes | 1 byte |
Respuestas sin datos:
| CODIGO | espacio | NOMBRE | \n |
| 4 bytes | 1 byte | n bytes | 1 byte |
CODIGO = código de respuesta (número en formato ASCII)
NOMBRE = un nombre descriptivo de la respuesta (en formato ASCII)
LARGO = cantidad de bytes de la respuesta incluyendo el último \n (en formato ASCII)
solo para comandos que devuelven datos.
DATOS = datos de la respuesta (en formato ASCII o binario según corresponda)
solo para comandos que devuelven datos.
espacio = un espacio (caracter ASCII 32)
\n = fin de linea (caracter ASCII 10)
Códigos de respuesta
Los códigos de respuestas disponibles (en la versión de firmware 1.00) son los
siguientes:
| Código | Nombre | Significado |
| 0 | OK | comando aceptado |
| 1 | UNKNOWN | comando desconocido |
| 2 | OUT-OF-RANGE | valor fuera de rango |
| 3 | BUSY | el osciloscopio está ocupado ejecutando otro comando |
Tabla 7.1 Códigos de respuesta
Ejemplos de sesión (comandos y respuestas)
PING
0 OK
VERS
0 OK 5
1.00
HDIV 128
0 OK
AQHI 5
0 OK 6
%!_P^
BINA 0
0 OK
AQHI 5
0 OK 18
24 123 203 129 56
CAPTURAR 343
1 UNKNOWN
Capítulo 8. Fabricación y puesta en marcha
Contenido de este capítulo
Introducción
Este capítulo habla sobre temas relacionados con la implementación del
hardware, desde las compras de componentes hasta la fabricación y puesta en
funcionamiento de la placa.
Fabricación de la placa
Alternativas de fabricación
Llegada la etapa de la construcción de la placa en donde montar los
componentes, nos planteamos tres posibilidades para llevar a cabo dicha tarea:
- Protoboard
- Circuito impreso (PCB)
- Placa universal
Protoboard
El Protoboard, o tableta experimental, es una herramienta que nos permite
interconectar elementos electrónicos, ya sean resistencias, condensadores,
semiconductores, etc, sin la necesidad de soldar los componentes.
El protoboard esta lleno de orificios metalizados -con contactos de presión- en
los cuales se insertan los componentes del circuito a ensamblar.
Se conocen en español como "placas de prototipos" y son esencialmente unas
placas agujereadas con conexiones internas dispuestas en hileras, de modo que
forman una matriz de taladros a los que podemos directamente "pinchar"
componentes y formar el circuito deseado. Como el nombre indica, se trata de
montar prototipos, de forma eventual, nunca permanente, por lo que probamos y
volvemos a desmontar los componentes, quedando la protoboard lista para el
próximo experimento.
Cada agujero de inserción está a una distancia normalizada de los demás, lo que quiere decir que un circuito integrado encajará perfectamente.
Tienen la ventaja de ser de rápida ejecución, sin necesidad de soldador ni
herramientas, pero los circuitos que montemos deberán ser más bien sencillos,
pues de otro modo se complica en exceso y las conexiones pueden dar lugar a
fallos, porque la fiabilidad de las mismas decrece rápidamente según aumenta el
número de éstas.
Fig 8.1 Protoboard
Esta opción si bien puede ser simple y rápida de llevar a cabo, consideramos
que es poco prolija y puede traer complicaciones de falso contacto,
interferencia, entre otros problemas.
Circuito impreso (PCB)
El circuito impreso esta constituido por una placa aislante, en una o en sus
dos caras, de conductores planos metalizados cuyo objeto es asegurar las
conexiones eléctricas entre el conjunto de los componentes electrónicos
dispuestos en su superficie.
El término normalizado que designa a este componente es placa impresa, pero en
uso común se emplea circuito impreso. Igualmente, en inglés el término Printed
Circuit Board es de uso corriente, mientras que printed circuit se emplea
prácticamente solo para referirse a la técnica de la fabricación de una placa
impresa.
Existen distintos tipos de circuitos impresos, de simple capa (llamado de una
sola cara), de doble capa, multicapa, flexible, rígido, flexorígido, de
agujeros metalizados, etc.
El circuito impreso puede ser la mejor opción si ya se conoce y se tiene
probado el circuito, donde no se permiten cambios fácilmente, pero todas las
conexiones son seguras, y mas aptas para trabajar a alta velocidad.
Sin embargo esta opción la descartamos ya que si bien tiene muchas ventajas, no
nos permite hacer modificaciones fácilmente, y creemos que para una etapa de
prueba no es la mejor solución.
Además, esta solución implica un costo mayor. Más aún, en los principios del
diseño del PCB (que luego hemos postergado), hemos observado una alta
complejidad en la distribución de las pistas, necesitándose una placa doble
faz, con puentes y jumpers, pero aún así, no estamos seguros de que quepa todo
el circuito en una placa doble faz.
Fig 8.2 Circuito Impreso
Fig 8.3 PCB
Tal como se puede observar en la imagen, un circuito impreso no es mas que una
placa plástica (que puede ser de fenólico o pertinax), sobre la cual se dibujan
"pistas" e "islas" de cobre las cuales formaran el trazado de dicho circuito,
partiendo de un dibujo en papel, ya sea creado por una persona o por un
ordenador.
Para empezar se debe decidir el material que se va a utilizar. Si se trata de
un circuito donde hayan señales de radio o de muy alta frecuencia tendremos que
usar una placa virgen de pertinax, que es un material poco alterable por la
humedad. De lo contrario, para la mayoría de las aplicaciones, una placa de
fenólico es suficiente.
Cada trazo o línea se denomina pista, la cual puede ser vista como un cable que
une dos o mas puntos del circuito. Cada círculo o cuadrado con un orificio
central donde el terminal de un componente será insertado y soldado se denomina
isla.
Cuando se compra una placa de circuito impreso virgen ésta se encuentra
recubierta completamente con una lámina de cobre, por lo que, para formar las
pistas e islas del circuito habrá que eliminar las partes de cobre sobrantes.
Además de pistas e islas sobre un circuito impreso se pueden escribir leyendas
o hacer dibujos. Esto es útil, por ejemplo, para señalar cual terminal es el
positivo, hacia dónde se inserta un determinado componente o incluso como marca
de referencia del fabricante.
Para que las partes de cobre sobrantes sean eliminadas de la superficie de la
placa se utiliza un ácido, el Percloruro de Hierro o Percloruro Férrico. Este
ácido produce una rápida oxidación sobre metal haciéndolo desaparecer pero no
produce efecto alguno sobre plástico. Utilizando un marcador de tinta
permanente o plantillas Logotyp podemos dibujar sobre la cara de cobre virgen
el circuito tal como queremos que quede y luego de pasarlo por el ácido
obtendremos una placa de circuito impreso con las pistas que se pretendían.
Placa universal
El circuito impreso universal para prototipos, también conocido como _UPCB
(Universal Printed Circuit Board)_, es un circuito impreso de uso general
diseñado a partir de la estructura básica del protoboard, esta placa facilita
el montaje de aplicaciones electrónicas sin requerir la etapa de diseño y
fabricación de un circuito impreso especifico.
El circuito impreso universal para prototipos esta fabricado con importantes
recursos tecnológicos que garantizan aplicaciones de mejor desempeño y
presentación, entre las principales características técnicas se encuentran:
- Capa de blindaje en cobre para evitar interferencias.
- Pads recubiertos de estaño-plomo, evita oxidación y garantiza una soldadura de máxima calidad.
- Película de antisoder verde que recubre el cobre en las áreas donde no se debe soldar protege de la oxidación y de cortocircuitos.
- Hueco de 3mm para tornillo permite un eficaz anclaje al chasis o caja contenedora.
- Circuito impreso de fibra de vidrio provee máxima resistencia al impacto y a torsiones.
Fig 8.4 Placa Universal en detalle
Fig 8.5 Placa Universal
La placa universal tiene las ventajas de un protoboard, ya que es versátil y
permite cambios fácilmente, y las de un circuito impreso, con la facilidad de
la colocación de los componentes y pistas de cobre para soldar. Esta placa es
muy permisiva en cuanto a las conexiones, ya que al tratarse de cables, éstos
pueden hacer cruces entre sí que no se podrían realizar en un circuito impreso.
También nos permitió realizar cambios en cuanto a conexiones cuando
encontrábamos un funcionamiento erróneo, o por ejemplo cuando habíamos elegido
una salida del microcontrolador que no permitía el tipo uso que se precisaba.
Proceso de fabricación
Habiendo ya decidido que la opción sería construir sobre una placa universal, a continuación detallamos nuestro proceso de construcción.
- Materiales
- Disposición de componentes
- Realización, prueba y experiencia
Materiales
Básicamente los materiales que se precisan en esta etapa son:
- UPCB (placa universal)
- Zócalos
- Cables y buses
Hemos utilizado las placas universales que se consiguen hoy en plaza, ya que
son de buena calidad y es lo estándar para estos casos. Nos han dado muy buen
resultado, con excepcion de alguna pista que se corta o se suelta por la
presión de los cables al torcerlos, o al desoldar y volver a soldar en el mismo
pad (isla).
Los zócalos los creímos necesarios ya que permiten soldar y dejar previsto el
lugar de los mismos, sin que el mismo componente se encuentre en el lugar. Más
aún, esto nos permite no tener que soldar el componente en si, sino que éste se
coloca a presión en el zócalo. Además, el hecho de utilizar zócalos tiene como
ventaja fundamental la facilidad de colocación y extracción del componente,
como también su reemplazo.
Fig 8.6 Zócalo
Existe un tipo de zócalo diferente y especial que es el
ZIF (Zero Insertion
Force). Estos zócalos no requieren de fuerza para la inserción del componente,
sino que se coloca dentro del zócalo y luego se presionan las patas del mismo
moviendo una palanca que tiene en uno de los extremos.
Esto permite de forma simple y sin riesgos colocar o extraer el componente del
zócalo. En nuestro caso, lo vimos sumamente útil para el microcontrolador, el
cual es uno de los componentes más delicados y con frecuencia se saca y se
vuelve a colocar para su programación.
Fig 8.7 Zócalo ZIF
Para realizar las conexiones entre los componentes hemos utilizado cables
obtenidos del UTP Categoría 5e. Este tipo de cable esta muy probado en la
industria y es muy flexible en cuanto a su torsión y a su facilidad de soldado.
Fig 8.8 Cable UTP Cat5e
Los buses los hemos cableado con cables del tipo
flat, los cuales son
específicos para este tipo de conexiones.
Fig 8.9 Cable Flat
Disposición de componentes
La distribución de los componentes en la placa tuvo que ser pensada basándose en dos características:
- velocidad a la que trabajan los componentes
- facilidad de conexión entre sí
Esto quiere decir que los componentes que trabajan a alta velocidad, como ser
la memoria y el conversor, deberían estar lo mas cerca posible.
Así mismo, los buses son de más fácil conexión cuando los componentes tienen
una distribución de patas similar y se encuentran juntos.
Dado que la cantidad de componentes no nos permitía colocarlos todos en una
misma placa, hemos tenido que separarlo en dos placas. Esto implica tener que
decidir qué bloques o componentes colocar juntos en una misma placa y cuales
no.
Como mencionamos antes, una de las pautas para esta decisión es la velocidad de
trabajo de cada bloque.
Basándonos en esto, decidimos que toda la parte de control del sistema estaría
en una placa y la parte de alta velocidad en la otra.
La distribución entonces fue la siguiente:
- Placa de captura y alta velocidad:
- Buffers de entrada
- Conversor AD
- Memorias
- Lógica adicional
- Placa de control:
- PIC
- Contador
- Buffer bidireccional
- Lógica adicional
En cuanto a la primer placa, ésta se dedica exclusivamente a la captura y
almacenamiento de los datos, con la sola excepcion de los contadores. En ella
también se encuentra una mínima lógica adicional, como ser algunas compuertas,
qué deben de estar en la misma placa ya que de lo contrario éstas señales
deberían ir a la otra placa y luego volver, aumentando el recorrido y las
posibilidades de interferencias.

Fig 8.10 Placa de adquisición: conversores - memorias - entrada - compuertas
En cuanto a la ubicación de los contadores, por un tema de espacio tuvieron que
ser colocados en la segunda placa.
Dado que el diseño esta localizado en que el microcontrolador solamente realice
tareas de control, ninguna de las señales que éste controla son de tan alta
velocidad como las que se manejan en la etapa de captura.

Fig 8.11 Placa de control: pic - buffers - contadores - compuertas
Realización, prueba y experiencia
Esta fue una de las etapas más tediosas y lentas del proceso, ya que hubo que soldar muchos cables y cada uno de ellos tuvo que ser hecho a medida.
Hubo que prestar mucha atención en que las soldaduras sean buenas, que no hayan
corto-circuitos, como así también, tener precaución con el soldador de no
quemar el recubrimiento aislante de los cables, ya que así también se podrían
producir falsas conexiones.
Una vez planeada la ubicación de los componentes dentro de la placa, se colocan
primero los zócalos de los integrados, y luego a partir de ellos se comienza
con el soldado de los cables para interconectar como corresponde a cada uno de
los componentes. Aquí hay que tener especial cuidado en no confundir los pines
de los circuitos integrados, ya que eso puede provocar un mal funcionamiento,
un corto circuito, o incluso la ruptura de algún componente.
Luego hay que interconectar las dos placas, ya sea con buses (cable flat para
buses de datos) o con cables individuales, los que suelen ser de control, a
excepción de la señal de reloj y las alimentaciones.
Una vez finalizada la construcción de las placas, hay que hacer una prueba
exhaustiva de las conexiones. Este punto es necesario e imprescindible, ya que
como mencionamos, una mala conexión puede provocar un mal funcionamiento, un
corto circuito, o incluso la ruptura de un circuito integrado, siendo este
último caso el peor.
El precio de cada componente y especialmente la disponibilidad de los mismos
nos obligaba a estar seguros de su correcta ubicación y conexión antes de
colocarlos y ponerlos en funcionamiento.
Como es normal, en la etapa de prueba hemos encontrado errores y cortos. Esto
era de esperarse, ya que con tantos cables y circuitos integrados, resulta poco
probable cometer un error. Vale aclarar que esto no hubiese pasado si
hubiésemos optado por la opción de utilizar una placa impresa (PCB), ya que la
misma tiene todas las conexiones hechas en pistas de cobre, aunque no nos
hubiese permitido realizar los cambios que hemos hecho sobre la marcha.
La conclusión que podemos sacar de haber trabajado de la forma en que lo hemos
hecho es que la elección del tipo de placa fue la correcta, ya que es mucho más
seguro y confiable que trabajar en un protoboard, y a la vez no es tan
restrictiva como una placa impresa.
También como critica constructiva podemos decir que se podría haber comenzado
con la construcción antes de lo que lo hemos hecho. Una vez que se tienen
definidos los componentes que se van a usar, ya se está en condiciones de
comenzar a colocar los zócalos en las placas. Luego a medida que se van
definiendo las conexiones, se van soldando los cables. Nosotros hemos comenzado
con la construcción una vez que teníamos definidas todas las conexiones. Aún
así, y como hemos comentado previamente, tuvimos que realizar cambios de
conexiones sobre la marcha, y aquí es donde demuestra la ventaja la placa
universal sobre el PCB.

Fig 8.12 Placa completa del prototipo
La foto anterior muestra ambas placas y sus interconexiones. Vale recalcar que
la desprolijidad en el cableado entre las placas (claramente notoria) será
solucionado con la construcción del circuito impreso.
Carcaza
La compra de la carcaza fue una de las tareas realizadas al final del proceso
de fabricación, ya que ésta solo aporta una mejora estética (y no funcional) al
prototipo
En consecuencia, tuvimos que decidir rápidamente entras las alternativas
disponibles en plaza. Optamos por una carcaza de plástico por su flexibilidad a
la hora de realizar perforaciones para colocar los controles.

Fig 8.13 Carcaza del osciloscopio

Fig 8.14 Conectores BNC del osciloscopio
Compra de componentes
La compra de los componentes no es una etapa en si, sino que es una tarea
previa a la fabricación.
Una vez que se decide por el uso del cierto componente, el acto que le sigue es el de averiguar dónde se puede comprar y a qué precio.
Aquí es donde uno se encuentra con las siguientes dificultades:
En nuestro diseño usamos muchos componentes que no se encuentran en plaza en el
mercado uruguayo. Si bien unos cuantos los hemos conseguido en Uruguay, al
haber disponibilidad de los mismos en otros países y a mejor precio, nos hemos
planteado la posibilidad de comprarlos en el exterior por una cuestión de
costos.
Una vez que habíamos decidido la utilización del PIC como controlador
principal, compramos uno para poder comenzar con las pruebas.
En cuanto a los componentes que no se conseguían en Uruguay, consideramos
Argentina y Estados Unidos como posibles proveedores de los mismos, dado que
contamos con facilidades en estos dos países para comprar lo que precisemos y
luego traerlo.
Aprovechando la ocasión de que teníamos que comprar ciertos componentes en
Estados Unidos por la falta de disponibilidad en Uruguay y Argentina, hemos
decidido también comprar ciertos componentes que se conseguían en Uruguay, pero
en el exterior tenían un costo menor, como por ejemplo el PIC.
En el caso del PIC, el primero que compramos lo compramos en Uruguay, pero
luego hemos comprado otros 2 mas en Estados Unidos, aprovechando que ya
teníamos que hacer una compra de otros componentes.
Esto nos da cierta ventaja en cuanto a la facilidad para conseguir componentes
que de otra forma serían casi imposibles o muy costosos. Sin embargo esto trae
aparejado un problema, que es la demora.
En cuanto a las compras en Argentina, nos resultaba más fácil que con las de
Estados Unidos, ya que contábamos con una persona que viajaba constantemente,
con una frecuencia de una vez cada dos semanas en promedio, lo que nos permitía
traer componentes con poco tiempo de demora.
De todas maneras, hubieron compras que eran necesarias hacerlas en Estados
Unidos, y aquí es cuando se vio demorado el proyecto. No siempre era posible
contar con una persona que viaje cuando el proyecto lo precisaba, sino que
había que coordinar el proyecto con estos viajes, y además, no siempre esta
persona podía traer estos componentes, con lo cual tuvimos demoras de hasta
casi dos meses en la espera de éstos.
Sin embargo, la forma en la que hemos procedido la creemos correcta. Siempre se
tiene la posibilidad de recurrir a un Courier de entrega rápida y directa,
pero es claro que esto insume un costo mayor, el cual tratamos de evitar. Como
lección podemos decir que hubiese sido mejor poder prever los componentes con
mas anticipación, y así realizar las compras y traslados con tiempo y evitar
que el proyecto se demore.
Depuración por hardware
La posibilidad de depurar por hardware es una herramienta fundamental en la
etapa de implementación.
Esta herramienta nos permite verificar y ejecutar
paso a paso el programa
cargado en el microcontrolador. Nos permite también monitorear diferentes
variables, contenidos de memoria, o estados de las patas del PIC.
La conexión del ICD2 se realiza a través de un cable de 6 hilos. Para facilitar
la conexión, utilizamos un cable con conectores RJ12 en sus extremos, y zócalos
en las placas.

Fig 8.15 Pinout del conector RJ12 del ICD2
Tabla 8.1 Pines del conector RJ12 del ICD2
Descripción de los pines:
- GND - Voltaje de referencia.
- Vdd - Tensión de alimentación positiva. Esta alimentación es la que energiza al microcontrolador.
- Vpp - Tensión de programación. Debe conectarse al puerto MCLR del PIC. Este voltaje debe ser superior a Vdd para que el microcontrolador ingrese al modo de programación.
- PGC - Señal de reloj de la transmisión de datos serie.
- PGD - Línea de datos. Esta conexión es bidireccional, y permite la comunicación de dos vías entre el PIC y la interfaz de programación
Para poder entrar en el modo
debug es necesario realizarlo desde el programa,
el MPLAB. Allí, seleccionando las opciones correspondientes, se programa al PIC
con una versión "modificada" del programa original. Esta modificación, hecha
automáticamente por el software, contiene las rutinas necesarias para poder
realizar el depurado
on-line, ya que de tratarse de la operación normal del
PIC, éste ejecutaría el programa de forma normal, sin interrupciones ni
posibilidad de monitoreo. Una vez finalizado el proceso de depurado, se debe
volver a programar el microcontrolador con la versión
normal del programa.
Hemos incluido estas conexiones en nuestro equipo, permitiendo el depurado _en
linea_ del mismo. Nos da la posibilidad de una conexión simultánea del ICD2 y
el ordenador con la placa.
La ventaja fundamental es que podemos observar el comportamiento del sistema
cuando este se encuentra conectado al PC y ejecutando las operaciones
solicitadas. Nos ha facilitado la detección de errores tanto de programación
como de hardware.
Corriendo paso a paso las instrucciones, pudimos verificar si el puerto de
control del PIC efectivamente estaba realizando las operaciones solicitadas, y
si los componentes conectados a él también lo hacían.
Puesta en funcionamiento
La puesta en funcionamiento del equipo fue progresiva. Consideramos fundamental
colocar los componentes de a uno por vez e ir probando las conexiones y su
funcionamiento. Hay que prever que puedan existir errores en la placa aún
teniendo en cuenta las etapas de fabricación y prueba. Esta forma de proceder
tiene como objetivo la preservación de los componentes, la mayor facilidad en
la detección de errores, y la aislación de problemas.
Una vez que se tienen todas las conexiones hechas, y el circuito encargado de
generar la señal de reloj esta listo, procedimos primero a colocar el
microcontrolador. Luego de ver que éste se encontraba funcionando y teníamos
comunicación con él, comenzamos a colocar el resto de los componentes.
Primero fueron las compuertas discretas. Esto ha sido así, debido a que para
poder colocar el resto de los componentes, se precisan listas las señales de
control. Luego colocamos el buffer bidireccional. A través de él, podíamos
medir y comprobar si efectivamente el bus de entrada/salida se encontraba
funcionando correctamente, como así también las señales de control
involucradas.
Para evitar interferencias y especialmente para hacer que los cables que
conectaban las dos placas no actuasen de antenas, decidimos colocar los
amplificadores de entrada, pero no alimentarlos. Es decir, las señales
analógicas de entrada que también se encontraban conectadas al microcontrolador
se encontraban flotantes y sobre un recorrido largo de cable. Al colocar los
amplificadores pero no alimentarlos, realmente no se estaban utilizando estos
circuitos, pero si servían para reducir la interferencia posible. Las
conexiones de tierra estaban hechas entre las dos placas desde el principio, y
así también para todos los componentes de cada placa.
El siguiente paso fue colocar los contadores. Estos contadores son controlados
por el PIC, y su señal de reloj puede provenir tanto desde el cristal como
desde una señal de control del PIC, la cual tiene como objetivo tener una señal
de reloj mas lenta y configurable.
Una vez que comprobamos el buen funcionamiento del contador, probamos la
función de
presetear el contador, es decir, darle un valor de contador desde
el cual éste debe comenzar a contar. Aquí se probó por completo el
funcionamiento del bus bidireccional, ya que a través de éste se realiza la
operación de carga del contador. Aquí nos hemos encontrado con un problema, que
es que la carga del
preset del contador se realiza sincrónicamente, es decir,
cuando recibe un pulso de reloj. Para el contador de los bits menos
significativos esto no sería un problema ya que la señal de reloj es
controlada. Pero para el segundo contador, el de los bits más significativos,
esto era un problema ya que en realidad la señal de reloj que éste recibe
proviene del contador que lo precede (contadores en cascada). Este problema y
su solución están explicados en la siguiente sección:
Problemas.
A continuación procedimos a colocar las memorias. Este paso fue crucial, ya que
las memorias eran los primeros componentes que se colocaban en la placa de
adquisición. Hasta este momento se había trabajado con una sola placa, y este
era el momento de probar la segunda placa. Aquí había que comprobar la
alimentación, si existían corto circuitos, caídas de tensión, interferencias,
etc. Por suerte tuvimos un resultado muy positivo. Salvo algún problema de
falso contacto (más bien producido por los zócalos, ver:
Problemas con los zócalos), hemos tenido
un excelente resultado. Así hemos logrado conectarnos satisfactoriamente con la
segunda placa, la de alta velocidad, la de captura y adquisición. Cabe aclarar
que para realizar este paso fue necesario conectar la alimentación de la placa
en cuestión, ya que si bien la conexión de tierra estaba hecha, no así la de
tensión.
Al conectar la alimentación de la placa de adquisición automáticamente el
amplificador de entrada comenzó a funcionar. Esto no es problema ninguno, y
sólo optamos por no dejar
flotando la entrada del amplificador y conectarla a
tierra. Como siguiente paso, conectamos los conversores. Este momento marca un
punto especial en el proyecto, y la prueba del hardware. Aquí es donde se va a
apreciar si todos los componentes logran trabajar en armonía y logran
comunicarse con facilidad. Al igual que en algún otro caso anterior, hemos
tenido problemas con las conexiones, pero como adicional, hemos verificado
también el correcto funcionamiento de la memoria, ya que ahora podíamos
comprobar con mayor confianza los datos que se guardaban y que se leían. Aquí
detectamos un error en las señales de control de la memoria, ya que no se
estaba realizando correctamente el procedimiento para su lectura (Ver la
siguiente sección).
Finalmente una vez solucionados los problemas detectados, a través de la
interfaz de consola que nos provee el osciloscopio, obtuvimos muestras que
coincidían con lo esperado. Es decir, que cuando la entrada se colocaba a
tierra, se obtenían valores todos cercanos a cero (posibles ruidos, etc), y
cuando utilizamos una señal cuadrada de un generador, obteníamos valores
coherentes, o sea, una serie de valores altos, luego otra serie de valores
bajos, y así sucesivamente.
Consideramos muy satisfactorio el proceso de fabricación de la placa, en el
cual obtuvimos pocos errores y fallas, y consumió poco tiempo llevarlo al
funcionamiento deseado.
Para estas pruebas utilizamos un reloj de 8 megaciclos, el cuál es el mínimo
posible para que funcionen todos los componentes, pero la velocidad esta lejos
del objetivo final. Es natural suponer que a menor velocidad las cosas
funcionen mejor, y en caso de que existan problemas, sean mas fácil
detectarlos, o mismo al comprobar el funcionamiento de los componentes. La
intención es que una vez que se logre hacer funcionar el equipo correctamente a
esta velocidad, se irá incrementando la velocidad del reloj y así cada vez
acercarnos más a la velocidad de trabajo propuesta como objetivo (40 Mhz).
Problemas de funcionamiento
NAND no oscila
En una de las primeras etapas del circuito, la etapa osciladora va directamente
conectada hacia el microcontrolador, pero a su vez va conectada en paralelo a
una NAND (funcionando como NOT). En algún momento durante la construcción y
prueba de la placa, esta compuerta tenía como salida la señal de reloj,
obviamente invertida. Luego, más avanzado el proceso de colocación de
componentes y prueba, observamos que ya su salida no oscilaba, sino que se
mantenía constante con valor cero. Buscando los posibles orígenes de este
problema, vimos que su entrada estaba funcionando perfectamente, y que todos
los circuitos así también lo hacían. Sin embargo, habría que seguir
investigando, ya que el problema no radicaba en un componente defectuoso, sino
como producto de cambios que podríamos haber hecho en la placa en la etapa de
prueba y detección de errores.
Observamos como la amplitud de la señal de reloj podía ser mayor o menor, pero
aún no encontrábamos el parámetro que hacía que esto cambie. Al medir las
tensiones de la amplitud de dicha señal y comparándolas con las
especificaciones de la compuerta, vimos que efectivamente se trataba de un tema
de amplitudes. Ésta señal no tenía la amplitud suficiente para que la compuerta
detecte un cambio de estado en su entrada.
Más específicamente, las mediciones daban valores de
1.5v a 4v para la
amplitud de la señal de reloj como entrada de la compuerta. Luego, en la hoja
de datos de ésta, se tiene como especificación que _V.high (min) = 2.0v y un
V.low (max) = 0.8v_. Dado que la tensión del oscilador nunca era menor que
1.5v, queda claro que la compuerta entonces nunca detectaría un cambio de
estado en su entrada.
Realizando modificaciones en los bits de configuración del PIC logramos hacer
que estas amplitudes cambien, o mejor dicho, sean más cercanas a cero. Sin
embargo no llegamos a lograr que bajen de 1v. Por otra parte, si
desconectábamos la NAND como carga del circuito oscilador, éste tenia
amplitudes entre
0.6v y 3.8v. Esto implica que las amplitudes tienen relación
directa con la carga y las impedancias que dicho circuito tiene.
Hasta hemos probado quitarle una resistencia de 1M ohm que el oscilador tenía,
la cual en ciertos documentos hemos visto, pero en otros no estaba incluida. Al
quitarle esta resistencia, y sin tener la carga adicional de la compuerta, la
amplitud tenia una variación entre
0.3v y 3.4v. De todos modos, al volver a
conectar la compuerta, estas amplitudes volvían al mismo estado detectado al
principio, sin lograr que la compuerta funcione.
Finalmente, detectado que se trataba de un problema de impedancias y no de
configuración, decidimos probar de obtener la señal y cargar al oscilador en la
otra pata que este tiene. Es decir, el circuito oscilador tiene dos bornes de
conexión, entre los cuales se encuentra el cristal y componentes adicionales.
Estas dos patas van conectadas al PIC en sus puertos OSC1 y OSC2. Durante toda
esta etapa estuvimos obteniendo la señal de reloj del puerto OSC1, pero llegado
este punto, optamos por probar conectar en el puerto OSC2.
Aquí se resuelve el problema. Evidentemente el puerto OSC1 no esta preparado
para tener cargas en paralelo y el puerto OSC2 sí.
Las amplitudes obtenidas ahora son entre
-0.2v a 4.8v. Esto es más que
suficiente para que la NAND opere correctamente.
Además, ya casi no se observan diferencias cuando se conecta la NAND, es decir,
que efectivamente se trataba de un tema de cargas, y de las características de
cada puerto.
El siguiente problema que detectamos es que la salida de la NAND, la cual sería
una señal cuadrada (se trata de un componente digital, por mas que su entrada
sea analógica), pero ésta se encontraba considerablemente distorsionada. Dicha
señal, si bien tenia la misma frecuencia y ostentaba ser lo esperado, era muy
curvada y no parecía ser tanto una señal digital cuadrada.
No sabemos si es un tema de velocidad, si es que la gran amplitud de la señal
de entrada genera este comportamiento, o si es que se debe utilizar una
compuerta del tipo
schmidt-trigger.
A continuación se puede observar el comportamiento al cual hacemos referencia.
Esta imagen es una foto tomada del osciloscopio con el cuál hemos trabajado.

Fig 8.16 abajo el oscilador, arriba la salida de la NOT (NAND)
Para entender un poco mejor la razón por la que al conectarse a una de las dos
terminales de oscilación el circuito no funcionaba pero con el otro terminal
sí, hemos hecho una búsqueda un poco mas exhaustiva en la documentación del
PIC. Allí encontramos el siguiente diagrama:
Fig 8.17 Bloque de entrada del oscilador
Esto podría ser la explicación al problema, ya que el puerto OSC1 esta configurado como la entrada de un buffer, y por lo tanto con alta impedancia, mientras que el terminal OSC2 es una salida, pudiendo provocar incompatibilidades al intentar conectarlo en paralelo con otros componentes.
Este comportamiento, y en especial la forma de onda no tan perfecta (cuadrada) no nos ha generado problemas desde este punto en adelante, sin embargo luego hemos visto con el osciloscopio que esta señal habría mejorado, y creemos que esto es debido al avance que ha habido en la conexión de los componentes. Es decir, hasta que no hemos logrado hacer funcionar correctamente esta compuerta nos hemos visto imposibilitados de avanzar con la conexión y prueba del resto de los componentes. Al haber solucionado este tema, es que hemos continuado conectando el resto del circuito. Es así que avanzada un poco más la implementación del circuito hemos observado que el comportamiento mencionado había mejorado aún más.
De todos modos consideramos importante estudiar las cargas que puede tener esta compuerta (NAND), para poder corroborar si es que se trataba de un tema de sobrecarga.
Esta compuerta estaba cargada con los siguientes componentes:
- 2 entradas de NAND (igual compuerta, una en control de memoria y otra en adquisición)
- 2 entradas de reloj de los conversores A/D
Las salidas de las NAND tienen las siguientes características:
Fan Out:
I(OH) = -1mA ; I(OL) = 20mA
Las entradas de las NAND:
Fan Out:
I(IH) = 20uA ; I(IL) = -0.6uA
Características eléctricas en continua:
I(IH) = 5uA ; I(IL) = -0.6mA
Y finalmente, las entradas de los conversores A/D:
I(IH) = 5uA ; I(IL) = 5uA
Este estudio demuestra que las salidas de la compuerta NAND son ampliamente
capaces de poder manejar los 4 componentes que tienen en su salida.
Otros problemas de oscilación
El oscilador también ha presentado otro problema. Cuando el circuito se
encontraba conectado a la placa ICD2 (programador y depurador), oscilaba
perfectamente. Sin embargo, al conectar el equipo al puerto USB del PC,
encontramos un funcionamiento errático, donde en ciertas ocasiones oscilaba y
en otras no. Hemos buscado las razones de este comportamiento, pero realmente
nos ha costado. Hemos pensado en que podía ser un tema de interferencias,
consumo de corriente del puerto USB, malas conexiones, etc.
Finalmente la razón de este comportamiento no radicaba en un problema de
hardware, sino de los bits de configuración del PIC. Específicamente provenía
de la configuración del oscilador en estos bits. Aquí se debe especificar con
qué oscilador se trabaja, el tipo, la velocidad, etc. Al configurar
correctamente estos bits, no ocurrió nuevamente este comportamiento.
Retardo de contador lleno
Durante el proceso de prueba de funcionamiento de los contadores, observamos
que estos no se detenían cuando llegaban a su máxima cuenta.
En el diseño se contempla que cuando ambos contadores llegan a su cuenta
máxima, un pulso es generado en la pata FULL (contador lleno) del contador
mayor, y este pulso es detectado por el microcontrolador generando una
interrupción de alta prioridad. Esta interrupción, entre otras tareas, detiene
el contador. Al tratarse de una interrupción, se podría decir que se obtiene
uno de los tiempos de respuesta más bajos posibles. Sin embargo, esta respuesta
no es inmediata, sino que consume un cierto tiempo de procesamiento.
Las mediciones dieron los siguientes resultados:
- Corriendo el contador a 8Mhz y el PIC a 24Mhz, el retardo desde que el contador se llena hasta que es detenido es de 16 cuentas (16 ciclos de 8Mhz).
- Corriendo el contador a 8Mhz y el PIC a 48Mhz, el retardo baja a la mitad, retardo de 8 ciclos de 8Mhz.
8Mhz -> 125 ns
24Mhz -> 41.6 ns
48Mhz -> 20.8 ns
16 ciclos a 8Mhz -> 2us
8 ciclos a 8Mhz -> 1us
2us a 48Mhz -> 48 ciclos
1us a 24Mhz -> 48 ciclos
Haciendo algunas cuentas, se llega a que el retardo que tiene el
microcontrolador en atender la interrupción y detener el contador es de 48
ciclos.
De acuerdo a la velocidad a la que corra el contador, y a la que se ejecuten
las instrucciones del PIC, este tiempo cambia, y se puede observar en las
mediciones obtenidas.
Es evidente que sólo se pueden mejorar estos tiempos vía software (o firmware),
pero en principio esto no implica un problema.
El único efecto que esto produce es que se sobreescriban las
n muestras (16,
8, o bien, la cuenta que resulte de los 48 ciclos del PIC) obtenidas y
guardadas en memoria. Teniendo una memoria de gran tamaño, y siendo tantas las
muestras que se toman de la señal de entrada, creemos que la citada cantidad no
es relevante y puede despreciarse. El único cuidado que hay que tener es el de
no tenerlas en cuenta y considerarlas como muestras no validas, descartándolas
y suponiendo el resultado los valores guardados a partir de la muestra número
n.
Inserción de zócalos
Los circuitos integrados seleccionados para componer el sistema completo fueron
en su mayoría de encapsulado DIP, lo que facilita enormemente su uso,
especialmente en placas universales (ver:
Fabricación). Sin embargo los
conversores y las memorias no las pudimos obtener en este tipo de encapsulado.
Los conversores TLC5540 de Texas Instruments tienen un encapsulado SOIC-24.
Para este componente debimos comprar un zócalo adaptador de SOIC-24 a DIP-24.
Afortunadamente este tipo de encapsulado (frente al SOJ) es de mas fácil
soldadura, y el zócalo adaptador calzó perfecto en los zócalos DIP estándar,
con los cuales construimos la plaqueta.
Las memorias Cypress CY7C-109B tiene encapsulado SOJ-32 y debimos comprar
zócalos adaptadores de SOJ-32 a DIP-32. Sin embargo en este caso nos
encontramos con un gran problema. El zócalo adaptador (en su parte DIP) tenía
una distancia entre sus lineas paralelas de 400-mil (1 mil = 1/1000" -> 400-mil
= 0.4" = 10.16mm), mientras que la separación standard es de 300-mil (7.62mm).
O sea, en la fabricación de la plaqueta, hemos dispuesto a todos los
componentes es zócalos DIP standard, y luego a medida que llegaba el momento de
colocarlos, el zócalo ya se encontraba soldado. Ahora, si tenemos ya soldado e
instalado un zócalo de 300-mil y tenemos que colocar en él un componente con
separación de 400-mil, está claro que no va a ser posible. Dado que
consideramos más complicado y con posibilidad de error el cambiar el zócalo de
la placa, ya que este ya se encontraba soldado (con todas las conexiones
adyacentes también soldadas) optamos por construir (en primera instancia) un
adaptador "casero" de DIP-32@400-mil a DIP-32@300-mil.
Esto al principio provocó fallas intermitentes en la conexión desde el
integrado hacia las pistas de cobre, pero se solucionó ajustándolo mejor y
haciendo mas presión sobre los componentes. Resulta evidente que estos zócalos
deben de reemplazarse por sus correspondientes, pero la solución optada ha sido
por cuestiones de tiempos y facilidad.
Preseteo de contadores
Los contadores que hemos seleccionado tienen la funcionalidad de
presetearlos, es decir, cargarle un valor predefinido al contador y luego
éste comenzará a contar a partir de dicho valor. El procedimiento de carga de
dicho valor es sincrónico, es decir, que una vez que se pone el valor deseado
en las patas correspondientes y la señal de carga esta seteada, se debe dar un
pulso en la señal de reloj para que dicha carga tenga acción. A diferencia de
los componentes asincrónicos, los cuales una vez que en el puerto de control se indica la carga del valor de preseteo, no requieren de un pulso de reloj para llevar la acción a cabo.
Esto no sería un problema para el contador de los bits menos significativos, ya
que la señal de reloj de este componente esta controlada por el PIC. Sin
embargo, el diseño de contadores en cascada, lo que permite aumentar la
cantidad de bits del contador, hace que la señal de reloj del contador más
significativo sea controlada por el contador de los bits menos significativos.
Este proceso hace que cada vez que el contador mas chico llega a la última
cuenta (el último numero antes de volver a cero), dé un pulso en su pata de
FULL (contador lleno), y esta es la que hace que el contador mayor aumente en
1 su cuenta.
Como vimos, el contador mayor esta controlado en cuanto a su sincronismo y
señal de reloj por el contador menor, y esto complica el proceso de preseteo,
ya que no tenemos forma directa de controlar la señal de reloj de dicho
contador (recordar que son sincrónicos).
Entonces la solución que hemos encontrado para resolver este problema es
haciendo que cada ciclo de preseteo de contadores cargue en el contador menor
el mayor valor posible, luego cargarle al contador mayor el valor deseado (esto
no ocurrirá hasta un nuevo pulso de reloj), y posteriormente enviar un pulso de
reloj al contador mayor para que este avance en su cuenta. Dado que lo habíamos
cargado con el máximo valor posible en su cuenta, un nuevo pulso de reloj hará
que este vuelva a cero y de un pulso en su señal de
contador lleno. Esta
señal es la que controla el reloj del contador mayor, y por consiguiente aquí
se producirá la carga efectiva de los datos en este contador, ya que como hemos
dicho, este contador es sincrónico y realiza las operaciones en cada pulso de
reloj.
Finalmente se carga al contador menor con el valor deseado y se termina con el proceso de preseteo.
Si bien esta solución no sería la ideal a primera vista, consideramos que una solución que se pueda hacer por software, en vez de realizar cambios en el hardware, es mejor y más fácil de llevar a cabo.
Control de lectura de memoria
La memoria tiene varias formas de ser operada y controlada, diferentes señales
proveen combinaciones diferentes qué hacen que el componente accione como se
espera. Por ejemplo, podríamos decir que puede ser controlada por la pata de
lectura, la de escritura, o la de habilitación. De acuerdo con qué
configuración se esté utilizando, entonces dichas señales deben de tener cierto
valor para el funcionamiento correcto.
Habiendo tales diferencias, hemos cometido un error de diseño sobre cómo
debería ser la señal de lectura.
Mientras probamos el funcionamiento de la placa observamos un funcionamiento en
este componente que no coincidía con el esperado. Al depurar en tiempo real qué
es lo que estaba ocurriendo, detectamos que el problema tenía origen
exactamente en el comportamiento de la memoria frente a lo que las señales de
control suponían. Aquí entonces revisando más a fondo las formas de control
detectamos que la señal de lectura estaba invertida, y por lo tanto, la
solución inmediata fue la de eliminar una de las compuertas NOT (hecha con
NAND) del camino de control de dicha señal.
Una vez realizado este cambio, la memoria funcionó tal como se esperaba.
Cambio de elección de patas del PIC
Mientras se comprobaba el funcionamiento de todos y cada uno de los
componentes, detectamos que alguna de las veces que un componente no actuaba
como se esperaba el problema provenía del microcontrolador. El PIC no realizaba
lo que se le solicitaba. Ciertas patas del PIC que debían cambiar de valor no
lo hacían, incluso al depurar en tiempo real por hardware.
Algunos de estos comportamientos anómalos se debían a una mala definición o programación de los puertos de entrada/salida del microcontrolador. Sin embargo otros casos se debían a la mala elección por nuestra parte, donde por ejemplo ciertos puertos utilizados para interrupciones no podían ser utilizados como patas de control standard.
En estos casos, debimos recablear las señales buscando algún otro puerto
disponible en el PIC. Esto implica tener que desoldar un cable, extraerlo, y
volver a colocar otro de las medidas necesarias y entre el viejo componente y
el nuevo puerto del PIC. Esta operación hay que realizarla con sumo cuidado ya
que los procesos de desoldar y volver a soldar pueden provocar cortes de
pistas, corto circuitos, y otros problemas.
Una vez que realizamos los cambios correspondientes, y se ha reprogramado el
microcontrolador con la nueva configuración, el funcionamiento fue óptimo.
Aquí es donde vuelven a aparecer las ventajas de utilizar una placa universal
en vez de un circuito impreso. La acción de hacer un cambio de último momento
en la selección de puertos implica que la conexión entre un componente y otro
cambie de recorrido, tenga un destino diferente, que el camino sea otro. Esto
en una placa impresa podría ser imposible de llevar a cabo, a menos que se
utilicen cables para reemplazar la pista de cobre. Nuevamente consideramos como
buena la elección de utilizar una placa universal.
Conexión simultánea al ICD2 y al puerto USB
La mayor ventaja del ICD2 es poder depurar lo que está pasando en la placa directamente sobre el hardware, lo cual, en contraste con una simulación, es un excelente recurso para encontrar problemas en el funcionamiento.
Al programar la placa, ésta queda por defecto en modo reset (el MPLAB la deja configurada así). Por lo tanto una vez programada la placa se debe sacar del modo reset yendo a
Programmer -> Release from reset. Esto hace que la placa corra simultáneamente conectada al puerto USB y al ICD2.
Para poder depurar el funcionamiento es necesario seleccionar el modo Debugger en lugar de Programmer, y luego ejecutar el programa yendo a Debugger -> Run (también pulsando la tecla F9).
Problemas de programación del ICD2
En repetidas oportunidades encontramos dificultades al programar el PIC, esto
era en la etapa de verificación de la programación.
Es decir, el proceso de programación consta de la verificación del dispositivo
y la conexión, luego se programa por completo el dispositivo, y finalmente se
hace una verificación del contenido.
Cuando existe una diferencia entre lo programado y lo verificado, puede ser o
bien que haya sido mal programado, o que el proceso de verificación no se haya
completado correctamente. Dado que después de una programación no satisfactoria
el dispositivo no funcionaba, es claro que la falla estaba en la etapa de
programación.
Varias veces hemos tratado de encontrar la raíz del problema, pero sin poder
llegar a ninguna conclusión.
De hecho, se podría decir que habíamos encontrado una forma de hacer que vuelva
a su funcionamiento normal, y era reiniciando el PC y reconectando todos los
equipos. Esto nos hizo suponer que se trataba de un problema en el PC, o mejor
dicho, de algún inconveniente con el puerto USB.
Sin embargo, mas adelante descubrimos que el problema radicaba en el regulador
de tensión del ICD2. Luego de un largo periodo de operación este componente
recalentaba y producía el mal funcionamiento. Creemos que una de las posibles
razones de que el regulador aumente su temperatura es la calidad de la fuente
de alimentación que utilizamos. Luego de detectado el problema lo resolvimos añadiéndole un disipador al regulador de tensión, y también colocamos un ventilador disipador próximo a él para asegurarnos que funcione correctamente.
Calibración
Una vez que el osciloscopio estuvo funcionando, fue necesario realizar la
calibración del equipo.
La computadora ya podía obtener los valores de las mediciones, por lo que
restaba hacer los cálculos correspondientes para asignarles un valor correcto a
dichas tensiones y a los tiempos equivalentes entre las muestras obtenidas,
teniendo en cuenta los parámetros de captura del osciloscopio para cada modo de
captura distinto.
La etapa de entrada tiene un potenciómetro multivuelta de alta precisión para
cada canal que permite ajustar el nivel de tensión media de los mismos antes de
entrar al conversor analógico digital. Con este potenciómetro nos aseguramos
que ambos canales tengan el nivel correcto de tensión media, encontrándose
exactamente en el medio de la excursión del conversor.
Luego realizamos varias mediciones con señales de laboratorio conocidas,
generadas con un generador de funciones. Las señales utilizadas fueron de
diferentes formas de onda, y de diferentes tensiones y frecuencias (utilizando
todo el rango posible). Estas señales fueron medidas con nuestro osciloscopio y
con un osciloscopio profesional.
Finalmente, al obtener las mediciones, realizamos los cálculos correspondientes
para que nuestro equipo muestre los valores de tensión correspondientes. Al
mismo tiempo realizamos las mediciones de tiempos, corroborando el tiempo entre
muestras de acuerdo a las diferentes velocidades y diferentes tipos de
muestreo. De esta forma se realizó la calibración del prototipo.
Especificaciones finales
A continuación se presenta una tabla con el resumen de las especificaciones
finales del osciloscopio, según el prototipo armado.
| Especificación | Valor |
| Resolución vertical | 8 bits |
| Conexión a la PC | USB 1.1 (USB 2.0 compatible) |
| Velocidad máxima de muestreo | 8 MSPS |
| Entradas | 2 canales con entradas BNC |
| Rangos de tensión | ±40 V |
| Precisión de tensión | 3% |
| Tamaño del buffer | 64K |
| Impedancia de entrada | 1 MΩ |
| Alimentación eléctrica | 9V DC |
| Consumo de potencia | 5-7W |
| Dimensiones | 240mm x 180mm x 75mm |
| Software | Windows 98/2000/XP Linux Mac (no probado) |
| Aislación | Mo dispone de aislación eléctrica |
| Señal de calibración | No dispone de señal de calibración |
Tabla 8.1 Especificaciones finales del osciloscopio
Cada una de las especificaciones es limitada o definida por un componente
particular, a saber:
- Resolución vertical - limitada por todo el sistema, ya que todos los componentes son de 8 bits
- Conexión con la PC - Limitada por el PIC puesto que solo trabaja a USB1.1
- Velocidad máxima de muestreo - Limitado por la frecuencia del oscilador (en este caso, un cristal de 8 Mhz). Sino sería limitado por la frecuencia máxima de trabajo del ADC (40 Mhz).
- Precisión de tensión - definido por el error en el ADC (± 1 LSB) más un error (estimado) en la etapa de entrada
- Tamaño del buffer - limitado por las memorias
- Impedancia de entrada - definido por la impedancia de entrada de los amplificadores operacionales de entrada
- Alimentación eléctrica - definido por el regulador 7805
- Consumo de potencia - definido a partir del consumo de todos los componentes activos. Ver Capítulo 4. Hardware
- Dimensiones - definido por el tamaño de la carcaza
- Software - definido por las características del lenguaje python
Compatibilidad con puntas de atenuación
Es muy corriente que las puntas de medición para osciloscopios tengan la
posibilidad de atenuar grandes señales de entrada. Esta característica se
incluye para poder medir señales de gran amplitud. De este modo, la misma punta
de medición atenúa 10 veces a la señal, para que ésta cumpla con los rangos de
entrada del osciloscopio y pueda ser medida. Esta es una práctica muy común y
la mayoría de los osciloscopios y puntas de medición ya vienen con esta esta
capacidad.
En nuestro caso, entendemos que agregar esta funcionalidad resulta trivial,
puesto que solo bastaría con modificar el software agregándole un selector
X1/X10 (y realizando las cuentas correspondientes) de la misma forma que hoy
posee un selector para habilitar o deshabilitar la etapa de entrada (ver
).
Estudiando hojas de datos de diferentes puntas de medición, observamos que
en general éstas requieren una impedancia vista de entrada hacia el
osciloscopio de 1 MΩ lo cual se cumple en nuestro prototipo.
Referencias
- Microchip MPLAB (programador y depurador del PIC18F4550)
- Microchip MPLAB C18 (compilador C para el PIC18F4550)
- Figuras
Capítulo 9. Manual de usuario
Contenido de este capítulo
Introducción
En este capítulo se presenta el manual de usuario del osciloscopio, el cual
incluye una descripción de sus características y la guía de como utilizar el
software. Está orientado al usuario final del osciloscopio.
Información sobre el producto

Fig 9.1 Foto frontal del osciloscopio
Especificaciones
| Especificación | Valor |
| Resolución vertical | 8 bits |
| Conexión a la PC | USB 1.1 (USB 2.0 compatible) |
| Velocidad máxima de muestreo | 8 MSPS |
| Entradas | 2 canales con entradas BNC |
| Rangos de tensión | ±40 V |
| Precisión de tensión | 3% |
| Tamaño del buffer | 64K |
| Impedancia de entrada | 1 MΩ |
| Alimentación eléctrica | 9V DC |
| Consumo de potencia | 5-7W |
| Dimensiones | 240mm x 180mm x 75mm |
| Software | Windows 98/2000/XP Linux Mac (no probado) |
| Aislación | Mo dispone de aislación eléctrica |
| Señal de calibración | No dispone de señal de calibración |
Tabla 9.4 Especificaciones del osciloscopio
Requisitos mínimos del sistema
Para que funcione el osciloscopio se necesita un computador con las siguientes
características mínimas:
| Procesador | Pentium o equivalente |
| Memoria | 32 Mb. |
| Espacio en disco | 5 Mb. |
| Sistema operativo | Microsoft Windows 98 SE, ME, 2000, XP o superior Linux 2.6 o superior Mac OS X 10.2 o superior (no probado) |
| Puertos | Puerto compatible con USB 1.1 como mínimo |
Tabla 9.1 Requisitos del sistema
Conectores y controles del osciloscopio
El osciloscopio posee varios controles y conectores que se detallan a
continuación.
Panel frontal

Fig 9.2 Panel frontal del osciloscopio
Descripción de los controles del panel frontal (de izquierda a derecha):
| Etiqueta | Tipo | Función |
| CHAN1 | Conector BNC | para conectar la punta de osciloscopio del canal 1 |
| CHAN2 | Conector BNC | para conectar la punta de osciloscopio del canal 2 |
| ETAPA DE ENTRADA | Llave | para habilitar/deshabilitar la etapa de entrada (también es necesario habilitar/deshabilitar la desde el programa) |
Tabla 9.2 Controles del panel frontal
Panel trasero

Fig 9.3 Panel frontal del osciloscopio
Descripción de los controles del panel trasero (de izquierda a derecha):
| Etiqueta | Tipo | Función |
| USB | Conector USB tipo B | para conectar el osciloscopio a la PC con un cable USB estándar |
| DEBUG | Conector RJ12 | para depurar el funcionamiento del osciloscopio a través del programador/depurador ICD2 |
| RESET | Botón | para resetear el osciloscopio |
| ON/OFF | Llave | para encender/apagar el osciloscopio |
| 9V DC | Conector de corrriente | para conectar la alimentación al osciloscopio |
Tabla 9.3 Control del panel trasero
Instalación del osciloscopio
A continuación se detallan los pasos de instalación a seguir para instalar el
osciloscopio en su sistema operativo de preferencia.
Windows
1. Baje el software
- Bajar la última versión del software de http://pablohoffman.com/twiki/pub/Oscusb/Oscusb
- Descomprimir el archivo oscusb-sw-rX.zip (donde X es el número de revisión) en un algún directorio, por ejemplo c:\oscusb
2. Conecte el osciloscopio e instale el driver
Al conectar el osciloscopio por primera vez aparecerá el Asistente para
instalación de hardware de Windows indicándole que se ha conectado un nuevo
dispositivo a su PC. Siga los siguientes pasos para instalar el driver:
- Seleccionar Instalar desde una lista o ubicación específica (avanzado) y haga clic en Siguiente
- Hacer clic en Examinar y seleccione la carpeta c:\oscusb\driver\WIN98-2K-XP
- Hacer clic en Siguiente
- Windows dirá que se ha reconocido el nuevo dispositivo Osciloscopio USB
- Hacer clic en Finalizar
Linux
- Baje la última versión del software de http://pablohoffman.com/oscusb/software/
- Descomprima el archivo oscusb-sw-rX.zip (donde X es el número de revisión) en algún directorio, por ejemplo: /usr/local/oscusb
Uso del osciloscopio
Tanto en Windows como en Linux el programa tiene la siguiente interfaz:
Fig. 9.4 Interfaz del software del osciloscopio
Como se puede observar la interfaz cuenta con 3 displays y varios controles.
Los cuales se explican a continuación:
Display en el tiempo
El display más grande de la izquierda es donde se podrán observar las señales
capturadas en el tiempo, ya sea de uno o ambos canales (separados o
superpuestos). El mismo está dividido por un grilla de 10x10 y su escala
depende del valor de los parámetros V.DIV y H.DIV.
La posición del cero en el display de la señal en el tiempo depende de ciertos
factores, como ser:
- cantidad de canales
- etapa de entrada habilitada
- etc
Y cambia automáticamente al cambiar esas opciones con los controles.
Análisis espectral
Los displays pequeños de la derecha muestran el análisis espectral de las
señales, respectivamente: canal 1 (arriba), canal 2 (abajo).
La frecuencia máxima de los displays de análisis espectral cambia
automáticamente cuando se cambia la división horizontal a través del control
H.DIV. El cero en dichos display siempre está fijo en el medio.
Fig. 9.5 Captura (modo dual) de dos señales superpuestas
Controles
Los diversos controles de la aplicación (ubicados en la parte inferior de la
interfaz) permiten configurar el modo de funcionamiento del osciloscopio, de
forma análoga a como se haría en un osciloscopio analógico.
Botón capturar
El botón Capturar sirve para dar comienzo al proceso de captura. Es un botón de
doble estado: para detener la captura hay que presionarlo nuevamente.
Al presionar el botón Capturar aparecerán las señales en el display principal y
sus respectivos análisis espectral respondiendo a la configuración de los
controles. Ambos continuarán actualizándose continuamente hasta que la captura
sea detenida.
Como es de esperar, los controles pueden ser cambiados durante el proceso de captura. No es necesario detener la captura y volver a largar.
H.DIV
El control H.DIV permite configurar la división horizontal del osciloscopio, es
decir, el valor en el tiempo que ocupa una división del display.
Debajo del control H.DIV se indica la frecuencia de muestreo a la cual está
trabajando el osciloscopio para lograr la división horizontal seleccionada.
Dicho valor es actualizado automáticamente al cambiar el H.DIV, al igual que la
frecuencia máxima de los análisis espectrales.
El selector x8 permite hacer un zoom digital en el tiempo de la señal.
Canales
El selector de canales permite seleccionar los canales a ver en el display. Las
opciones son:
- Canal 1 - muestra solo el canal 1
- Canal 2 - muestra solo el canal 2
- Ambos (superpuestos) - muestra ambos canales en el display superpuestos uno arriba del otro
- Ambos (separados) - muestra ambos canales en el display, pero separados: canal 1 (arriba), canal 2 (abajo)
Al cambiar esta opción se cambia la posición del cero en el display principal y
también habilita (o deshabilita) los respectivos display de análisis espectral.
V.DIV
Los controles V.DIV permiten configurar configurar la división vertical del
osciloscopio, es decir, el valor de voltaje que ocupa una división del display.
En otras palabras, permite seleccionar la escala de voltaje a usar en cada
canal. La misma puede seleccionarse de forma independiente por cada canal.
Nivel Trigger
Los controles de Nivel de Trigger permiten seleccionar el valor del trigger por
nivel del osciloscopio. Es decir, el valor a partir del cual se comenzará a
mostrar la señal en el display.
Este trigger es un disparador por software que, una vez recibidas las muestras del
osciloscopio, decide a partir de qué muestra se visualizará en el display.
RT Step
El control RT Step permite cambiar el intervalo (step) de actualización del
display en las capturas de tiempo real (es decir, para H.DIV = 1s, 2s ó 4s). Por
defecto su valor es 1 y las señales son dibujadas pixel por pixel. Sin embargo,
para PCs más lentas su velocidad puede ser insuficiente para observar un
display continúo en tiempo real. Para dichos casos basta con aumentar el RT
Step.
Fig. 9.6 Captura (modo dual) de dos señales separadas
Parámetros de la señal
El osciloscopio presenta un cuadro con información sobre diversos parámetros
típicos de la señal en la sección inferior derecha de la ventana. Ellos son:
- Vpp - voltaje pico-pico
- Vrms - voltaje eficaz
- Vm - voltaje medio
Estos valores son actualizados de forma continua, junto con la señal en el
tiempo y su espectro.
Guardar muestras en archivo TSV
El programa permite guardar las muestras recibidas del osciloscopio en un
archivo para su posterior análisis, por ejemplo en algún programa de cálculo
numérico.
Para ello basta con tildar la opción
Guardar muestras en un archivo TSV e
ingresar debajo el nombre del archivo donde se desean guardar las muestras.
Esto debe hacerse antes de pulsar el botón Capturar, puesto que esta opción no
puede ser cambiada una vez que el osciloscopio está capturando.
El formato del archivo generado es bien simple: cada línea contiene dos valores
separados por un tabulador. El primer valor es el voltaje del canal 1, y el
segundo valor es el voltaje del canal 2.
Barra de estado
La barra de estado ubicada en la parte inferior izquierda de la ventana brinda
información sobre el estado de funcionamiento del osciloscopio, por ejemplo, la
cantidad de muestras capturadas y si hubo algún error al recibir algún dato.
Estado de conexión
La barra de estado de conexión es la que se encuentra en la esquina inferior
derecha de la ventana y nos brinda información sobre el estado de conexión con
el osciloscopio y su versión de firmware.
En caso de estar conectado aparecerá un indicador verde señalando que se encuentra
conectado y la versión de firmware del osciloscopio. En caso de no estar
conectado aparecerá el mismo en color rojo indicando
No conectado.
Es posible desconectarse y volverse a conectar al osciloscopio tildando el cuadro que se encuentra a la izquierda del estado de conexión.
Capítulo 10. Temas pendientes y rentabilidad
Contenido de este capítulo
Introducción
Este capítulo se enumeran los temas que quedaron pendientes para un desarrollo
posterior del proyecto, junto con un comentario sobre la importancia y dificultad de cada uno. También se presenta un estudio de rentabilidad tentativo, a modo de ejemplo.
Mejoras pendientes
Como en todo proyecto, tuvimos que dar prioridad a ciertas tareas sobre otras,
debido fundamentalmente a la falta de tiempo. La siguiente es una lista de los
temas que quedaron pendientes y las posibles mejoras a realizar.
Etapa de entrada y aislación
La etapa de entrada actual fue diseñada como prueba de concepto, para mostrar
el funcionamiento del control de escala de voltaje y la interacción necesaria
entre el software y el firmware para lograrlo.
Sin embargo, la etapa de entrada carece de un exhaustivo diseño por lo que su
funcionamiento debe considerarse muy elemental.
Actualmente, los amplificadores de alta ganancia generan oscilaciones, y los de
baja ganancia no amplifican lo suficiente para poder medir el rango de señales
deseado. Además, estos componentes tienen que cumplir con el requisito de ancho
de banda necesario para no degradar el funcionamiento del equipo. Esta etapa
debe ser rediseñada por completo de forma minuciosa para cumplir con los
requisitos necesarios.
Por otro lado, también carece de cualquier mecanismo de protección. Dado que
las pruebas fueron realizadas con señales de laboratorio controladas, este
tópico fue aplazado. Sin embargo, la protección y aislación para proteger la
seguridad del equipo (y del operador) es un requisito imprescindible en el caso
de que se vaya a comercializar el producto.
De igual importancia, es la aislación (a través de un optoacoplador o similar)
entre la placa y el PC, ya que hoy en día la conexión al puerto USB se realiza
de forma directa.
Ancho de banda
Otro tema pendiente es el de aumentar la frecuencia de trabajo del osciloscopio
de forma de llegar a los 20 MSPS estipulados en los objetivos. Como ya se
mencionó en varias oportunidades, el hardware del osciloscopio fue diseñado
para trabajar hasta 40 Mhz, por lo cual, para lograr este objetivo bastaría con
sustituir el cristal por uno más rápido.
Sin embargo, también sería necesaria la fabricación de un circuito impreso
apropiado, para minimizar los problemas de ruido e interferencia que van a
aparecer a estas frecuencias (ver punto sobre Circuito Impreso y EMC, más
abajo).
Circuito impreso y EMC
Una vez que se cuente con el diseño final de la placa (incluyendo la etapa de
entrada), será necesario realizar un circuito impreso para obtener un mejor
desempeño en cuanto a la interferencia y el ruido, y minimizar la probabilidad
de fallas, malas conexiones, etc.
Debido a la naturaleza de nuestro proyecto (componentes de alta velocidad,
buses de datos, alta tasas de transferencias) sería deseable realizar un
delicado estudio pormenorizado de la interferencia electromagnética generada y
recibida por los componentes de forma de poder diseñar una distribución óptima
para minimizar dichos problemas.
Para atacar este problema, ya existen algunas pautas genéricas sobre el diseño
de PCB de alta frecuencia, como ser:
- evitar al máximo posible los loops en las pistas de alta frecuencia
- colocar componentes de alta frecuencia lo más cerca posible
- utilizar planos de tierra
Debido a que la fabricación de un circuito impreso para la placa no estaba
dentro de los objetivos previstos, este fue uno de los tópicos que quedó
relegado para una futura instancia del proyecto.
También vale recalcar que, para poder comercializar el producto, éste debería
aprobar las pruebas de conformidad con los límites actuales de emisión e
interferencia fijados por la URSEC.
Detección de transitorios por software
La detección de transitorios es una tarea muy importante, incluso más que el
análisis en frecuencia, pero bastante más compleja también, puesto que
involucra tareas de procesamiento inteligente, como ser correlación de los
datos con secuencias de valores conocidos para detectar picos de voltaje y
otros tipos de irregularidades. Esta tarea también fue relegada por no estar
relacionada directamente con el diseño electrónico del aparato o su
comunicación con el PC, sin embargo siempre tenida en cuenta a lo largo del
desarrollo para dejarla prevista. Por eso escogimos una memoria grande de 32K
para poder almacenar una buena cantidad de muestras, lo cual es un requisito
necesario para este tipo de procesamiento de la señal. Dada su gran utilidad,
consideramos que esta es una de las primeras características a agregar en el
software.
Convolución con sinc
Actualmente el software interpola linealmente las muestras recibidas del
osciloscopio para graficar la señal obtenida. Esto ocasiona que a frecuencias
muy cercanas a la máxima (4 Mhz, en el caso del prototipo) no sea posible
vislumbrar una señal senoidal, más aún, solo se obtiene una banda continua de
puntos, ya que en dicho caso se están interpolando únicamente dos puntos por
período. Para solucionar este problema y lograr graficar señales senoidales de
hasta 4 Mhz deberíamos entonces interpolar la señal con un sinc que es aquella
señal cuya transformada en frecuencia es un escalón (es decir, un pasabajo), lo
cual se asemeja más al filtro aplicado en el muestreo de la señal, y por lo
tanto nos permite obtener un resultado más fiel al original.
Vale notar que al convolucionar un sinc con la señal más rápida (la cual tiene
2 muestras por período aprox.) se obtiene una señal senoidal perfecta lo cual
es coherente con lo esperado puesto que una senoidal de 4 Mhz es la señal más
rápida que el osciloscopio es capaz de medir.
Para implementar esta convolución (y así agregar una gran ventaja de usabilidad
al osciloscopio) se utilizaría la misma librería usada para la FFT (NumPy) por
lo cual sería una tarea bastante sencilla.
Mecanismo de conexión con el osciloscopio
Actualmente se utiliza el mecanismo de barrido de puertos serie para conectarse
con el osciloscopio. Este mecanismo no es inocuo para el PC y por lo tanto debe
cambiarse en el producto final, ya sea colocando un selector de puerto a
utilizar (solución sencilla) o desarrollando un driver USB propio para el
osciloscopio que no involucre el uso de puertos virtuales.
LEDs de estado
Una característica importante de usabilidad que dejamos de lado fue la
colocación de LEDs de diagnóstico (y estado) en el osciloscopio. En particular,
resultan de interés:
- LED de encendido
- LED de conexión USB
- LED de captura de datos en curso
Dichos podrían ser conectados de la siguiente manera:
- el LED de encendido conectado a la salida del regulador 7805
- el LED de conexión USB conectada al Vcc del bus USB
- el LED de captura de datos iría conectada a un pin del PIC y sería controlado desde el firmware.
Trigger externo por hardware
Otro tema que quedó pendiente fue la implementación de un trigger externo por
hardware lo cual permitiría disparar la captura de datos por un canal al
recibir un pulso por el otro.
El hardware fue dejado previsto para esta tarea, por lo cual solo faltaría
implementar el algoritmo de disparo por hardware que se encuentra explicado en
el
Capítulo 4. Hardware
(Trigger externo por
hardware).
Sin embargo, la implementación de esta característica requiere profundizar el
estudio sobre el funcionamiento del comparador del PIC y sus interrupciones por
cual sería una tarea de mediana complejidad.
Driver USB propio
Escribir un driver de comunicación USB propio, lo cual permitiría obtener
transferencias más rápidas entre el osciloscopio y la PC. Si bien no sería
posible llegar a la velocidad máxima de USB 1.1 (1.4 Mbytes/seg) debido a
limitaciones de tiempo procesamiento del PIC, se podría mejorar ampliamente
la velocidad de transferencia. Actualmente ésta está limitada a 80 Kbytes/seg
debido al firmware CDC utilizado para la comunicación.
Sin embargo, el tener un driver USB propio también complicaría la portabilidad,
puesto que habría que escribir un driver para cada sistema operativo donde se
quiera correr el osciloscopio, en lugar de aprovechar los drivers para la
comunicación USB-CDC que ya vienen disponibles en todo sistema operativo
moderno.
Vendor ID y Product ID propio
Si bien los valores del Product ID (PID) y Vendor ID (VID) puede ser
modificados arbitrariamente al programar el firmware, dichos códigos son un
tema muy delicado. La USB-IF (USB Implemmenters Forum) tiene la autoridad (y
responsabilidad) absoluta sobre la asignación de códigos VID únicos de 16 bit
para cada fabricante que quiere comercializar sus productos USB. Esos códigos
son obtenidos mediante una licencia y el pago de un impuesto (por una única
vez) que asciende a los U$S 1500.
Una vez que al fabricante obtiene su Vendor ID (VID) tiene a disposición 65.536
códigos PID (de 16-bit) para identificar únicamente sus productos. En caso de
querer comercializar el osciloscopio sería necesario contactar a la USB-IF para
solicitar un un Vendor ID.
Esta tarea es puramente administrativa y no presenta dificultad alguna, salvo
por la solvencia económica necesariamente para obtener los U$S 1500.
Tamaño del firmware
Actualmente el firmware utiliza funciones de la librería estándar de C
stdio.h, concretamente
sprintf(). La implementación de dichas funciones son
extremadamente grandes y hacen que el tamaño del firmware compilado
prácticamente se duplique. Como en nuestro caso el código entra sin problemas
en el PIC no consideramos este problema una prioridad, pero se podrían eliminar
dichas funciones (que son muy genéricas) implementando manualmente las rutinas
necesarias para obtener la misma funcionalidad que hoy se logra a través de
ellas.
Puesto que el uso de la función
sprintf() es muy reducido (solo se utiliza
para generar el texto de la respuestas USB) solucionar este problema sería
bastante sencillo.
Estudio de rentabilidad
A continuación realizaremos un análisis de los costos de fabricación y
desarrollo para estudiar si el producto es rentable comercialmente. Sabemos que
el prototipo en su estado actual no es comercializarle, pero nos parece
igualmente de gran utilidad la realización de este estudio para ver donde
estamos parados y además porque es etapa por la que siempre debe pasar todo
producto electrónico que vemos en el mercado.
Para comenzar, calcularemos el costo total de producir un osciloscopio
utilizando la siguiente fórmula:
Costo total = Costo materiales + Costo desarrollo
Donde costo total es la suma del costo de todos los componentes de construcción
y el costo de desarrollo, que esta dado por la siguiente fórmula:
Costo desarrollo = Costo hora hombre * Horas hombre dedicadas / Unidades a vender
Dado que nuestro mercado objetivo es el ámbito académico, estimaremos las
unidades a vender basados en los potenciales clientes locales. A esto le
sumaremos un estimativo de unidades que se podrán vender a entusiastas,
empresas, personas que trabajen en el ramo, e incluso la posibilidad de vender
unidades en el exterior (incluidos dentro de "otros").
| Cliente | Unidades a vender |
| Universidad de la república | 50 |
| Universidad ORT | 15 |
| UTU | 50 |
| IEME | 10 |
| Universidad Católica | 15 |
| IADE | 10 |
| Otros | 30 |
| Total | 180 |
Tabla 10.1 Estimación de unidades a vender el primer año
Suponiendo el costo de la hora hombre de desarrollo en U$S 15, y estimando un total de 700 horas hombre dedicadas (2 * 350 hs) nos queda:
Costo desarrollo = 700 * 15 / 180 = U$S 58.
El costo de los componentes se desglosa a continuación. No se incluyen
adaptadores SOIC-DIP y similares puesto que éstos solo son necesarios para el
desarrollo del prototipo y no para su producción. Además no se incluyen precios
de resistencias y capacitores pero éstos, a su vez, serán compensados por el
abaratamiento de los componentes al comprarlos en grandes volúmenes y
empaquetados más económicos.
| Cantidad | Componente | Modelo | Precio (U$S) | Total |
| 1 | PIC | PIC18F4550 | 6.72 | 6.72 |
| 1 | Cristal 8 Mhz | | 1.00 | 1 |
| 2 | Memoria SRAM | CY7C109B-25VC | 2.55 | 5.1 |
| 2 | Contador 8-bit | 74F269SPC | 1.80 | 3.6 |
| 2 | ADC | TLC5540 | 5.13 | 10.26 |
| 2 | Buffer 3-state | 74F245 | 2.30 | 4.6 |
| 2 | Amplificador de entrada | MAX477 | 6.36 | 12.72 |
| 2 | Conector BNC | - | 1.55 | 3.1 |
| 1 | Protector USB | SN65240P | 0.99 | 0.99 |
| 1 | Conector USB-B | ED90003-ND | 1.23 | 1.23 |
| 1 | Carcaza | - | 30.00 | 30 |
| 1 | Decodificador binario | 74HCT139 | 4.40 | 4.4 |
| 1 | Inversor | 74HC240 | 2.40 | 2.4 |
| 2 | Llave analógica | 74HC4066 | 3.12 | 6.24 |
| Total: | U$S 92.36 |
Tabla 10.2 Costo de los componentes
Por lo tanto, el costo total de fabricación del osciloscopio queda de la
siguiente forma:
Costo total = Costo materiales + Costo desarrollo = U$S 92 + U$S 58 = U$S 150
Esto nos daría el margen suficiente como para comercializar el osciloscopio a
U$S 300, lo cual nos parece un precio razonable para centros de estudio.
La principal intención es recuperar los costos de desarrollo dentro del primer
año de ventas, es por esto que se divide por las 180 unidades estimadas como
venta inicial. Luego sobre los costos fijos de componentes se suma la mano de
obra necesaria para producir cada equipo.
El margen de ganancia bruta obtenido se destinaría a alguna de las siguientes
categorías:
- reinversión (investigación, mejoras, etc).
- distribución.
- marketing, publicidad.
- ganancia neta.
Los porcentajes de cada ítem deberán ser evaluados oportunamente, en el caso de
que este proyecto llegue a ser una realidad comercial.
Flujo de fondos
A continuación se presenta un estudio de flujo de caja tentativa para los
valores actuales. Debe ser tomado solo a modo a ejemplo, puesto que prototipo
actual no permite estimar el costo exacto del un modelo comicial, sino
simplemente tener una idea acerca del mismo.
| Año | 0 | 1 | 2 | 3 | 4 | 5 |
| |
| Inversion Inicial | -10.500 | | | | | |
| CV | | -13.500 | -14.850 | -17.820 | -23.166,00 | -30.115,80 |
| CF | | -3.600 | -3.600 | -3.600 | -3.600 | -3.600 |
| Costo MP | | -16.625 | -18.287 | -21.945 | -28.528,16 | -37.086,60 |
| gastos de administracion y ventas | | -12.000 | -13.200 | -15.840 | -20.592 | -26.770 |
| |
| Costos Totales | | -45.725 | -49.937 | -59.205 | -75.886 | -97.572 |
| |
| Volumen | | 180 | 198 | 238 | 309 | 402 |
| Precio | | 300 | 300 | 300 | 300 | 300 |
| Ingreso por Ventas | | 54.000 | 59.400 | 71.280 | 92.664,00 | 120.463,20 |
| |
| FLUJO DE FONDOS | -10.500 | 8.275 | 9.463 | 12.075 | 16.778 | 22.891 |
Tabla 10.3 Estudio del flujo de caja
| Año | 1 | 2 | 3 | 4 | 5 |
| Volumen | 180 | 198 | 238 | 309 | 402 |
| Inversion Inicial | 10.500 | | | | |
| Precio | 300 | | | | |
| Costo Var. | 75 | | | | |
| Gastos Fijos | 3.600 | | | | |
| MP | 92,36 | | | | |
| Margen Gcia | 100% | | | | |
| GAV | 12.000 | 13.200 | 15.840 | 20.592 | 26.769,6 |
Tabla 10.4 Datos auxiliares al cálculo del flujo de caja
En definitiva:
- Tasa de costo de capital (TCC): 9%
- VAN: $41.144,38 ( VAN > 0 )
- TIR: 94% ( TIR > TCC )
Al obtener un Valor Actual Neto (VAN) de la inversión positivo, y al ser la TIR
mayor a la tasa de costo de capital, podemos decir que el proyecto es rentable
y decidimos llevarlo a cabo.
La Tasa de Costo de Capital (TCC) es el promedio ponderado de la tasa requerida
por el accionista y la tasa de costo de la deuda después de los impuestos. Como
suponemos que esta inversión se financia solamente con fondos de terceros (para
simplificar), utilizamos la tasa de costo de la deuda en dolares que nos da un
banco en plaza. El 9% es la tasa anual en dolares. También puede ser la tasa de
retorno requerida por los inversores.
El Valor Actual Neto es la diferencia entre todos los ingresos y todos los egresos actualizados al periodo actual. Según el criterio del Valor Actual Neto el proyecto debe aceptarse si su Valor Actual Neto es positivo.
La Tasa Interna de Retorno (TIR) es aquella tasa tal que descontando el flujo a esa tasa el VAN es cero. Esta tasa mide la rentabilidad de la inversión.
Volumen: Calculamos para el volumen una venta de 180 unidades el primer año, incrementando 10% en el segundo, 20% en el tercero y 30% en los siguientes.
Costos Fijos: estos serían gastos de electricidad, teléfono, alquiler, etc. Suponemos un gasto de U$S 300 mensual.
Gastos de Administración y Ventas: Suponemos unos U$S 1000 por mes y aumenta en el mismo porcentaje que el volumen de ventas.
Los costos variables son los costos que varían con las cantidades producidas.
Son los afectados directamente por la producción (no como los costos fijos, que
no importa la cantidad de osciloscopios que se produzcan, siempre se va a tener
los mismos; el alquiler, el teléfono, el gas, los sueldos, no varían). Los
calculamos suponiendo únicamente las horas hombre afectadas a la producción de
cada equipo, estimadas en 5 hs. y valor se multiplica por la cantidad de
equipos que se fabriquen por año.
El costo de MP, es el costo de la materia prima, que esta calculado en la tabla
10.2.
Referencias
Capítulo 11. Autoevaluación y conclusiones
Si bien al principio se realizó un cronograma base para encarar el proyecto,
debemos recalcar que no es lo mismo afrontar la tarea con un plan semanal que
uno anual. La realización y el seguimiento del cronograma es muy importante
para cumplir exitosamente el objetivo planteado. El beneficio en la
organización y seguimiento del proyecto es sustancial. Basados en nuestra
experiencia de este año de trabajo, creemos que es muy importante plantearse
objetivos intermedios y a corto plazo, además de los objetivos a largo plazo y
las grandes etapas del proyecto.
Por otra parte, la división, organización y cumplimiento de las tareas es
extremadamente importante. Es necesario definir el responsable de cada tarea y
el plazo que se le da a la misma. Se trata de un trabajo de equipo por lo que
todas las partes del mismo deben funcionar de manera coordinada y aceitada de
la misma forma que lo hacen los engranajes de un sistema mecánico. Si una de
las partes no cumple con el objetivo o el plazo, todo el equipo se verá
demorado y perjudicado. Tomando este ejemplo, si un engranaje deja de
funcionar, hasta que éste no cumpla su función, el sistema no podrá operar. La
división de las tareas es un punto importante a tener en cuenta. Es fundamental
que éstas se distribuyan correctamente puesto que una sola parte no podría
realizar las tareas de todos. También debemos recalcar que resulta más
productivo y eficaz asignar a cada miembro del grupo aquellas tareas en las
cuales su participación sea la más idónea ya que actuará en su ámbito de
conocimiento aumentando así su comodidad y eficiencia.
También creemos que el acceso a Internet hoy en día es imprescindible (y no
solamente para un proyecto de este tipo) puesto que la red cuenta con
incontables recursos e información, mucho más que cualquier biblioteca local.
Además, los datos están actualizados.
La herramienta de colaboración en línea que hemos utilizado (TWiki) ha hecho
posible que cada integrante del grupo pueda trabajar de forma colaborativa y
simultánea ya que la información está siempre disponible y es actualizada en
línea, por lo que nunca ocurre un "desfasaje" de los datos entre los distintos
integrantes, como ocurriría en caso de trabajar con archivos de Word y utilizar
el mail como medio de intercambio. El uso de herramientas colaborativas en
línea es una técnica cada vez más utilizada hoy en día.
En cuanto al proyecto en sí, hemos aprendido varias lecciones en base a las
experiencias vividas. Se ha podido comprobar las dificultades que se tienen al
trabajar a altas frecuencias lo cual, hasta ahora, era solo "un mito teórico".
También aprendimos que no es lo mismo tomar medidas preventivas para evitar
inconvenientes que enfrentar el problema real. Un factor importante a tener en
cuenta es el hecho de haber trabajado sobre una placa universal en lugar de un
circuito impreso (PCB) lo cual limita ciertos aspectos del funcionamiento pero
era inevitable por la naturaleza del proyecto. Sería impensable mandar a
fabricar un nuevo PCB cada vez que se realiza un cambio a los esquemáticos, al
menos en las primeras etapas donde no hay nada estable.
Nos hubiera gustado llegar a fabricar el PCB pues hubiéramos aprendido mucho
más, pero desgraciadamente el presupuesto, el tiempo y la falta de un diseño
estable nos impidió hacerlo.
Afortunadamente el equipo funciona correctamente a 8Mhz, pero el objetivo es
aumentar la frecuencia de trabajo para cumplir las objetivos propuestos
originalmente de 20 MSPS. Creemos firmemente que la fabricación de un circuito
impreso adecuado es la forma de lograr este objetivo por el inconveniente de
las altas frecuencias ya mencionado.
Otro tema no menor en la realización de este tipo de proyectos es la
dependencia del equipamiento necesario para trabajar. A diferencia de un
proyecto de software (como puede ser el caso de comprar una placa de desarrollo
y programar sobre ella) nuestro proyecto exigió el uso de osciloscopios y
herramientas de laboratorio no disponibles a nivel residencial. Si fuéramos a
realizar nuevamente el proyecto elaboraríamos una lista de instrumentos y
herramientas necesarias para el desarrollo y procuraríamos buscar una forma de
disponer de los mismos en todo momento.
Finalmente, otra lección aprendida es la de prever con anticipación las
necesidades, problema que tuvimos que sufrir con la falta de disponibilidad de
los componentes y que nos ha retrasado en el comienzo de la fabricación de la
placa. De haber tenido conciencia de esto, ordenar los componentes con
anticipación nos hubiese dado una ventaja en los tiempos.
En cuanto al firmware, la experiencia que nos dejó su desarrollo es que, si
bien el uso de C para programarlo fue de gran utilidad, hay aplicaciones (como
el trigger por hardware) que sería más conveniente implementar en assembler.
Además el MPLAB C18 implementa una versión de C con ciertas limitaciones, y
dichas limitaciones no están correctamente documentadas (por un tema comercial
quizás) lo cual generó atrasos considerables en el desarrollo y la depuración
del código.
A nivel de software, debemos admitir que nos sorprendió la sencillez y
flexibilidad brindada por el lenguaje python, hasta el punto de convencernos de
que no hubiéramos podido elegir un mejor lenguaje para escribir el código.
Tanto el lenguaje en sí como sus librerías hacen que sea irresitiblemente
simple y divertido de implementar hasta las operaciones más complejas. La
razón de esto se la atribuimos a un muy inteligente diseño del lenguaje junto
con una excelente documentación. Recomendamos fuertemente python como lenguaje
de propósito general y, en particular, para prototipado de aplicaciones.
Si bien las especificaciones completas del proyecto no pudieron ser alcanzadas
en esta primera instancia, estamos conformes con los resultados obtenidos y
creemos que el prototipo puede ser fácilmente extendido para cumplir con los
requisitos propuestos inicialmente.
Por último debemos confesar que la etapa más difícil del proyecto fue sin duda
el comienzo pues carecíamos de un rumbo definido a seguir y teníamos gran
dificultad en enfocarnos en un tema concreto, por miedo a estar perdiendo el
tiempo o de llegar a un callejón sin salida. En cambio, ya en etapas
posteriores, con las ideas claras y los objetivos inmediatos bien definidos nos
resultó más interesante y ameno el trabajo. Es más, nos gustaría seguir
trabajando en este proyecto pues la etapa donde nos encontramos ahora es muy
divertida, pero lo vemos poco viable debido a la falta de tiempo, capital y
herramientas apropiadas de trabajo.
Bibliografía
Aquí se presenta la bibliografía completa de todo el material utilizado para elaborar esta documentación.
- BAKER, Bonnie. 2004. Predict the Repeatability of Your ADC to the BIT [online] [citado 19 Abril 2005]. Disponible en Internet: <http://ww1.microchip.com/downloads/en/devicedoc/adn010.pdf>
- BANAHAN, Mike. 1991. The C Book [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://publications.gbdirect.co.uk/c_book/>
- BITSCOPE DESIGNS. 2002. Bandwidth vs Sample Rate [online] [citado 19 Abril 2005]. Disponible en Internet: <http://www.bitscope.com/design/hardware/convertor/?p=3#sub>
- BRANNON, Brad. 1995. Aperture Uncertainty and ADC System Performance [online] [citado 19 Abril 2005]. Disponible en Internet: <http://www.analog.com/UploadedFiles/Application_Notes/5356940929547373956522730668848977365163734AN501.pdf>
- DALLAS SEMICONDUCTOR. 2002. How Quantization and Thermal Noise Determine an ADC's Effective Noise Figure [online] [citado 19 Abril 2005]. Disponible en Internet: <http://www.maxim-ic.com/appnotes.cfm/appnote_number/1197>
- DALLAS SEMICONDUCTOR. 2004. Coherent Sampling Calculator (CSC) [online] [citado 19 Abril 2005]. Disponible en Internet: <http://www.maxim-ic.com/appnotes.cfm/appnote_number/3190>
- DIX, Alan. 1999. Three DSP Tips [online] [citado 16 Abril 2005]. Disponible en Internet: <http://www.hiraeth.com/alan/papers/DSP99/DSP99.pdf>
- HEWLETT-PACKARD. 1998. Oscilloscopes Sampling: How fast and which way? [online] [citado 24 Abril 2005]. Disponible en Internet: <http://tritium.fis.unb.br/Fis3Exp/www.tmo.hp.com/tmo/pia/BasicInstrument/TUTnBRIEF/English/BI-T-Sampling-010.html>
- KERNIGHAN, Brian; RITCHIE, Dennis. 1988. The C Programming Language. 2da.ed. Nueva Jersey: Prentice Hall.
- KRUKOWSKI, Artur; et.al. 1996. Application of polyphase filters for bandpass sigma-delta analog-to-digital conversion [online] [citado 16 Abril 2005]. Disponible en Intenet: <http://users.cscs.wmin.ac.uk/~krukowa/pdf/Paper12.pdf>
- MICROCHIP. 2001. Analog-to-Digital Converters [online] [citado 24 Abril 2005]. Disponible en Internet: <http://ww1.microchip.com/downloads/en/devicedoc/adc.pdf>
- MICROCHIP. 2005. MPLAB C18 C Compiler Getting Started [online] [citado 24 Abril 2005]. Disponible en Internet: <http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Getting_Started_51295f.pdf>
- MICROCHIP. 2005. MPLAB C18 C Compiler Libraries [online] [citado 24 Abril 2005]. Disponible en Internet: <http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Libraries_51297f.pdf>
- MICROCHIP. 2005. MPLAB C18 C Compiler User's Guide [online] [citado 24 Abril 2005]. Disponible en Internet: <http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Users_Guide_51288j.pdf>
- PENTEK INC. 2004. Putting Undersampling to Work [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://www.pentek.com/deliver/TechDoc.cfm/PutUndersamp.pdf?Filename=PutUndersamp.pdf>
- STRASSBERG, Dan. 2003. Eyeing jitter: shaking out why signals shake [online] [citado 19 Abril 2005]. Disponible en Internet: <http://www.edn.com/article/CA293235.html>
- TEXAS INSTRUMENTS. 1995. Understanding Data Converters [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://focus.ti.com/lit/an/slaa013/slaa013.pdf>
- USB IMPLEMENTERS FORUM. 2000. USB 2.0 Specification [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://www.usb.org/developers/docs/>
- VAIDYANATHAN, Preethy. 2001. Generalizations of the sampling theorem: seven decades after nyquist [online] [citado 3 Mayo 2005]. Disponible en Intenet: <http://www.systems.caltech.edu/dsp/students/bojan/journ/Nyquist7decades.pdf>
- VAN ROSSUM, Guido. 2006. Python Documentation [online] [citado 15 Junio 2005]. Disponible en Internet: <http://docs.python.org>
- WIKIPEDIA. 2006. Nyquist–Shannon sampling theorem [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://www.answers.com/topic/nyquist-shannon-sampling-theorem>
- WIKIPEDIA. 2006. Quantization Noise [online] [citado 3 Mayo 2005]. Disponible en Internet: <http://today.answers.com/topic/quantization-error>
Por hojas de datos de los componentes ver
Apéndice III. Hojas de datos
.
Apéndice I: Esquemáticos
Este apéndice contiene los esquemáticos completos del osciloscopio, separados
en bloques funcionales.
A lo largo del proyecto, hubo un total de 11 revisiones de los esquemáticos que se encuentran disponibles en la siguiente página:
http://pablohoffman.com/oscusb/esquematicos/
Allí se puede observar el progreso de los mismos, ya que cada revisión
tiene anotaciones sobre los cambios con respecto a la versión anterior.
A continuación se publica la última revisión de los mismos.
Apéndice II: Lista de materiales (BOM)
Este apéndice contiene la lista de todos los componentes necesarios para la fabricación del osciloscopio (también conocida como BOM).
El código de referencia es el mismo que aparece en los esquemáticos.
| Cant | Descripción | Referencia | Encapsulado |
| 1 | 74HC_6V, 74HC139N_6V | U32 | NO16 |
| 1 | 74hc240, 74HC240N_6V | U34 | NO20 |
| 2 | CAP_ELECTROLIT, 4.7uF-POL | C11, C12 | ELKO5R5 |
| 4 | Opamps, MAX477 | U7, U31, U35, U37 | DIP-8 |
| 2 | CMOS_5V, 4066BT_5V | U33, U36 | SO-14 |
| 2 | ADC_DAC, TLC5540 | U12, U13 | DIP-24 |
| 2 | SCHOTTKY_DIODE, 10BQ015 | D1, D2 | SMB |
| 2 | CAP_ELECTROLIT, 0.1uF-POL | C1, C2 | ELKO5R5 |
| 2 | Memory, CY7C109B | U16, U17 | DIP32 |
| 4 | RESISTOR, 470Ohm_5% | R16, R17, R12, R15 | RES0.25 |
| 2 | RESISTOR, 15kOhm_5% | R4, R5 | RES0.25 |
| 1 | Transient, SN65240 | U1 | DIP-8 |
| 2 | LED, LED_green | LED1, PWR | LED1 |
| 2 | RESISTOR, 27Ohm_5% | R2, R3 | RES0.25 |
| 1 | Connectors, USB-B | U2 | SO4 |
| 2 | Counters, 74F269 | U5, U6 | PDIP-24 |
| 2 | RESISTOR, 4.7kOhm_5% | R7, R13 | RES0.25 |
| 2 | CAPACITOR, 100nF | C4, C8 | CAP4 |
| 1 | Microprocessors, PIC18F4550 | U15 | PDIP-40 |
| 2 | SWITCH, DIPSW1 | J1, J2 | DIPSW1H |
| 1 | RESISTOR, 1.0MOhm_5% | R14 | RES0.25 |
| 2 | CAPACITOR, 15pF | C3, C5 | CAP1 |
| 1 | CAPACITOR, 470nF | C6 | CAP4 |
| 2 | Buffers, 74F245 | U19, U21 | DIP-20 |
| 1 | SOCKETS, DIP6 | ICSP | DIP-6 |
| 1 | VOLTAGE_REGULATOR, LM7805CT | U8 | TO-220 |
| 1 | CAPACITOR, 330nF | C7 | CAP4 |
Apéndice III. Hojas de datos
Este apéndice contiene enlaces a las hojas de datos de todos los componentes
utilizados o mencionados en la documentación. Por razones de espacio, solo se
publican los enlaces.
La lista se encuentra separada en secciones según la categoría del componente.
Procesadores
Contadores
Memorias
- Cypress CY7C109B
- Texas BQ4011
- Cypress CY7C199
- ALSC AS7C256A
ADCs
- Texas TLC5540
- Texas ADS831
- Texas THS0842
- Analog Devices AD9057
- Analog Devices AD9059
Buffers 8-bit
- Fairchild 74F245
- Texas SN74AHCT541
Protectores USB
Amplificadores
- Maxim MAX477
- Texas OPA695
- Texas OPA691
- Texas OPA830
Decodificadores binarios
Inversores
Llaves analógicas
Osciladores programables
- Linear Technology LTC6905
Apéndice IV: Glosario
Este apéndice contiene la lista de términos, abreviaciones y siglas utilizadas en la documentación del proyecto, junto con su debida explicación.
- AB - Ancho de Banda
- ADC - Analog to Digital Converter
- API - Application Progam Interface. Conjunto de funciones provistas por una librería para extender la funcionalidad de un lenguaje de programación para una funcionalidad particular.
- Bitscope - osciloscopio para PC de origen australiano con esquemáticos del hardware publicados en la web.
- CRO - Cathode Ray Oscilloscope
- DFT - Discrete Fourier Transform
- DSO - Digital Storage Oscilloscope. También es el nombre del software para controlar el Bitscope.
- IC - Integrated Controller.
- DMA - Direct Memory Access. Sistema utilizado por dispositivos para acceder directamente a la memoria, sin pasar por los puertos de entrada/salida del procesador. Permite transferencias de alta velocidad.
- Endpoint - entidad lógica que usan los dispositivos para comunicarse por el protocolo USB
- Flash - tecnología utilizada por algunos osciloscopios digitales para digitalizar la señal.
- FPGA - Field-programmable gate array. Más información en http://en.wikipedia.org/wiki/FPGA
- HDL - Hardware Description Language
- PCB - Printer Circuit Board. (Circuito impreso)
- PGA - Programmable Gain Amplifier
- Pipe - En USB, es el canal de comunicación de conecta al host controlador con el endpoint.
- Pipeline - tecnología utilizada por algunos osciloscopios digitales para digitalizar la señal. Ver TecnologiasADC?
- SAR - Successive Aproximation Register. Una arquitectura muy común para de ADC de mediana a alta frecuencia.
- Schottky (diodo) - El diodo Schottky es un diodo con bajo voltaje de umbral y alta velocidad de conmutación.
- SMD - Surface Mount Devices. Ver SMT.
- SMT - Surface Mount Technology. La tecnología de ensamblar integrados "sin agujeros", es decir soldado directamente a la placa.
- TLC - Linea de convertidores Analógico-digitales de Texas Instruments.
- Toolkit gráfico - API utilzada para el control, manejo y creación de una aplicación gráfica.
- URSEC - Unidad Reguladora de Servicios de Comunicaciones - organismo encargado de la regulación de las telecomunicaciones en el Uruguay
Apéndice V. Lista de figuras
Este apéndice contiene una lista de todas las Figuras incluidas en la documentación.
- Fig 1.1 Diagrama de interconexión de componentes
- Fig 1.2 Página principal de TWiki (sitio web del proyecto)
- Fig 1.3 Diagrama de Gantt del proyecto
- Fig 2.1 Método de muestreo en tiempo real
- Fig 2.2 Método de muestreo aleatorio repetitivo
- Fig 2.3 Método de muestreo secuencial
- Fig 2.4 Espectro completo de una señal
- Fig 2.5 Efecto del aliasing
- Fig 2.6 Espectro de la señal filtrada
- Fig 2.7 La señal muestreada no es afectada
- Fig 2.8 Error de compensación
- Fig 2.9 Error de ganancia
- Fig 2.10 Error de apertura
- Fig 2.11 DNL Error
- Fig 2.12 INL Error
- Fig 2.13 Error de cuantificación
- Fig 2.14 Error absoluto
- Fig 3.1 Conector USB tipo A (izquierda) y tipo B (derecha)
- Fig 3.2 Conector USB Mini tipo A (izquierda) y tipo B (derecha)
- Fig 4.1 Placa de desarrollo ETRAX
- Fig 4.2 Diagrama de bloques
- Fig 4.3 PIC18F4550 - empaquetado DIP-40
- Fig 4.4 Características del PIC
- Fig 4.5 Pinout del PIC18F4550
- Fig 4.6 Diagrama del conversor SAR
- Fig 4.7 Diagrama del conversor Delta-Sigma
- Fig 4.8 ADC tipo Pipeline
- Fig 4.9 Semiflash ADC
- Fig 4.10 ADC tipo Flash
- Fig 4.11 Comparación ADC
- Fig 4.12 Resolución Vs. Velocidad de muestreo
- Fig 4.13 Celda SRAM
- Fig 4.14 Arreglo SRAM
- Fig 4.15 Celda DRAM
- Fig 4.16 Funcionamiento DRAM
- Fig 4.17 Arquitectura de la memoria Cypress CY7C-109B
- Fig 4.18 Estructura de un contador
- Fig 4.19 Buffer bidireccional
- Fig 4.20 Circuito de protección USB
- Fig 4.21 Etapa de entrada del osciloscopio
- Fig 4.22 Diagrama de tiempos de escritura a memoria a 40Mhz
- Fig 4.23 Comparador para el trigger por hardware
- Fig 4.24 Programador serie
- Fig 4.25 Create USB Interface
- Fig 4.26 In Circuit Debugger
- Fig 5.1 Captura de pantalla del MPLAB IDE
- Fig 5.2 Diagrama de funcionamiento del firmware (modos de captura)
- Fig. 5.3 Configuration bits del PIC 18F4550
- Fig 6.1 Interacción entre las clases del software
- Fig 8.1 Protoboard
- Fig 8.2 Circuito Impreso
- Fig 8.3 PCB
- Fig 8.4 Placa Universal en detalle
- Fig 8.5 Placa Universal
- Fig 8.6 Zócalo
- Fig 8.7 Zócalo ZIF
- Fig 8.8 Cable UTP Cat5e
- Fig 8.9 Cable Flat
- Fig 8.10 Placa de adquisición: conversores - memorias - entrada - compuertas
- Fig 8.11 Placa de control: pic - buffers - contadores - compuertas
- Fig 8.12 Placa completa del prototipo
- Fig 8.13 Carcaza del osciloscopio
- Fig 8.14 Conectores BNC del osciloscopio
- Fig 8.15 Pinout del conector RJ12 del ICD2
- Fig 8.16 abajo el oscilador, arriba la salida de la NOT (NAND)
- Fig 8.17 Bloque de entrada del oscilador
- Fig 9.1 Foto frontal del osciloscopio
- Fig 9.2 Panel frontal del osciloscopio
- Fig 9.3 Panel frontal del osciloscopio
- Fig. 9.4 Interfaz del software del osciloscopio
- Fig. 9.5 Captura (modo dual) de dos señales superpuestas
- Fig. 9.6 Captura (modo dual) de dos señales separadas
Apéndice VI. Lista de tablas
Este apéndice contiene una lista de todas las tablas incluidas en la documentación.
- Tabla 3.1 Revisiones del estándar USB
- Tabla 3.2 Velocidades de transferencias USB
- Tabla 3.3 Pines del bus USB
- Tabla 3.4 Clases de dispositivos USB
- Tabla 4.1 Comparación de tipos de muestreo
- Tabla 4.2 Comparación de tipos de memorias
- Tabla 4.3 Frecuencia máxima de componentes
- Tabla 4.4 Consumo de potencia de componentes activos
- Tabla 5.1 Modos de captura - frecuencias límite
- Tabla 5.2 Funciones de transferencia USB
- Tabla 5.3 Archivos del firmware
- Tabla 6.1 Herramientas de desarrollo del software
- Tabla 7.1 Códigos de respuesta
- Tabla 8.1 Pines del conector RJ12 del ICD2
- Tabla 8.1 Especificaciones finales del osciloscopio
- Tabla 9.4 Especificaciones del osciloscopio
- Tabla 9.1 Requisitos del sistema
- Tabla 9.2 Controles del panel frontal
- Tabla 9.3 Control del panel trasero
- Tabla 10.1 Estimación de unidades a vender el primer año
- Tabla 10.2 Costo de los componentes
- Tabla 10.3 Estudio del flujo de caja
- Tabla 10.4 Datos auxiliares al cálculo del flujo de caja
Apéndice VII. Licencias
Este apéndice contiene las versiones oficiales (en inglés) de las licencias bajo las cuales está liberado este proyecto.
GNU General Public License
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
GNU Free Documentation license
GNU Free Documentation License
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The "Document", below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as "you". You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject. (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification. Examples of
transparent image formats include PNG, XCF and JPG. Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".) To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled "History" in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the "History" section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements"
or to conflict in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications". You must delete all sections
Entitled "Endorsements".
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.