universidad autÓnoma metropolitana148.206.53.84/tesiuami/uami11167.pdf · de sodio y potasio, ......

Download UNIVERSIDAD AUTÓNOMA METROPOLITANA148.206.53.84/tesiuami/UAMI11167.pdf · de sodio y potasio, ... iónico, su conductancia está dada por la Ley de Ohm. Cuando la célula excitable

If you can't read please download the document

Upload: lekhanh

Post on 07-Feb-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • UNIVERSIDAD AUTNOMAMETROPOLITANA

    Unidad: Iztapalapa Divisin: CBIGrado: Licenciatura en Ingeniera Biomdica

    Ttulo del Proyecto:

    Desarrollo de un Paquete de Cmputo para laAdquisicin de Seales Bioelctricas a Nivel Celular,

    Basado en la Tarjeta de Adquisicin NationalInstruments.

    Nombre del alumno:

    David Alejandro Velasco Navarrete 93223080

    Nombre y firma del profesor:

    J. Rafael Godnez Fernndez

    Lugar de realizacin del proyecto: Laboratorio de Biofsica

    Fecha de realizacin: 28 de Julio de 2004

  • 2

    NDICE

    Objetivo general 3Objetivos especficos

    Justificacin 3Equipo utilizado 4Introduccin 5

    Potenciales BioelctricosConceptos bsicos de LabWindows / CVI 10

    Sistema Operativo WindowsGUIEvent Handler y Funciones Callback

    Desarrollo y pasos realizados 14Resultados 22Observaciones 36Conexiones en el conector SH6850 38Conclusiones 38Cdigo fuente 39

    estimulador.cestimulador.uir

    Apndice A 79Especificaciones de la tarjeta PCI-MIO-16E-1

    Apndice B 86Pseudocdigo del programa

    Bibliografa 89

  • 3

    OBJETIVO GENERAL

    Desarrollar un sistema de estimulacin y adquisicin de sealeselectrofisiolgicas a nivel celular, empleando la tarjeta de adquisicin de datosNational PCI-MIO 16E1 y el software LabWindows/CVI

    OBJETIVOS ESPECFICOS

    Disear un programa que genere seales compuestas por cuatrosegmentos en el cual cada uno de estos pueda variarse tanto en amplitudcomo en duracin, para poder adaptarse a los protocolos de estimulacin.

    Utilizar los canales de salida y entrada analgica para realizar laestimulacin y la adquisicin de datos de manera sncrona.

    Graficar la respuesta de las clulas debido a los estmulos aplicados ycoherentes a las relaciones DAC y ADC correspondientes a los parmetrosdel amplificador utilizado .

    Realizar el almacenamiento de los parmetros de la estimulacin y losdatos adquiridos en formato ASCII y binario para su posteriorprocesamiento e interpretacin.

    JUSTIFICACIN

    La razn principal de realizar dicho proyecto es la de ayudar al rea de lainvestigacin, construyendo un instrumento virtual capaz de realizar estimulaciny adquisicin sncrona . Con la ventaja de que al ser el sistema digital sedisminuyan los errores de precisin y artefactos de ruido que introducen lossistemas analgicos, adems de contar con una interfaz grfica que haceinteractuar al usuario de una manera fcil y rpida. Adems de graficar laestimulacin y adquisicin con los parmetros del amplificador utilizado en elexperimento coherente con los valores de corriente y voltaje utilizados en lasclulas.

    La programacin se realiza usando el software LabWindows /CVI de la tarjetaNational , que es un ambiente de programacin interactiva de C.

    El Compilador utilizado en este proyecto es parte de LabWindows/CVI deNational Instruments versin 5.0, adems es compilador de ANSI C, contienebibliotecas escritas para el anlisis de datos, interfaz de instrumentacin einterfaz de usuario grficos (GUI). La razn de utilizar estas bibliotecasadicionales es por que el ANSI C es muy limitada, en particular en programacin

  • 4

    sobre Windows, ya que el ambiente basado en la ANSI C no incluye rdenes degrficos.

    Con interfaz de usuario grfica los programas son ms atractivos y fciles deusar.

    Con LabWindows/CVI, se pueden desarrollar programas sin grandes detalles decompilacin. El recopilador incorporado del ANSI C compila y liga el proyectopara que funcione el programa.

    Otro elemento dominante en LabWindows/CVI que hace la programacin de Cms fcil es por que cuenta con un panel de funcin. Un panel de funcin es unarepresentacin grfica de funciones de la biblioteca, adems de contar conobjetos grficos (mandos, controles e indicadores) diseados especialmente parasistemas de instrumentacin. Se pueden disponer de perillas, grficos, botones,mens desplegables, etc. Cada control e indicador tienen la funcionalidad derepresentar datos tcnicos en una manera familiar y cientfica.

    EQUIPO UTILIZADO

    Computadora PC con Windows 98.Cable conector SH6850.Tarjeta de conversin digital National Instruments PCI-MIO-16E-1.Software Labwindows / CVI version 5.0.Software de adquisicin de datos NIDAQ versin 6.1.Amplificador marca Axons Instruments, modelo AXOPATCH 200A.Generador de funciones.Osciloscopio.

  • 5

    INTRODUCCIN

    Este sistema es diseado para realizar estudios sobre el comportamiento elctricode las clulas ante diferentes caractersticas de estimulacin con pulsosgenerados que varan tanto en amplitud como en tiempo.

    El registro de la respuesta celular consiste en adquirir la diferencia de potencial olas corrientes transmembranales generadas en la clula como consecuencia delos pulsos de estimulacin aplicados.

    Se desarrollar el sistema de generacin de pulsos para la estimulacin de lasclulas en base al software Labwindows/CVI en el cual se podrn seleccionar ymodificar los parmetros del pulso de estimulacin, para poder registrar de formasncrona la respuesta celular.

    Los estmulos generados y el registro de las respuestas elctricas de las clulasse realizar a travs de los convertidores digital-analgico DAC y analgico-digital ADC de la tarjeta de adquisicin y procesamiento de datos PCI-MIO-16E-1de National Instruments.

    A continuacin se menciona una resea del origen de los potencialesbioelctricos .

    Potenciales Bioelctricos

    Los potenciales bioelctricos son voltajes inicos producidos como resultado de laactividad electroqumica de ciertos tipos especiales de clulas, denominadasexcitables (nerviosas, musculares, glandulares, etc.)

    Las propiedades elctricas de las clula excitables son producto de lascaractersticas biofsicas de las membranas celulares. Las membranas celularesestn constituidas por una bicapa lipdica y protenas de membrana.

    Algunas protenas de membrana funcionan como transportadores y canalesinicos. Los transportadores estn distribuidos en todas las clulas, excitables yno excitables; el transportador ms comn es la bomba de Na+/K+.

    Sin embargo, nicamente las clulas excitables presentan canales inicos quenormalmente se encuentran cerrados, pero que se abren al registrar las clulasun voltaje umbral. A los canales inicos que se abren por voltaje se les denominavoltaje dependientes. La propiedad de las clulas excitables de generar una

  • 6

    diversidad de potenciales de accin es producto de la forma en que se abren ycierran los canales inicos por el voltaje de la membrana celular.

    El estudio del comportamiento (apertura o cierre) de los canales inicos con elvoltaje de membrana es importante en el estudio del funcionamiento celular, yaque la actividad elctrica en forma de potenciales de accin comanda lasrespuestas celulares en las clulas excitables. Por ejemplo, los potenciales deaccin en las clulas: musculares genera la contraccin, nerviosas permite lacomunicacin interneuronal, glandulares permite la liberacin de hormonas, etc.

    El potencial de membrana (Vm) o potencial de reposo es la diferencia depotencial entre uno y otro lado de la membrana, debido a la distribucinasimtrica de las cargas elctricas, la cual a su vez es el resultado de ladiferencia de concentracin inica determinada por el transporte activo y por lapermeabilidad selectiva de la membrana. En general se acumula un exceso deiones negativos dentro de la membrana celular, y un nmero igual de ionespositivos (cationes) inmediatamente fuera de la misma. El resultado es eldesarrollo de un potencial de membrana y cuando el flujo neto de iones es cero,es decir, cuando la membrana se encuentra en reposo, se dice que estapolarizada.

    Se ha comprobado que el potencial de membrana en reposo vara generalmenteentre 50 a 90 mV.

    Existen tres aspectos importantes por medio de los cuales pueden desarrollarsepotenciales de membrana en la clula:

    Transporte activo de iones a travs de la membrana, mediante las bombasde sodio y potasio, el sodio es impulsado hacia el exterior y el potasiohacia el interior.Difusin de iones a travs de la membrana, como consecuencia de losgradientes qumico y elctrico entre ambos lados de la misma y de lapermeabilidad para cada in.Dentro de las clulas existen aniones que no pueden salir por que sonmolculas grandes, e iones de protena que colaboran con la diferencia depotencial existente en la membrana.

    Comportamiento elctrico de la membrana

    Existe una diferencia de potencial entre el interior y exterior de clulas. Ladiferencia de potencial a travs de una clula relaciona el potencial del interior dela clula con el de la solucin externa, que, segn la convencin comnmenteaceptada, es cero. Las diferencias de potencial entre dos puntos que sonseparados por un aislador son ms grandes que las diferencias entre estos

  • 7

    puntos separados por un conductor. As, la membrana bilipdica, que es unaislador bueno, tiene una diferencia de potencial.

    Modelo elctrico de la membrana celular.

    La conductancia G en unidades siemens( ) es el inverso de la resistencia R enohms( ), as la resistencia infinita indica una conductancia cero. Cuando varioscanales inicos de la membrana celular son abiertos simultneamente, el total dela conductancia es simplemente la suma de las conductancias de los canalesindividuales abiertos.

    Fig. 1. Suma de Conductancias.

    En la figura 1 se representan dos resistencias en paralelo, con la mismaconductancia G que modelan el estado abierto de dos canales inicos. Lasconductancias en paralelo se suman.

    La ley de Ohm relaciona el voltaje, la resistencia lineal y la corriente a travs delresistor:

    dV = IR = I/G (volts)

  • 8

    Fig. 2. Circuito equivalente que describe las propiedades pasivas de las membranas celulares. En(b) el circuito consta de una resistencia (Rm) en serie con una batera(Vr), ambos conectados enparalelo con un capacitor (Cm). Cuando se aplica una corriente Im sta se divide en dos, unacapacitiva(Ic) y otra inica(Ii). La corriente Im ocasiona que el potencial Vr se modifique al valorVm con un curso temporal exponencial cuya constante de tiempo, tm, es igual al producto Rm*Cm .En (a) se representan los componentes estructurales de la membrana y su anlogo elctrico. Elcomportamiento capacitivo est dado por la bicapa lipdica (bl) y el resistivo por los canales de lamembrana(ci). El potencial de reposo est indicado en (b) por la batera Vr.Al inyectar la corriente Im se ocasiona un cambio en el potencial de membrana, similar alproducido en el circuito equivalente.

    Las propiedades elctricas de las clulas se pueden representar por un circuitoRC en paralelo, en donde R representara la resistencia total de la membrana y Cla capacitancia de la membrana. La capacitancia C es producto de laspropiedades dielctricas de la bicapa lipdica. La resistencia R est dada por elestado abierto o cerrado de los canales inicos. En es te caso, es mejor hablar dela conductancia G. Como se coment, G es la suma de la conductancia Gi decada canal inico en estado abierto. La resistencia es infinita en el estado cerradode los canales inicos y su conductancia G es cero. Cuando se abre un canalinico, su conductancia est dada por la Ley de Ohm.

    Cuando la clula excitable presenta el voltaje de reposo, los canales voltajedependientes se encuentran cerrados y la conductancia G es cero. Cuando elvoltaje de membrana disminuye hasta un voltaje umbral se abren los canalesinicos cuyas conductancias Gi se suman. Se abren diferentes poblaciones decanales inicos, que son selectivos para el paso de una especie inica como los

  • 9

    de Na+ (canales de sodio), K+ (canales de potasio), Ca++ (canales de calcio), etc.dependiendo del tipo celular. La apertura de los canales depende del voltajecomo ya se coment, pero tambin del tiempo.

    Una vez abiertos los canales inicos, se producen corrientes inicas (de Na+, K+,etc.) movindose los iones de acuerdo a su gradiente electroqumico (fuerzaimpulsora) produciendo los potenciales de accin, que son cambios bruscos en elpotencial de membrana pasando de un valor negativo a positivo.

    El estudio de los canales inicos es importante, ya que en las clulas excitables,la actividad elctrica comanda la funcin celular como ya se coment. Existen dostcnicas fundamentales para el estudio de los canales inicos: La Tcnica deFijacin del Voltaje y la Tcnica de Fijacin de Corriente. En ambas tcnicas, seemplean protocolos de estimulacin y, de manera simultnea, se adquieren lasrespuestas elctricas de las clulas. Es crtico en esta parte experimental contarcon un sistema de estimulacin y de adquisicin de seales. El sistema consta detarjetas de conversin A/D y D/A as como del Software de control de la tarjeta yde anlisis de las seales adquiridas. Existen diversos sistemas en el mercadoque son apropiados en la mayora de los casos. Sin embargo, presentan algunaslimitaciones en cuanto a la diversidad de protocolos de estimulacin que puededesarrollar el usuario, ancho de banda limitado y en algunos casos, pocaamabilidad con el usuario.

    Fig. 3. En la tcnica de fijacin de voltaje, por medio de un microelectrodo y el amplificador A1 semide el potencial de membrana Vm de la clula (Ce), ste potencial de membrana se compara enel amplificador A2 con el voltaje comando o de fijacin que define el usuario, la salida amplificadadel segundo amplificador va ha inyectar corriente a la clula hasta que la diferencia entre estosdos voltajes sea cero.

    En el presente proyecto se disea y construye un sistema que cubre algunas delas limitaciones mencionadas como son: seleccin de una tarjeta de conversinapropiada (mayor ancho de banda), creacin del software de control de la tarjeta

  • 10

    que contiene los protocolos de estimulacin de los paquetes que se ofrecen en elmercado y mayor facilidad de manejo por el usuario. Adems, por contar con losprogramas fuente, con cambios pequeos en el programa se pueden generar unagran diversidad de protocolos de estimulacin y adquisicin de las seales. Porltimo, dado que los programas de anlisis son complicados, el formato en que sealmacenan los datos permite emplear el software del mercado que se encuentralibre en la red.

    CONCEPTOS BSICOS DE LABWINDOWS / CVI

    Como se mencion anteriormente LabWindows/CVI simplifica la programacinconducida por acontecimiento al responder a una interfaz de usuario grfica(GUI). Estos programas se destacan por la facilidad en la demostracin de datos yel control en la ejecucin de programa . Los programas que controlan este GUISson muy diferentes a el tradicional basado en DOS.

    Cada objeto de GUI tiene su propia seccin de cdigo de C (funcin deretrollamada) que automticamente es ejecutado siempre que el control esmanejado, por lo tanto, los programas de C son simplemente una coleccin defunciones que son asociados con cada uno de los GUI.

  • 11

    Sistema Operativo Windows

    Windows es un sistema operativo multi tareas que usa una interfaz de usuariogrfica (GUI), en el cual mltiples tareas pueden ejecutarse al mismo tiempo .

    La multitarea bajo Windows implica la divisin de la CPU para la realizacin devarios procesos. En una aplicacin basada en Windows, las ventanas son el mtodo primario decomunicar la informacin de la aplicacin al usuario. Asimismo el usuario usa laventana para comunicarse con la aplicacin, alcanzando el comportamientodeseado para lograr una tarea determinada,

    El ambiente de Windows es un sistema basado por mensajes. Los mensajescontienen informacin sobre el tipo de acontecimiento, como su tipo, el tiempo enel cual ocurri, y hacia donde fue dirigido.

    Cuando una aplicacin en Windows es comenzada, el programa comienza en unpunto de entrada en el cdigo. Este punto de entrada es una funcin al que sellama WinMain, mientras que en LabWindows/CVI se llama RunUserInterfaz. Laaplicacin entonces crea un o ms ventanas. Cada ventana contiene unprocedimiento que es responsable de los datos de entrada a los que responde elusuario.

    GUI

    El elemento fundamental de un GUI en Labwindows/CVI es llamado el Panel, acada panel utilizado se le asocia un nombre de constante que al ser ejecutado elprograma se identificaran rpidamente.

    Event Handler y Funciones Callback

    El Event Handler est vigilando continuamente los acontecimientos que elusuario genera al mover el ratn o al presionar una tecla.

    El Event Handler procesa los acontecimientos del usuario aplicando algunasreglas muy simples. Primero determina "donde" el acontecimiento ha sido creado,se obtiene el nombre de panel donde el acontecimiento ocurri. Entoncescomprueba si el panel tiene algn procedimiento, en LW se conoce como unafuncin de retrollamada (Callback), asociada con ello.

  • 12

    Si el Event Handler no encuentra una funcin de Callback asociada con el panel,simplemente lo ignora y checa el prximo evento a ocurrir, en caso deencontrarse una funcin Callback se procesa el evento asignado.

    Aunque el nombre de funcin Callback parezca intimidante, la estructura de estafuncin sigue el estndar de el lenguaje C, esto es, tiene una declaracin defuncin, cabecera y cuerpo. El cuerpo de funcin por lo general es unadeclaracin para realizar un acontecimiento en particular. La funcin Callbackslo procesa acontecimientos vlidos.

    Qu es un acontecimiento vlido?

    A los acontecimientos de usuario vlidos son llamados eventos "COMMIT" : escuando el usuario pulsa con el botn izquierdo del ratn u oprime la tecla ENTER.

    Cuando un acontecimiento de usuario es recibido, el Event Handler de LWejecuta los pasos siguientes:

    Primero, LW determina el nombre del panel donde el acontecimientoocurri.Despus, LW comprueba si una funcin callback ha sido asociada con elpanel particular para realizar el acontecimiento. Si ninguna funcin decallback ha sido asociada con el panel donde el acontecimiento de usuarioocurri, esto es ignorado y LW vuelve al Event Handler y espera el prximoacontecimiento a ocurrir.

    Si una funcin de callback ha sido asociada con el panel, LW entra en elloy comienza a realizar el acontecimiento de usuario.

    Primero la funcin de callback determina si el acontecimiento de usuario esvlido. Un acontecimiento vlido es el que cae en la categoraEVENT_COMMIT, esto es , oprimir con el boton izquierdo del ratn alpresionar la tecla ENTER. Los acontecimientos que no caen en lacategora EVENT_COMMIT son ignorados y LW vuelve al event handler yespera el acontecimiento de usuario siguiente para ocurrir.

    Finalmente, cualquier cdigo adicional en la funcin de callback esejecutado y despus, LW regresa al event handler y espera otroacontecimiento de usuario.

  • 13

    Fig. 5.

    Fig. 6. Diagrama General de un programa realizado en Labwindows /CVI

  • 14

    DESARROLLO

    Las caractersticas y requerimientos del programa consisten en lo siguiente:

    Dividir el pulso de estimulacin en cuatro segmentos.Poder variar los valores tanto en amplitud como en tiempo de cadasegmento.Poder seleccionar el nmero de iteraciones.Despus de la generacin de cada pulso, se deben tener tiempos deespera entre cada uno de ellos, los cuales deben ser seleccionados por elusuario.Se debe poder aumentar en ganancia el valor de cada segmento despusde cada iteracin.Realizar la estimulacin y adquisicin de la respuesta celular de manerasncrona.Obtener la respuesta celular para que sea graficada y tener la posibilidadde poder almacenar los datos en formato ASCII Binario.

    PASOS REALIZADOS

    La realizacin del proyecto comenz dividindose en varios pasos:

    Lo primero que se realiz fue instalar el software Labwindows / CVI en la PC.

    Seguidamente se instal la tarjeta de conversin digital PCI MIO 16E-1 en lasranuras de expansin con las que cuenta la tarjeta madre de la PC utilizada.

    Teniendo instalada la tarjeta se procedi a instalar el software NIDAQ.Al no contar con el cable original de 68 pines de ambos lados de la conexin seutiliz el cable conector SH6850 que realiza la misma funcin, nada ms que de unlado del conector tiene 68 pines y del otro 50, en ste cable se unenautomticamente las tierras de los canales de entrada, y en otra se unen lastierras de los canales de salida, por esta razn el # de pines es menor en unconector que en el otro. Se realiz la correspondencia de los pines de un cablehacia el otro y se procedi a conectarlo a la tarjeta de adquisicin.

    Para realizar nuestra aplicacin en LabWindows /CVI se necesitaron de treselementos bsicos, los cuales se integran en un proyecto.

  • 15

    El proyecto se compone de:

    Interfaz grfica de usuario (estimulador.uir).Programa de control que coordina la adquisicin, el anlisis y la interfaz,dicho programa se realiza en lenguaje C (estimulador.c)Archivo en el cual se introducen los prototipos de las funciones(estimulador.h).

    Los tres se adicionan a un solo archivo de proyecto (estimulador.prj),

    A continuacin se muestra un ejemplo de una ventana de proyectos

    En la interfaz grfica de usuario se realiza:

    Edicin de atributos: Estando en el GUI con la herramienta de edicin activadaseleccionaremos mediante doble click en el atributo o campo que queramosmodificar.Los atributos mas importantes son:

    CONSTANT NAME: Variable con el que se conocer dentro del programa. Poner todo en maysculas p.ej ADQUIRIR

    CONTROL MODE: Normal, Indicator o Hot

    CALLBACK FUNCTION: Funcin asociada al evento. Poner el constant name y solo la 1 en maysculas p.ej. Adquirir

    LABEL: Etiqueta con la que aparecer en la interfaz grfica.

    A continuacin se presenta la edicin de un control llamado Adquirir.

  • 16

    Grficamente:

    La realizacin del proyecto se llevo a cabo de la siguiente manera:

    1.- Se comenz con la interfaz grfica de usuario (uir), en ella se seleccion unpanel, en el cual se le van agregando poco a poco los elementos, como controles,botones, graficas, casillas de entrada de datos que uno desea para que formennuestro elemento virtual.

    2.- Teniendo el panel, se agreg dos controles grficos uno para visualizar lospulsos de estimulacin y otro para la adquisicin, referenciados con los nombresPANEL_GRAPH y PANEL_GRAPH2 respectivamente en el cdigo del programa,

  • 17

    los ttulos de los ejes verticales de ambas grficas son variables dependiendo sise esta estimulando o adquiriendo corriente(nA, pA) o voltaje(mV), el ejehorizontal siempre es el tiempo en mseg.

  • 18

    Se agregaron los controles de entrada donde el usuario define los valores de laestimulacin y la adquisicin.Cuando el pulso es triangular el usuario define la amplitud inicial y final de cadasegmento.

    Cuando el pulso es cuadrado:(se define cada uno de los 4 segmentos)

    Cuando el pulso es triangular(se define cada uno de los 4 segmentos)

    3.- Se agregaron los controles o botones etiquetados Inicio y Salir, uno parainiciar a estimular-adquirir de manera sncrona de acuerdo a los parmetros delusuario y el otro para terminar y salir del programa; al salir del programa seguardan la ltima configuracin utilizada en un archivo de texto y al volver iniciarel programa se puede cargar sta configuracin.

    El botn Inicio se encuentra asociado a la funcin CVICALLBACK_AcquireDatacuando es pulsado se genera un evento que ejecuta el cdigo de la funcin en elarchivo estimulador.c

  • 19

    4.- Teniendo la parte grfica, se procedi a realizar el cdigo en Ccorrespondiente, se utilizaron las funciones de bajo nivel de NI DAQ: 1).Waveform Generation Functions (Funciones de Generacin de Forma de onda)para la estimulacin y 2). Low-Level Data Acquisition Functions(Funciones deAdquisicin de informacin de bajo nivel) para la adquisicin

    Las funciones fueron las siguientes:a).-WFM_Config(), WFM_Group_Control(), WFM_Load(), WFM_Rate(),WFM_Scale().b).-DAQ_Config(), DAQ_Rate(), DAQ_Start(), DAQ_Vscale(), DAQ_Check().

    Primero se pide memoria(un arreglo) al sistema para formar el pulso deestimulacin sea cuadrado o triangular que desea el usuario y un ciclo for va hagenerar las iteraciones deseadas, al final del ciclo se verifica si hay incrementospara poder repreparar la forma de onda del pulso, una funcin llamada Estimula()es utilizada para contar el tiempo entre cada pulso de estimulacin donde no seestimula ni tampoco se adquiere informacin, tiempo donde la clula se recuperade una estimulacin.

    5.- Se programaron los convertidores DAC y ADC de la tarjeta National para queiniciaran su operacin por hardware, es decir slo cuando reciban un pulso dedisparo externo enviado a los pines 45(PFI6/WFTRIG) y 38(PFI0/TRIG1)respectivamente, de esta manera la estimulacin-adquisicin es sncrona.El pulso de disparo para los convertidores se genera usando el contador 0 depropsito general y esta disponible en el pin 49(GPCTR0_OUT) para que inicieuna iteracin o registro.Es necesario hacer las conexiones fsicas externas en el conector SH6850, de locontrario el programa se va quedar suspenso puesto que los convertidoresesperaran el pulso de disparo para que comiencen a funcionar.La frecuencia de muestreo es igual al nmero de muestras 512,1024,2048 o 4096que el usuario quiera entre la suma de los 4 segmentos de tiempo enmilisegundos.

    6.- Se grafican los datos adquiridos de manera paralela, es decircorrespondientes a cada iteracin o registro, el botn Zoom sirve poder ampliary observar una rea especfica de inters de la grfica dependiendo de lacolocacin de los cursores auxiliares blancos en cruz y el botn Restaura pararestablecer la grfica.Los indicadores Coordenada X y Coordenada Y muestran los valorescorrespondientes a las coordenadas del cursor verde en cruz

  • 20

    7. Guardar en archivo sirve para almacenar en Binario(extensin .dat) y enASCII(extensin .txt) los datos de las ejecuciones del programa. slo se leenlos datos guardados POR EL PROGRAMA

    En ASCII se guardan los tiempos y datos adquiridos en columnas de cadaiteracin o registro y tambin un encabezado con todos los parmetros de laestimulacin-adquisicin.El archivo guardado en binario se puede abrir en el software Clampfit,Clampex yel guardado en ASCII en Excel, bloc de notas, Wordpad, GraphPadPrism.8.- Los parmetros del amplificador se refieren a las relaciones de losconvertidores que se programan en el amplificador Axon Instruments paraestimular directamente a la clula. Estos parmetros deben ser introducidos en lapantalla grfica del programa o interfaz grfica de usuario.

    Por ejemplo :Si se establece 50 mV/V para la RELACIN DAC y si el usuario quiere estimulara la clula con 100 mV , la tarjeta National tiene que mandar al amplificadorAxons Instruments 2 Volts para que ste estimule con 100 mV a la clula. Elusuario no tiene que preocuparse por los clculos, ya que el programa los realiza.Para la RELACIN ADC pasa algo similar, si se establece 100 mV/pA, la tarjetaNational va a recibir 100 mV cuando la clula responda con 1 pA.

  • 21

    El usuario debe introducir la ganancia que utiliz en el amplificador AxonInstruments en el control de entrada GANANANCIA X para que el programagrafique la respuesta correcta haciendo el ajuste.

    9.- Modo de estimulacin, cuando es continua el usuario estimulacontinuamente con un pulso fijo a la clula sin guardar la informacin, slo sepresentan los datos adquiridos en una grfica, el usuario detiene la estimulacincon el botn Parar.

    10.- LoadConfigPasada, al activar este control el programa carga o leelos parmetros utilizados en la anterior sesin de trabajo del archivoconfdefault.txt, una vez cargados se desactiva el control hasta laprxima vez que se encienda la computadora, al apagar lacomputadora el programa automticamente guarda la ltimaconfiguracin utilizada en el mismo archivo.

    11.- Rango de la Tarjeta National, al activar este control se programael rango de entrada utilizado por la tarjeta PCIMIO16E1, +/-10V o +/-5V, por ejemplo, es necesario cuando se obtiene ms de +/-5 nA de laclula definir el rango de la tarjeta National en +/- 10 V para poderampliar el rango y adquirir +/-10 nA con los siguientes valores en elamplificador:

    fijacin de voltaje:DAC: 20 mV/VADC: 1000 mV/nA

  • 22

    RESULTADOS

    Parmetros programados en el amplificador para la evaluacin:

    fijacin de Voltaje(se estimula voltaje y se mide corriente) 20 mV/V , DAC

    1000 mV/nA, ADC

    fijacin de Corriente(se estimula corriente y se mide voltaje) 2 nA/V , DAC

    0.001 V/mV , ADC

    Vm = Vo ( 1- e t/RC) = RC =(500X106*33X10-12) = 16.5 ms.

    Im = Vcomando/RmIm = (Vcomando- V)/(R)= (Vcomando-Im*Rs)/(R)

    A continuacin se muestran las grficas obtenidas al hacer la evaluacin delsoftware estimulador.prj con la tarjeta National PCI-MIIO-16E-1 y un amplificadorpara clulas de Axons Instruments.Primero se muestra la grfica de estimulacin, luego la adquisicin y por ltimo lagrfica I vs V de cada experimento.

  • 23

    Estimulacin

    tiempo[ms]

    Volta

    je[m

    V]

    50 100 150

    -100

    -80

    -60

    -40

    -20

    0

    20

    40

    60

    80

    100

  • 24

    Conductancia: 0.001925 X10-6 (siemens)Resistencia: 519.4805 X10 6 (ohms)

    Adquisici n

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    50 100 150

    -1.0

    -0.5

    0.0

    0.5

    1.0

    V[mV]

    I [nA

    ]

    -100 -80 -60 -40 -20 20 40 60 80

    -0.15

    -0.10

    -0.05

    -0.00

    0.05

    0.10

    0.15

    0.20

  • 25

    Estimulacin

    tiempo[ms]

    Volta

    je[m

    V]

    100 200 300 400

    -100

    -80

    -60

    -40

    -20

    0

    20

    40

    60

    80

    100

    Adquisicin

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    100 200 300 400

    -1.0

    -0.5

    0.0

    0.5

    1.0

  • 26

    Conductancia: 0.001921875 X10 6 (siemens)Resistencia: 520.325203 X10 6 (ohms)

    V[mV]

    I[nA]

    -100 -80 -60 -40 -20 20 40 60 80

    -0.3

    -0.2

    -0.1

    -0.0

    0.1

    0.2

    0.3

    Estimulacin

    tiempo[ms]

    Volta

    je[m

    V]

    0 500 1000 1500 2000 2500 3000 3500 4000 45000

    20

    40

    60

    80

    100

  • 27

    Adquis ic i n

    t iem po[m s]

    Cor

    rient

    e[nA

    ]

    500 1000 1500 2000 2500 3000 3500 4000 4500

    -1.0

    -0.8

    -0.6

    -0.4

    -0.2

    -0.0

    0.2

    0.4

    0.6

    0.8

  • 28

    Conductancia: 0.00196321 X10-6 (siemens)Resistencia: 509.367912 X 10 6 (ohms)

    Estimulacin

    tiempo[ms]

    Volta

    je[m

    V]

    50 100 150 200 250

    -100

    -50

    0

    50

    100

  • 29

    Conductancia: 0.0094021 X10-6 (siemens)Resistencia: 106.3583 X10 6 (ohms)

    Adquisicin

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    0 50 100 150 200 250-6

    -5

    -4

    -3

    -2

    -1

    0

    1

    2

    V[mV]

    I nA]

    -100 -75 -50 -25 25 50 75 100

    -0.75

    -0.50

    -0.25

    0.25

    0.50

    0.75

  • 30

    Estimulacin

    tiempo[ms]

    Volta

    je[m

    V]

    50 100 150 200 250

    -100

    -50

    0

    50

    100

    Adquisicin

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    0 50 100 150 200 250-0.50

    -0.25

    0.00

    0.25

    0.50

    0.75

    1.00

    1.25

  • 31

    Conductancia: 0.0019417 X10-6 (siemens)Resistencia: 515.00 X10 6 (ohms)

    V[mV]

    I [nA

    ]

    -100 -75 -50 -25 25 50 75 100

    -0.20

    -0.15

    -0.10

    -0.05

    -0.00

    0.05

    0.10

    0.15

    Estimulacin

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    100 200 300 400

    -0.5

    -0.4

    -0.3

    -0.2

    -0.1

    -0.0

    0.1

    0.2

    0.3

    0.4

  • 32

    Conductancia: 0.002022 X10-6 (siemens)Resistencia: 494.4295 X10 6 (ohms)

    Adquisicin

    tiempo[ms]

    Volta

    je[m

    V]

    100 200 300 400

    -250

    -200

    -150

    -100

    -50

    0

    50

    100

    150

    200

    250

    V[mV]

    I nA]

    -200 -150 -100 -50 50 100 150 200

    -0.3

    -0.2

    -0.1

    -0.0

    0.1

    0.2

    0.3

  • 33

    Estimulacin

    tiempo[ms]

    Cor

    rient

    e[nA

    ]

    200 400 600 800

    -0.5

    -0.4

    -0.3

    -0.2

    -0.1

    -0.0

    0.1

    0.2

    0.3

    0.4

    Adquisicin

    tiempo[ms]

    Volta

    je[m

    V]

    200 400 600 800

    -300

    -250

    -200

    -150

    -100

    -50

    0

    50

    100

    150

    200

    250

  • 34

    Conductancia: 0.0020082x10-6 (siemens)Resistencia: 497.945 x10 6 (ohms)

    Debido al rango de un dato entero int (-32,767 +32,767 ) el rango de guardar unaseal adquirida correctamente en formato binario es (-163 +163)[ mV], cuando serebasa se tiene los resultados de la grfica siguiente, que fue la ltima adquirida,debido a que el dato completo no cabe en los 2 bytes del entero, ste problemano se tiene cuando se guardan los datos en formato ASCII puesto ah los datos seguardan en un dato tipo doble double de 4 bytes y de rango mucho mayor:

    V[mV]

    I [nA

    ]

    -150 -100 -50 50 100 150

    -0.3

    -0.2

    -0.1

    -0.0

    0.1

    0.2

    0.3

  • 35

    Se soluciono el problema anterior aumentando el rango a +/-1630 (mV), se dividien formato binario la adquisicin entre 10 y luego en clampfit se multiplic x 10. Acontinuacin la grfica:

  • 36

    OBSERVACIONES

    Los parmetros utilizados en el amplificador deben ser introducidos en lainterfaz grfica del programa de los contrario se obtendrn resultadosequivocados.

    Es necesario mencionar que la tarjeta National no va ha estimular directamentea la clula, sino que sta va a mandar y a recibir informacin de unamplificador para clulas Axon Instruments.

    Es necesario contar con los siguientes archivos 00322k01.dat y confdefault.txten la carpeta que contiene el proyecto estimulador.prj , el primero es paraobtener el encabezado de los archivos que se van a guardar en binario y elsegundo para guardar la configuracin al final de una sesin de trabajo y paraleer o cargar al inicio de la siguiente con el botn LoadConfigPasada.

    Se utiliz para la adquisicin de datos un buffer sencillo y no el doble quedispone la tarjeta National, por lo tanto esta limitada la frecuencia mxima demuestreo a 512,000 muesras/seg es decir por ejemplo, 2048 muestras en 4mseg.

    Si se quiere la frecuencia mxima de la tarjeta 1,250,000 muestras/seg esnecesario el uso del doble buffer.

  • 37

    Se programaron los convertidores de la tarjeta National de la siguiente manera:el DAC en modo bipolar y rango +/-10 V y el ADC bipolar con rangoprogramable de +/-5 V o +/-10V.

    Si la programacin de los convertidores DAC y ADC de la tarjeta se hubierahecho por software, es decir con las instrucciones o funcionesWFM_Group_Control(Start) y DAQ_Start() no se hubiera podido hacer lasincronizacin ya que uno de los convertidores se adelantara al otrodependiendo del orden de colocacin de las instrucciones en el cdigo.

    Solamente se utilizan un canal(DAC0) para estimular y otro paraadquirir(ACH0) de la tarjeta National.

    La ventaja de guardar la informacin en Binario es la menor cantidad de bytesque se ocupan respecto con el formato ASCII.

    Si se usa otro conector diferente al SH6850, la colocacin y disposicinde los pines cambia, por lo tanto hay peligro de daar la tarjeta y lacomputadora sino se toma en cuenta esta advertencia. Por lo tanto hay queinvestigar la correspondencia exacta de los pines.

  • 38

    CONCLUSIONES

    Se implement un sistema de estimulacin y adquisicin sncrona, donde elusuario puede variar los valores de los pulsos de estimulacin como duracin en[ms], voltaje [mV] o corriente en [nA] o [pA], incrementos de amplitud, nmero demuestras adquiridas, nmero de iteraciones.Los pulsos pueden ser cuadrados o triangulares, para stos ltimos el usuariotiene que introducir los valores inicial y final de voltaje o corrientecorrespondientes de cada uno de los 4 segmentos.Se puede observar los valores reales con los que se estimula y adquiere de laclula en una interfaz grfica bajo el sistema operativo Windows.La informacin se guarda y lee en formato Binario y en ASCII.El usuario al introducir los valores de las relaciones del amplificador que utilizaren el experimento se evita hacer clculos y ajustes.Se agreg un modo de estimulacin continua en donde se estimula a la clulacontinuamente con un pulso fijo definido por el usuario, en cada iteracin serefresca la grfica de adquisicin, no se guarda la adquisicin slo se visualiza,el usuario detiene la estimulacin con el botn Parar.

  • 39

    CDIGO FUENTE/********************estimulador.c *********************************//* PROGRAMA DE ESTIMULACIN-ADQUISICIN SNCRONA, HAY DOS MODOS DEOPERACIN CONTINUA Y NORMAL, CADA ESTIMULACIN SE DIVIDE EN 4 SEGMENTOSDE VOLTAGE O CORRIENTE EN FORMA CUADRADA O TRIANGULAR , EL USUARIO PUEDEVARIAR: AMPLITUDES(POLARIDADES), TIEMPOS, NUMERO DE ESTIMULOS, NMERO DEMUESTRAS, ESPACIO O TIEMPO ENTRE ELLOS, INCREMENTOS EN LA AMPLITUD,INTRODUCIR LOS PARAMETROS DE FIJACIN DE VOLTAJE O CORRIENTE DELAMPLIFICADOR QUE UTILIZAR, GUARDAR LAS ADQUISICIONES EN FORMATO BINARIOO ASCII. ES NECESARIO QUE SE CUENTE CON LOS ARCHIVOS AUXILIARES:00322k01.dat Y confdefault.txt PARA EL FUNCIONAMIENTO DEL PROGRAMA Y DELAS CONEXIONES EN EL CONECTOR SH6850.*//******************************************************************/ /*Jueves 15 de julio del 2004*/#include "nidaqex.h" #include #include #include #include #include #include #include #include "estimulador.h" #include #include #include

    #define PCIMIO16E1 1 //Tarjeta National Instruments utilizada#define CANAL0_INPUT 0#define CANAL0_OUTPUT 0#define NUCANALSALIDA 1#define GROUP 1#define START 1#define CLEAR 0#define NORMAL_MODE 0#define ITERAWFM 1#define RATECDA 10000#define tam 256#define ASCII 0#define STARTEXT 1#define CUADRADO 0#define TRIANGULAR 1#define mV_VOLT 0#define nA_VOLT 1

    static float relGdac=0.0,relGadc=0.0,Ganaxons=1.0;

    static int GananciaNational=1;static float relGdac0=0.0;static float relGdac1=0.0;static float relGadc0=0.0;static float relGadc1=0.0;static float relGadc2=0.0;

    static double Ciclos=0.0;static double TDAC=0.0;static int whatexperim=0;static int reldac=0,reladc=1;static float t1=0.0,t2=0.0,t3=0.0;static floatamp=0.0,amp1=0.0,incAmp1=0.0,amp3=0.0,incremento=0.0,incAmp3=0.0;static float tadq,trp=0.0;

  • 40

    static int G_adc=1,G_dac=1,indAdq,num_Adq;static unsigned long ulGpctrNum = ND_COUNTER_0;static unsigned long ulLOWcount = 10; //100static unsigned long ulHIGHcount = 10;//10000static unsigned long ulArmed = ND_YES;static short iIgnoreWarning = 0;static double *waveformDAC=0, *p_auxDAC=0;static short *binArray=0,*p_auxbinArray=0;static unsigned long puntos=0;static unsigned long puntosDAC[4]={0,0,0,0};static short ao_buffer[400]={0};static short Adqbinario[61440]={0};static double volt[61440]={0};static double voltaux[61440]={0};static int ColorArray[16] ={VAL_RED,VAL_YELLOW,VAL_WHITE,VAL_BLUE,VAL_MAGENTA,VAL_GRAY,VAL_CYAN,VAL_GREEN,VAL_RED,VAL_YELLOW,VAL_WHITE,VAL_BLUE,VAL_MAGENTA,VAL_GRAY,VAL_CYAN,VAL_GREEN};static unsigned long numChannels;static unsigned long taskID;int b,c,k,q =0,j;static short status=0;static short statusX=0;static short WFMStopped=0;static short DAQStopped=0;static long ItersDone=0;static long PuntsDone=0;static long Retrieved=0;static short Retval=0 ;static short timebase = 0,code;static unsigned short sampleInterval = 0;double TiempoInicio;static double tiempos_de_DAQ[4096]={0};static float tiempos[5]={0.0,0.0,0.0,0.0,0.0};static double voltajesCD[4]={0.0,0.0,0.0,0.0};static double voltajesCDaux[4]={0.0,0.0,0.0,0.0};static double Viniciales[4]={0.0,0.0,0.0,0.0};static double dG1,dG2,dG3,dG4;static double dG1i,dG2i,dG3i,dG4i;static double espa;static int Nomuestras;static int Numuestras;static double Rate= 0.0;static float Frecmuestreo=0.0;static short timebaseAO=0;static unsigned long update=0;static short ao_channels[1]={CANAL0_OUTPUT};static unsigned int itera=0;static unsigned int registros=0;static unsigned long tasklD;static char proj_dir[MAX_PATHNAME_LEN];static char file_name[MAX_PATHNAME_LEN];static float voltsave[45000];static char readformpul[15];static char readreldac[20];static char readreladc[25];static int handle;static int err;static int mestimular=0;static int stop=0;

  • 41

    static char temp[40];error_check(char *temp, int err);static unsigned int Pulsos=0;static double Vtriangular[8]={0.0,2.0, 0.0,2.0, 0.0,2.0, 0.0,2.0};static double Vtriangaux[8]={0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0};static double Vtriginicial[8]={0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0};static unsigned long puntosTriang[5]={0,0,0,0,0};static float votreadCD[4]={0,0,0,0};static float votreadDCaux[4]={0,0,0,0};static float vtrigCDread[8]={0,0,0,0,0,0,0,0};static float vtrgCDreaux[8]={0,0,0,0,0,0,0,0};static float dvol1,dvol2,dvol3,dvol4;static float dvol1aux,dvol2aux,dvol3aux,dvol4aux;static float relatdac=0.0,relatadc=0.0,ganread=0.0;static double tempo,temporal;static float temposDAQ[4096]={0};static float tiempreadCD[5]={0,0,0,0,0};static char arch_leido[MAX_PATHNAME_LEN];

    void Toma_datos_de_UIR(void);void Estimula(double TiempoEstimulo,double VoltajeAplicado);void PreparaWFM(void);void GuardValoresConverts(void);void disparo_de_inicio_AOAI(void);double selecciona_el_intervalo_entre_muestras(short Basetiempo, shortInterv_muestras);void recupera_enc(FILE *ap);void GuardarConfig(void);void CargarConfig(void);

    //************* M A I N ******************************int main (int argc, char *argv[]){ int status=0; if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in externalcompiler; harmless otherwise */ return -1; /* out of memory */ GetProjectDir (proj_dir); if((handle = LoadPanel (0, "estimulador.uir", PANEL))

  • 42

    /*Funcin que realiza la lectura de los valores de las variablesinvolucradas en el programa como lo son: Ganancia y amplitud de lossegmentos, Nmero de iteraciones y espacio (en seg.) entre cada sealpara iniciar las estimulaciones */

    void Toma_datos_de_UIR(void){int error;GetCtrlVal(handle,PANEL_TEM, &tiempos[1]);GetCtrlVal(handle,PANEL_TEM2, &tiempos[2]);GetCtrlVal(handle,PANEL_TEM3, &tiempos[3]);GetCtrlVal(handle,PANEL_TEM4, &tiempos[4]);GetCtrlVal(handle,PANEL_GAIN ,&voltajesCD[0]);GetCtrlVal(handle,PANEL_GAIN2,&voltajesCD[1]);GetCtrlVal(handle,PANEL_GAIN3,&voltajesCD[2]);GetCtrlVal(handle,PANEL_GAIN4,&voltajesCD[3]);GetCtrlVal(handle,PANEL_INCREMENTO1,& dG1);GetCtrlVal(handle,PANEL_INCREMENTO2,& dG2);GetCtrlVal(handle,PANEL_INCREMENTO3,& dG3);GetCtrlVal(handle,PANEL_INCREMENTO4,& dG4);GetCtrlVal(handle,PANEL_NUMBEROFSCANS,&Nomuestras);GetCtrlVal(handle,PANEL_ITERACIONES, &itera);GetCtrlVal(handle,PANEL_ESPACIO, &espa);GetCtrlVal(handle,PANEL_RELACDAC,&relGdac);GetCtrlVal(handle,PANEL_RELACADC,&relGadc);GetCtrlVal(handle,PANEL_GANAXONS ,&Ganaxons);GetCtrlVal(handle,PANEL_FORMAONDA,&Pulsos);GetCtrlVal(handle,PANEL_FUNSPECIAL,&mestimular);GetCtrlVal(handle,PANEL_RELACIONADC,&reladc);//9 junio-04GetCtrlVal(handle,PANEL_GANPGIA,&GananciaNational);//14 julio-04relGdac=(relGdac)*(0.001);relGadc=(relGadc)*(0.001);GetCtrlVal(handle,PANEL_VTRIANG1I,&Vtriangular[0]);GetCtrlVal(handle,PANEL_VTRIANG2I,&Vtriangular[2]);GetCtrlVal(handle,PANEL_VTRIANG3I,&Vtriangular[4]);GetCtrlVal(handle,PANEL_VTRIANG4I,&Vtriangular[6]);GetCtrlVal(handle,PANEL_VTRIANG1F,&Vtriangular[1]);GetCtrlVal(handle,PANEL_VTRIANG2F,&Vtriangular[3]);GetCtrlVal(handle,PANEL_VTRIANG3F,&Vtriangular[5]);GetCtrlVal(handle,PANEL_VTRIANG4F,&Vtriangular[7]);error = GetNumChannels (1, "0", ANALOG_OUTPUT, &numChannels);SetCtrlAttribute(handle, PANEL_ACQUIRE, ATTR_DIMMED, 1);//_ACQUIREDeleteGraphPlot(handle, PANEL_GRAPH, -1, 1);tiempos[1]=tiempos[1]/1000;tiempos[2]=tiempos[2]/1000;tiempos[3]=tiempos[3]/1000;tiempos[4]=tiempos[4]/1000;Viniciales[0]=voltajesCD[0]; Viniciales[1]=voltajesCD[1];Viniciales[2]=voltajesCD[2]; Viniciales[3]=voltajesCD[3];Vtriginicial[0]=Vtriangular[0]; Vtriginicial[2]=Vtriangular[2];Vtriginicial[4]=Vtriangular[4]; Vtriginicial[6]=Vtriangular[6];Vtriginicial[1]=Vtriangular[1]; Vtriginicial[3]=Vtriangular[3];Vtriginicial[5]=Vtriangular[5]; Vtriginicial[7]=Vtriangular[7];voltajesCD[0]=voltajesCD[0]/1000; voltajesCD[1]=voltajesCD[1]/1000;voltajesCD[2]=voltajesCD[2]/1000; voltajesCD[3]=voltajesCD[3]/1000;Vtriangular[0]=Vtriangular[0]/1000; Vtriangular[2]=Vtriangular[2]/1000;Vtriangular[4]=Vtriangular[4]/1000; Vtriangular[6]=Vtriangular[6]/1000;Vtriangular[1]=Vtriangular[1]/1000; Vtriangular[3]=Vtriangular[3]/1000;Vtriangular[5]=Vtriangular[5]/1000; Vtriangular[7]=Vtriangular[7]/1000;

  • 43

    dG1=dG1/1000; dG2=dG2/1000;dG3=dG3/1000; dG4=dG4/1000;dG1i=dG1; dG2i=dG2; dG3i=dG3; dG4i=dG4;Vtriangaux[0]=Vtriangular[0];Vtriangaux[2]=Vtriangular[2];Vtriangaux[4]=Vtriangular[4];Vtriangaux[6]=Vtriangular[6];Vtriangaux[1]=Vtriangular[1];Vtriangaux[3]=Vtriangular[3];Vtriangaux[5]=Vtriangular[5];Vtriangaux[7]=Vtriangular[7];voltajesCDaux[0]=voltajesCD[0];voltajesCDaux[1]=voltajesCD[1];voltajesCDaux[2]=voltajesCD[2];voltajesCDaux[3]=voltajesCD[3];voltajesCD[0]=voltajesCD[0]/relGdac;voltajesCD[1]=voltajesCD[1]/relGdac;voltajesCD[2]=voltajesCD[2]/relGdac;voltajesCD[3]=voltajesCD[3]/relGdac;Vtriangular[0]=Vtriangular[0]/relGdac;Vtriangular[2]=Vtriangular[2]/relGdac;Vtriangular[4]=Vtriangular[4]/relGdac;Vtriangular[6]=Vtriangular[6]/relGdac;Vtriangular[1]=Vtriangular[1]/relGdac;Vtriangular[3]=Vtriangular[3]/relGdac;Vtriangular[5]=Vtriangular[5]/relGdac;Vtriangular[7]=Vtriangular[7]/relGdac;dG1=dG1/relGdac;dG2=dG2/relGdac;dG3=dG3/relGdac;dG4=dG4/relGdac;indAdq=itera;num_Adq=Nomuestras;t1=( (tiempos[1]) * (1000) );t2=( (tiempos[2]) * (1000) );t3=( (tiempos[3]) * (1000) );// + ( (tiempos[4]) * (1000) );tadq=( (tiempos[1])*(1000) ) + ((tiempos[2])*(1000)) +((tiempos[3])*(1000)) + ((tiempos[4])*(1000));trp=tadq;amp1=(float)(Viniciales[0]);amp =(float)(Viniciales[1]);amp3=(float)(Viniciales[2]);incAmp1=(float)(dG1i*1000);incremento=(float)(dG2i*1000);incAmp3=(float)(dG3i*1000);} //Fin de la funcion Toma_datos_de_UIR(void)

    void Estimula(double TiempoEstimulo,double VoltajeAplicado){ short status=0; double TiempoInicio = Timer();

    while((TiempoEstimulo>0.0) &&((Timer()-TiempoInicio)

  • 44

    int CVICALLBACK Reset (int panel, int control, int event, void *callbackData, int eventData1, inteventData2){ switch (event){ int i,j; case EVENT_COMMIT: stop=0; mestimular=0; SetCtrlAttribute(handle,PANEL_RELACADC,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_RELACDAC,ATTR_DIMMED,0); SetCtrlAttribute(handle, PANEL_ACQUIRE, ATTR_DIMMED, 0);

    //Control_RESETEAR deshabilitado: SetCtrlAttribute(handle, PANEL_RESETEAR, ATTR_DIMMED, 1);

    SetCtrlVal(handle,PANEL_FORMAONDA,Pulsos); SetCtrlVal(handle,PANEL_RELACIONDAC,reldac); //RELACIONDAC==mV/V

    SetCtrlVal(handle,PANEL_RELACIONADC,reladc);//RELACIONADC==mV/pA

    DeleteGraphPlot (handle,PANEL_GRAPH2,-1,1); DeleteGraphPlot (handle,PANEL_GRAPH ,-1,1); SetCtrlVal (handle, PANEL_ARCH_LEIDO, " "); SetCtrlVal(handle,PANEL_TEM, tiempos[1]*1000 ); SetCtrlVal(handle,PANEL_TEM2, tiempos[2]*1000 ); SetCtrlVal(handle,PANEL_TEM3, tiempos[3]*1000 ); SetCtrlVal(handle,PANEL_TEM4, tiempos[4]*1000 ); SetCtrlVal(handle,PANEL_GAIN ,Viniciales[0]); SetCtrlVal(handle,PANEL_GAIN2,Viniciales[1]); SetCtrlVal(handle,PANEL_GAIN3,Viniciales[2]); SetCtrlVal(handle,PANEL_GAIN4,Viniciales[3]); SetCtrlVal(handle,PANEL_INCREMENTO1,dG1i*1000); SetCtrlVal(handle,PANEL_INCREMENTO2,dG2i*1000); SetCtrlVal(handle,PANEL_INCREMENTO3,dG3i*1000); SetCtrlVal(handle,PANEL_INCREMENTO4,dG4i*1000); SetCtrlVal(handle,PANEL_NUMBEROFSCANS,Nomuestras); SetCtrlVal(handle,PANEL_ITERACIONES, itera); SetCtrlVal(handle,PANEL_ESPACIO, espa); SetCtrlVal(handle,PANEL_RELACDAC,relGdac*1000 ); SetCtrlVal(handle,PANEL_RELACADC,relGadc*1000 ); SetCtrlVal(handle,PANEL_GANAXONS,Ganaxons); SetCtrlVal(handle,PANEL_VTRIANG1I,Vtriginicial[0]); SetCtrlVal(handle,PANEL_VTRIANG2I,Vtriginicial[2]); SetCtrlVal(handle,PANEL_VTRIANG3I,Vtriginicial[4]); SetCtrlVal(handle,PANEL_VTRIANG4I,Vtriginicial[6]); SetCtrlVal(handle,PANEL_VTRIANG1F,Vtriginicial[1]); SetCtrlVal(handle,PANEL_VTRIANG2F,Vtriginicial[3]); SetCtrlVal(handle,PANEL_VTRIANG3F,Vtriginicial[5]); SetCtrlVal(handle,PANEL_VTRIANG4F,Vtriginicial[7]); if(Pulsos==0){ SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 0); //habilitar SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 0); } else { SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,0);//habilitar SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,0);

  • 45

    SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,0); GetCtrlVal(handle,PANEL_FUNSPECIAL,&mestimular); }

    for(i=0;i

  • 46

    Retval=ProcessSystemEvents (); } while ((ulArmed == ND_YES) && (status == 0)); /* CLEANUP - Don't check for errors on purpose. */ status = GPCTR_Control(PCIMIO16E1, ulGpctrNum, ND_RESET);/* Desconectar GPCTR0_OUTPUT. *//*Nota que esto va a causar que la salida este en alta impedancialo cual probablemente causara un nivel logico ALTO si hay una "pull up"resistencia en este pin.(Checa tu manual de usuario de hardware) si tu noquieres este comportamiento, comenta la siguiente linea de salida */status = Select_Signal(PCIMIO16E1, ND_GPCTR0_OUTPUT,ND_NONE,ND_DONT_CARE);} //Fin de la funcion disparo_de_inicio_AO/AI();

    /***FIN:DISPARO DE INICIO DE WFM Y DAQ******************************/

    double selecciona_el_intervalo_entre_muestras(short Basetiempo,short Interv_muestras) { double Int_muetrs_verd=0.0,tiempoaux=0.0; switch(Basetiempo) { case -3:{ tiempoaux = 0.00000005;break; } case -1:{ tiempoaux = 0.00000020;break; } case 1:{ tiempoaux = 0.00000100;break; } case 2:{ tiempoaux = 0.00001000;break; } case 3:{ tiempoaux = 0.00010000;break; } case 4:{ tiempoaux = 0.00100000;break; } case 5:{ tiempoaux = 0.010000000;break; } default: printf("El parametro timebase fuera de rango!\n");

    } Int_muetrs_verd = tiempoaux*Interv_muestras; return Int_muetrs_verd;}

    void PreparaWFM(void){

    int i=0,j=0; p_auxDAC = waveformDAC;

    if(Pulsos==CUADRADO){ for(i=0;i

  • 47

    } else { puntosTriang[0]=0; for(i=0;i

  • 48

    if( ( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) > (0.050)) &&( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) < (1.0))) { puntosDAC[i]=(tiempos[i+1]) * (RATECDA*2); TDAC=0.00005; } }

    if( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4])>=(1.0) ) puntos= (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4])* (RATECDA);

    if( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) (0.050)) && ((tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) < (1.0)) ) puntos= (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4])*(RATECDA*2); waveformDAC = (double *)malloc((puntos+1)*sizeof(double)) ; if(waveformDAC == NULL) { printf("No hay suficiente memoria para generar el patron deestimulacion\n"); exit(1); } p_auxDAC = waveformDAC;

    if(Pulsos==CUADRADO){ for(i=0;i

  • 49

    printf("No hay suficiente memoria para guardar los voltajes depunto flotante convertidos en binarios para el DAC\n"); exit(1); } p_auxbinArray = binArray;

    status=AO_VWrite(PCIMIO16E1,CANAL0_OUTPUT,0.0); Rate=Nomuestras/(tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]); status=DAQ_Rate(Rate,0,&timebase,&sampleInterval); status=WFM_Group_Setup(PCIMIO16E1,NUCANALSALIDA,ao_channels,GROUP);

    status=Select_Signal(PCIMIO16E1,ND_OUT_START_TRIGGER,ND_PFI_6,ND_HIGH_TO_LOW);

    GetCtrlVal(handle,PANEL_FUNSPECIAL,&mestimular); if(mestimular==0){// inicio if(mestimular==0)4 de junio-04for(a=0;a=(1.0) ) status=WFM_Rate(RATECDA,0,&timebaseAO,&update); if( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) (0.050)) &&( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) < (1.0)) ) status=WFM_Rate(RATECDA*2,0,&timebaseAO,&update);

    status=WFM_ClockRate(PCIMIO16E1,GROUP,0,timebaseAO,update,NORMAL_MODE); status=WFM_Group_Control(PCIMIO16E1,GROUP,START); disparo_de_inicio_AOAI(); while( ((WFMStopped==0)&&(status==0)) &&((DAQStopped!=1)&&(statusX==0)) ){

    status=WFM_Check(PCIMIO16E1,0,&WFMStopped,&ItersDone,&PuntsDone); statusX=DAQ_Check(PCIMIO16E1,&DAQStopped,&Retrieved); Retval=ProcessSystemEvents (); tempo=0; temporal=0; for(j=0;j

  • 50

    DAQ_VScale(PCIMIO16E1,CANAL0_INPUT,1,1.0,0.0,Nomuestras,&Adqbinario[Nomuestras*a],&volt[Nomuestras*a]);

    if(GananciaNational== -1){// +/- 10V for(i=0;i

  • 51

    Vtriangaux[5]=Vtriangaux[5]+dG3i; Vtriangaux[6]=Vtriangaux[6]+dG4i; Vtriangaux[7]=Vtriangaux[7]+dG4i; PreparaWFM(); } }

    WFMStopped=0; status=0; DAQStopped=0; statusX=0; ItersDone=0; PuntsDone=0; Retrieved=0; } /*fin del for del itera */}//fin del if(mestimular==0) else{ //inicio else(mestimular==1) if (mestimular==1){ //inicio if(mestimular==1(Continuo))/*****inicio estimulacion continua***************/ a=0; SetCtrlAttribute(handle, PANEL_STOP, ATTR_DIMMED, 0); //habilitar SetCtrlAttribute(handle, PANEL_RESETEAR, ATTR_DIMMED, 1); //deshab.for(;;) {

    status=DAQ_Start(PCIMIO16E1,CANAL0_INPUT,GananciaNational,&Adqbinario[0],Nomuestras,timebase,sampleInterval);status=WFM_Scale(PCIMIO16E1,0,(puntos+1),1,waveformDAC,binArray);status=WFM_Load(PCIMIO16E1,1,ao_channels,binArray,(puntos+1),ITERAWFM,NORMAL_MODE);if( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4])>=(1.0) ) status=WFM_Rate(RATECDA,0,&timebaseAO,&update); if( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) (0.050)) &&( (tiempos[1]+tiempos[2]+tiempos[3]+tiempos[4]) < (1.0)) ) status=WFM_Rate(RATECDA*2,0,&timebaseAO,&update);status=WFM_ClockRate(PCIMIO16E1,GROUP,0,timebaseAO,update,NORMAL_MODE);status=WFM_Group_Control(PCIMIO16E1,GROUP,START);disparo_de_inicio_AOAI();while(((WFMStopped==0)&&(status==0))&&((DAQStopped!=1)&&(statusX==0))){status=WFM_Check(PCIMIO16E1,0,&WFMStopped,&ItersDone,&PuntsDone);statusX=DAQ_Check(PCIMIO16E1,&DAQStopped,&Retrieved);Retval=ProcessSystemEvents ();tempo=0; temporal=0;}status=WFM_Group_Control(PCIMIO16E1,GROUP,CLEAR);Estimula((espa-0.2),0.0);WFMStopped=0;status=0;DAQStopped=0;statusX=0;tersDone=0;PuntsDone=0;Retrieved=0;/*PROCESAMIENTO DE LA ENTRADA ANALOGICA*/Int_muetrs_verd = selecciona_el_intervalo_entre_muestras(timebase,sampleInterval);DAQ_VScale(PCIMIO16E1,CANAL0_INPUT,1,1.0,0.0,Nomuestras,&Adqbinario[0],&volt[0]);

  • 52

    if(GananciaNational== -1){// +/- 10V for(i=0;i

  • 53

    void salva_reg_arch_Bin(FILE *fp){ int i,j,k,buff[1],canal=0; i=canal; j=0;

    while(j

  • 54

    if (reldac==0){ c[413]='m';c[414]='V'; } else{c[413]='n';c[414]='A'; }

    if (reladc==0){ c[896]='n';c[897]='A'; } else if (reladc==1){ c[896]='p';c[897]='A'; } else{ c[896]='m';c[897]='V'; } fwrite(f,4,tam, fp); salva_reg_arch_Bin(fp); fclose(fp);}

    /******* G U A R D A R *******************/

    int CVICALLBACK Save(int panel, int control, int event, void*callbackData, int eventData1, int eventData2){ FILE *fp=NULL; double Int_muetrs_verd=0.0; static char arch_escrito[MAX_PATHNAME_LEN]; static char pulscuadr[15]="CUADRADO"; static char pulstrig[15]="TRIANGULAR"; static char relacmV[20]="RelacinDAC(mV/V): "; static char relacnA[20]="RelacinDac(nA/V): "; static char relatnA[25]="RelacinADC(mV/nA): "; static char relatpA[25]="RelacinAdc(mV/pA): "; static char relatV[25] ="RelationAdc(V/mV): "; int count=0; int i,j, k=0,l=0,fileType=0,p=0; int a=0,b=0,c=0; char resp;

    if (event == EVENT_COMMIT){ GetCtrlVal (handle, PANEL_OutputType, &fileType); if(fileType==ASCII){ if(FileSelectPopup (proj_dir, "*.txt", "*.txt", "Nombre delarchivo a guardar", VAL_OK_BUTTON, 0, 1, 1, 0, arch_escrito) > 0){//03 junio-04 if((fp=fopen(arch_escrito,"w"))==NULL){ fprintf(stderr,"error al abrir el archivo %s.", arch_escrito ); exit(1); } fprintf(fp,"\n %.3f %s ",Rate,":Muestras/seg"); fprintf(fp,"\n %d %s", Nomuestras,":Muestras/registro"); fprintf(fp,"\n %d %s", itera,":Registro(s)");

    if(Pulsos==0) //Pulsos==CUADRADO fprintf(fp,"\n %s %s","Pulso(s): ",pulscuadr); else //Pulsos==TRIANGULAR fprintf(fp,"\n %s %s","Pulso(s): ",pulstrig); if(reldac==0) //reldac==mV/V

  • 55

    fprintf(fp,"\n %s %.3f",relacmV,relGdac*1000); else //reldac==nA/V fprintf(fp,"\n %s %.3f",relacnA,relGdac*1000);

    if(reladc==0) //reladc==mV/nA fprintf(fp,"\n %s %.3f",relatnA ,relGadc*1000); if(reladc==1) //reladc==mV/pA fprintf(fp,"\n %s %.3f",relatpA ,relGadc*1000); if(reladc==2) //reladc==V/mV fprintf(fp,"\n %s %.3f",relatV ,relGadc*1000); fprintf(fp,"\n %s %.3f","GANANCIA_*: ",Ganaxons);

    // Prueba para guardar los PARAMETROS DE ESTIMULACION(tiempos y losvoltajesCD de estimulacion) fprintf(fp,"\n"); for(count=0;count

  • 56

    }//combinacion4 if((reldac==nA_VOLT) && (Pulsos==TRIANGULAR) ){ for(count=0;count

  • 57

    }

    fprintf(fp,"%f\t", volt[(i*Nomuestras)+j]); } fprintf(fp,"\n" ); } fclose(fp);if (reladc==2){for(i=0;i 0){ //03 junio-04

    //****AQUI VA EL CODIGO PARA GUARDAR EN BINARIO: salva_reg()*****

    fp=fopen(arch_escrito, "wb+"); salva_poner_enc(fp); }//03 junio-04 }//Fin del ELSE del if(fileType==ASCII) SetCtrlAttribute (handle, PANEL_Read, ATTR_DIMMED, 0); // }//Fin del FileSelectPopup() // 03 junio/04 } //Fin del event==EVENT_COMMIT return(0);}//Fin de la funcion CALLBACK Save()

    /*********L E C T U R A************************/

    int CVICALLBACK Read(int panel, int control, int event, void*callbackData, int eventData1, int eventData2){ FILE *ap=NULL; int count=0; int b=0,n=0,o=0,q=0,i=0,j=0,l=0,status,fileType=0,p=0,result=0,h=0; //itera-->registros long w=0,position=0; char mama1[15],mama2[20],mama3[15]; //Rate-->Frecmuestreo charinfor1[15]={"HOLA"},infor2[15]={"HOLA"},infor3[15]={"BY"},infor4[15]={"CLUB"},infor5[15]={"CANDY"},infor6[15]={"SKYGT"}; char troya1[15],troya2[15],troya3[15],troya4[15]; char readpuls[15]; char gananaxs[15]; char etiqut1[15]={"SUPER"},etiqut2[15]={"MAN"};

    if (event == EVENT_COMMIT){//Nomuestras--->Numuestras GetCtrlVal (handle, PANEL_InputType, &fileType); DeleteGraphPlot (handle, PANEL_GRAPH2, -1, 1); for(i=0;i

  • 58

    for(i=0;i 0) { if( (ap = fopen(arch_leido,"r"))==NULL){ fprintf(stderr,"Error al abrir el archivo."); exit(1); } fscanf(ap, "\n%f %s",&Frecmuestreo,mama1); fscanf(ap, "\n%d %s",&Numuestras,mama2); fscanf(ap, "\n%d %s",&registros,mama3);

    fscanf(ap, "\n%s %s",readpuls,readformpul); fscanf(ap, "\n%s %f",readreldac,&relatdac);

    fscanf(ap, "\n%s %f",readreladc,&relatadc); fscanf(ap, "\n%s %f",gananaxs,&ganread);

    for(count=0;count

  • 59

    fscanf(ap,"%s %f\t",infor6,&dvol4); }//combinacion4 if( ((strcmp(readreldac,"RelacinDac(nA/V):"))==0) &&((strcmp(readformpul,"TRIANGULAR"))==0) ){ for(count=0;count

  • 60

    dvol4=dvol4/1000;

    DeleteGraphPlot (handle, PANEL_GRAPH2, -1, 1); for(b=0;b

  • 61

    SetCtrlVal(handle,PANEL_GAIN4,votreadDCaux[3]);

    SetCtrlVal(handle,PANEL_VTRIANG1I,vtrgCDreaux[0]); SetCtrlVal(handle,PANEL_VTRIANG2I,vtrgCDreaux[2]); SetCtrlVal(handle,PANEL_VTRIANG3I,vtrgCDreaux[4]); SetCtrlVal(handle,PANEL_VTRIANG4I,vtrgCDreaux[6]); SetCtrlVal(handle,PANEL_VTRIANG1F,vtrgCDreaux[1]); SetCtrlVal(handle,PANEL_VTRIANG2F,vtrgCDreaux[3]); SetCtrlVal(handle,PANEL_VTRIANG3F,vtrgCDreaux[5]); SetCtrlVal(handle,PANEL_VTRIANG4F,vtrgCDreaux[7]);

    SetCtrlVal(handle,PANEL_INCREMENTO1,dvol1aux); SetCtrlVal(handle,PANEL_INCREMENTO2,dvol2aux); SetCtrlVal(handle,PANEL_INCREMENTO3,dvol3aux); SetCtrlVal(handle,PANEL_INCREMENTO4,dvol4aux); SetCtrlVal(handle,PANEL_NUMBEROFSCANS,Numuestras); SetCtrlVal(handle,PANEL_ITERACIONES, registros); SetCtrlVal(handle,PANEL_RELACDAC, relatdac); SetCtrlVal(handle,PANEL_RELACADC, relatadc); //AAMI SetCtrlVal(handle,PANEL_GANAXONS, ganread);

    if( ((strcmp(readformpul,"CUADRADO"))==0)){ SetCtrlVal(handle,PANEL_FORMAONDA,0);

    SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 0);//habilitar SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 0);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,1);//deshabilitar SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,1);

    }else{ SetCtrlVal(handle,PANEL_FORMAONDA,1); SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 1);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,0);

  • 62

    }

    if( ((strcmp(readreldac,"RelacinDAC(mV/V):"))==0) ) { SetCtrlVal(handle,PANEL_RELACIONDAC,0);

    SetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"V1i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"V2i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"V3i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"V4i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"V1f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"V2f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"V3f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"V4f[mV]");SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "Voltaje [mV]" );}else{

    SetCtrlVal(handle,PANEL_RELACIONDAC,1);SetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"I1i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"I2i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"I3i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"I4i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"I1f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"I2f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"I3f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"I4f[nA]");SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "I corriente [nA]" );}

    if( ((strcmp(readreladc,"RelacinADC(mV/nA):"))==0) ) { SetCtrlVal(handle,PANEL_RELACIONADC,0); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE[nA]" );}

    if( ((strcmp(readreladc,"RelacinAdc(mV/pA):"))==0) ) { SetCtrlVal(handle,PANEL_RELACIONADC,1); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE[pA]" );}if( ((strcmp(readreladc,"RelationAdc(V/mV):"))==0) ) { SetCtrlVal(handle,PANEL_RELACIONADC,2); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "Voltaje [mV]" );}

  • 63

    SetCtrlAttribute(handle, PANEL_RESETEAR, ATTR_DIMMED, 0);//Control_RESETEAR habilitado

    } } // fin_if(fileType==ASCII)14/06/04 else{ //(fileType==BINARIO) 14/06/04 //14/06/04if (FileSelectPopup ("", "*.dat", "*.dat", "Nombre del archivo a leer", VAL_OK_BUTTON, 0, 1, 1, 0, arch_leido) > 0) {if( (ap = fopen(arch_leido,"rb"))==NULL){ //14/06/04 fprintf(stderr,"Error al abrir el archivo."); exit(1); }

    /*leer binario(inicio-14/06/04)*******************************/ recupera_enc(ap); }/**leer binario(fin-14/06/04)********************************/ //14/06/04 } //14/06/04

    }//fin del COMMIT return(0);}// fin de la funcion Read

    void recupera_enc(FILE *ap){ float f[tam],IntMuestro; char *c; int i=0,j=0,k=0,buff[1],relaciones[4]={0},count=0;

    fread(f,4,tam, ap); num_Adq=f[2]; //Numero_de_muestras indAdq =f[3]; //iteraciones IntMuestro=f[4]; //Sampling interval[useg.] trp=f[14]; //[mseg.] amp1=f[25]; //A level initial value and increment incAmp1=f[26]; //A level initial value and increment amp=f[27]; //B level initial value and increment incremento=f[28]; //B level initial value and increment t1=f[29]; //A duration initial value(samples) amp3=f[43]; //C level initial value and increment incAmp3=f[44]; //C level initial value and increment t2=f[56]; //B duration initial value(samples) t3=f[45]; //C duration initial value(samples) c=(char*)&f[0]; relaciones[0]=c[413]; relaciones[1]=c[414]; relaciones[2]=c[896]; relaciones[3]=c[897];

    if ( (relaciones[0]==109) && (relaciones[1]==86) ){//mV reldac=0; } else{reldac=1; //nA }

    if ( (relaciones[2]==110) && (relaciones[3]==65) ){//nA

  • 64

    reladc=0; } else if ( (relaciones[2]==112) && (relaciones[3]==65) ){ //pA reladc=1; } else{ reladc=2; //mV }

    while(j

  • 65

    PlotWaveform (handle, PANEL_GRAPH2,&voltsave[num_Adq*b],(num_Adq), VAL_FLOAT,1.0, (0.0), (0.0),(IntMuestro*0.000001) ,VAL_THIN_LINE,VAL_EMPTY_SQUARE, VAL_SOLID, 1, ColorArray[b]); } DeleteGraphPlot (handle, PANEL_GRAPH, -1, 1);

    for(b=0;b

  • 66

    SetCtrlVal(handle,PANEL_VTRIANG1F,vtrgCDreaux[1]); SetCtrlVal(handle,PANEL_VTRIANG2F,vtrgCDreaux[3]); SetCtrlVal(handle,PANEL_VTRIANG3F,vtrgCDreaux[5]); SetCtrlVal(handle,PANEL_VTRIANG4F,vtrgCDreaux[7]);

    SetCtrlVal(handle,PANEL_INCREMENTO1,dvol1aux); SetCtrlVal(handle,PANEL_INCREMENTO2,dvol2aux); SetCtrlVal(handle,PANEL_INCREMENTO3,dvol3aux); SetCtrlVal(handle,PANEL_INCREMENTO4,dvol4aux); SetCtrlVal(handle,PANEL_NUMBEROFSCANS,num_Adq); SetCtrlVal(handle,PANEL_ITERACIONES, indAdq); SetCtrlVal(handle,PANEL_RELACDAC, relatdac); SetCtrlVal(handle,PANEL_RELACADC, relatadc); //AAMI SetCtrlAttribute(handle,PANEL_RELACADC,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_RELACDAC,ATTR_DIMMED,1);if( 1 ){ //"CUADRADO" SetCtrlVal(handle,PANEL_FORMAONDA,0);

    SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 0);//habilitar SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 0);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,1);//deshabilitar SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,1);}else{ SetCtrlVal(handle,PANEL_FORMAONDA,1); SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 1);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,0);

    }

    if( reldac==0 ) { SetCtrlVal(handle,PANEL_RELACIONDAC,0);

    SetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "V3[mV]");

  • 67

    SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"V1i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"V2i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"V3i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"V4i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"V1f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"V2f[mV]");

    SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"V3f[mV]");

    SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"V4f[mV]"); SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "Voltaje[mV]" );

    }else{

    SetCtrlVal(handle,PANEL_RELACIONDAC,1);SetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"I1i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"I2i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"I3i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"I4i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"I1f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"I2f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"I3f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"I4f[nA]");SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "I corriente [nA]" );}

    if(reladc==0) { SetCtrlVal(handle,PANEL_RELACIONADC,0); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE[nA]"); } if(reladc==1 ) { SetCtrlVal(handle,PANEL_RELACIONADC,1); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE[pA]"); } if(reladc==2 ) { SetCtrlVal(handle,PANEL_RELACIONADC,2); SetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "Voltaje [mV]" ); } SetCtrlAttribute(handle, PANEL_RESETEAR, ATTR_DIMMED, 0);//Control_RESETEAR habilitado/*************fin del graficado de datos enbinario*************************/

  • 68

    }

    /**********RelationDac(Inicio)***********************************/int CVICALLBACK RelationDac(int panel, int control, int event, void *callbackData, int eventData1, inteventData2){

    switch (event){ int i,j; case EVENT_COMMIT: GetCtrlVal(handle,PANEL_RELACIONDAC,&reldac); if (reldac==0) {//reldac==mV/VSetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"V1i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"V2i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"V3i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"V4i[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"V1f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"V2f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"V3f[mV]");SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"V4f[mV]");SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "VOLTAJE [mV]" );SetCtrlVal(handle,PANEL_RELACDAC,relGdac0*1000 ); //24 jun-04} else{ //reldac==nA/VSetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_LABEL_TEXT, "I1[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_LABEL_TEXT, "I2[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_LABEL_TEXT, "I3[nA]");SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_LABEL_TEXT, "I4[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_LABEL_TEXT,"I1i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_LABEL_TEXT,"I2i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_LABEL_TEXT,"I3i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_LABEL_TEXT,"I4i[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_LABEL_TEXT,"I1f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_LABEL_TEXT,"I2f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_LABEL_TEXT,"I3f[nA]");SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_LABEL_TEXT,"I4f[nA]");SetCtrlAttribute(handle, PANEL_GRAPH,ATTR_YNAME, "I CORRIENTE [nA]" );SetCtrlVal(handle,PANEL_RELACDAC,relGdac1*1000 ); //24 jun-04} break;} return 0;} //Fin de la funcion RelationDac

    /****RelationDac(fin)**********************************************/

  • 69

    /********FormWave(Inicio)*****************************************/int CVICALLBACK FormWaveCallback(int panel, int control, int event, void *callbackData, int eventData1, inteventData2){ switch (event){ int i,j,formpulso=0; case EVENT_COMMIT: GetCtrlVal(handle,PANEL_FORMAONDA, &formpulso); if( (formpulso==0) || ((strcmp(readformpul,"CUADRADO"))==0)){ SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 0);//habilitar SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 0);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,1);//deshabilitar SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,1); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,1);

    } else{

    SetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 1); SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 1);

    SetCtrlAttribute(handle,PANEL_VTRIANG1I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4I,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG1F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG2F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG3F,ATTR_DIMMED,0); SetCtrlAttribute(handle,PANEL_VTRIANG4F,ATTR_DIMMED,0); } break; } return 0;} //Fin de la funcion FormWave

    /*************FormWave(fin)********************************************/

    /***********RelationAdc(Inicio)****************************************/int CVICALLBACK RelationAdc(int panel, int control, int event, void *callbackData, int eventData1, inteventData2){ switch (event){ int i,j;

    case EVENT_COMMIT: GetCtrlVal(handle,PANEL_RELACIONADC,&reladc);

  • 70

    if(reladc==0){ //reladc==mV/nASetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE [nA] ");SetCtrlVal(handle,PANEL_RELACADC,relGadc0*1000 ); //24 jun-04 } if(reladc==1){ //reladc==mV/pASetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "I CORRIENTE [pA] ");SetCtrlVal(handle,PANEL_RELACADC,relGadc1*1000 ); //24 jun-04 } if(reladc==2){ //reladc==V/mVSetCtrlAttribute(handle, PANEL_GRAPH2,ATTR_YNAME, "V VOLTAJE [mV] ");SetCtrlVal(handle,PANEL_RELACADC,relGadc2*1000 ); //24 jun-04 }

    break; } return 0;} //Fin de la funcion RelationAdc

    /*******************RelationAdc(fin)***********************************/

    /*********************************************************************//* La funcin RestoreGraph restaura la grfica a su estado original.*//* Llevandose a cabo un autoescalamiento. *//*********************************************************************/

    int CVICALLBACK RestoreGraph(int panel, int control, int event, void*callbackData, int eventData1, int eventData2){

    if (event == EVENT_COMMIT) SetAxisRange (handle, PANEL_GRAPH2, VAL_AUTOSCALE,0,100,VAL_AUTOSCALE,0,100); return(0);}

    /*********************************************************************/La funcin CVICALLBACK UpdateMarker actualiza las coordenadas X y Ydel marcador(el cursor verde en forma de cruz) cuanto ste es movido.Esta funcin es llamada siempre que el cursor en la grafica es movido./*********************************************************************/

    int CVICALLBACK UpdateMarker(int panel, int control, int event, void*callbackData, int eventData1, int eventData2){ double x=0.0,y=0.0;

    if (event == EVENT_COMMIT) { GetGraphCursor (handle, PANEL_GRAPH2, 2, &x, &y); SetCtrlVal (handle, PANEL_XREADOUT, x*1000); SetCtrlVal (handle, PANEL_YREADOUT, y);//(24 may/04) } return(0);}

    /**********************************************************************/La funcin ZoomIn simula la operacin zoom en la grfica por medio de unreescalamiento de ejes. Cuando el botn Zoom es pulsado, esta funcintoma la posicion presente de los dos cursores(blancos y en cruz) y

  • 71

    reescala la grafica basado en sus posiciones. Estos cursores definen laregin del zoom./**********************************************************************/

    int CVICALLBACK ZoomIn(int panel, int control, int event, void*callbackData, int eventData1, int eventData2){ double x1, x2, y1, y2; double temp; if (event == EVENT_COMMIT) { GetGraphCursor (handle, PANEL_GRAPH2, 1, &x1, &y1); GetGraphCursor (handle, PANEL_GRAPH2, 3, &x2, &y2);

    if (x1 > x2) { temp = x1; x1 = x2; x2 = temp; } if (y1 > y2) { temp = y1; y1 = y2; y2 = temp; } SetAxisRange (handle, PANEL_GRAPH2, VAL_MANUAL, x1, x2,VAL_MANUAL, y1, y2); } return(0);}

    int CVICALLBACK StopStimulation(int panel, int control, int event, void *callbackData, int eventData1, inteventData2){ switch(event){ case EVENT_COMMIT: stop= 1;SetCtrlAttribute(handle, PANEL_STOP, ATTR_DIMMED, 1); //deshabilitarSetCtrlAttribute(handle, PANEL_RESETEAR, ATTR_DIMMED, 0); //habilitarSetCtrlAttribute(handle, PANEL_GAIN, ATTR_DIMMED, 0); //habilitarSetCtrlAttribute(handle, PANEL_GAIN2, ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_ITERACIONES, ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_OutputType , ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_InputType , ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_Save , ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_Read , ATTR_DIMMED, 0);SetCtrlAttribute(handle, PANEL_FUNSPECIAL , ATTR_DIMMED, 0); break; } return(0);}

    int CVICALLBACK FuctSpecial(int panel, int control, int event, void *callbackData, int eventData1, inteventData2){ switch(event){ case EVENT_COMMIT:

  • 72

    GetCtrlVal(handle,PANEL_FUNSPECIAL,&mestimular); if (mestimular==1){SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_ITERACIONES, ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_OutputType , ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_InputType , ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_Save , ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_Read , ATTR_DIMMED, 1);SetCtrlAttribute(handle, PANEL_FUNSPECIAL , ATTR_DIMMED, 1); }

    if (mestimular==0){ SetCtrlAttribute(handle, PANEL_INCREMENTO1, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_INCREMENTO2, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_INCREMENTO3, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_INCREMENTO4, ATTR_DIMMED, 0); SetCtrlAttribute(handle, PANEL_ITERACIONES, ATTR_DIMMED, 0); } break; } return(0);

    }

    /*****CargarConfig(inicio)24jun-04****************************/int CVICALLBACK LoadConfiguration(int panel, int control, intevent, void *callbackData, int eventData1, int eventData2){

    int count=0; FILE *ap_default=NULL; char confgdefa1[20]; char confgdefa2[20]; char confgdefa3[20]; char confgdefa4[20]; char confgdefa5[20]; char confgdefa6[20]; char confgdefa7[20]; char confgdefa8[20]; char confgdefa9[20]; char confgdefa6xx[26]= davidvelasco ; float espaX; float relGdac0X,relGdac1X,relGadc0X,relGadc1X,relGadc2X; float VinicialesX[4],VtriginicialX[8]; float dG1iX,dG2iX,dG3iX,dG4iX;

    switch(event){ case EVENT_COMMIT:

    if((ap_default=fopen("c:\\ESTIMULADOR\\confdefault.txt","r"))==NULL){ fprintf(stderr,"error al abrir el archivo:confdefault.txt paraCargar la configuracion anteriormente utilizada "); exit(1); }

    fscanf(ap_default,"\n %d %s", &Nomuestras,confgdefa1);

  • 73

    fscanf(ap_default,"\n %d %s", &itera ,confgdefa2);fscanf(ap_default,"\n %f %s", &espaX ,confgdefa3);//Pulsos==0(CUADRADO)Pulsos==1(TRIANGULAR)fscanf(ap_default,"\n %d %s", &Pulsos ,confgdefa4);//reldac==0(mV/V)reldac==1(nA/V)fscanf(ap_default,"\n %d %s", &reldac ,confgdefa5);//reladc==0(mV/nA)reladc==1(mV/pA)reladc==2(V/mV)fscanf(ap_default,"\n %d %s", &reladc ,confgdefa6);fscanf(ap_default,"\n %f %s" , &relGdac0X,confgdefa6);fscanf(ap_default,"\n %f %s" , &relGdac1X,confgdefa6);fscanf(ap_default,"\n %f %s" , &relGadc0X,confgdefa6);fscanf(ap_default,"\n %f %s" , &relGadc1X,confgdefa6);fscanf(ap_default,"\n %f %s" , &relGadc2X,confgdefa6);fscanf(ap_default,"\n %s %f",confgdefa6,&Ganaxons);fscanf(ap_default,"\n %s %d",confgdefa6xx,&GananciaNational);

    //PARAMETROS DE ESTIMULACION(magnitudes y tiempos de estimulacion)

    for(count=0;count

  • 74

    SetCtrlVal(handle, PANEL_GANPGIA , GananciaNational); SetCtrlVal(handle, PANEL_FORMAONDA , Pulsos ); SetCtrlVal(handle, PANEL_RELACIONDAC, reldac ); SetCtrlVal(handle, PANEL_RELACIONADC, reladc ); switch (reldac) { case 0:{ SetCtrlVal(handle, PANEL_RELACDAC , relGdac0X ); break; } case 1:{ SetCtrlVal(handle, PANEL_RELACDAC , relGdac1X ); break; } default: break; }

    switch (reladc) { case 0:{ SetCtrlVal(handle, PANEL_RELACADC , relGadc0X ); break; } case 1:{ SetCtrlVal(handle, PANEL_RELACADC , relGadc1X ); break; } case 2:{ SetCtrlVal(handle, PANEL_RELACADC , relGadc2X ); break; } default: break; }

    break; } SetCtrlAttribute(handle, PANEL_LOADCONF, ATTR_DIMMED, 1);//deshabilitar relGdac0=relGdac0X/1000;//29 jun-04 relGdac1=relGdac1X/1000;//29 jun-04 relGadc0=relGadc0X/1000;//29 jun-04 relGadc1=relGadc1X/1000;//29 jun-04 relGadc2=relGadc2X/1000;//29 jun-04

    if (reldac==0) { //reldac==mV/V 29 jun-04SetCtrlAttribute(handle, PANEL_GAIN, ATTR_LABEL_TEXT, "V1[mV]");SetCtrlAttribute(handle, PANEL_GAIN2, ATTR_LABEL_TEXT, "V2[mV]");SetCtrlAttribute(handle, PANEL_GAIN3, ATTR_LABEL_TEXT, "V3[mV]");SetCtrlAttribute(handle, PANEL_GAIN4, ATTR_LABEL_TEXT, "V4[mV]");SetCtrlAttribute(handle, PANEL_IN