Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

84
Proyecto Final Osciloscopio de Almacenamiento Digital para PC Robert Pérez 7mo KA Año 2004 I.T.S Montevideo - Uruguay

description

Thesis about a digital storage oscilloscope.

Transcript of Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Page 1: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final

Osciloscopio de AlmacenamientoDigital para PC

Robert Pérez 7mo KA Año 2004

I.T.S Montevideo - Uruguay

Page 2: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 2I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Indice:

Introducción 3

Teoría:Diferencias entre DSO’s y Osciloscopios Análogos 4Teoría de Muestreo 5Frecuencias o señales Alias 8Que es un ADC ¿? 9Muestreo y retención 10Arquitectura de Conversores ADC: 11

Conversores Flash 11Conversores Half-Flash 12Conversores SAR 12Conversores Integradores 13Conversores Pipeline 14Conversores Delta-Sigma 15

“Oversampling” 17“Noise Shaping” 17

Cuadro de comparación de Arquitecturas 18Circuitos de trigger 19

DiseñoCaracterísticas y descripción del equipo: 20

Diagrama General 20Placa de captura 22Placa de control 27

Descripción del Software del Microcontrolador PICPlaca de entrada 43

Diagrama del gabinete 46Descripción del Software de la PC 47Filtrado digital 51Análisis de Costos 53Conclusión 55Apéndice A 57

Porqué en “C” ¿?Apéndice B

Listado del Software de la PC 58Apéndice C

Listado del software del PIC 77Referencias 84

Page 3: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 3I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Introducción:

El proyecto que planteo es un Osciloscopio de Almacenamiento Digital para PC.Consiste en un equipo capaz de tomar muestras de una señal analógica, guardarlasen un buffer interno y luego trasmitirlas a la PC para su posterior análisis.

Está compuesto por un hardware externo conectado a la PC mediante el puertoparalelo, que a través de un software (que también es parte del proyecto) me permiteconstruir la señal adquirida en la PC.

Actualmente el equipo es capaz de tomar 40MSPS (Millones de muestras porsegundo) con una resolución de 8 Bits. Lo que me permite teóricamente adquirirseñales menores a 20MHz.

Lo que me motivó a hacer este proyecto fue intentar traer una herramientaimprescindible hoy en día a mas técnicos e ingenieros de Uruguay, buscando formaspara reducir los costos pero a su vez implementar prestaciones que no se encuentranen los Osciloscopios analógicos. Al usar la PC para almacenar y reproducir lasseñales adquiridas, los costos se reducen dado que no hay que usar un TRC (ycircuitos asociados) y además me permite realizar varias funciones que solo seencuentran en los Osciloscopios digitales (filtrado digital, almacenamiento deseñales, etc.)

Vale aclarar que este proyecto no es un producto final terminado, sino que es elcomienzo de un estudio y posible desarrollo de estos equipos, aunque bastanteavanzado en algunas etapas hay otras a las que se le ha dedicado poco tiempodebido a la complejidad de todo el equipo en su conjunto (Hardware ySoftware)

El informe empieza primero con las diferencias y similitudes entre este tipo deequipo y las versiones analógicas, luego sigue una introducción a la adquisición deseñales para después empezar a explicar el funcionamiento del equipo.

Page 4: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 4I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Teoría:Diferencias entre DSO’s y Osciloscopios Análogos

Para ver las diferencias entre estos dos equipos debemos fijarnos en los diagramas enbloques que se muestran mas abajo.

Fig. 1 Diagrama simplificado de un Osciloscopio analógico.

En un Osciloscopio Analógico la señal entra a la etapa de amplificación / atenuación (segúnlo que corresponda hacerle a la señal, se selecciona desde los controles del Osciloscopio)donde es acondicionada para provocar la deflexión vertical del haz en el T.R.C (Tubo deRayos Catódicos) y además se usa para generar el trigger (disparo) sincronizando así elbarrido de las señales siguientes y dando la sensación de que la señal está inmóvil (si estaes periódica). La etapa de trigger alimenta la etapa de generación de barrido horizontal, quees un generador de señal en forma de rampa que varía su período según se ajuste el controlde base de tiempo del Osciloscopio. Veamos ahora el esquema de un DSO.

Fig. 2 Diagrama en bloques básico de un DSO.

A simple vista el diagrama en bloques del Osciloscopio Digital de Almacenamiento (DSO)tiene mas componentes que el analógico.

Podemos ver que difiere en varios aspectos:

Amplificador / AtenuadorVertical

Generación de Trigger Generación de BarridoHorizontal

T.R.C.

Amplificador / AtenuadorVertical

Generación de Trigger

T.R.C.

Sistema digital devisualización

ADC

Clock de captura

Microprocesador ocontrolador

Buffer paramuestras

Page 5: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 5I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

El corazón del sistema es el ADC (Conversor Analógico/Digital) que convierte la señalanalógica en un flujo de números que representan la señal analógica (si el ADC es de 8Bitslos números van del 0-255 y si es de 12Bits van del 0-4096), estos se almacenan en elbuffer (Memoria SRAM o FIFO) temporalmente para después mostrarlos en la pantalla.

El Microprocesador o Microcontrolador sincroniza el funcionamiento de las diferentesetapas. Primero habilita el ADC para que empiece a convertir (si es necesario espera unaseñal del circuito de trigger ) y almacena las muestras en la memoria. Luego detiene elADC y lee la memoria para enviar las muestras adquiridas a la etapa de visualización. ElClock de captura fija la frecuencia a la que se adquieren muestras, que se puede variar parano llenar la memoria con muestras redundantes (es innecesario capturar una señal de 100Hza 40MSPS, aunque si se desea es posible.)

La etapa de visualización digital consiste en un DAC (Conversor Digital / Analógico) queconvierte las muestras adquiridas en una señal analógica para alimentar el TRC o LCDsegún corresponda, además de generar las señales de barrido para el caso del TRC.

La complejidad que agrega este tipo de equipos se compensa con la posibilidad que ofrecende almacenar las señales adquiridas para su posterior análisis, o poder recorrer una señaladquirida de punta a punta (ampliarla o reducirla según se necesite), medir tiempos entreeventos por medio de cursores, etc.

Teoría de MuestreoSi tomamos muestras de una señal analógica podemos llegar a pensar que estamosperdiendo la información correspondiente a los puntos de la señal en los que no tomamosmuestras, esto no es así si tenemos en cuenta el Teorema de Muestreo que explicamos acontinuación.El teorema de muestreo dice:

“Una señal limitada en banda f(t) de valor real sin componentes espectrales porencima de una frecuencia de B Hertz, se determina en forma única por medio de susmuestras equidistantes en intervalos no mayores a 1/(2B) segundos. “

Este enunciado se puede demostrar por medio de la propiedad de modulación de laTransformada de Fourier. Tenemos una señal limitada en banda f(t) (o sea que no tienecomponentes de frecuencia por encima de B Hertz), a la que se le toman muestras aintervalos de tiempo regulares usando la función periódica pulso cuadrado donde cadapulso tiene una amplitud unitaria, tiene τ segundos de ancho y ocurre a intervalos de Tsegundos. Nombrando a la señal muestreada fs(t) y la función pulso cuadrado periódicop(t), podemos escribir:

Page 6: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 6I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Pero como p(t) es periódica, podemos representarla por su serie de Fourier

Donde ωc = 2π/T . Aplicando la Transformada de Fourier en ambos lados de la ecuacióntenemos

Si usamos la propiedad de traslación en frecuencia de la Transformada de Fourier, tenemos

Sacando el termino para n=0 fuera de la sumatoria, resulta

(con n ≠ 0)

De esta forma resulta evidente que la densidad espectral (Transformada de Fourier) de laseñal f(t)s es, salvo por la constante multiplicando, igual a la densidad espectral de la señalmuestreada f(t) dentro del ancho de banda original. Luego se repite a si misma en formaperiódica cada ωc radianes/seg, quedando cada repetición multiplicada (o modulada) porlos coeficientes de la serie de Fourier de la señal de muestreo. Notar también que ladensidad espectral de la señal original se puede recuperar usando un filtro pasa bajos a lafrecuencia ωc/2 (en la figura aparece como ωo/2).

Veámoslo representado en las figuras de abajo para entenderlo mejor.

f t( ) s f t( )∞−

n

Pn e j n⋅ ω c⋅ t⋅⋅∑=

Fourier f t( ) s( ) Fourier f t( )∞−

n

Pn e j n⋅ ω c⋅ t⋅⋅∑=

F ω( )s

∞−

n

Pn Fourier f t( ) e j n⋅ ω c⋅ t⋅⋅( )⋅∑=

F ω( )s

∞−

n

Pn F ω n ω c⋅−( )⋅∑=

F ω( )s P 0 F ω( )⋅

∞−

n

Pn F ω n ω c⋅−( )⋅∑=

+

f t( ) s f t( ) p t( )⋅

Page 7: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 7I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 3.En la figura 3.a vemos la señal f(t) limitada en banda, a la derecha tenemos su equivalenteen el dominio de la frecuencia, donde podemos ver que efectivamente no tienecomponentes por encima de |B| Hertz (o W radianes/seg).En la figura 3.c tenemos la señalde muestreo que tiene forma de tren de pulsos periódicos, separados T segundos, conamplitud unitaria y con una duración del pulso alto de τ segundos.

A la derecha tenemos la representación de la densidad espectral para esta función, tiene unaenvolvente de la forma (sen (x))/(x) con cada componente separada ωo rad/seg

En la figura 3.e, tenemos la función f(t)s que es el resultado de multiplicar las dos señalesanteriores en el dominio del tiempo, y a la derecha tenemos su representación en el dominiode la frecuencia, en ella podemos apreciar que aparecen varias copias del espectro de la

Page 8: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 8I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

señal original modulados por la envolvente de la densidad espectral de la señal de muestreoy desplazada hacia ambos lados a una frecuencia angular de ωc radianes/segTambién vemos que una copia del espectro se encuentra en ω = 0 que es el espectro de laseñal original que podemos recuperarlo con un filtro pasa bajos a la frecuencia de ωc/2.Esto es lo mismo que explicamos mas arriba con los resultados de las cuentas.

Veamos ahora que pasa si variamos la frecuencia de la señal de muestreo. Recordar queωc = 2π/T , por lo tanto T= 2π/ωc

Si T disminuye ωc aumenta y las copias del espectro de la señal original se separan cadavez mas lejos evitando así que se superpongan e interfieran unos con otros. Por otro lado siT aumenta ωc disminuye y las copias se juntan cada vez mas hasta que llegamos al puntocritico donde W=ωc/2 en este punto si seguimos disminuyendo la frecuencia de muestreo,los espectros vecinos se traslapan entre sí provocando distorsión. Teniendo en cuenta que2W=ωc=2π/T , y sabiendo que W=2πB tenemos que 2(2πB)= 2π/T o 2B=1/T entoncesB=Fs/2 siendo Fs=1/T y es la frecuencia de muestreo. Este es el punto en el que losespectros se traslapan entre si, pero nosotros queremos evitar eso, así que B<Fs/2 (estotambién se conoce como Frecuencia de Nyquist.) siendo B el ancho de banda en Hertz dela señal que queremos muestrear o la maxima componente de frecuencia de la señal aadquirir.

La pregunta que queda ahora es, que pasa si no hacemos esto ¿?, es decir, si muestreamospor debajo de esta frecuencia mínima, dijimos que aparece una distorsión, pero de queforma ¿?

Aparecen las señales o frecuencias alias.....

Frecuencias o señales alias:

Las frecuencias o señales Alias aparecen por no cumplir con el Teorema del Muestreo. Lascopias de los espectros de la señal original se traslapan entre si y aparecen señales confrecuencias que están relacionadas con la suma y diferencia de las componentes en de laseñal muestreada y la frecuencia de muestreo. Para asegurarnos de que complimos con elTeorema del Muestreo colocamos un filtro pasa bajos en la entrada del conversor ADC a lafrecuencia de FS/2 para evitar que toda componente mayor a esta frecuencia llegue alconversor. Prácticamente esto es imposible, por lo que se usan filtros de mas de un ordenpara obtener una respuesta lo más brusca posible, pero sin afectar demasiado la fase o ladistorsión de la señal de entrada. Teóricamente al cambiar la frecuencia de muestreodeberíamos también cambiar la frecuencia de corte de este filtro.Por razones que explicaremos cuando hablemos de la etapa de entrada del equipo este DSOno tiene un filtro pasa bajos a la entrada, lo que tiene el inconveniente de permitir el pasaje

Page 9: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 9I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

de frecuencias mayores a la de Nyquist, provocando así la generación de alias en lasseñales.

Que es un ADC ¿?:Las diferentes formas que tiene un ADC para convertir la señal analógica en digital varíande un integrado a otro. Esta depende de la arquitectura del conversor, algunos tienen comoventaja la velocidad de conversión, mientras que otros tienen la ventaja de una mayorresolución (nro de Bits).

Figura 4Describiremos brevemente un conversor genérico a modo de ejemplo y luego los másusados:Este tipo de conversor que vemos en la Figura 4 es un conversor simple e intuitivo (aunquees muy parecido a la arquitectura de ADC Integrador como veremos mas adelante) perosirve para explicar el funcionamiento básico de un conversor ADC. Consiste en unconversor DAC que es alimentado por un contador. Cuando damos la orden para empezarla conversión (ponemos el pin de Reset en “1”) el contador comienza a incrementarse enuno a la frecuencia fijada por el reloj de 1Mhz. Dado que el contador alimenta el conversorDAC, a la salida del mismo vemos una tensión analógica en forma de rampa (o escaleraascendente). Cuando esta tensión supera la señal de entrada el comparador deshabilita elClock por medio de la compuerta AND y el valor digital correspondiente a la señalanalógica se encuentra en el contador y sale al exterior por medio del Buffer 74245.

Este tipo de ADC si bien sirve para explicar el funcionamiento básico de un conversor noes tan eficiente como parece. Por ejemplo si la tensión analógica es muy alta, el DACdemoraría mas tiempo en llegar a una tensión comparable ya que empieza en 0 y se vaincrementando con el tiempo a medida que el contador se incrementa. A su vez el tiempo

Page 10: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 10I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

de conversión no es constante sino que depende de la tensión de entrada. Estas cosas sonlas que se tratan de corregir con otras arquitecturas como veremos a continuación, peroantes veremos otro componente de los conversores ADC que a veces se encuentra integradoen el mismo IC o fuera del mismo como otro circuito aparte, el circuito de Muestreo yRetención.

Figura 5

Normalmente es necesario tomar la tensión de entrada a la hora de convertirla y mantenerlahasta que se termine de convertir. Para esto se crearon los circuitos de muestreo/retención(Sample & Hold , o S&H). Como vemos en la imagen de arriba, un circuito de S&H secompone principalmente de un switch y un elemento almacenador como un capacitor. Loque hacemos es cargar el capacitor a la tensión instantánea de entrada y luego abrir elswitch. De esta forma el capacitor mantiene la tensión instantánea de la señal hasta que lohagamos de nuevo para la próxima muestra. Lo que hace este circuito es mantener latensión constante mientras estemos convirtiendo la muestra a digital, dado que si varía latensión el conversor puede determinar un valor erróneo para el equivalente analógico.

Page 11: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 11I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

En la figura también vemos que hay dos amplificadores operacionales, en realidad esto espara mostrar que estamos aislando la señal de entrada del elemento almacenador, y tambiénhacia la salida tenemos un operacional para proporcional una impedancia de carga alta, deesta forma el condensador demora mas en descargarse. Actualmente en circuitos integradosse usan MOSFETs como switches y se usa la capacidad que hay entre puerta y surtidor paraalmacenar el valor instantáneo durante un corto tiempo.

Arquitecturas de Conversores ADC:

Veamos ahora las distintas arquitecturas que hay disponibles de conversores ADC

Conversores FLASHLos conversores Flash usan una cadena de comparadores junto con divisores resistivos paraobtener el equivalente digital de la señal aplicada a la entrada. Las tensiones decomparación están 1LSB separadas entre sí, 1LSB es el valor de tensión correspondiente al

Figura 6

mínimo cambio en el valor digital, si tenemos 256 valores posibles (conversor de 8Bits)1LSB es Vref/256. De acuerdo al nivel de la tensión de entrada los comparadores generanun “1” o un “0” de acuerdo si es mayor o menor a su tensión de referencia. Luego la lógicacombinacional tiene que cambiar la codificación ya que tomando solamente la salida de loscomparadores obtenemos un “código de termómetro” que se debe convertir a binario o a loque sea necesario (se le dice código termómetro porque es parecido a como sube elmercurio en un termómetro con la temperatura.)

Page 12: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 12I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Tienen la desventaja de requerir 2n – 1 comparadores (serían 255 para un conversor de8Bits) junto con sus resistencias (2n) , lo que los hacen económicamente inviables pararesoluciones mayores a 8 o como máximo 10Bits.La ventaja es que son los más rápidos de todos ya que tienen el menor tiempo de retardo.

Conversores Half FlashEstos conversores usan también comparadores, pero la diferencia con los Flash es queconvierten en dos etapas. Primero obtienen la mitad superior de los Bits (los massignificativos), luego alimentan este valor a un DAC y por medio de un circuito restadorobtiene la diferencia con la señal a medir. Luego alimentan esta diferencia a un ADC paraobtener los Bits menos significativos (incluso es posible usar el mismo ADC que la vezanterior si usamos un circuito de S&H extra.) La ventaja de estos conversores es que solousan 2x(2n/2 –1) comparadores (o solo 2n/2 –1) si usan el mismo ADC para ambos casos, porlo tanto si usamos 8Bits, tenemos 15 comparadores en vez de 255.Se podrían considerar como un conversor Pipeline de dos etapas (ver mas adelante), aunquetambién se puede llegar a usar el mismo ADC Flash para convertir las dos veces,disminuyendo así la cantidad de comparadores en el chip. La desventaja que tienen es queen comparación con los FLASH son mas lentos ya que hay mas tiempos de propagaciónagregados por las dos etapas, el restador, etc.

Conversores SARLos conversores SAR (Succesive Aproximation Register o Registro de Aproximacionessucesivas), se llaman de esta forma porque contienen un registro de este tipo.Estos conversores usan un algoritmo de búsqueda binaria para converger en la señal de

Figura 7entrada. Básicamente usan una técnica que nosotros usamos normalmente aunque sindarnos cuenta. Por ej., cuando buscamos una pagina en un libro no empezamos a contardesde la primer pagina una por una hasta llegar a la pagina deseada. Si no que vamos hastala mitad del libro (mas o menos a la mitad), y si la pagina estaba antes volvemos un pocopara atrás o si estaba después vamos mas hacia delante, y así hasta encontrar la paginadeseada ,estos conversores hacen algo similar. Como vemos en la figura la señal de entradapasa por un circuito de retención y alimenta la entrada no inversora de un comparador.

Page 13: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 13I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

La lógica SAR, carga en el registro un valor digital correspondiente a Vref/2, o sea100....000 en binario. Con ese valor en la salida del DAC hay una tensión que es igual aVref/2, la salida del comparador indica cual tensión es mayor. Si la salida del DAC esmayor, en el registro se cambia ese 1 por un 0 y se sigue con el siguiente bit, y si la tensiónde entrada es la mayor se deja el primer uno y luego se pone el siguiente bit en 1 paraseguir con el proceso.Luego de N decisiones de este tipo tenemos el valor digital de la tensión de entrada en elregistro SAR de N Bits. Estos conversores tienen como tope unos pocos MSPS y conresoluciones no mayores a 14 o 16 Bits.La velocidad de estos conversores está limitada por el tiempo de establecimiento del DAC,el del comparador y los tiempos de propagación de la lógica empleada, aunque su ventajaes la baja disipación de potencia y su capacidad para ser integrado en poco espacio, lo quepermite integrarlo con otros componentes (Microcontroladores por ejemplo).

Figura 8En la Figura 8 vemos como un conversor ADC SAR de 4Bits va convirtiendo una muestraa digital, vemos como la salida del DAC se va aproximando (converge) a la señal analógicaa convertir a medida que transcurren los ciclos de reloj.

ADC Integradores:Estos conversores se basan en un integrador y un comparador analógico.Como vemos en la Figura 9 (abajo), integramos la tensión de entrada hasta que elcomparador detecte que la salida del integrador es mayor que la tensión de referencia.Medimos el tiempo que esto demora en suceder (quizás con un contador) y este valor esproporcional a la tensión de entrada (Tint ∝ Vin).Si bien es fácil de implementar, el inconveniente que tiene este sistema es que la precisióndel integrador depende de los componentes R y C. Si estos varían con la temperatura,frecuencia, tensión o cualquier otro parámetro (y seguramente lo harán) tendremos unaconversión que no es precisa. Para eliminar este problema se usan dos ciclos de integración(conversores de doble pendiente) como vemos en la Figura 10. Primero integramos contrauna tensión de referencia interna y luego de-integramos con la señal de entrada. De estaforma en los dos ciclos eliminamos los inconvenientes de los componentes, ya que

Page 14: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 14I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

cualquier error introducido por la precisión de los componentes se cancela en la etapa dede-integracion.En este caso el tiempo de de-integracion es proporcional a la tensión de entrada y tambiénal tiempo de integración, cancelándose así entonces la imprecisión de los componentes.

Figura 9 Figura 10

Conversores Pipeline (Tubería)Esta es la arquitectura mas nueva en cuanto a conversores ADC, implementan un tipo de

Figura 11tubería con lo que se consigue ir convirtiendo varias muestras a la misma vez (de manerasimilar a como los microprocesadores actuales ejecutan mas de una instrucción por ciclo dereloj). De esta manera la cantidad de Muestras/Seg aumenta considerablemente cuanto máslarga sea la tubería y mayor es la frecuencia de reloj.

La figura muestra un ADC de 12Bits formador por una tubería de 5 etapas, la ultima siendoun conversor tipo Flash de 4 Bits como los que describimos anteriormente.

Page 15: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 15I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Empezando desde la izquierda, la señal analógica es muestreada y retenida por el circuitode muestreo y retención (S&H), luego la primer etapa obtiene una aproximación de la señalde entrada por medio de un conversor Flash de 3 Bits, la salida de este conversor es llevadaa un DAC también de 3 Bits que convierte de nuevo ese valor a analógico y se resta de laseñal de entrada, obteniéndose así un residuo que es amplificado por 4 y luego pasa a lasiguiente etapa. Ese residuo amplificado por 4 se convierte de nuevo a digital con 3 Bits deresolución y sigue el mismo proceso que en la etapa anterior. Al final los últimos 4 Bits seobtienen del conversor ADC Flash de mas a la derecha.La ventaja que tiene esta arquitectura en tubería es que una vez que la 1er etapa aproxima laseñal con 3 Bits y pasa el resultado a la siguiente, puede empezar a convertir otra muestradebido al circuito de S&H que tiene incorporado cada bloque. De esta forma se alcanza unmayor flujo de muestras (“throughput”) en el conversor.

Figura 12

Como vemos en la Figura 12 estos conversores sufren de un fenómeno que se llamaLatencia (Latency), el cual hace que el tiempo que demora una muestra en atravesar toda latubería (o sea en convertirla a digital) sea de N x Tclk, donde N es el numero de etapas dela tubería y Tclk es el periodo del reloj del conversor.Así que idealmente si tenemos una muestra, en realidad esta corresponde a un tiempoN x Tclk antes del actual, o sea no es tiempo real, aunque esto se compensa con la ventajade la tubería de procesar varias muestras a la vez (N muestras a la vez ).

Delta Sigma ADCs.Este tipo de conversores también es muy popular, usa componentes analógicos simplesaunque luego usa filtros digitales y diezmadores digitales que son relativamentecomplicados. Viendo la Figura 13, la parte analógica consiste en un punto de suma (unrestador analógico), un integrador, un ADC de 1 Bit (comparador) y cerrando el lazo derealimentación negativa un DAC de 1 Bit.

Page 16: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 16I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 13La teoría de funcionamiento es relativamente simple.Supongamos que la señal de entrada es constante, a la salida del integrador tendríamos unarampa (ascendente si la entrada es positiva o descendente si es negativa), la rampa se aplicaal ADC de 1 bit (que simplemente es un comparador analógico), este decide si la señal seencuentra por encima o debajo de 0 Volts y genera un “1” o un “0” de acuerdo a esto.Este flujo de unos y ceros se aplica al DAC de 1 Bit transforma un 1 en +Vref y un 0 en–Vref, por lo tanto debido al lazo de realimentación negativa, cuando el circuito seestabiliza tenemos que en el punto de suma (B), el valor medio de la salida del DAC esigual al valor medio de la señal de entrada, y su representación digital se obtiene del flujode bits que alimenta el DAC.Este flujo antes de sacarlo hacia el exterior se pasa por un filtro pasa bajos digital queelimina toda componente de frecuencia por encima de la banda que nos interesa.

Hay una técnica muy popular que se llama sobre-muestreo (Oversampling) que consiste enmuestrear por encima de la frecuencia de Nyquist (normalmente 64 o más veces) parareducir el ruido de cuantificación (ruido producido por el error entre el valor digital y elanalógico). Veamos las figuras de abajo...

Veremos también un circuito que se llama diezmador que realiza un downsampling, lo quehace es dejar pasar una muestra de cada K muestras.

Page 17: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 17I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 14

Lo que muestran estas figuras es como logramos reducir el ruido usando distintas técnicas.

En la parte superior izquierda tenemos un conversor ADC que no es Delta-Sigma, que correa una frecuencia de muestreo fs , y vemos que el ruido de cuantificación (que para unaseñal senoidal vale q/sqrt(12), siendo q el intervalo de cuantificación (LSB)) es continuohasta fs/2 (justamente la banda que nos interesa).

Abajo vemos que pasa si usamos la técnica de Oversampling con el mismo ADC, es decirmuestreamos a K.fs , siendo K un nro. entero, luego pasamos las muestras por un filtrodigital pasa bajos y luego por un diezmador entre K. A la salida del diezmador tenemos lasmuestras de la señal como si hubiésemos realizado un muestreo a fs Muestras/Seg. A laderecha de esta figura vemos como quedaría repartido el ruido de cuantificación en eldominio de la frecuencia. Tenemos que el ruido de cuantificación se esparció desde 0 aK.fs/2, pero como nos interesa la banda desde 0 a fs/2 usamos un filtro pasa bajos paraeliminar todo por encima a fs/2, eliminando así también gran parte del ruido (que enrealidad quedó reducido en un factor de K). Cuanto más aumenta la frecuencia de muestreo,mas se reduce el ruido y aumenta el ENOB (Effective Number Of Bits) que depende de larelación señal ruido que se obtenga en el conversor, al disminuir el ruido, aumenta la SNRy aumenta el ENOB.

En la ultima parte de la figura anterior, tenemos un ADC tipo Delta-Sigma conOversampling, filtro digital y diezmador. El conversor Delta-Sigma proporciona unacaracterística que se conoce como “Noise Shaping” (modelado de ruido, o darle forma al

Page 18: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 18I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

ruido) , ya que debido a su respuesta en frecuencia (principalmente al integrador), el ruidoqueda en su mayor parte acumulado cerca de K.fs/2, reduciendo aun mas el ruido luego deaplicar el filtro pasa bajos entre 0 y fs/2.

Cuadro de comparación entre arquitecturas.

Como siempre la arquitectura más conveniente depende de la aplicación. Si se requiere unconversor rápido, no va a ser de bajo costo. Veamos un par de gráficas que nos muestra larelación entre costos, complejidad, resolución y velocidad.

Figura 15Tenemos 3 gráficas que muestran las características de cada arquitectura para que podamoscompararlas. En la de arriba a la izquierda vemos la gráfica de resolución/tiempo deconversión, en este caso vemos que si deseamos mantener la velocidad a medida queaumentamos la resolución lo mejor es un conversor Flash, luego le siguen los SAR y deTubería, Sigma-Delta y por ultimo los integradores que aumentan en forma casiexponencial el tiempo de conversión para una cantidad dada de Bits de resolución.

Arriba a la derecha vemos la gráfica de resolución/igualdad de componentes (o calibradode componentes). En esta característica se destacan los conversores integradores, ya que nolos afecta la diferencia entre componentes si son de doble pendiente. Las demásarquitecturas dependen de que sus componentes sean iguales (comparadores, divisoresresistivos, etc.)

Al final tenemos la gráfica de resolución/tamaño del IC (o complejidad en cuanto acantidad de componentes). Acá los que requieren mas espacio en el IC a medida queaumentamos la resolución son sin duda los conversores Flash, dado que se duplica la

Page 19: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 19I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

cantidad de comparadores (y componentes asociados) cada vez que agregamos un bit deresolución (por lo tanto son también los mas caros). Luego tenemos los SAR, Delta-Sigma,ADCs de Tubería y los que requieren menos espacio en el IC para una resolución dada sonlos Integradores.

Como siempre, no hay una arquitectura que lo tenga todo (buena resolución, velocidad yque sea de bajo precio), siempre tenemos que buscar lo que mas se ajusta a nuestrasnecesidades. Por ejemplo para un voltímetro digital que tenemos que tomar 100muestras/seg nos alcanza con un ADC integrador. Para Audio se usan mucho losDelta-Sigma porque se obtienen resoluciones bastante buenas y bajo ruido debido al“Noise-Shaping”. Para equipos de adquisición de datos (DSO’s, imagen, etc.) se usanADCs Pipeline o ADCs Flash ya que normalmente se requieren altas velocidades deconversión.

Circuitos de Trigger:

Para que necesitamos un circuito de trigger ¿?Necesitamos un circuito de trigger para disparar la adquisición de muestras en un momentodeterminado. Esto es debido a que si queremos adquirir en forma continua una señalperiódica tenemos que encontrar un punto de referencia a partir del cual capturarla.Veamos un ejemplo:

Figura 16En esta figura tenemos una señal senoidal que es la entrada y un nivel de trigger que son3.0V. Lo que hacemos es determinar cuando la señal de entrada sobrepasa el nivel detrigger y generar un pulso para empezar a convertir la señal (esto lo hacemos con uncomparador). Luego para el próximo ciclo hacemos lo mismo y así indefinidamente. Deesta forma logramos que en la pantalla del Osciloscopio veamos la señal inmóvil si esta esperiódica. Lo anterior corresponde a un trigger de nivel, o sea disparamos la adquisición dela señal cuando sobrepasa un nivel de tensión fijado por un potenciometro o por ejemplopor un DAC controlado por PC y por un Microcontrolador.

Page 20: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 20I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Otra forma de trigger que tenemos es un trigger que cuenta la cantidad de pulsos y deacuerdo a esto dispara la conversión de la señal. Por ejemplo en la figura de arribaqueremos disparar la conversión luego del 3er pulso del comparador. De esta formaveríamos 3 ciclos de la señal senoidal.

Todas las variaciones anteriores pueden darse de la forma de flanco ascendente odescendente, lo que tenemos que hacer es usar un detector de flancos (construido con uncircuito RC formando un filtro pasa altos) e invertir los pulsos que salen del comparador.

Diseño:Características y descripción del equipo propuesto:

Frecuencia maxima de muestreo 40MSPS (Millones de muestras por segundo)

Ancho de Banda Analógico Teóricamente 475Mhz, sin medir prácticamente

Impedancia de entradaX1 10KX10 110K

Rango de entrada:X1 +/- 512mVX10 +/- 5.12V

Cantidad de canales 1

Potencia de consumo 500mA*9V = 4.5W nominales.

Peso 420 gr.

Dimensiones 160mm X 105mm X 80mm

Page 21: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 21I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Diagrama General:

Figura 17El equipo está separado en 3 PCBs para simplificar su modificación en caso de sernecesario, la placa de captura, la placa de control y la placa de entradaCada etapa cumple una función especifica, veamos una descripción básica.

La señal llega hasta la etapa de entrada, pasando por el atenuador y el separador AC/DCque es controlado por un par de llaves en la Placa de Entrada. Luego esta señal se dirigehacia el ADC que según la orden del Microcontrolador comienza a convertir a digital laseñal en su entrada. Las muestras que salen del ADC con una frecuencia de FSmuestras/seg se almacenan en la memoria SRAM en la posición que señala el contador de16Bits.Luego cuando la PC lo solicite, el Microcontrolador activa el Buffer de 3 estados para quepasen las muestras almacenadas en la memoria hacia el puerto paralelo de la PC, donde elsoftware las lee y luego las grafica en el monitor.

Vamos ahora a una explicación mas exhaustiva de cada etapa.

AtenuadorAC/DC

ADC 40MSPS8Bits

Controles

Contador16Bits

Buffer LPT de la PCPlaca de Captura

Placa de Entrada

SRAM32Kbytes @ 25nS

LógicaCombinacional

Microcontrolador

Osc 40MHz

Osc 20MHz

Placa de Control

Page 22: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 22I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Placa de captura:Es la que contiene el conversor ADC, la memoria, los contadores y el Buffer de 3 estadospara la transmisión por medio del puerto paralelo.El esquemático completo se encuentra al final del informe, explicaremos el funcionamientode este circuito:

El ADC:En el esquemático de la placa de captura vemos los componentes mas importantes delequipo (salvo el Microcontrolador). En ella se encuentra el ADC (U1 en el esquemático),que es un circuito integrado de la empresa Analog Devices denominado AD9283. Es capazde tomar hasta 100MSPS de 8Bits máximo por lo tanto para nuestra aplicación a 40MSPSsirve perfectamente. Este conversor es de Arquitectura en Tubería (ya explicamos este tipode arquitectura), tiene entradas analógicas diferenciales, una entrada de reloj para fijar elreloj de captura, una señal de habilitación que cuando está deshabilitada pone al conversoren un modo de bajo consumo (aprox 4.2mW), tensión de referencia incluida (aunque sepuede usar una externa si se desea), y tensiones de alimentación analógica y digital porseparado por si se quiere reducir el ruido en la fuente de alimentación para las etapasanalógicas. Otra de las ventajas de este integrado es que contiene un circuito de muestreo yretención integrado, evitando así componentes extras para formar esta etapa.Por otro lado el encapsulado del mismo es SSOP de 20 patillas, teniendo una separaciónentre patillas de 0.65mm lo que complica su soldadura sin los equipos adecuados (quelamentablemente no disponía)Este integrado funciona con una fuente de alimentación de 3.4V nominales, por lo tanto nopude usar la misma alimentación que para los demás ICs, pero le armé una fuente con esatensión para alimentarlo con un regulador usado de una placa ya que no disponíaactualmente de otro y este funciono a la perfección. Primero intenté usar un LM371 paragenerar los 3.4V pero dado que es una tensión tan baja no funcionaba correctamente, poreso lo tuve que sustituir.El uso del ICs es relativamente simple, hay que aplicar la señal analógica a convertir en lasentradas analógicas en forma diferencial (o en forma Single Ended si se desea conectando/AIN a masa), asegurarse de que la señal de POWERDOWN esté en “0” lógico (es activaa nivel bajo) y aplicar la señal de reloj a la patilla ENCODE. La señal de reloj es una ondacuadrada, preferiblemente con 50% de ciclo de trabajo, a la frecuencia que se deseaconvertir la señal analógica (p.ej, 50MHz si se desea convertir a 50MSPS). Como el ICtiene 4 ciclos de latencia, la primer muestra va a aparecer 5 ciclos de reloj mas tarde desdeque empezamos a convertir, aunque en el software ignoramos las primeras 10 muestrasporque normalmente son erróneas. La latencia de la que hablamos se debe principalmente ala arquitectura del conversor y depende de cuantas etapas halla en la tubería. (ver laexplicación de la arquitectura en las paginas anteriores.)Hay que tener en cuenta de que al conversor no se le deben aplicar mas de 1,024 Vpp entrelas entradas diferenciales analógicas (por mas de que el IC tiene diodos de protección querecortan las señales por debajo de GND o por encima de VDD)Hay que tener especial cuidado ya que en la Placa de entrada no se tuvo en cuenta el diseñode limitadores o algún circuito de protección. A su vez las señales de POWERDOWN yENCODE antes de llegar al conversor se pasan por un divisor resisitivo (formado por dos

Page 23: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 23I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

resistencias de 4.7K y 10K respectivamente que atenúan X0.68) para adaptar los 5V delMicrocontrolador PIC al conversor que corre a 3.4V.En cada placa se proveen capacitores de 47nF cerca de cada IC para disminuir el ruido quegenerar las transiciones de 1 a 0 o viceversa de los circuitos digitales.Además en esta placa se provee un condensador de 220uF para filtrar la línea de 5V y luegouno de 47uF para la de 3.4V

Memoria:Las muestras que salen del conversor AD, se dirigen hacia la memoria de 32Kbytes dealmacenamiento y hacia el buffer de 3 estados, que en el momento de almacenamiento estábloqueando la salida de datos hacia la PC.Esta memoria es de la empresa Alliance Semiconductor , tiene como ya dije 32Kbytes decapacidad organizados en una matriz de 256 columnas por 128 filas, y tiene como interfacecon el mundo exterior un bus de direcciones de 15 Bits, un bus de datos bi-direccional y 3señales de control, nWE (habilitación de escritura), nOE (habilitación de lectura) y nCE(habilitación del chip, para poner mas de uno en cascada.)Lo que más se precisaba en la memoria, es que fuese de un rápido tiempo de acceso ya quea 40MSPS tenemos solo un ciclo de reloj para almacenar la muestra que se adquirió, o seasolo tenemos 25nS. Esta memoria tiene un tiempo medio de acceso de 15nS.El uso de esta memoria lo dividimos en dos etapas, escritura y lectura.

Escritura:Para almacenar las muestras en esta memoria lo que hacemos es colocar el valor de 8 Bitsen el bus de datos, la posición de memoria en la que deseamos que la muestra quede

Figura 18almacenada en el bus de direcciones, poner a “0” la señal de nWE, a “1” la señal de nOE, ya “0” la de nCE (ver nota). Luego subimos la señal de nWE a “1”, y la muestra se almacenaen la posición que especificamos en el bus de direcciones.

En la hoja de datos de la memoria se especifican los tiempos necesarios para almacenar.Con el oscilador tuve problemas con esta parte y con los niveles TTL de la compuerta queusé, mas adelante lo explico en mas detalle.

Page 24: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 24I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Lectura:Para leer una muestra el procedimiento es similar. Poner la dirección que deseo leer en elbus de direcciones, poner en “1” la señal nWE, en “0” la señal nOE, y en “0” la señal nCE.Cuando subo la señal nOE a “1”, el valor almacenado se transporta al bus de datos, desdedonde puedo leerlo para enviarlo a la PC.

Figura 19Nota: normalmente la línea nCE estaría siempre a cero si usamos una sola memoria, peroen el 1er diseño pensé en usar dos memorias de 32K ya que como está hecho el impresopodría ir una soldada encima de la otra y doblar la capacidad de almacenamiento. En eldiseño final no lo hice, pero la línea nCE quedó cableada al bit 15 de los contadores comovemos en el esquemático

Cuando el valor de la muestra aparece en el bus de direcciones lo que hago es habilitar elbuffer de 3 estados para que deje pasar la información hacia la PC (esto lo hago poniendoen “0” la señal n2PC en el buffer 78LS245), de esta forma lo puedo leer desde el puertoparalelo de la PC, ya que la salida del buffer de 3 estados está conectado al bus de datos delpuerto paralelo (pin 2 al pin 9).

Contadores:Son dos contadores de 8 Bits cada uno de la empresa Philips denominados 74F269, y están conectados en cascada, o sea que cuando unos se desborde (pase de 1111.1111 a0000.0000), incremente en 1 el 2do contador (viéndose efectivamente como un contador de16Bits). Estos contadores los uso para direccionar la memoria desde la posición 0 a la32768. La salida de los contadores está conectada al bus de direcciones de la memoria y elultimo bit (el bit 15) está conectado a la señal nCE de la memoria.También tengo conectada la señal nCE de la memoria al pin RA4 del PIC, lo que me ayudaa poner a cero los contadores (para mas detalle ver la rutina del PIC ResetCnt() )La especificación que tenía para estos contadores era que fueran capaces de operarperfectamente a 40Mhz, si nos fijamos en la hoja de datos del componente vemos queoperan normalmente hasta los 115Mhz typ, así que están bastante sobrados.Para incrementar los contadores usamos una señal de reloj que tiene que estar biensincronizada con la señal de reloj para adquirir las muestras y leer la memoria (ver la placa

Page 25: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 25I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

de control), esta señal está conectada al pin etiquetado cnt_clk del contador (veresquemático Placa de Captura)

Buffer 3 Estados.Este componente aísla el bus de datos del puerto paralelo de la PC. Solo cuandohabilitamos la línea nOE (Output Enable) del buffer, tenemos conexión entre los dos buses.En el IC, la línea de dirección (DIR) está conectada a un “1” lógico, lo que determina que ladirección es desde el bus de datos de la memoria al bus de datos del puerto paralelo (en elIC desde el “Bus A” al “Bus B”).Este componente no tiene requisito de frecuencia de operación, ya que opera a frecuenciasbajas debido a que el puerto paralelo no soporta grandes tasas de transferencias de datos(con el Pic corriendo a 20MHz solo llegué a unos 200Kbytes/seg)

En la figura de abajo mostramos el impreso de esta placa (también se encuentra en formatoPDF junto con las hojas de datos si se desea ver en mejor calidad). En la parte inferiorderecha mostramos las modificaciones que se le tuvieron que hacer luego de encontrarfallas en el impreso (por ejemplo en la fuente del ADC y en la línea de nCE de la memoria)

Page 26: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 26I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Veamos el PCB de esta placa junto con las modificaciones que surgieron después.

Figura 20

Page 27: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 27I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Placa de controlLa placa de control como lo dice su nombre es la encargada de generar todas las señalespara sincronizar el funcionamiento del equipo. Lo que hace es generar las señales de nWE,nOE para la memoria, incrementar los contadores, iniciar o detener el ADC según estemosescribiendo o leyendo la memoria, y enviar las muestras a la PC por medio del Buffer74LS245, etc.

El esquemático se encuentra al final del informe junto con los demás, en el vemos unMicrocontrolador PIC16F819, un arreglo de compuertas y el oscilador de 40MHz junto conel XTAL para el oscilador del PIC.Los mas interesante aquí es el arreglo de compuertas (La lógica combinacional que figuraen el diagrama en bloques) para generar las señales control. Estas toman el Clock quegenera el Osc. de 40 MHZ o el que genera el PIC (2.5MHZ) mas algunas señales de controlque genera el PIC (nOE_WE y hsclk_en) que son para lectura o escritura de la memoria.

Para explicar esta etapa debemos ver también el software que tiene cargado elMicrocontrolador. El listado completo se encuentra al final del informe, pero aquí veremoslas rutinas por separado según sea necesario.

El software del PIC está escrito en el lenguaje C en vez de lo mas común que es elensamblador. Lo atractivo de este lenguaje es que es mas simple de entender que elensamblador, es mas fácil de escribir o implementar una idea que en ensamblador. Parasaber un poco mas de porqué usé este lenguaje en vez a lo mas común que es ensamblador,ver el Apéndice A, así ahora nos centramos en el Software.

El programa comienza en la función main() , esta función primero llama a otras funcionespara inicializar el Microcontrolador y luego entra en un loop infinito (una secuencia que serepite continuamente) que consiste en almacenar muestras en la RAM y luego transmitirlasa la PC.

Expliquemos en que consiste esta función.

void main(){

declaraciones..

instrucciones..instrucciones..

// esto es un comentario

/* esto es otro comentario */}

Aquí arriba vemos como se ve un programa simple, la palabra clave void quiere decir algoasí como “vacío“, y significa que la función main no retorna ningún valor a la función quela llama (en nuestro caso main nunca retorna)

Page 28: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 28I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Las declaraciones e instrucciones dentro de la función están encerradas entre corchetes, lasdeclaraciones son las variables que vamos a usar en las instrucciones y las instruccionesoperan en estas variables o en los registros del procesador.

Veamos como luce la función main de nuestro programa.

void main(){

unsigned char cnt,cnt2;

aquí estamos declarando dos variables sin signo de 1 byte de ancho, cnt y cnt2. O sea enestas variables podemos almacenar un valor de 8 bits.

Inicializar(); // Setear los registros TRIS y deshabilitarinterrupciones.

Esta función lo que hace es setear cuales pines en el PIC vamos a usar para entrada y cualespara salida, deshabilita las interrupciones porque no las usamos, deshabilita el ADC internoporque no lo usamos y setea los valores iniciales de los registros que vamos a usar, masadelante veremos el cuerpo de esta función en detalle.

Luego viene el loop infinito que captura las muestras y después las envía, en el lenguaje Chay varias formas de construir un loop infinito, yo usé la instrucción while, que ejecuta loque está dentro de los corchetes mientras la condición sea verdadera (en este caso es 1 quequiere decir TRUE), si la condición en algún momento se hiciera 0, saldríamos del looppero como está puesto un 1 fijo lo que está dentro de los corchetes se ejecuta continuamenteuna y otra vez

while(condición){

instrucciones....}

el loop de nuestro software luce así

while(1){

loop:if(start_conv == 0)

goto loop;

loop2:if(start_conv == 1)

goto loop2;

loop3:if(start_conv == 0)

goto loop3;

powerdown = 0; // Habilitar el ADC

Page 29: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 29I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Lo que hacemos aquí es fijarnos si la variable start_conv (que está definida como un pin enalgún puerto del PIC que está conectado al LPT de la PC) está en 1 o 0.Lo que hago es esperar una secuencia por parte de la PC para saber que me está pidiendoque comience a capturar y almacenar muestras.El if(condición) lo que hace es ejecutar la instrucción que está abajo si la condición esverdadera (en este caso si el BIT start_conv es igual a 0), que en este caso es saltar haciaatrás (a la etiqueta loop:) para volver a ejecutar de nuevo la misma instrucción ify seguir indefinidamente hasta que start_conv se haga igual a 1. Lo mismo pasa con lasinstrucciones siguientes (3 bloques parecidos) que lo que hacen es definir la secuencia quedebe seguir la PC, primero un 1, luego un 0 y finalmente otro 1. Luego de terminada estasecuencia la instrucción powerdown = 0; pone a cero el pin del PIC asignado a estavariable que en definitiva habilita al ADC para que comience a adquirir muestras.

if(nInit == 1)Adquirir40MSPS();

elseAdquirir2_5MSPS();

powerdown = 1;

// Mandar el ADC al modo de bajo consumo, tambien pone sus salidas en Hi-Z

Luego siguen las siguientes instrucciones, el comando if(nInit == 1) determina si la PCpuso esta señal del LPT a uno o cero y adquiere muestras a 40MSPS o 2.5MSPS según suvalor (si es 1, usa 40MSPS y si es 0, usa 2.5MSPS)Las funciones Adquirir40MSPS(); y Adquirir2_5MSPS(); las veremos mas adelante enmas detalle.La instrucción else, lo que hace es ejecutar la instrucción que está abajo si la condición delif es falsa, en nuestro caso llama a la función para adquirir a 2.5MSPS.

Al final de todo deshabitamos el ADC (ponemos powerdown = 1) para que las salidas sepongan en alta impedancia y no dañarlas por sobrecarga con la salidas de la memoria (sinoquedaría el ADC como salida y la memoria como salida conectadas en paralelo, si un pindel ADC tiene un 0 y el otro pin en paralelo de la memoria tiene un 1 se produce unasobrecarga de corriente que puede dañar el transistor driver del pin de salida.)

La hoja de datos del ADC recomienda que cuando deshabitamos el ADC, mandemos unosciclos de reloj en la línea de ENCODE para asegurarnos de que valla al estado de reposo,yo en mi caso mando 20 ciclos (la hoja de datos recomienda por lo menos 15). Antesponemos la señal read_clk en 1 así en la entrada de la compuerta OR que maneja la señal deENCODE no queda siempre en 1 (notar que la señal read_clk pasa por una NAND antesque invierte la señal), ver el esquemático para mas detalles.

Luego hacemos un loop 40 veces que hace alternar entre 1 y 0 la línea de ENCODE (enrealidad son 20 ciclos completos)

Page 30: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 30I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

// mandar unos ciclos de ls_encode antes de seguir para asegurar el powerdown.

read_clk = 1;cnt = 40;while(cnt != 0){

ls_encode = !ls_encode;cnt--;

}ls_encode = 0;read_clk = 0;

En esta parte del programa usamos la variable que habíamos definido al principio, cnt, enla que primero almacenamos el nro. 40 y luego vamos decrementando de uno en uno (conla instrucción cnt-- que sería igual a cnt = cnt – 1; aunque es mas corta), la instrucciónls_enconde = !ls_encode quiere decir que la variable ls_encode (el ls es por low speed,simplemente para recordar que es la señal generada por el PIC), la invertimos con eloperador “!” “NOT” y luego la asignamos a si misma, básicamente la estamos invirtiendo.

Lo que logramos es invertir la señal 40 veces, que en síntesis genera una onda cuadrada de20 ciclos completos en la línea de ls_encode que está conectada a la compuerta OR y luegoal ADC por medio de la línea ENCODE.

Luego de esto volvemos a dejar las señales que usamos en cero, es decir, ls_encode yread_clk ambas igual a cero.

n2PC = 0; // pasa todo a la PC.EnviarMuestras();n2PC = 1; // no sale nada hacia la PC, estoy almacenando...

}

return;}

Lo que hacemos después es poner la señal n2PC (la n quiere decir que es activa a nivelbajo, el 2 es por “to PC” y el PC es hacia el puerto LPT de la PC, es una nomenclatura“normal” en programación, o por lo menos para mí ☺), esta señal si nos fijamos en elesquemático vemos que está conectada al buffer 74LS245 que deja o no pasar los bits quevienen de la memoria hacia el LPT de la PC (si está en cero pasa, si está en uno no.)Así que dejamos que pasen las muestras hacia la PC, y llamamos a la función que seencarga de enviar las muestras por el LPT con el protocolo EPP y luego volvemos a hacerque el buffer de 3 estados bloquee todo hacia la PC.

La llave que cierra luego de esa instrucción está cerrando el bloque del loop infinito, asíque después de aquí se vuelve a repetir esta función.

La palabra clave return quiere decir que llegamos al final de la función main() por lo tantodel programa, pero como no salimos nunca del loop infinito esto no pasa.La ultima llave cierra el bloque de la función main().

Page 31: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 31I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Expliquemos ahora las funciones auxiliares que llamamos desde la función main().

La primera que venia era Inicializar();

void Inicializar(){

/*Setear los Puertos, timers, interrupciones, etc.....

*/

ADCON1 = 0x06; /* PORTA es todo digital I/O, con otros valorespodemos definir algunas entradas analogicas parausar el ADC interno

*/

TRISA = 0b1111.0010;TRISB = 0b1000.1100;

powerdown = 1; /* El ADC arranca deshabilitado (output en HI-Z). */ls_encode = 0; /* Reloj del ADC arranca en 0. */n2PC = 1; /* No se transmite nada a la PC */read_clk = 0;GIE = 0; /* deshabilitar interrupciones */hsclk_en = 0; /* todavía nada de clocks...*/

}

La primera instrucción que vemos asigna el valor 6 al registro del PIC ADCON1 que si nosfijamos en la hoja de datos del mismo quiere decir que usamos el puerto A comoentrada/salida digital, otros valores nos permiten usar algunos bits para el conversor ADCintegrado en el mismo controlador, cosa que actualmente no queremos.

Luego seteamos los registros TRIS A y B del controlador, los valores están en binario (elnibble alto primero y luego del punto el nibble bajo) los bits que están en 1 son entradas ylos que están en 0 son salidas. Estos valores están de acuerdo a las definiciones que están alprincipio del programa y de acuerdo al esquemático, que define que señales estánconectadas a que pines del PIC. Los pines de cada puerto están representados como bit0 =RA0 o RB0 (depende del registro TRIS, TRISA o TRISB), el bit1 es RA1 o RB1 y asísucesivamente.

Mas abajo ponemos en el estado inicial las señales de control, los comentarios explicanpara que sirve cada instrucción.

La función que sigue es Adquirir40MSPS(); que es la encargada de tomar las muestras yguardarlas en la memoria en la localidad que corresponda.Mostremos el cuerpo de la función:

void Adquirir40MSPS(){

ResetCnt();nOE_WE = 1; // escribir...hsclk_en = 1; // comienza el oscilador de 40MHZ

Page 32: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 32I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Lo que hacemos antes que nada es resetear los contadores para empezar desde la posición 0(mas adelante veremos esta función). Luego decimos que vamos a escribir en la memoria,poniendo la línea de nOE_WE en “1”, de esta forma el hardware se encarga de poner lalínea de nWE = 0 y la de nOE = 1, y cuando aplicamos el Clock, la única línea que cambiaes la de nWE. Después habilitamos el Clock de alta velocidad, poniendo la línea hsclk_en(HighSpeed Clock Enable) en “1”, de esta forma

/*while(tc2cnt == 0)

;*/

#asmloop:

BTFSS PORTA,4 ; tc2cntGOTO loop

#endasm

hsclk_en = 0; // sin reloj de 40}

Luego, lo que está entre /* y */ es un comentario, en realidad es lo que el código de abajohace. El problema aquí era que el compilador me generaba instrucciones adicionales enensamblador, que no eran necesarias (esto pasa porque me generaba dos instrucciones parael switcheo de banco, que no se precisaban porque siempre estoy en el mismo banco dememoria, pero como el compilador es una versión gratuita no incluye todas lasoptimizaciones posibles, entonces tuve que recurrir a generar yo mismo las instrucciones enensamblador, ver el Apéndice A para mayor explicación). Volviendo al código, lo quehacemos aquí es esperar a que tc2cnt se ponga en 1, eso es lo que hacen las instruccionesen ensamblador:

#asmloop:

BTFSS PORTA,4 ; tc2cntGOTO loop

#endasm

Las etiquetas #asm y #endasm indican al compilador que lo que está dentro de ellas no escódigo en “C”, sino que nosotros decidimos incluir directamente el código en ensambladory que nos hacemos responsables de que es correcto. Este código lo que hace es probar el Bit4 de Puerto A (tc2cnt), si es 1 salta sobre la instrucción GOTO y continuamos con lasiguiente instrucción, si era 0 quiere decir que todavía no llenamos la memoria y tenemosque seguir así que se ejecuta el GOTO loop, y volvemos a probar el Bit 4 del PORTA con lainstrucción BTFSS (Bit Test File Skip if Set)

Cuando el tc2cnt se pone en “1” es porque llenamos la memoria y tenemos que detener elADC, que es lo que hacemos mas abajo poniendo la línea hsclk_en en “0” y ahí es donderetornamos a la función desde donde está fue llamada.

Page 33: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 33I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Ahora seguimos con la función Adquirir2_5MSPS(), que hace lo mismo que la anterior, loúnico que captura a 2.5MSPS.

void Adquirir2_5MSPS(){

unsigned char cnt,cnt2;

ResetCnt();nOE_WE = 1; // write...hsclk_en = 0; // sin reloj de 40

Comenzamos definiendo dos variables sin signo de 1 byte cada una, cnt y cnt2. Nos van aservir como contadores para el loop que vamos a describir mas abajo. Antes de empezar aejecutar alguna instrucción reseteamos el contador con la función ResetCnt(), luegoseteamos la señal nOE_WE a 1 para indicar que vamos a escribir en la RAM (igual comolo hicimos en la función que captura a 40MSPS), y luego ponemos la señal hsclk_en encero para deshabilitar el reloj de 40Mhz, ya que vamos a generar el reloj de 2.5Mhz con elPIC.

cnt = 0xFF; //256*(128/2)*2=32768cnt2 = 2;

read_clk=0;

a las variables que definimos anteriormente ahora le asignamos valores, a cnt le asignamos255(0xFF) y a cnt2 el valor 2, para entender porque estos valores debemos ser lasinstrucciones que están abajo....

// read_clk = RB5#asm

MOVLW 0b0001.0000 // dejo todos los pines del PORTB// iguales menos RB5 que lo hago subir y bajar.

next:XORWF PORTB,F // 128*2 veces para completar 128 ciclos de relojXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F 128 Instrucciones total.

........................

........................XORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

Como vemos por la directiva #asm las que siguen son instrucciones en ensamblador, estoes para lograr la mayor velocidad posible. Lo que hacemos es asignar al registroacumulador (W) el valor en binario 0001.0000, esto es para hacer operaciones XOR coneste registro y los valores del Puerto B, de esta forma al asignarle solo 1 al Bit 5 logramosque al hacer XOR entre los dos registros sucesivamente el Bit 5 del Puerto B alterne entre 1y 0 con cada instrucción. Podría haber hecho (en realidad al principio lo hice) un loop mascorto de la siguiente forma:

Page 34: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 34I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Loop:XORWF PORTB,FDECFSZ cnt

(este código no se encuentra en el programa, es a modo de ejemplo)

Este código también funciona pero el problema que tiene es la velocidad, dado que lasinstrucciones de salto en el PIC toman dos ciclos de reloj el mínimo periodo que se puedelograr con el PIC corriendo a 20Mhz es de 1.2uS (3ciclos x 0.2uS x 2).De esta forma solo se puede obtener una onda cuadrada con una frecuencia de 1/1.2uS osea 833.3Khz.La forma alternativa que encontré fue la que mostramos primero, coloqué 128 instruccionesXORWF PORTB,F seguidas y con los contadores ejecuto este loop de 128 instrucciones unas2x256 veces. Con esto logro 2x256x128 = 32768 ciclos completos de una onda cuadrada.Ya que solo ejecuto 2x256 saltos para ejecutar las 128 instrucciones XOR, en promediologro una señal cuadrada con un periodo de 2x0.2uS o sea 400nS. Si hacemos el inversotenemos que la frecuencia de muestreo que obtenemos son 2.5Mhz con el PIC corriendo a20Mhz.

DECFSZ cnt2,FGOTO next

DECFSZ cnt,FGOTO next

#endasm}

Al final de la función tenemos las instrucciones que decrementan los contadores y cuandose hacen cero salimos de la función. Primero decrementamos el cnt2, si no es cerovolvemos arriba a ejecutar las 128 instrucciones XOR de nuevo, si es cero decrementamosel cnt, y cuando cnt vale cero retornamos a la función que nos llamó.

Vamos ahora con la función ResetCnt()

void ResetCnt(void){/* ls_encode = 1; // deshabilito el encode, es solo para

// incrementar el contador

read_clk = 0;

while(tc2cnt == 0)read_clk = !read_clk;

while(tc2cnt == 1)read_clk = !read_clk;

read_clk = 0;ls_encode = 0;

*/

Por problemas de velocidad y eficiencia esta función fue escrita en su mayoría enensamblador. Las instrucciones en C que están arriba comentadas son solo para mostrarcomo funciona el algoritmo.

Page 35: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 35I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Como tenemos dos contadores de 8Bits en cascada, son capaces de contar hasta 64K(65536), pero nuestra memoria es de solo 32K (32768). El 15 Bit (empezamos a contardesde el Bit0) está conectado a la línea de nCE de la memoria que deshabilita el uso de lamemoria si está en “1”. Por lo tanto la memoria está operativa solo en el intervalo delcontador que va desde 0 hasta 32KLo que hacemos es incrementar los contadores y hasta que nCE (que en el software sellama tc2cnt) sea 1, eso quiere decir que pasamos el intervalo de 0 a 32K, luego hacemos lomismo pero esperamos que se haga 0 de nuevo, o sea que salimos del intervalo de 32K a64K y estamos en cero. Luego nos salteamos las primeras 10 posiciones por un problemaque tenia antes porque quedaban huecos al principio de la memoria con posiciones sinllenar. Esta fue una solución simple que le encontré.

Expliquemos ahora como está implementado esto en software. Expliquemos solo elequivalente en ensamblador para no tener que verlo dos veces.

unsigned char cnt;

Primero definimos la variable sin signo y de 1 byte de ancho cnt que la vamos a usar alfinal de la función.

#asmBCF 0x03,RP0BCF 0x03,RP1BSF 0x06,ls_encodeBCF 0x06,read_clk

m001BTFSC 0x05,tc2cntGOTO m002

Primero empezamos diciéndole al compilador que vamos a escribir instrucciones enensamblador con la directiva #asm, luego siguen dos instrucciones para especificar quevamos a trabajar en el banco 0 de memoria (ver manual del Microcontrolador para masinformación), luego ponemos en “1” la línea ls_encode para solo poder incrementar loscontadores pero no mandarle ciclos al ADC por la línea de ENCODE, fijando esta línea en“1” la otra entrada de la compuerta OR no cambia el estado de la salida. Además ponemosla señal read_clk en 0 como estado inicial. Luego nos quedamos en un loop esperando aque la señal tc2cnt se ponga en 0 por lo que explicamos antes mientras no se haga 0tenemos que generar una onda cuadrada en la línea de read_clk para incrementar elcontador. Esto lo hacemos de forma similar a la función de muestreo, hacemos un XORentre el Puerto B y un valor cargado en el acumulador (W), en este caso el valor es 16 yaque la línea read_clk está conectada al Bit 5.

MOVLW .16XORWF PORTB,1GOTO m001

Eso es lo que hace este grupo de 3 instrucciones, asigna el valor 16 al acumulador, luegohace el XOR entre el acumulador y el Registro PORTB y salta al inicio del loop.

m002BTFSS 0x05,tc2cntGOTO m003

Page 36: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 36I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

MOVLW .16XORWF PORTB,1GOTO m002

Luego tenemos este otro grupo de instrucciones que hace algo similar aunque espera a quela línea tc2cnt esté en 1, el funcionamiento del código es igual al de arriba.

m003BCF 0x06,ls_encodeBCF 0x06,read_clk

#endasm

Antes de terminar ponemos las líneas ls_encode y read_clk en cero para su posterior uso.La directiva #endasm indica el final de las instrucciones en ensamblador, ahora nossalteamos las primeras 10 posiciones de memoria en el loop que sigue abajo. Iniciamos elcontador a 10 y mientras no sea igual a cero aplicamos un ciclo de reloj al contador paraincrementarlo y luego salimos de la función al llegar al final.

cnt = 10; // me salteo las primeras 10 muestras

while(cnt != 0){

read_clk = !read_clk;read_clk = !read_clk;cnt--;

}}

La función que sigue ahora es epptx() que transmite un byte por el puerto paralelo de la PCcon el protocolo EPP (Extended Parallel Port) que está disponible en PCs desde 486 enadelante. Antes veremos una introducción a este protocolo.El puerto paralelo a partir de la PC PS/2 de IBM viene con mejoras (LPT de ahora en mas).Normalmente el LPT solo se usaba para enviar información al exterior (impresoras, etc..),pero desde el PS/2 de IBM se le agregó la característica de recibir informacióntransformándolo en un puerto bi-direccional. Esta característica se controla con el Bit 5 delpuerto de control “BASE + 2” siendo la dirección base 0x378 o 0x278 en hexadecimalsegún el puerto que sea (LPT1 = 0x378 y LPT2 = 0x278 normalmente), entonces BASE+2es 0x378+2 o 0x278+2 según corresponda. Luego se le fueron agregando característicascomo por ejemplo que el protocolo lo controle el hardware del puerto en vez del softwarede la PC para hacer las comunicaciones mas rápidas y eficientes. Uno de estos protocoloses el que usamos acá para transmitir las muestras de 8 Bits que están en la memoria. Abajotenemos una figura en la que mostramos como implementar este protocolo.

Page 37: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 37I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 21El ciclo de lectura es el siguiente:

1) El programa de la PC lee el registro de datos. (Base+4)2) DATA STROBE se activa si WAIT está a nivel bajo.3) La PC espera el reconocimiento por la línea WAIT al cambiar a nivel alto.4) El Dato se lee de los pins del puerto paralelo (D0-D7).5) DATA STOBE se desactiva.6) El ciclo de lectura de datos finaliza.

Figura 22

En nuestro caso no usamos la línea de WRITE, simplemente como el bus de datos estáconectado a través del buffer de 3 estados (74LS245), habilitamos la línea de n2PC que es laseñal que habilita al buffer de 3 estados para que pase el byte que está almacenado en lamemoria. Ahora mostramos el ciclo de lectura. Lo único que varía es la que la línea de WRITEahora está en “1” como es activa a nivel bajo está indicando un ciclo de lectura, pero comonosotros no la usamos no cambia nada con respecto al ciclo de escritura..

Page 38: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 38I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Teóricamente con este protocolo se pueden lograr velocidades de transmisión de hasta2Mbytes/seg, pero con el PIC corriendo a 20Mhz lo máximo que logré fueron unos200Kbytes/seg. Además ahora los puertos paralelos tienen una memoria FIFO de 16 nivelesque hace de buffer para almacenar los valores recibidos y aumentar la velocidad de lectura oescritura.

Mas adelante cuando veamos el software que está del lado de la PC veremos como tenemosque hacer para usar este protocolo a la hora de recibir información en la PC.

Expliquemos ahora en que consiste la función epptx() que hace uso de este protocolo para elenvío de los bytes hacia el LPT

/* Transmite un byte al LPT de la PC con el protocolo EPP */void epptx(){/*

wait = 0;while(datastb == 1)

;

wait = 1;

while(datastb == 0);

*/

Por el mismo propósito que hablamos antes esta función está codificada en ensambladorLo que está entre los delimitadores /* y */ es el equivalente en “C” del código queimplementa el protocolo EPP (es un comentario, el compilador no genera código para estetexto, solo está para que el programador pueda hacer anotaciones en medio del programa).Primero ponemos la línea wait en cero y esperamos a que la PC nos responda poniendodatastb (DATA_STROBE) en cero. Se supone que antes ya tenemos el 74LS245 habilitadopara que pase el byte que está en la memoria hacia el LPT. Por lo tanto cuando la PC nosresponde, nosotros seguimos con el protocolo poniendo la línea wait a 1 y luego esperamos aque datastb suba a 1 como respuesta de la PC. Cuando esto sucede ya la PC leyó el byte ypodemos salir de la función.

#asmBCF PORTA,waitNOP

m001:BTFSC PORTB,datastbGOTO m001BSF PORTA,waitNOP

m002:BTFSS PORTB,datastbGOTO m002

#endasm }

La ultima función que queda EnviarMuestras(), es la encargada de controlar el envío demuestras a la PC, y hace uso de la función que describimos anteriormente.

Page 39: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 39I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

void EnviarMuestras(){

ResetCnt();

nOE_WE = 0; // lectura

Primero reseteamos el contador con la función ResetCnt() y luego ponemos la líneanOE_WE en cero indicando que estamos a punto de leer la memoria en la posición queindica el contador.

while(tc2cnt == 0){

read_clk = !read_clk;read_clk = !read_clk;epptx();

}}

Luego entramos en un loop que incrementa el contador además de generar los ciclos en la líneade nOE para la memoria (lo explicaremos mas adelante) y después enviamos esa muestra haciala PC por el puerto LPT, pero no salimos del loop hasta que no lleguemos a las 32K muestrasindicado por la línea tc2cnt.

Luego de ver el software que está cargado en el PIC podemos pasar a ver el hardware en sí.Para ver el esquemático completo, ver al final del informe donde se muestran. Aquí solo vamosa ver partes especificas del mismo.

Figura 23

La placa de control consiste en un arreglo de compuertas (lógica combinacional), elMicrocontrolador PIC y los cristales para obtener las señales de reloj.Quizá lo mas importante en la placa de control es la lógica combinacional que genera todas lasseñales para controlar el ADC, la memoria y los contadores.

En la primer compuerta AND que tenemos mas hacia la izq. llega la señal de CLK (40MHZ)desde el oscilador y una línea (PORTB.0) desde el PIC, esta ultima se usa para inhabilitar elCLK de 40MHZ cuando se va a leer la memoria o cuando se va a adquirir a una frecuencia de

21

3

54

Page 40: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 40I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

muestreo generada por el PIC (en nuestro caso a 2.5MSPS). La salida de esta compuerta ANDse dirige hacia una de las entradas de la compuerta OR que está casi en el centro de la imagen.La otra entrada de esta compuerta OR es otra línea del PIC (PORTB.4) que es CLK generadopor el PIC. Cabe destacar que para el correcto funcionamiento cuando voy a usar el CLK de40MHZ debo poner el otro CLK del PIC en “0” y viceversa (estas son las líneas etiquetadascomo 2 y 3 en la imagen).La salida de esta compuerta es una onda cuadrada de 40MHZ o de 2.5MHZ seleccionable desdeel PIC, ahora necesitamos una forma de generar las señales de nWE, nOE, ENCODE, y cnt_clka partir de este reloj. Parte de este trabajo lo hacen las compuertas NAND que siguen. Las 3superiores forman un “de-multiplexor”, lo que hace es tomar la señal de reloj y mandarla a unade las dos salidas posibles (U7 o U12) que a través de las compuertas OR (U8 y U11) alimentanla memoria con las señales nWE para la escritura y nOE para la lectura.Las dos compuertas OR al final fueron necesarias para mantener la sincronización entre lostiempos de todas las señales, dado que de alguna forma tenía que controlar la señal deENCODE en forma independiente a la señal de cnt_clk tuve que hacerla pasar por unacompuerta para controlarla con el PIC. Dado que las compuertas de la serie 74FXX tienen untiempo de propagación medio del orden de 5nS, y que el periodo de la señal de CLK de 40MHZes de 25nS y que la señal de lectura o de escritura en la memoria tiene que tener un pulso “bajo”de por lo menos 15nS las señales de control deben estar muy sincronizadas, debido a esto uséotras compuertas para mantener un tiempo de propagación en todas las señales de control“constante”.La compuerta AND abajo del todo tiene una de sus entradas conectadas a una señal que iba aservir de “trigger” pero dado que el tiempo no dio para terminar esta etapa quedó en espera. Porlo tanto esta entrada está conectada a +V habilitando siempre la señal de reloj.

Figura 24

La siguiente Figura 24 muestra el oscilador de 40Mhz que genera el reloj que fija la frecuenciade muestreo, y el cristal de 20Mhz es el que está conectado al PIC y fija el ciclo de instrucción(200nS). Los capacitores de desacople de 30pF c/u forman junto con el cristal y un inversordentro del PIC un oscilador a la frecuencia del cristal (para mas detalles ver la hoja de datos delPIC). El oscilador de 40Mhz tiene 3 pines, masa, alimentación y salida. La salida es una ondasenoidal de 5Vpp centrada en la mitad de la tensión, 2.5V. El inconveniente que había (aunqueen realidad no lo pude comprobar con un Osciloscopio, si no con simulaciones) es lo que semuestra en la figura de abajo:

Page 41: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 41I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 25La señal senoidal es la que en el esquemático está como B y la salida de la compuerta AND esla onda cuadrada y está etiquetada como A. El problema parece ser que el pulso bajo de la señalcuadrada no es del tiempo necesario para que se pueda escribir o leer en la memoria. Según lahoja de datos este tiempo es de por lo menos 15nS, pero si medimos este tiempo en lasimulación tenemos que es de 9.7nS o sea que no vamos a poder almacenar ni leer nada. Estome di cuenta luego de probar varias veces de adquirir a 40MSPS sin lograrlo. Una forma que seme ocurrió de resolver el problema sin modificar mucho el impreso fue agregar un capacitor yun potenciómetro como muestra la figura anterior. De esta forma puedo desplazar el la señal dereloj para que el pulso bajo sea mas extenso.

Page 42: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 42I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 26Ahora agregamos el capacitor y el potenciometro y podemos correr el nivel de la señal para quese ajuste el pulso bajo al tiempo que necesitamos, esto es lo que muestra la figura que vemosarriba, en donde notamos que el pulso bajo se incrementó notablemente.

Veamos el PCB de esta placa junto con algunas modificaciones que tuve que hacer después.En la figura de abajo vemos el impreso de la placa de control de ambos lados y luego una vistacon los componentes y la modificación que le tuve que hacer para agregarle el potenciometro yel capacitor a la salida del oscilador de 40Mhz.

Page 43: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 43I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 27

Eso es todo en cuanto a la Placa de Control, veamos ahora por ultimo la Placa de Entrada.

Placa de entrada

La placa de entrada consiste en el conector BNC para introducir la señal al DSO, un par dellaves para seleccionar AC o DC y para seleccionar el nivel de atenuación X1 o X10.

Page 44: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 44I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 28

Como vemos el switch SW2 deja pasar la señal a través del capacitor C12 o la dejapasar directo hacia el conversor. El otro switch SW1 manda la señal de entradadirectamente hacia el conversor o la hace pasar por la resistencia de 100K que juntocon la impedancia de entrada del conversor que es de 10k forma un atenuador de9:1 y a su vez manda 5V o 0V a la línea nACK del puerto paralelo según seseleccione el nivel de atenuación. De esta forma el software de la PC sabe que nivelde atenuación se está usando leyendo esta señal.Es justo reconocer que esta etapa es un poco precaria como entrada para el DSO,pero no pude dedicarle mucho tiempo a su diseño ya que lo mas importante era quelas placas de captura y control funcionara bien. Sin ellas por mas que pudieraseleccionar varios niveles de atenuación y por mas que la placa de entrada nointrodujera nada de ruido, sería imposible que el DSO funcione. Por eso su diseño eimplementación fue dejada para la ultima parte del proyecto y no fue posiblededicarle la atención necesaria.Otro componente que le faltó a esta etapa es el filtro antialias. Momentáneamenteme limito a no adquirir señales superiores a 20Mhz aunque esta no es la solucióndefinitiva. Para la próxima versión en la que se van a agregar un buffer de altaimpedancia y una mayor selección de niveles de atenuación se agregará también elfiltro pasa bajos.Debido al ruido que introducía la placa de entrada en las pruebas preliminares tuveque modificar ligeramente el impreso, cortar conexiones y usar cables coaxiales enun intento de mejorar la situación. El ruido disminuyó, pero no tanto como yoquería. Debido a esto se implemento un filtrado digital por software que veremosmas adelante. Además de esto se usó una placa cobreada entre la de captura yentrada para “blindar” la ultima del ruido producido por la placa de captura. Lassuperficies de esta placa están conectadas a masa para intentar blindar la placa deentrada.

Veamos el PCB de esta placa y las explicaciones a las modificaciones realizadasposteriormente para reducir el ruido.

Page 45: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 45I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 29

En la figura de la derecha vemos donde se cortaron las conexiones del impreso yque se usaron coaxiales para las líneas de nAIN y AIN que van hasta la placa decaptura donde está el ADC. También se usó un coaxial para la conexión que vadesde el BNC hasta la resistencia de 100K.

Unir con coaxial

Page 46: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 46I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

X1 o X10

Llave paraseleccionar AC o DC

Conector BNC paraentrada de la señal a

Llave deEncendido

Entrada delTransformadorde 9VConector DB25

para el LPT de laPC

105m

160mm

80m

160mm

Separador deplástico

Separador deplástico

Disipador parael regulador7805

Placa de Entrada

Placa de“blindaje”

Placa de CapturaPlaca de Control

Page 47: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 47I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Descripción del Software:

El software del lado de la PC es una aplicación WIN32 (Windows de 32Bits, que corre enWindows 95 en adelante).No vamos a explicar todo el software que usamos ya que tendríamos que explicar elfuncionamiento las aplicaciones Windows cosa que estaría fuera del alcance de estedocumento. Pero sí explicaremos partes del mismo donde manejamos el hardware externo ocuando dibujamos la señal adquirida entre otras cosas. De todas formas el código fuentecompleto del programa se encuentra en los apéndices al final del documento y en el discojunto con el programa del PIC y demás documentos.Debido a que en Windows 2000 en adelante no se puede acceder a un puerto de la PCdirectamente, tuve que usar una librería (archivo .dll) para que haga de intermediario con elsistema operativo y así poder leer el puerto paralelo. Esto no pasa en Win9X ya queMicrosoft cambió la arquitectura del sistema a partir de Win2K para mejorar la seguridaddel mismo.

Lectura de las muestras desde la PC:Para leer las muestras desde la PC usamos el siguiente código:

if(IsDlgButtonChecked(hDlg,IDC_40MSPS)==BST_CHECKED){

highspeed = TRUE;F_SAMPLE = 40;

}else{

highspeed = FALSE;F_SAMPLE = (double)(2.50);

}

Este código se fija si está tildado el botón de 40MSPS y si es así pone a verdadero lavariable highspeed y la variable F_SAMPLE a 40 indicando la frecuencia de muestreo quevamos a usar

if(highspeed == TRUE)Out32(CONTROL,Inp32(CONTROL)|4); //40MSPS

elseOut32(CONTROL,Inp32(CONTROL)&0xFB); //2.5MSPS

Luego de esto si vamos a adquirir a 40MSPS ponemos en “1” el bit 3 del puerto deCONTROL (parte del puerto paralelo), el PIC se fija en este bit para saber que frecuenciade muestreo usamos. Si vamos a adquirir a 2.5MSPS ponemos este bit en “0”

//Secuencia para que el PIC empiece a adquirir.Out32(CONTROL,Inp32(CONTROL)&0xF7);// pongo en '0' nSelect (para el PIC es '1')Out32(CONTROL,(Inp32(CONTROL)|0x8));// pongo en '1' nSelect (para el PIC es '0')Out32(CONTROL,Inp32(CONTROL)&0xF7);// pongo en '0' nSelect (para el PIC es '1')

Page 48: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 48I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Luego de esto la PC pone el bit 4 del puerto de CONTROL en “1”,”0”,”1”, esta es lasecuencia que está esperando el PIC para empezar a convertir.

GetSystemTime(&oldsystemtime);while((Inp32(STATUS)&0x80) == 0) // espera a que busy este a 1{

GetSystemTime(&systemtime);if(systemtime.wSecond > oldsystemtime.wSecond + 5)

// espera 5 seg, si no responde aborta.{

MessageBox(NULL,"El Hardware no ha respondido en 5seg., erifique que está conectado y encendido","Error",MB_OK);

break;}

}

Lo que hacemos acá es obtener el tiempo actual y esperar a que la señal de busy esté en“1”, así podemos leer las muestras por el puerto paralelo.Nos vamos fijando en el tiempo que transcurre, y si pasan mas de 5Seg sin que el Hardwareresponda, abortamos con un mensaje de error.

/*me fijo si el botón de X10 está apretado,si está actúo en la escala para reflejar el cambio

*/

atenuacion = (Inp32(STATUS)&0x40);

if(atenuacion != 0)Vdivision = 10*0.163/vertScale;

elseVdivision = 0.163/vertScale;

Lo que sigue es leer desde el puerto paralelo el valor del bit 7 delpuerto STATUS. Este bit está conectado a la llave que indica si la señal está pasando através del atenuador o no.

Si este bit está en 1, multiplicamos la variable Vdivision x 10, que me fija la tensión pordivisión que aparece en la grilla del software.Dividimos sobre vertScale que es el zoom que hacemos por software de la señal. Losvalores típicos para la variable vertScale son 0.5, 1, 2, 4 etc.....

for(x=0;x<NUM_SAMPLES;x++){

dato[x] = parallelrx();}

Luego tenemos el loop donde leemos las “NUM_SAMPLES” muestras. Llamamos a lafunción parallelrx() que nos devuelve un valor de 8 bits que es igual al valor de la muestra ylo guardamos en el array “dato” en la posición x. Cuando llegamos a 128*255(NUM_SAMPLES) salimos del loop.

Out32(CONTROL,(Inp32(CONTROL)|0x8)); // pongo en '1' nSelect (para el PIC es '0')

InvalidateRgn(hWndMain,NULL,TRUE);

Page 49: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 49I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

UpdateWindow(hWndMain);

Lo que hacemos después es poner el bit 4 del puerto de CONTROL en 0 para que el PICsepa que terminamos de leer las muestras. Las ultimas dos funciones son llamadas aWindows para que dibuje la ventana de nuevo ya que hemos actualizado el buffer con lasmuestras.

Dibujo de la señal en la PC:Para dibujar la señal en la PC lo que hacemos es unir los puntos de las muestras con unalínea y listo (bueno en realidad es un poco mas difícil si queremos desplazar la señal en lapantalla con una barra de desplazamiento). Abajo se muestra el código necesario:

MoveToEx(hDC,Xmargin,intdato[m],NULL);

for(x=m;x<(NUM_SAMPLES-Ifiltro); x++){

temp = (double)(x-m)*horScale;

if(temp > largo) // corta al final de la pantalla en forma horizontalbreak;

LineTo(hDC,Xmargin+temp,intdato[x]);}

Este es el bucle en el que dibujamos la señal, primero movemos el cursor al 1º punto en laseñal o sea la 1º muestra. Eso lo hacemos con la primer función MoveToEx() que es unafunción de Windows.El bucle for que sigue va recorriendo las muestras y uniendo los puntos de la señal.Empieza en la muestra m siendo m un valor que seteamos de acuerdo a donde queremosque comience a mostrar la señal. A partir de ahí seguimos hasta el final del buffer, notarque el final del buffer está marcado por el valor (NUM_SAMPLES-Ifiltro), siendo Ifiltro elíndice del filtro (en caso de que no lo estemos usando este valor es 0). Esto es así dado queuna vez que filtramos la señal con la PC (por medio de un Moving Average Filter comodijimos arriba), quedamos con un buffer de menos muestras del que teníamosoriginalmente. En realidad son pocas muestras, en caso de que el índice de filtro queusemos sea 5, las ultimas 5 muestras del buffer original las perdemos, pero es insignificanteen comparación a casi 32K muestras.

Al empezar el bucle calculamos la posición en el eje X en que vamos a dibujar la línea (lavariable temp), luego en el if nos fijamos si nos pasamos del borde de la grilla, en ese casoabortamos. Y al final dibujamos la línea desde la muestra anterior a la actual con la funciónLineTo() que es de Windows, nos pide entre otras cosas la coordenada final X e Y.

Antes de eso dibujamos la grilla que consiste en 11 líneas horizontales y 11 verticales, asícomo también ponemos los valores de tiempo y tensión en los bordes de la misma.

En la figura de abajo mostramos como luce el software mostrando una señal de video...

Page 50: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 50I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Figura 30

El programa se divide en 3 ventanas:La ventana principal es donde mostramos la señal adquirida junto con la grilla y valores detiempo y tensión en los bordes de la misma.El cuadro con los controles es desde donde manejamos las escalas de la señal, dondeactivamos el filtro y donde damos la orden para adquirir muestras, salvar o cargarlas de unarchivo en la PC.Por ultimo tenemos la ventana en donde mostramos información correspondiente a los doscursores que vemos en la ventana principal. Con estos cursores podemos medir diferenciasde tiempo o frecuencias.

Page 51: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 51I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Filtrado digital por software:Realmente quedé bastante asombrado con esta técnica, es realmente simple y disminuye enforma significativa el ruido aleatorio sumado a la señal.La desventaja que tiene es disminuir la pendiente de los flancos en la señal, pero nodemasiado. Antes de explicar como funciona veamos una muestra.

En la figura de abajo tenemos una señal de video filtrada con este método y sin filtrar.

Figura 31Obviamente la de arriba es la filtrada, fue filtrada con un índice de 4 y aun así mantiene losflancos bastante rectos. Si seguimos aumentando el índice disminuye el ruido aún mas perolos flancos en la señal empiezan a perder su pendiente.

Page 52: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 52I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Este tipo de filtro es bueno para eliminar ruido aleatorio sumado a una señal y pero esineficiente a la hora de separar bandas de frecuencia, cosa que no era necesario en nuestrocaso.

El funcionamiento es bastante simple, supongamos que tenemos dos buffers en memoria,uno lleno con muestras de una señal adquirida con ruido aleatorio superpuesto, y el otrototalmente vacío. Empecemos con la muestra 1 del buffer vacío, le asignamos un valorigual al promedio de “n” muestras adyacentes del buffer A partiendo de la 1, luegohacemos lo mismo con la muestra nro. 2 y así hasta el final (las “n” muestras son el nro.que especificamos como índice de filtrado). Abajo mostramos una ecuación donde se vemas claro el procedimiento.

a(j) es el buffer de salida, y b(j) es el de entrada (el que contiene la señal a filtrar).Expandiendo esta sumatoria tenemos por ejemplo:usando 4 puntos en el filtro (M=4) para la muestra 20:

y para la muestra 21 tenemos

y así hasta que terminamos.

En la PC pasamos el algoritmo de filtrado al Lenguaje C, la parte del software que hace elfiltrado de la señal es la siguiente:

//filtroint tempsum,i;

if(Ifiltro != 0){

for(x=0;x<NUM_SAMPLES;x++){

tempsum = 0;

for(i=0;i<Ifiltro;i++)tempsum += intdato[x+i];

intdato[x] = tempsum/Ifiltro;}

}

Primero declaramos dos variables enteras de 16Bits tempsum e i. La variable Ifiltro es elíndice del filtro que se selecciona desde los controles del DSO, ya está definida al principio

aj0

M 1−

i

b j i+( )∑=

M

a20b20 b21+ b22+ b23+

4

a21b21 b22+ b23+ b24+

4

Page 53: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 53I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

del programa. La constante NUM_SAMPLES es igual a 128*255 = 32640 y es el nro. demuestras que hay en el buffer. Lo que hacemos ahora es un loop recorriendo el buffer conlas muestras y sacando el promedio de las Ifiltro muestras siguientes para asignarlas albuffer temporal (en realidad uso el mismo buffer, ya que no sacamos el promedio de lasmuestras hacia atrás, por lo tanto no se ve afectado).

Al aumentar el índice del filtro usamos mas muestras consecutivas en el promedio, estotiene la ventaja de reducir aun mas el ruido, pero también hace que los flancos no sean tanrectos como en la señal original, distorsionando entonces la misma.Por lo que dice en el libro de donde saqué la idea de este filtro la gente que lo usa siemprequeda con la idea de que hay que hacer algo mas, en realidad es lo que me pasa ya que fuemuy simple implementarlo (desde que lo leí hasta que tenia funcionando la 1er versiónpasaron 5 o 10 minutos!!!!!!) y los resultados fueron bastante buenos.

Análisis de Costos:

El costo de diseño del equipo no fue muy elevado dado que varios IC se consiguieron pormedio de muestras gratis con las empresas que los fabrican. El costo mas grande fue el delas memorias (5 memorias de 32K @ 25nS de tiempo de acceso), ahora que empece afijarme en PLDs y FPGAs para la lógica de control quizá hubiese comprado algún IC deese tipo por el precio de las memoria. (precios de acuerdo a Eneka y Fablett y Bertoni)

5 Memorias 32Kbytes @ 25nS (gastos de envío + impuestos de aduana)U$S 70Placa de fibra de vidrio doble faz $ 300Gabinete de plástico $ 3802 Contadores Muestras gratis de Philips Estimado U$S 20ADC Muestras gratis de Analog Devices Estimado U$S 30Buffer 245 $ 20Cristal 20Mhz PIC $ 30Oscilador 40Mhz $ 100Conector para LPT $ 90Microcontrolador PIC16F819 $ 1004 Compuertas serie 74F $ 100

Hay que tomar en cuenta también el costo de la licencia del software Visual C++ 6.0 que seuso para crear la aplicación Windows, aunque también hay compiladores gratuitos enInternet (quizá el costo de esta licencia ronde los U$S 800 o mas).

Se emplearon mas de 250 horas desde el 02/01/2005 (en realidad el diseño empezó muchoantes, en abril/2004 cuando cursamos la materia, algunos días me faltó anotar las horas y noestán las horas correspondientes a escribir el Informe Final que apróx. son 60).O sea que si damos por finalizado el proyecto al 30/06/2005 tenemos 250Horas/6Meses =41.7 Horas/Mes y si tomamos 4 semanas por mes tenemos 10.5Horas por semana.Vale destacar también que debido al trabajo, solo le podía dedicar mas tiempo los fines desemana, debido a esto se acumulan las 10.5 horas de promedio en el fin de semana...

Page 54: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 54I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Otra medida del tiempo empleado puede ser también las jornadas de 8 horas que hubiesellevado, si son 250 Horas/8horas por jornada, hubiesen sido 31.25 jornadas de 8 horas,poco mas de un mes de trabajo continuo.

Lo que más demoró el comienzo del diseño y las pruebas fue conseguir los componentes.Según la agenda pude conseguir las memorias cerca el 12/04 y quedó demorado hasta 01/05por exámenes. El costo de la memoria fue exagerado, pero en el mercado uruguayo nohabía una memoria con tiempo de acceso tan bajo, por eso tuve que recurrir a comprar 5memorias a través de JAMECO que es un distribuidor internacional. Lo irónico fue quetuve que pagar mas por los costos de envío e impuestos de aduana que por las memorias.El costo del conversor y contadores es aproximado y no está tomado en cuenta losimpuestos y costos de envío. De acuerdo a estos precios, el costo de fabricación de unequipo sería aproximadamente de $2800 c/u. Estos costos se pueden reducir aun máscomprando los componentes por mayor cantidad y mas todavía si centralizamos toda lalógica de control y memoria en un PLD o FPGA.

Costo estimado de venta del producto:Como dije en la introducción del informe, en el estado actual que está el proyecto no estáen condiciones de ser un producto comercial. Pero dado que los Osciloscopios Analógicosde 20Mhz actualmente están cerca de los U$S 600 en nuestro mercado, este producto enbuenas condiciones podría venderse fácilmente a U$S 250 o U$S 300 (estimado de acuerdoal precio que tienen equipos similares fuera del país y que además hay que sumarle losimpuestos de Aduana y envío). En cuanto a buenas condiciones me refiero a una buenaetapa de entrada que haga posible seleccionar distintos niveles de atenuación y seleccionarmas frecuencias de muestreo. Actualmente no está muy lejos de esto, pero creo que seríaconveniente diseñarlo de nuevo con un IC de lógica programable (PLD o FPGA) comoexplico mas adelante.

Page 55: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 55I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Conclusión:

He quedado bastante satisfecho con el resultado final del equipo, no pensé que podría llegara trabajar a 40Mhz con placas hechas por mi mismo, realmente es gratificaste. Ahora llegóel momento de las criticas, si bien me gustó el resultado hay muchas cosas para mejorar.

Principalmente la etapa de entrada carece de un control de ganancia/atenuación y de unblindaje o diseño mas cuidadoso de la etapa para evitar que el ruido se sume a la señal quenos interesa, además de un buffer de alta impedancia y un filtro antialias. Quizá el conectorBNC se debería haber situado mas cerca del ADC para evitar conexiones largas y por lotanto mas ruido. Las primeras señales que adquirí con el equipo que se ven con menosruido que las actuales y es porque me estaba salteando la etapa de entrada e inyectandodirectamente la señal a la entrada del ADC, pero esto cambia al usar la punta para medir yluego pasar todo a través de la placa de entrada, resultando en una señal mas ruidosa.

En un principio pensé en usar una etapa de entrada FET diferencial y luego mandar la señaldiferencial a un amplificador controlado por DC para manejar el nivel de la señal por mediode una señal de continua con un potenciómetro o con PWM desde el PIC (si nos fijamos enel esquemático el pin de PWM en el PIC está libre, ya que lo había dejado libre con estefin). Luego de pruebas fallidas con este amplificador opté por simplificar esta etapa y usardirectamente la entrada del ADC. Al hacer esto el DSO queda con una impedancia deentrada de 10K que es la interna del ADC (se manejan 1Meg en los Osciloscopiosnormales, y para medir señales en líneas de transmisión se usan 50 o 75Ohm según laimpedancia característica de la línea).

Carece también de un filtro anti-alias o pasa bajos, lo que dejaría pasar señales al conversorque tengan componentes mayores a FS/2. Esto si bien es un problema hasta ahora no metrajo problemas visibles ya que no he tratado de adquirir señales mayores a FS/2, aunquepuede ser la causa (entre otras cosas) del ruido que hay en la señal. En próximas versionessin duda tendrá que haber un filtro con estas características, quizá se pueda implementar enel mismo amplificador de entrada, usando algún operacional.

Otra cosa para agregar sería una etapa de trigger y la posibilidad de realizar un muestreocontinuo, ya que no se pudo implementar un muestreo de este tipo como tenía pensado(principalmente por problemas de tiempo) no fue necesario un generador de trigger, pero esalgo que debería agregar si considero el muestreo continuo en un futuro.

Se pudiera haber usado una memoria FIFO para almacenar las muestras, de esta forma nonecesitaríamos de contadores para direccionar una memoria SRAM. En un principio sepensó de esta forma pero al no encontrar memorias de este tipo opté por la memoria SRAMy los contadores ya que me habían llegado las muestras de Philips.

Page 56: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 56I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

La lógica usada para controlar el equipo y generar las señales es el principal limitante de lavelocidad de operación del mismo (los contadores llegaban hasta 115Mhz pero lascompuertas y la memoria no). Por lo tanto para la próxima versión pienso implementar todala lógica en un integrado programable (PLD o FPGA) ya que estos integrados operan afrecuencias mayores (normalmente hasta 250Mhz sin problemas y mas....) y me permitenimplementar casi toda la lógica de control en un mismo integrado (contador, memoria,circuito de trigger). Además sería mas fácil hacer actualizaciones al equipo porque todas lasconexiones dentro del PLD o FPGA se manejan con software, para actualizarlo seriasuficiente con descargar el software de nuevo al IC.

La ventaja que tiene reducir la cantidad de componentes también es el costo de los mismos,en una producción por cantidad, reducir 4 o 5 ICs a 1 sería una reducción de costosinteresante.

Si pudiera implementarlo en un IC de este tipo incluso se podría reducir las dimensionesfísicas del equipo por lo tanto también la cantidad de placas, que determina otra reducciónen costos.

Al software de la PC se le pueden agregar análisis de señales como FFT y cálculos entreseñales, por ej. si tuviéramos dos canales podríamos hacer CH1/CH2 y si CH1 fuera unatensión y CH2 una corriente tendríamos como varía la impedancia en función de lafrecuencia. Obviamente para eso tendríamos que poder convertir dos canales, cosa que nosería tan difícil como parece si usáramos dos conversores y dos memorias o si simplementeintercalamos una muestra de cada canal, obviamente reduciendo la frecuencia de muestreoa la mitad ya que se reparte entre los dos canales.

Como se puede ver quedan muchas cosas por corregir y mejoras por hacer pero estoyrealmente motivado en seguir con el desarrollo del equipo.

Robert Pérez7mo KA

I.T.S Montevideo-Uruguay

Page 57: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 57I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Apéndice A

Porqué usar software escrito en C para un Microcontrolador ¿?Entre algunas características porque es mas fácil de entender que el ensamblador.Para un programador con experiencia en ambos lenguajes quizá no hay diferencia entre lasinstrucciones en ensamblador

MOVLW 23MOVWF reg_a

y su equivalente en C

reg_a = 23;

Pero para un programador con poca experiencia en ensamblador (o para alguien conexperiencia cansado de leer muchas líneas de código ☺) el C resulta mas simple deentender. También es mas portable, ya que el mismo software escrito en C puede sercompilado para que corra en otro Microcontrolador (por ej un 8052 o AMR) que no sea unPIC y no tener que modificar tanto el código, en vez de escribir todo el código de nuevo siestuviera escrito en ensamblador para PIC y quisiéramos implementarlo en un 8052 por ej.Estas son algunas de las ventajas que tiene el lenguaje C, como desventaja tiene entre otrasel tiempo de ejecución y tamaño del código generado.Debido a que el compilador genera el código equivalente en ensamblador en formaautomatizada (quizá haga alguna optimización al final de la compilación) este código puedeser menos eficiente que el generado por un programador con experiencia, pero en buenoscompiladores es muy difícil generar código a mano que sea mejor que el que genera elcompilador.

Porqué usamos entonces este lenguaje si en un Microcontrolador tenemos recursos tanlimitados como RAM y EEPROM para almacenar el programa ¿?Porque los compiladores están escritos pensando en estas limitaciones y por lo tantorehusan las localidades de RAM de la mejor forma posible. En cuanto al espacio enEEPROM, también se cuida el tamaño del código generado rehusando código o arreglandoel código en subrutinas para que no se repita varias veces en el programa.Además siempre está la opción de codificar partes del programa en ensamblador que seancríticas tanto en tiempo de ejecución como en espacio de EEPROM. Podemos ver el códigoque genera el compilador para una función dada y si pensamos que podemos implementarlomejor se puede escribir en ensamblador “en línea”, es decir incrustado dentro del código C.

Esto ha sido hecho en el software del Microcontrolador para este proyecto, principalmenteen la función que envía las muestras a la PC y en las funciones para adquirir las muestrasdado que se requiere la mayor velocidad de ejecución. Pero el problema no era elcompilador, sino que usé una versión de evaluación que no tiene todas las optimizacionesactivadas, por lo tanto tuve que fijarme en la salida del compilador y optimizar el código yomismo a mano para que sea mas eficiente. (la versión completa ronda los U$S 200, elcompilador se llama CC5X C Compiler FREE edition y tiene como limitación laoptimización del código generado que solo se pueden compilar programas de hasta 1K)

Page 58: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 58I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Apéndice BListado del Software de la PC:

// Final Project.cpp : Defines the entry point for the application.//

#include "stdafx.h"#include "resource.h"#include "commrutines.h"

#define MAX_LOADSTRING100#define NUM_SAMPLES 128*256

double F_SAMPLE=40.00;

unsigned char dato[NUM_SAMPLES];

unsigned int intdato[NUM_SAMPLES];unsigned int maxSample = 0;unsigned int horLines[11], vertLines[11];int atenuacion =0, Invertir=1;

extern int portLPT1;

int highspeed=TRUE;int Ifiltro=0,IfiltroOld=0;

short _stdcall Inp32(short PortAddress);void _stdcall Out32(short PortAddress, short data);

int m=0,bflag=0,bZoom=0,bmiddleY=0,bCur1=0,bCur2=0;;double horScale = 1,vertScale = 1,temp=0;int yOffset = 0;double deltaX,deltaY,largo,ancho,middleX,middleY,middleYConst=1,offsetY;char buffer[5]; // para obtener el texto de los controlesdouble timeCur1=0, timeCur2=0,timeDiff=0, voltCur1=0, voltCur2=0;char ctimeCur1[10], ctimeCur2[10], cvoltCur1[10], cvoltCur2[10];double Vdivision=0.163;int Xcur1=75,Xcur2=80;double XScaleDouble[] = {8,4,2,1,0.5,0.25,0.125,0.0625,0.03125,0.015625};char* XScaleText[] =

{"X0.125","X0.25","X0.5","X1","X2","X4","X8","X16","X32","X64"};

double YScaleDouble[] = {2,1,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5};char* YScaleText[] = {"X2","X1","X0.5","X2","X2","X2","X2","X2","X2","X2"};void double2str(double valor,char* cadena);HWND WndScrollYDiv,hWndScrollXDiv,hWndScrollYOff,

hWndCursoresDlg,hWndScrollFiltro;

int nPosYDiv=1,nPosXDiv=1,nPosYOff=0;HINSTANCE hInst; // current instanceTCHAR szTitle[MAX_LOADSTRING]; // The title bar textTCHAR szWindowClass[MAX_LOADSTRING]; // The title bar textHWND hWndMain,hWndControles; // Main Window

ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK ControlesProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK PuertosProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK CursoresProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);void DrawGrid(HDC hDC, int Xmargin, int Vmargin);void DrawWave(HDC hDC, int Xmargin);void SaveToFile(void);void LoadFile(void);void appendTimeUnit(double time, char *time_buf);void appendVoltUnit(double time, char *time_buf);

Page 59: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 59I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

void appendHertzUnit(double time,char *time_buf);void DrawCursors(HDC hdc, int Yfinal);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){

int x=0;

vertScale = YScaleDouble[nPosYDiv];horScale = XScaleDouble[nPosXDiv];

initLPT();

MSG msg;HACCEL hAccelTable;

// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_FINALPROJECT, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);

// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)){

return FALSE;}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_FINALPROJECT);

// Main message loop:while (GetMessage(&msg, NULL, 0, 0)){

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){

TranslateMessage(&msg);DispatchMessage(&msg);

}}

return msg.wParam;}

//// FUNCTION: MyRegisterClass()//// PURPOSE: Registers the window class.//// COMMENTS://// This function and its usage is only necessary if you want this code// to be compatible with Win32 systems prior to the 'RegisterClassEx'// function that was added to Windows 95. It is important to call this function// so that the application will get 'well formed' small icons associated// with it.//ATOM MyRegisterClass(HINSTANCE hInstance){

WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_FINALPROJECT);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);wcex.lpszMenuName = (LPCSTR)IDC_FINALPROJECT;wcex.lpszClassName = szWindowClass;

Page 60: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 60I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);}

//// FUNCTION: InitInstance(HANDLE, int)//// PURPOSE: Saves instance handle and creates main window//// COMMENTS://// In this function, we save the instance handle in a global variable and// create and display the main program window.//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWndMain;

hInst = hInstance; // Store instance handle in our global variable

hWndMain = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWndMain) { return FALSE; }

ShowWindow(hWndMain, nCmdShow); //UpdateWindow(hWndMain);

return TRUE;}

//// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)//// PURPOSE: Processes messages for the main window.//// WM_COMMAND - process the application menu// WM_PAINT - Paint the main window// WM_DESTROY - post a quit message and return//LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;int i=0;short int nPos,xPos,yPos,fwKeys,newM;static short int antX,antY,oldm,firstX,firstY,secondX,secondY,vertPromedio;int nScrollCode;HWND hwndScrollBar;SCROLLINFO scrollinfo;char sample_number[30],string[10];int Xmargin = 70, Vmargin = 40;static int Hscrollconst=1,Vscrollconst=1;HPEN newPen,oldPen,otherPen;double time;char act_time[20];unsigned int valor_muestra=0;RECT rect;

switch (message){

case WM_CREATE:

Page 61: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 61I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

SetScrollRange(hWnd,SB_HORZ,0,Hscrollconst,TRUE);return 0;

case WM_HSCROLL:nScrollCode = (int) LOWORD(wParam); // scroll bar valuenPos = (short int) HIWORD(wParam); // scroll box positionhwndScrollBar = (HWND) lParam; // handle to scroll bar

switch(nScrollCode){case SB_THUMBTRACK:

m = (nPos)*(NUM_SAMPLES/Hscrollconst);SetScrollPos(hWnd,SB_HORZ,nPos,FALSE);InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);

break;

case SB_PAGERIGHT:m += NUM_SAMPLES/10;SetScrollPos(hWnd,SB_HORZ,m/5,TRUE);InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);

break;

case SB_PAGELEFT:m -= NUM_SAMPLES/10;SetScrollPos(hWnd,SB_HORZ,m/5,TRUE);InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);

break;

case SB_LINERIGHT:if(m<NUM_SAMPLES){

m += 2;SetScrollPos(hWnd,SB_HORZ,m/5,TRUE);InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);

}break;

case SB_LINELEFT:if(m>0){

m -= 2;SetScrollPos(hWnd,SB_HORZ,m/5,TRUE);InvalidateRect(hWnd,NULL,TRUE);UpdateWindow(hWnd);

}break;

}

return 0;

case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// Parse the menu selections:switch (wmId){

case IDM_ABOUT:DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd,(DLGPROC)About);

break;case IDM_EXIT:

DestroyWindow(hWnd); break;

case ID_FILE_SAVETO: SaveToFile();

Page 62: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 62I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

break;case ID_FILE_LOAD: LoadFile(); InvalidateRgn(hWnd,NULL,TRUE); UpdateWindow(hWnd);

break;case ID_HERRAMIENTAS_CURSORES: hWndCursoresDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_CURSORES), hWnd, (DLGPROC)CursoresProc); ShowWindow(hWndCursoresDlg,SW_SHOW); break;case ID_HERRAMIENTAS_CONTROLES: ShowWindow(CreateDialog(hInst, MAKEINTRESOURCE(ID_CONTROL), hWnd, (DLGPROC)ControlesProc),SW_SHOW); break;case ID_OPCIONES_PUERTOS: ShowWindow(CreateDialog(hInst,

MAKEINTRESOURCE(IDD_DIALOGLPT1), hWnd, (DLGPROC)PuertosProc),SW_SHOW);

break;case ID_FILE_FITWAVEFORM: horScale = 0.025; vertScale = 1; middleYConst = 1; InvalidateRgn(hWnd,NULL,TRUE); UpdateWindow(hWnd);

break;default: return DefWindowProc(hWnd, message, wParam, lParam);

}break;

case WM_LBUTTONDOWN:fwKeys = wParam; // key flagsxPos = LOWORD(lParam); // horizontal position of cursoryPos = HIWORD(lParam); // vertical position of cursor

SetCapture(hWnd);if( (xPos <= 30)|(yPos <= 30) )

break; // ignoro todo lo que esté fuera de la grilla.

if((fwKeys & MK_LBUTTON) && (xPos > (Xcur1-3)) && (xPos < (Xcur1+3)))bCur1 = TRUE;

elsebCur1 = FALSE;

if((fwKeys & MK_LBUTTON) && (xPos > (Xcur2-3)) && (xPos < (Xcur2+3)))bCur2 = TRUE;

elsebCur2 = FALSE;

hdc = GetDC(hWnd);firstX = xPos;firstY = yPos;

xPos = m + (xPos - 30)/horScale;time = (double)xPos/F_SAMPLE;valor_muestra = intdato[xPos];

//agrega las unidades al final de la cadena (nS,uS,mS)appendTimeUnit(time,act_time);

strcpy(sample_number,"Tiempo cursor: ");strcat(sample_number,act_time);

SetBkMode(hdc, TRANSPARENT);SetTextColor(hdc,RGB(150,150,150));

oldm = xPos;

Page 63: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 63I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);bZoom = 1;

break;

case WM_LBUTTONUP:xPos = LOWORD(lParam); // horizontal position of cursoryPos = HIWORD(lParam); // vertical position of cursorbCur1 = FALSE;bCur2 = FALSE;ReleaseCapture();break;

case WM_MOUSEMOVE:fwKeys = wParam; // key flagsxPos = LOWORD(lParam); // horizontal position of cursoryPos = HIWORD(lParam); // vertical position of cursor

GetClientRect(hWnd, &rect);

if( (xPos < Xmargin)|(xPos > rect.right-Xmargin) )break; // ignoro todo lo que esté fuera de la grilla.

if((bCur1==TRUE) &&(fwKeys & MK_LBUTTON)){

Xcur1 = xPos;

if(Xcur1 == Xcur2) // para que se separen si los llego a// juntar..

Xcur1 = Xcur2 + 2;

firstX = m + (xPos - Xmargin)/horScale;timeCur1 = 1000*(double)firstX/F_SAMPLE;appendTimeUnit(timeCur1,act_time);

//agrega las unidades al final de la cadena (nS,uS,mS)SetDlgItemText(hWndCursoresDlg,IDC_CUR1TIME,act_time);

}

if((bCur2==TRUE)&&(fwKeys & MK_LBUTTON)){

Xcur2 = xPos;

if(Xcur1 == Xcur2)// para que se separen si los llego a juntar

Xcur1 = Xcur2 - 2;

// actualizar el label en el cuadro cursoressecondX = m + (xPos - Xmargin)/horScale;timeCur2 = 1000*(double)secondX/F_SAMPLE;//valor_muestra = intdato[xPos];

appendTimeUnit(timeCur2,act_time);//agrega las unidades al final de la cadena (nS,uS,mS)

// actualizar el label en el cuadro cursoresSetDlgItemText(hWndCursoresDlg,IDC_CUR2TIME,act_time);

}

if((fwKeys & MK_LBUTTON)){

int point=0,sign=0;timeDiff = timeCur2 - timeCur1;

appendTimeUnit(timeDiff,act_time);//agrega las unidades al final de la cadena (nS,uS,mS)

// actualizar el label en el cuadro cursoresSetDlgItemText(hWndCursoresDlg,IDC_TIMEDIFF,act_time);//actualizar la frecuencia calcula como 1/timediff

Page 64: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 64I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

appendHertzUnit(timeDiff,act_time);SetDlgItemText(hWndCursoresDlg,IDC_FREC,act_time);

InvalidateRgn(hWnd,NULL,TRUE);UpdateWindow(hWnd);

}break;

case WM_PAINT:hWndMain = hWnd;hdc = BeginPaint(hWnd, &ps);

GetClientRect(hWnd,&rect);

DrawCursors(hdc,rect.bottom - Vmargin);DrawGrid(hdc,Xmargin,40);

Hscrollconst = 10*((horScale*NUM_SAMPLES)/largo);if(Hscrollconst <= 0)

Hscrollconst = 1;

SetScrollRange(hWnd,SB_HORZ,0,Hscrollconst,TRUE);

TextOut(hdc,Xcur1-4,Vmargin-15,"1",1);TextOut(hdc,Xcur2-4,Vmargin-15,"2",1);

EndPaint(hWnd, &ps);break;

case WM_DESTROY:PostQuitMessage(0);break;

default:return DefWindowProc(hWnd, message, wParam, lParam);

} return 0;}

// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

switch (message){

case WM_INITDIALOG:return TRUE;

case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){

EndDialog(hDlg, LOWORD(wParam));return TRUE;

}break;

} return FALSE;}

LRESULT CALLBACK ControlesProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

int idEditCtrl,nScrollCode;HWND hwndEditCtrl,hwndScrollBar;short int nPos;char charYOffset[10];unsigned int x,serial,cnt;SYSTEMTIME oldsystemtime, systemtime;char buffer[10];

switch (message){

Page 65: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 65I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

case WM_INITDIALOG:/* Inicializar los controles. */hWndScrollYDiv = GetDlgItem(hDlg,IDC_SCROLLYDIV);hWndScrollXDiv = GetDlgItem(hDlg,IDC_SCROLLXDIV);hWndScrollYOff = GetDlgItem(hDlg,IDC_SCROLLYOFF);hWndScrollFiltro = GetDlgItem(hDlg,IDC_SCROLLIFILTRO);

nPos = SetScrollRange(hWndScrollYDiv,SB_CTL,0,8,TRUE);

SetScrollPos(hWndScrollYDiv,SB_CTL,nPosYDiv,FALSE);vertScale = YScaleDouble[nPosYDiv];horScale = XScaleDouble[nPosXDiv];yOffset = 0;Ifiltro = 0;

CheckDlgButton(hDlg,IDC_40MSPS,BST_CHECKED);

SetDlgItemText(hDlg,IDC_YDIV,YScaleText[nPosYDiv]);SetDlgItemText(hDlg,IDC_XDIV,XScaleText[nPosXDiv]);itoa(yOffset,charYOffset,10);SetDlgItemText(hDlg,IDC_YOFF,charYOffset);SetDlgItemText(hDlg,IDC_IFILTRO,itoa(Ifiltro,buffer,10));

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);break;

case WM_VSCROLL:nScrollCode = (int) LOWORD(wParam); // scroll bar valuenPos = (short int) HIWORD(wParam); // scroll box positionhwndScrollBar = (HWND) lParam; // handle to scroll bar

switch(nScrollCode){

case SB_LINEUP:if(hwndScrollBar == hWndScrollYDiv){

if(nPosYDiv<2)nPosYDiv++;

SetScrollPos(hWndScrollYDiv,SB_CTL,nPosYDiv,FALSE);

vertSca le = YScaleDouble[nPosYDiv];if(atenuacion != 0)

Vdivision=10*0.163/vertScale;else

Vdivision=0.163/vertScale;

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

SetDlgItemText(hDlg,IDC_YDIV,YScaleText[nPosYDiv]);}else if(hwndScrollBar == hWndScrollXDiv){

if(nPosXDiv>0)nPosXDiv--;

SetScrollPos(hWndScrollXDiv,SB_CTL,nPosXDiv,FALSE);horScale = XScaleDouble[nPosXDiv];InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);SetDlgItemText(hDlg,IDC_XDIV,XScaleText[nPosXDiv]);}else if(hwndScrollBar == hWndScrollFiltro){

Ifiltro++;

SetScrollPos(hWndScrollFiltro,SB_CTL,Ifiltro,FALSE);

Page 66: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 66I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);SetDlgItemText(hDlg,IDC_IFILTRO,itoa(Ifiltro,buffer,10));

}else{

yOffset -= 4;SetScrollPos(hWndScrollYOff,SB_CTL,yOffset,FALSE);InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);itoa(yOffset,charYOffset,10);SetDlgItemText(hDlg,IDC_YOFF,charYOffset);

}break;

case SB_LINEDOWN:if(hwndScrollBar == hWndScrollYDiv){

if(nPosYDiv>0)nPosYDiv--;

SetScrollPos(hWndScrollYDiv,SB_CTL,nPosYDiv,FALSE);vertScale = YScaleDouble[nPosYDiv];

if(atenuacion != 0)Vdivision=10*0.163/vertScale;

elseVdivision=0.163/vertScale;

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

SetDlgItemText(hDlg,IDC_YDIV,YScaleText[nPosYDiv]);}else if(hwndScrollBar == hWndScrollXDiv){

if(nPosXDiv<9)nPosXDiv++;

SetScrollPos(hWndScrollXDiv,SB_CTL,nPosXDiv,FALSE);horScale = XScaleDouble[nPosXDiv];InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

SetDlgItemText(hDlg,IDC_XDIV,XScaleText[nPosXDiv]);}else if(hwndScrollBar == hWndScrollFiltro){

if(Ifiltro > 0)Ifiltro--;

SetScrollPos(hWndScrollFiltro,SB_CTL,Ifiltro,FALSE);

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

SetDlgItemText(hDlg,IDC_IFILTRO,itoa(Ifiltro,buffer,10));

}else{

yOffset += 4;

Page 67: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 67I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

SetScrollPos(hWndScrollYOff,SB_CTL,yOffset,FALSE);InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);itoa(yOffset,charYOffset,10);SetDlgItemText(hDlg,IDC_YOFF,charYOffset);

}break;

}break;

case WM_CLOSE:DestroyWindow(hDlg);break;

case WM_COMMAND:switch(LOWORD(wParam)){

case IDC_ADQUIRIR:{

if(IsDlgButtonChecked(hDlg,IDC_40MSPS)==BST_CHECKED){

highspeed = TRUE;F_SAMPLE = 40;

}else{

highspeed = FALSE;F_SAMPLE = (double)(2.50);

}

if(highspeed == TRUE)Out32(CONTROL,Inp32(CONTROL)|4);//40MSPS

elseOut32(CONTROL,Inp32(CONTROL)&0xFB);//2.5MSPS

//Secuencia para que el PIC empieze a adquirir.Out32(CONTROL,Inp32(CONTROL)&0xF7);// pongo en '0' nSelect (para el PIC es '1')

Out32(CONTROL,(Inp32(CONTROL)|0x8));// pongo en '1' nSelect (para el PIC es '0')

Out32(CONTROL,Inp32(CONTROL)&0xF7);// pongo en '0' nSelect (para el PIC es '1')

GetSystemTime(&oldsystemtime);while((Inp32(STATUS)&0x80) == 0)// espera a que busy este a 1

{GetSystemTime(&systemtime);if(systemtime.wSecond >oldsystemtime.wSecond + 5)// espera 5 seg, si no responde aborta.{

MessageBox(NULL,"El Hardware noha respondido en 5seg., verifiqueque está conectado yencendido","Error",MB_OK);break;

}}

/*

Page 68: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 68I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

me fijo si el boton de X10 está apretado,si está actuo en la escala para reflejar elcambio*/

atenuacion = (Inp32(STATUS)&0x40);

if(atenuacion != 0)Vdivision = 10*0.163/vertScale;

elseVdivision = 0.163/vertScale;

for(x=0;x<NUM_SAMPLES;x++){

dato[x] = parallelrx();}

Out32(CONTROL,(Inp32(CONTROL)|0x8));// pongo en '1' nSelect (para el PIC es '0')InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

}break;

case IDC_LOAD:LoadFile();InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);break;

case IDC_SAVE:SaveToFile();break;

case IDOK:DestroyWindow(hDlg);return TRUE;break;

case EN_UPDATE :idEditCtrl = (int) LOWORD(wParam);// identifier of edit controlhwndEditCtrl = (HWND) lParam;// handle of edit control

switch(idEditCtrl){

GetDlgItemText(hDlg,idEditCtrl,buffer,5);

case IDC_EDIT_VERT:vertScale = atof(buffer);

break;

case IDC_EDIT_HORIZ:horScale = atof(buffer);

break;

case IDC_EDIT_OFFSVERT:middleYConst = atof(buffer);

break;}

break;

case IDC_INVERTIR:if(IsDlgButtonChecked(hDlg,IDC_INVERTIR) ==

BST_CHECKED)Invertir = -1;

elseInvertir = 1;

Page 69: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 69I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

break;

case IDC_ACTIVFILTRO:if(IsDlgButtonChecked(hDlg,IDC_ACTIVFILTRO) !=

BST_CHECKED){

IfiltroOld = Ifiltro;Ifiltro = 0;

}else{

if(IfiltroOld == 0)Ifiltro = 4;

elseIfiltro = IfiltroOld;

}InvalidateRgn(hWndMain,NULL,TRUE);UpdateWindow(hWndMain);

SetDlgItemText(hDlg,IDC_IFILTRO,itoa(Ifiltro,buffer,10));break;

}break;

} return FALSE;}

LRESULT CALLBACK PuertosProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

char buffer[10];

switch (message){

case WM_INITDIALOG:/* Inicializar los controles. */SetDlgItemText(hDlg,IDC_EDITLPT1,itoa(portLPT1,buffer,10));break;

case WM_CLOSE:DestroyWindow(hDlg);break;

case WM_COMMAND:switch(LOWORD(wParam)){

case IDOK:GetDlgItemText(hDlg,IDC_EDITLPT1,buffer,10);portLPT1 = atoi(buffer);DestroyWindow(hDlg);return TRUE;break;

}break;

} return FALSE;}

LRESULT CALLBACK CursoresProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

char buffer[10];

Page 70: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 70I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

switch (message){

case WM_INITDIALOG:appendTimeUnit(timeCur1,buffer);

//agrega las unidades al final de la cadena (nS,uS,mS)SetDlgItemText(hDlg,IDC_CUR1TIME,buffer);appendTimeUnit(timeCur2,buffer);

//agrega las unidades al final de la cadena (nS,uS,mS)SetDlgItemText(hDlg,IDC_CUR2TIME,buffer);appendTimeUnit(timeDiff,buffer);

//agrega las unidades al final de la cadena (nS,uS,mS)SetDlgItemText(hDlg,IDC_TIMEDIFF,buffer);break;

case WM_CLOSE:DestroyWindow(hDlg);break;

case WM_COMMAND:switch(LOWORD(wParam)){

case IDOK:GetDlgItemText(hDlg,IDC_EDITLPT1,buffer,10);portLPT1 = atoi(buffer);DestroyWindow(hDlg);return TRUE;break;

}break;

} return FALSE;}

void DrawGrid(HDC hDC, int Xmargin, int Vmargin){

double act_time= 0.000, times[11], voltajes[11] ;

/*Creo un nuevo pincel (newPen) gris para dibujar la grilla, y guardo el anterior enoldPen

*/unsigned int cnt2=0, sample=0,time_division=0,last_sample=0;HPEN newPen,oldPen,otherPen;RECT rect;int x=0,index=0,k=0;unsigned char cnt=0;char time_buf[10],time[10],volts[10],strVmedio[20];int point=0;int sign=0;int digits=4;char time_buffer[10];double sum=0,stddev=0;

newPen = CreatePen(PS_SOLID,1,RGB(120,120,120));oldPen = (HPEN)SelectObject(hDC,newPen);otherPen = CreatePen(PS_SOLID,1,RGB(160,160,160));

/*Obtengo las medidas de la ventana

*/GetClientRect(hWndMain,&rect);

largo = rect.right - rect.left - 2*Xmargin;ancho = rect.bottom - rect.top - 2*Vmargin;

middleX = largo/2;middleY = ancho/2;deltaX = largo/10;deltaY = ancho/10;

Page 71: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 71I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

offsetY = ancho*vertScale/255;SetBkMode(hDC, TRANSPARENT);SetTextColor(hDC,RGB(150,150,150));

for(x=0;x<11;x++){

if((x == 5)|(x == 0)|(x == 10))newPen = (HPEN)SelectObject(hDC,otherPen);

if((x == 6)|(x == 1)|(x == 11))otherPen = (HPEN)SelectObject(hDC,newPen);

MoveToEx(hDC,x*deltaX+Xmargin,Vmargin,NULL); // 11 lineas verticalesLineTo(hDC,x*deltaX+Xmargin,rect.bottom-Vmargin);

MoveToEx(hDC,Xmargin,deltaY*x+Vmargin,NULL); // 11 lineas horizontalesLineTo(hDC,rect.right-Xmargin,deltaY*x+Vmargin);

// guardo las posiciones de las lineas horizontales y verticales, son// 11 cada una

horLines[x] = x*deltaX+Xmargin;vertLines[x] = x*deltaY+Vmargin;times[x] = 1000*(m+(horLines[x]-Xmargin)/horScale)/F_SAMPLE;

}

for(x=0;x<5;x++)voltajes[x] = Vdivision*(5-x);

for(x=0;x<5;x++)voltajes[10-x] = -1*voltajes[x];

SelectObject(hDC,oldPen);DeleteObject(newPen);DeleteObject(oldPen);DeleteObject(otherPen);

// dibujo la señal en verde

newPen = CreatePen(PS_SOLID,1,RGB(0,255,64));oldPen = (HPEN)SelectObject(hDC,newPen);

/*Escalado vertical y paso a un entero de 16 bits porque no me da con uno de 8bits.

*/

for(x=0;x<NUM_SAMPLES;x++){

intdato[x] = (-Invertir*127 + Invertir*dato[x])*offsetY + middleY + Vmargin +yOffset - 12;

/* Esta parte del codigo elimina los saltos muy grandes en la señal que son un defecto del equipo. */

if ((dato[x] > (dato[x-1]+50)) | (dato[x] < (dato[x-1]-50)) )intdato[x] = intdato[x-1];

}

intdato[0] = intdato[1];

//filtroint tempsum,i;

if(Ifiltro != 0){

for(x=0;x<NUM_SAMPLES;x++)

Page 72: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 72I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

{tempsum = 0;

for(i=0;i<Ifiltro;i++)tempsum += intdato[x+i];

intdato[x] = tempsum/Ifiltro;}

}

MoveToEx(hDC,Xmargin,intdato[m],NULL);

for(x=m;x<(NUM_SAMPLES-Ifiltro); x++){

temp = (double)(x-m)*horScale;

if(temp > largo) // corta al final de la pantalla en forma horizontalbreak;

LineTo(hDC,Xmargin+temp,intdato[x]);}

for(i=0;i<11;i++){

if((m==0)&(i==0)){

TextOut(hDC,horLines[i] - 6*digits ,rect.bottom-20,"0.000nS",strlen("0.000nS"));

}else{

appendTimeUnit(times[i],time);TextOut(hDC,horLines[i] - 6*digits ,rect.bottom-20,time,strlen(time));

}

if((i==5))TextOut(hDC,4,(rect.bottom/2) - 7," 0.00mV",strlen(" 0.00mV"));

else{

appendVoltUnit(voltajes[i],volts);TextOut(hDC,5,vertLines[i] - 7,volts,strlen(volts));

}}

SelectObject(hDC,oldPen);DeleteObject(newPen);DeleteObject(oldPen);

return;}

void SaveToFile(){

FILE* pfile;

if((pfile = fopen("C:\salida.dat","wb")) == NULL){

MessageBox(NULL,"No se puede crear el archivo","Error...",NULL);return;

}

fwrite(&atenuacion,sizeof(int),1,pfile);fwrite(&highspeed,sizeof(int),1,pfile);fwrite(&dato,NUM_SAMPLES*sizeof(char),1,pfile);

fclose(pfile);

Page 73: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 73I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

return;}

void LoadFile(){

unsigned int i=0;FILE* pfile;

if((pfile = fopen("C:\salida.dat","rb")) == NULL){

MessageBox(NULL,"No se puede crear el archivo","Error...",NULL);return;

}

fread(&atenuacion,sizeof(int),1,pfile);fread(&highspeed,sizeof(int),1,pfile);fread(&dato,NUM_SAMPLES*sizeof(char),1,pfile);

if(atenuacion != 0)Vdivision = 10*0.163;

elseVdivision = 0.163;

if(highspeed == TRUE)F_SAMPLE = 40;

elseF_SAMPLE = (double)(2.50);

fclose(pfile);

return;}

void double2str(double valor,char* cadena){

int digits = 5;int point=0;int sign=0;char temp[20];char i,k=0;

strcpy(cadena,"Vmed = ");strcpy(temp,_ecvt(valor,digits,&point,&sign));

i = strlen(cadena)-1;

while(point-- > 0){

cadena[i++] = temp[k++];}

cadena[i++] = '.';

while((digits-point) > 0){

cadena[i++] = temp[k++];digits--;

}

cadena[i] = '\0';}

void appendTimeUnit(double time, char *time_buf){

int point=0;int sign=0;int digits=4;int index=0;char time_buffer[10];char time_temp[10];

Page 74: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 74I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

int k=0,mult=1;

if(time < 0)mult = -1; // para manejar el valor absoluto...

if(mult*time > 1000){

time /= 1000;strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"uS");

}else if(mult*time > 1000000){

time /=1000000;strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"mS");

}else{

strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"nS");

}

k=0;

while(point>0){

time_buf[k] = time_temp[k];k++;point--;

}

time_buf[k++] = '.';

index = digits - point;

index++;while(index-->0){

time_buf[k] = time_temp[k-1];k++;

}

time_buf[k] = '\0';

if(time < 0)strcpy(time_temp,"-");

elsestrcpy(time_temp," ");

strcat(time_temp,time_buf);

strcpy(time_buf,time_temp);}

void appendVoltUnit(double time, char *time_buf){

int point=0;int sign=0;int digits=3;int index=0;char time_buffer[10];char time_temp[10];int k=0,mult=1;

if(time < 0)mult = -1; // para manejar el valor absoluto...

Page 75: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 75I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

if(mult*time > 1){

strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"0V");

}else{

time *=1000;strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"0mV");

}

k=0;

while(point>0){

time_buf[k] = time_temp[k];k++;point--;

}

time_buf[k++] = '.';

index = digits - point;

index++;while(index-->0){

time_buf[k] = time_temp[k-1];k++;

}

time_buf[k] = '\0';

if(time < 0)strcpy(time_temp,"-");

elsestrcpy(time_temp," ");

strcat(time_temp,time_buf);

strcpy(time_buf,time_temp);}

void appendHertzUnit(double time, char *time_buf){

int point=0;int sign=0;int digits=6;int index=0;char time_buffer[20];char time_temp[20];int k=0, mult=1;

if(time < 0)mult = -1;

time /=1000;

time = mult/time;

if(time <= 1){

time *= 1000;

Page 76: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 76I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"KHz");

}else if(time > 1){

strcpy(time_temp,_ecvt(time,digits,&point,&sign));strcat(time_temp,"MegHz");

}

k=0;

while(point>0){

time_buf[k] = time_temp[k];k++;point--;

}

time_buf[k++] = '.';

index = digits + 5 - point;

index++;while(index-->0){

time_buf[k] = time_temp[k-1];k++;

}

time_buf[k] = '\0';

if(time < 0)strcpy(time_temp,"-");

elsestrcpy(time_temp," ");

strcat(time_temp,time_buf);

strcpy(time_buf,time_temp);

}

void DrawCursors(HDC hdc, int Yfinal){

HPEN newPen, oldPen;

newPen = CreatePen(PS_SOLID,1,RGB(200,200,200));oldPen = (HPEN)SelectObject(hdc,newPen);

MoveToEx(hdc,Xcur1,40,NULL);LineTo(hdc,Xcur1,Yfinal);

MoveToEx(hdc,Xcur2,40,NULL);LineTo(hdc,Xcur2,Yfinal);

SelectObject(hdc,oldPen);DeleteObject(newPen);DeleteObject(oldPen);

}

Page 77: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 77I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Apendice CListado del Software del Microcontrolador PIC

/*Firmware para DSO View (Osciloscopio de Almacenamiento Digital para PC porpuerto paralelo),contiene rutinas de control del Hardware

Autor: Robert Perez ([email protected])

Fecha: 08/01/2005

Instituto Tecnológico Superior de Electrónica y Electrotecnia (I.T.S)MONTEVIDEO-URUGUAY

*/

#pragma char ADCON1 @ 0x9F#pragma config = 0x3F62

bit hsclk_en @ PORTB.0; /* OUTPUT */bit nOE_WE @ PORTB.1; /* OUTPUT Lectura/escritura de la SRAM */bit start_conv @ PORTB.2; /* INPUT Inicia la conversion */bit gain_ctrl @ PORTB.3; /* INPUT Control de ganancia ACTUALMENTE

NO SE USA*/bit read_clk @ PORTB.4; /* OUTPUT genera el clk de lectura.*/bit ls_encode @ PORTB.5; /* OUTPUT low speed encode. */bit powerdown @ PORTB.6; /* OUTPUT POWERDOWN para el ADC */bit datastb @ PORTB.7; /* INPUT Señal del puerto paralelo Auto

Line Feed... */bit nAck @ PORTA.0; /* OUTPUT ACTUALMENTE NO SE USA, ESTA

CONECTADO AL CONTROL DE GANANCIA*/bit nInit @ PORTA.1; /* INPUT */bit n2PC @ PORTA.2; /* OUTPUT Habilita el 74245 para la PC*/bit wait @ PORTA.3; /* OUTPUT Señal del puerto paralelo,

nBusy... */bit tc2cnt @ PORTA.4; /* INPUT */

void ResetCnt(void){/* ls_encode = 1; // deshabilito el encode, es solo para

incrementar el contadorread_clk = 0;

while(tc2cnt == 0)read_clk = !read_clk;

while(tc2cnt == 1)read_clk = !read_clk;

read_clk = 0;ls_encode = 0;

*/

unsigned char cnt;

#asmBCF 0x03,RP0BCF 0x03,RP1BSF 0x06,ls_encodeBCF 0x06,read_clk

m001BTFSC 0x05,tc2cnt

Page 78: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 78I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

GOTO m002

MOVLW .16XORWF PORTB,1GOTO m001

m002BTFSS 0x05,tc2cntGOTO m003

MOVLW .16XORWF PORTB,1GOTO m002

m003BCF 0x06,ls_encodeBCF 0x06,read_clk

#endasm

cnt = 10; // me salteo las primeras 10 muestras

while(cnt != 0){

read_clk = !read_clk;read_clk = !read_clk;cnt--;

}}

void Delay1mS(){

unsigned char cnt,cnt2=2;

while(cnt2 != 0){

cnt = 0xFF;while(cnt != 0){

nop();nop();nop();cnt--;

} // aprox. 10 ciclos * 255 * 0.4uS = 1020uScnt2--;

}}

void Adquirir40MSPS(){

ResetCnt();nOE_WE = 1; // write...

hsclk_en = 1; // here we gooooo !!!/*

while(tc2cnt == 0);

*/#asmloop:

BTFSS PORTA,4 ; tc2cntGOTO loop

#endasm

hsclk_en = 0; // sin reloj de 40}

Page 79: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 79I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

void Adquirir2_5MSPS(){

unsigned char cnt,cnt2;

ResetCnt();nOE_WE = 1; // write...

hsclk_en = 0; // sin reloj de 40

cnt = 0xFF; //256*(128/2)*2=32768cnt2 = 2;

read_clk=0;

// read_clk = RB5#asm

MOVLW 0b0001.0000 // dejo todos los pines del PORTB iguales menos RB5 que lo hago subir y bajar.

next:XORWF PORTB,F // 128*2 veces para completar 128 ciclos

de relojXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

Page 80: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 80I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

Page 81: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 81I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

XORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,FXORWF PORTB,F

DECFSZ cnt2,FGOTO next

DECFSZ cnt,FGOTO next

#endasm}

/* Transmite un byte al LPT de la PC con el protocolo EPP */void epptx(){/*

wait = 0;while(datastb == 1)

;

wait = 1;

while(datastb == 0);

*/

#asmBCF PORTA,waitNOP

m001:BTFSC PORTB,datastbGOTO m001

Page 82: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 82I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

BSF PORTA,waitNOP

m002:BTFSS PORTB,datastbGOTO m002

#endasm}

void Inicializar(){

/*Setear los Puertos, timers, interrupciones, etc.....

*/

ADCON1 = 0x06; /* PORTA es todo digital I/O, con otros valores podemos definir algunas entradas analogicas

para usar el ADC interno*/

TRISA = 0b1111.0010;TRISB = 0b1000.1100;

powerdown = 1; /* El ADC arranca deshabilitado (output en HI-Z).*/

ls_encode = 0; /* Reloj del ADC arranca en 0. */n2PC = 1; /* No se transmite nada a la PC */read_clk = 0;GIE = 0; /* deshabilitar interrupciones */hsclk_en = 0; /* todavía nada de clocks...*/

}

void EnviarMuestras(){

ResetCnt();

nOE_WE = 0; // lectura

while(tc2cnt == 0){

read_clk = !read_clk;read_clk = !read_clk;epptx();

}}

void main(){

unsigned char cnt,cnt2;

Inicializar(); // Setear los registros TRIS y deshabilitar// interrupciones.

while(1){

loop:if(start_conv == 0)

goto loop;

loop2:if(start_conv == 1)

goto loop2;

loop3:

Page 83: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 83I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

if(start_conv == 0)goto loop3;

powerdown = 0; // Habilitar el ADC

if(nInit == 1)Adquirir40MSPS();

elseAdquirir2_5MSPS();

powerdown = 1; // Mandar el ADC al modo de bajo consumo, tambien// pone sus salidas en Hi-Z

// mandar unos ls_encode antes de seguir para asegurar el powerdown.

read_clk = 1;cnt = 40;while(cnt != 0){

ls_encode = !ls_encode;cnt--;

}ls_encode = 0;read_clk = 0;

n2PC = 0; // pasa todo a la PC.EnviarMuestras();n2PC = 1; // no sale nada hacia la PC, estoy almacenando...

}

return;}

Page 84: Digital Storage Oscilloscope (osciloscopio de almacenamiento digital)

Proyecto Final “DSO para PC” Robert Pérez

Página 84I.T.S Montevideo-Uruguay Prof.: Pablo Fosatti

Referencias

1) https://www.cs.tcd.ie/courses/baict/bac/jf/labs/scope/oscilloscope.html Diagramas en bloques y explicación detallada de Osciloscopios.

2) Understanding Flash ADCs3) Understanding Pipelined ADCs4) Understanding SAR ADCs5) Understanding Sigma-Delta ADCs6) Understanding Integrating ADCs Todos los links están en la pagina principal http://www.maxim-ic.com/tarticle/article.cfm

7) SIGMA-DELTA (SD) MEASUREMENT ADCS

8) An Introduction to the Sampling Theorem National Semiconductor Application Note 236

9) Introducción a los sistemas de comunicaciones F.G. Stremler

10) The Scientist and Engineer's Guide to Digital Signal Processing (Moving Average Filters)