Está en la página 1de 76

Apéndice A

Código Fuente

Debido a lo extenso que resulta la codificación de los algoritmos, solo se

citará las partes más resaltantes, dejando toda la información de la tesis en un

CD para mayor referencia.

A.1. Código C y Matlab

A.1.1. Codificación del Driver en GCC para Lectura de la BD Physionet - MIT

Para poder utilizar la base de datos de señales ECG provenientes de

Physionet-MIT se tuvo que desarrollar un driver en lenguaje C para el

compilador GCC que permite pasar las señales del sistema operativo Linux

hacia el sistema operativo Windows para procesarlo en Matlab.

Instalación en entorno Linux de Physionet WFDB:

A continuación (necesitamos ingresar como root), desempaquetamos el paquete con el comando: tar xfvz wfdb.tar.gz Esto crea un directorio de la forma: wfdb-10.m.n Luego ingresar a la carpeta: cd wfdb-10.m.n Seguidamente iniciar la instalación: ./configure Configurarlo en el sistema: make install

Instalación de las librerías W3C libwww Del CD de la Tesis bajar el programa w3c-libwww-5.3.2.tar.gz tar xfvz w3c-libwww-5.3.2.tar.gz cd w3c-libwww-5.3.2 ./configure --with-zlib=z make make install

128

Nota: El tiempo aproximado para estos pasos es de aproximadamente 40 minutos.

Compilación del programa Tesis.c

Para generar el archivo ejecutable tesis, empleamos el compilador ANSI C para Linux, esto es el gcc Como primer paso, en un terminal ejecutar: gcc –c tesis.c Luego: gcc tesis.o –o tesis –lwfdb Para correrlo dar un nuevo nombre al archivo (ver codigo fuente de tesis.c): ./tesis 100.txt

al archivo (ver codigo fuente de tesis.c): ./tesis 100.txt Cabe recalcar que todas las señales ana

Cabe recalcar que todas las señales analizadas han sido obtenidas de la Base de Datos del MIT, el programa tesis.c elaborador por el autor fue compilado usando el gcc sobre Linux, instalando previamente las librerías propias de Physionet, como se especifica en el manual de esta base de datos. En concreto el código del programa es:

129

/*Copyright Aland Bravo Vecorena II-FIEE-UNI-2003 */ #include <stdio.h> #include <malloc.h> #include <wfdb/wfdb.h> main(int argc,char *argv[]){ FILE *fp,*fp2; long int N=2400,var; char Ala1[33],cad[33];//long int tiene 32 bits int i,j,nsig; WFDB_Sample *v; WFDB_Siginfo *s;

if(argc!=2){

printf("Olvido introducir el nombre del archivo a Crear \n"); return 1;

}

if((fp=fopen(argv[1],"w"))==NULL){

printf("No se puede abrir el archivo \n"); return 1;

}

nsig=isigopen("16786",NULL,0);

if(nsig<1)

exit(1);

s=(WFDB_Siginfo *)malloc(nsig *sizeof(WFDB_Siginfo));

if(isigopen("16786",s,nsig)!=nsig)

exit(1);

v=(WFDB_Sample *)malloc(nsig *sizeof(WFDB_Sample));

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

if(getvec(v)<0)

break;

for(j=0;j<nsig;j++){

var=v[j]; sprintf(cad,"%d",var); fprintf(fp,"%s\n",cad); /*Visualizacion Externa*/

printf("%8d",var);

}

printf("\n");

}

/*Rutina para adicionar informacion trascendente */ /*Numero de Canales */ sprintf(cad,"%i",nsig);

fprintf(fp,"%s\n",cad); /*Numero Total de Muestras */ N=N*nsig;

130

sprintf(cad,"%d",N); fprintf(fp,"%s\n",cad); /*INICIO->DATOS --Numero de Canales --Numero total de Muestras <-FIN */ /*Cerrar Archivo */ fclose(fp);

/*Aqui empieza codigo de lectura del archivo */

if((fp2=fopen(argv[1],"r"))==NULL){

printf("No se puede abrir el archivo \n"); return 1;

}

printf("Leyendo del archivo

/*Lee el archivo */ /*Mostrar el contenido */

fscanf(fp2,"%s",Ala1);

while(!feof(fp2)){

printf("%s\n",Ala1);

fscanf(fp2,"%s",Ala1);

}

/*Aqui termina código de comprobación */

exit(0);

}

\n");

A.1.2. Codificación de los Algoritmos de las Wavelets y las Redes Neuronales en MATLAB

A continuación se muestras extractos de código en Matlab que

implementan los algoritmos de las Wavelet y las Redes Neuronales aplicadas a

las señales ECG.

Para lograr esto copiar la carpeta Uvi_Wave que viene en el CD de la Tesis, a la carpeta del Toolbox de Matlab, esto es: C:\matlabR12\toolbox\wavelet

Como siguiente paso, correr el programa inicio.m, esto es:

%Rutina inicio.m tmq='cd '; %pwd; %tmp=ans;

131

tmp='C:\matlabR12\work';

cd C:\matlabR12\toolbox\wavelet\Uvi_Wave startup; %Inicio de rutina q=length(tmq); p=length(tmp); N=p+q;

s=q+1;

tempo=tmq; for i=s:N tempo(i)=tmp(i-q); end eval(tempo); clear all; %El proposito de esta rutina es inicializar el paquete Uvi_Wave%

A continuación se describe algunos programas utilizados en Matlab para la lectura de la BD del MIT previamente traducidos al formato establecido por el autor de la Tesis.

traducidos al formato establecido por el autor de la Tesis. Código utilizado para lectura de datos:

Código utilizado para lectura de datos: (lee.m)

% Copy Right ABV

% Lectura de Señales Normales

fid01 = fopen('16265.txt','r');

%

132

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A);

N=p-2; % Numero total de muestras Ch=A(p-1); % Numero de Canales %Inicio Cadena IF%

if Ch==2

% Se crean dos Subvariables

for i=1:N/2

Nor_1(i)=A(2*i-1);

end

Nor_2(i)=A(2*i);

elseif Ch==3 % Se crean tres Subvariables for i=1:N/3

Nor_1(i)=A(3*i-2);

end

Nor_2(i)=A(3*i-1);

Nor_3(i)=A(3*i);

elseif Ch==4

% Se crean cuatro Subvariables

for i=1:N/4

Nor_1(i)=A(4*i-3);

Nor_2(i)=A(4*i-2);

Nor_3(i)=A(4*i-1);

Nor_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Nor_1(i)=A(i);

end

end %FIN Cadena IF%

% Lectura de Señales con Arritmia Supra Ventricular

fid01 = fopen('800.txt','r'); % Fs=128 Hz

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A);

N=p-2; % Numero total de muestras Ch=A(p-1); % Numero de Canales %Inicio Cadena IF%

if Ch==2

% Se crean dos Subvariables

for i=1:N/2

Asv_1(i)=A(2*i-1);

Asv_2(i)=A(2*i);

%

end elseif Ch==3 % Se crean tres Subvariables for i=1:N/3

Asv_1(i)=A(3*i-2);

end

elseif Ch==4

Asv_2(i)=A(3*i-1);

Asv_3(i)=A(3*i);

133

% Se crean cuatro Subvariables

for i=1:N/4

Asv_1(i)=A(4*i-3);

Asv_2(i)=A(4*i-2);

Asv_3(i)=A(4*i-1);

Asv_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Asv_1(i)=A(i);

end

end %FIN Cadena IF%

% Lectura de Señales con Taqui Arritmia Ventricular

fid01 = fopen('cu03.txt','r'); % Fs=250Hz

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A);

N=p-2; % Numero total de muestras Ch=A(p-1); % Numero de Canales %Inicio Cadena IF%

if Ch==2

% Se crean dos Subvariables

for i=1:N/2

Tav_1(i)=A(2*i-1);

end

Tav_2(i)=A(2*i);

%

elseif Ch==3 % Se crean tres Subvariables for i=1:N/3

Tav_1(i)=A(3*i-2);

end

elseif Ch==4

Tav_2(i)=A(3*i-1);

% Se crean cuatro Subvariables

for i=1:N/4

Tav_1(i)=A(4*i-3);

Tav_2(i)=A(4*i-2);

Tav_3(i)=A(4*i-1);

Tav_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Tav_1(i)=A(i);

end

Tav_3(i)=A(3*i);

end %FIN Cadena IF%

% Rutinas para normalizar la Señal de Entrada:

% Procesa Señal Normal

% Canal 1

P=length(Nor_1);

134

Q=min(Nor_1);

Nor_1=Nor_1-Q;

Delta=max(Nor_1)-min(Nor_1);

Nor_1=Nor_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Nor_1=Nor_1-(sum(Nor_1)/P);

% Canal 2

P=length(Nor_2);

Q=min(Nor_2);

Nor_2=Nor_2-Q;

Delta=max(Nor_2)-min(Nor_2);

Nor_2=Nor_2/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Nor_2=Nor_2-(sum(Nor_2)/P);

% Procesa Señal Taqui Arritmia Ventricular

% Canal 1

P=length(Tav_1);

Q=min(Tav_1);

Tav_1=Tav_1-Q;

Delta=max(Tav_1)-min(Tav_1);

Tav_1=Tav_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Tav_1=Tav_1-(sum(Tav_1)/P);

% Procesa Señal Arritmia Supra Ventricular

% Canal 1

P=length(Asv_1);

Q=min(Asv_1);

Asv_1=Asv_1-Q;

Delta=max(Asv_1)-min(Asv_1);

Asv_1=Asv_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Asv_1=Asv_1-(sum(Asv_1)/P);

% Canal 2

P=length(Asv_2);

Q=min(Asv_2);

Asv_2=Asv_2-Q;

Delta=max(Asv_2)-min(Asv_2);

Asv_2=Asv_2/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Tav_1=Tav_1-(sum(Tav_1)/P);

% Inicio de Rutinas para mostrar las Señales Cardiacas

zoom on

%figure(1)

figure subplot(3,1,1), plot(Nor_1,'red'),title('Señal Normal') subplot(3,1,2), plot(Asv_1,'blue'),title('Arritmia Supra Ventricular')

135

subplot(3,1,3), plot(Tav_1,'green'),title('Taquiarritmia Ventricular')

%figure(2)

figure subplot(3,1,1), plot(Nor_2,'red'),title('Señal Normal') subplot(3,1,2), plot(Asv_2,'blue'),title('Arritmia Supra Ventricular')

%subplot(3,1,3), plot(Tav_2,'green'),title('Taquiarritmia Ventricular')

%

Considerar:

 

%

1)

16265.txt

-->

Nor_1-->1900,Nor_2-->1900

%

2)

800.txt

-->

Asv_1-->640 ,Asv_2-->640

%

3)

cu03.txt

-->

Tav_1-->1326

%

Inicio del Procesamiento de la Red Neuronal

%

figure

 

%

plot(Nor_1,'red')

%

title('Normal sinus rhythm')

%

title('Supraventricular Arrhythmia')

%

title('Ventricular Tachyarrhythmia')

%

xlabel('Time, s')

 

%

ylabel('ECG')

%

N=512;

 

for i=1:N

Nor(i)=Nor_1(i);

Asv(i)=Asv_1(i);

Tav(i)=Tav_1(i);

end

% Graficas de las diversas Wavelet madre:

%[cA,cD]=dwt(Nor_1,'db2');

Lprima=dbaux(2); % Coeficientes del filtro L'

Hprima=wrev(Lprima); % revierte el orden del vector Lt=round(length(Hprima)/2)-1; % cada 2da muestra -1 for i=0:Lt

Hprima(2*(i+1))=-1*Hprima(2*(i+1));

end % obtenemos el filtro pasa alto H' HU=dyadup(Hprima,0); % upsample H'

H2=conv(HU,Lprima);

plot(H2)

% Realizando una TW continua

close all subplot(2,1,1), plot(Nor,'red'),title('Señal Normal')

subplot(2,1,2)

c=cwt(Nor_1,1:8:48,'db4','plot'); % 2D %c=cwt(Nor,1:12:61,'db4','3Dplot'); % 3D

%subplot(3,1,3)

%c=cwt(Nor_1,1:8:48,'db4','plot'); % 2D

% Empleo de Wavelet Packets

136

% para reduccion del Ruido

Es importante recordar, que para obtener estos resultados, se tuvieron que realizar diversas pruebas, por ejemplo el número de neuronas en las capas de entrada, oculta y salida; así como tipos de funciones de transferencia

El código utilizado en esta parte tiene varios bloques:

Por ejemplo la carpeta 371_1, significa que la red está compuesta de 3 neuronas en la capa de entrada, 7 en la oculta y 1 en la capa de salida. Asimismo esta carpeta tiene información sobre las funciones de transferencia de cada capa, en este caso:

1-> tansig

2-> tansig

3-> purelin

en este caso: 1-> tansig 2-> tansig 3-> purelin Esta carpeta contiene 2 carpetas dentro de

Esta carpeta contiene 2 carpetas dentro de ella, entrena371_1 y prueba371_1, como su propio nombre indica, estas carpetas contienen archivos *.m para realizar las etapas de entrenamiento y pruebas respectivamente. Contenido de la carpeta entrena371_1:

# cd entrena371_1

# lee_371

# entrenamiento_371

137

(lee_371.m) %Lee todas las señales de entrenamiento lee01_entrenamiento % Señal Nor 16265 Asv 800 Tav

(lee_371.m)

%Lee todas las señales de entrenamiento lee01_entrenamiento % Señal Nor 16265 Asv 800 Tav cu03 lee02_entrenamiento % Señal Nor 16265 Asv 801 Tav cu05 lee03_entrenamiento % Señal Nor 16265 Asv 802 Tav cu06 lee04_entrenamiento % Señal Nor 16265 Asv 803 Tav cu07 lee05_entrenamiento % Señal Nor 16272 Asv 804 Tav cu08 lee06_entrenamiento % Señal Nor 16272 Asv 806 Tav cu09 lee07_entrenamiento % Señal Nor 16272 Asv 807 Tav cu10 lee08_entrenamiento % Señal Nor 16272 Asv 808 Tav cu11 lee09_entrenamiento % Señal Nor 16273 Asv 809 Tav cu12 lee10_entrenamiento % Señal Nor 16273 Asv 810 Tav cu13 lee11_entrenamiento % Señal Nor 16273 Asv 811 Tav cu14 lee12_entrenamiento % Señal Nor 16273 Asv 812 Tav cu15 clear A Asv_1 Asv_2 Ch Delta N Nor_1 Nor_2 P Q Tav_1 i p fid01

(prewavelet250f.m)

function y=prewavelet250(x) % Fs=250 Hz f=length(x); % se supone f=512 pts

% Reduciendo la Linea Base

[h,g,rh,rg] = daub(4);

yt=wt(x,h,g,5); % descomposicion al 5to nivel

isplit(yt,5,'','r.')

%yt(1:16)=zeros(1,16);

% 1-16:(0-7.8125Hz) 16-32:(7.8125-15.625Hz) 32-64:(15.625-31.25Hz)

138

% 64-128:(31.25-62.5Hz) 128-256:(62.5-125Hz)

for i=0:f/2-1

ytabv(i+1)=yt(i+1);

end

close all

y=ytabv;

( prewavelet250.m ) function y=prewavelet250(x) % Fs=250 Hz f=length(x); % se supone f=512 pts % Reduciendo la Linea Base [h,g,rh,rg] = daub(4);

yt=wt(x,h,g,5); % descomposicion al 5to nivel

isplit(yt,5,'','r.')

%yt(1:16)=zeros(1,16);

% 1-16:(0-7.8125Hz) 16-32:(7.8125-15.625Hz) 32-64:(15.625-31.25Hz)

% 64-128:(31.25-62.5Hz) 128-256:(62.5-125Hz)

for i=0:f/2-1

ytabv(i+1)=yt(i+1);

end

close all

y=iwt(ytabv,rh,rg,4);

(lee12_entrenamiento.m)

% Copy Right ABV

% Lectura de Señales Normales

fid01 = fopen('16273.txt','r');

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A); N=p-2; % Numero total de muestras Ch=A(p-1); % Numero de Canales

%Inicio Cadena IF%

if Ch==2

%

% Se crean dos Subvariables

for i=1:N/2

Nor_1(i)=A(2*i-1);

Nor_2(i)=A(2*i);

end elseif Ch==3 % Se crean tres Subvariables

for i=1:N/3

Nor_1(i)=A(3*i-2);

end

elseif Ch==4

Nor_2(i)=A(3*i-1);

% Se crean cuatro Subvariables

for i=1:N/4

Nor_3(i)=A(3*i);

139

Nor_1(i)=A(4*i-3);

Nor_2(i)=A(4*i-2);

Nor_3(i)=A(4*i-1);

Nor_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Nor_1(i)=A(i);

end

end %FIN Cadena IF%

% Lectura de Señales con Arritmia Supra Ventricular

fid01 = fopen('812.txt','r');

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A); N=p-2; % Numero total de muestras Ch=A(p-1); % Numero de Canales %Inicio Cadena IF%

if Ch==2

% Se crean dos Subvariables

for i=1:N/2

Asv_1(i)=A(2*i-1);

end

Asv_2(i)=A(2*i);

%

elseif Ch==3 % Se crean tres Subvariables for i=1:N/3

Asv_1(i)=A(3*i-2);

end

Asv_2(i)=A(3*i-1);

Asv_3(i)=A(3*i);

elseif Ch==4

% Se crean cuatro Subvariables

for i=1:N/4

Asv_1(i)=A(4*i-3);

Asv_2(i)=A(4*i-2);

Asv_3(i)=A(4*i-1);

Asv_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Asv_1(i)=A(i);

end end %FIN Cadena IF%

% Lectura de Señales con Taqui Arritmia Ventricular

fid01 = fopen('cu15.txt','r');

A = fscanf(fid01,'%5d'); % reads 5-digit decimal integers.

A = A';

p=length(A); N=p-2; % Numero total de muestras

%

140

Ch=A(p-1); % Numero de Canales %Inicio Cadena IF% if Ch==2

% Se crean dos Subvariables

for i=1:N/2

Tav_1(i)=A(2*i-1);

end

Tav_2(i)=A(2*i);

elseif Ch==3 % Se crean tres Subvariables for i=1:N/3

Tav_1(i)=A(3*i-2);

end

elseif Ch==4

Tav_2(i)=A(3*i-1);

% Se crean cuatro Subvariables

for i=1:N/4

Tav_1(i)=A(4*i-3);

Tav_2(i)=A(4*i-2);

Tav_3(i)=A(4*i-1);

Tav_4(i)=A(4*i);

end else % Caso Ch==1 for i=1:N

Tav_1(i)=A(i);

end

Tav_3(i)=A(3*i);

end %FIN Cadena IF%

% Rutinas para normalizar la Señal de Entrada:

% Procesa Señal Normal

% Canal 1

P=length(Nor_1);

Q=min(Nor_1);

Nor_1=Nor_1-Q;

Delta=max(Nor_1)-min(Nor_1);

Nor_1=Nor_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Nor_1=Nor_1-(sum(Nor_1)/P);

% Canal 2

P=length(Nor_2);

Q=min(Nor_2);

Nor_2=Nor_2-Q;

Delta=max(Nor_2)-min(Nor_2);

Nor_2=Nor_2/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Nor_2=Nor_2-(sum(Nor_2)/P);

% Procesa Señal Taqui Arritmia Ventricular

% Canal 1

P=length(Tav_1);

Q=min(Tav_1);

141

Tav_1=Tav_1-Q;

Delta=max(Tav_1)-min(Tav_1);

Tav_1=Tav_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Tav_1=Tav_1-(sum(Tav_1)/P);

% Procesa Señal Arritmia Supra Ventricular

% Canal 1

P=length(Asv_1);

Q=min(Asv_1);

Asv_1=Asv_1-Q;

Delta=max(Asv_1)-min(Asv_1);

Asv_1=Asv_1/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Asv_1=Asv_1-(sum(Asv_1)/P);

% Canal 2

P=length(Asv_2);

Q=min(Asv_2);

Asv_2=Asv_2-Q;

Delta=max(Asv_2)-min(Asv_2);

Asv_2=Asv_2/Delta; % Rango de la Señal entre 0 y 1

% Si se desea un DC=0, agregar:

% Tav_1=Tav_1-(sum(Tav_1)/P);

% Inicio de Rutinas para mostrar las Señales Cardiacas

zoom on

%figure(1)

%figure %subplot(3,1,1), plot(Nor_1,'red'),title('Señal Normal') %subplot(3,1,2), plot(Asv_1,'blue'),title('Arritmia Supra Ventricular') %subplot(3,1,3), plot(Tav_1,'green'),title('Taquiarritmia Ventricular')

%figure(2)

%figure %subplot(3,1,1), plot(Nor_2,'red'),title('Señal Normal') %subplot(3,1,2), plot(Asv_2,'blue'),title('Arritmia Supra Ventricular')

%subplot(3,1,3), plot(Tav_2,'green'),title('Taquiarritmia Ventricular')

% Considerar:

% 1)

16265.txt

-->

Nor_1-->1900,Nor_2-->1900

% 2)

800.txt

-->

Asv_1-->640 ,Asv_2-->640

% 3)

cu03.txt

-->

Tav_1-->1326

% Inicio del Procesamiento de la Red Neuronal

% figure

% plot(Nor_1,'red')

% title('Normal sinus rhythm')

% title('Supraventricular Arrhythmia')

% title('Ventricular Tachyarrhythmia')

% xlabel('Time, s')

% ylabel('ECG')

142

%

N=512;

for i=1:N

Nor_16273(i)=Nor_1(i);

Asv_812(i)=Asv_1(i);

Tav_cu15(i)=Tav_1(i);

End

A.2. Código Java y C Embebido para MPLAB

A.2.1. Codificación en Java del Servlet

Para poder utilizar desplegar la aplicación en el servidor web Tomcat, se

utilizó la tecnología de los Servlets de Java, en donde se programó la lógica

interna para almacenar los archivos ECG en texto plano.

En el paquete signalAnalysis, en la clase FileUploadServlet.java:

package signalAnalysis;

import javax.servlet.*; import javax.servlet.http.*; import java.io.*;

import com.oreilly.servlet.multipart.*;

public class FileUploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private File dir;

String dirName = "C:" + File.separatorChar + "UNI5" + File.separatorChar

+ "feb5" + File.separatorChar + "apache-tomcat-5.5.12" +

File.separatorChar + "database"

+ File.separatorChar + "users" + File.separatorChar + "temp";

String finaldirName = "C:" + File.separatorChar + "UNI5" + File.separatorChar

+ "feb5" + File.separatorChar + "apache-tomcat-5.5.12"+

File.separatorChar +"database"

+ File.separatorChar + "users" ;

143

public void init(ServletConfig config) throws ServletException { super.init(config); // Read the uploadDir from the servlet parameters // = config.getInitParameter("uploadDir");

// if (dirName == null) { // throw new ServletException("Please supply uploadDir parameter"); // } dir = new File(dirName); if (!dir.isDirectory()) { throw new ServletException("Supplied uploadDir " + dirName + " is invalid");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/plain"); System.out.println(" userid " + request.getParameter("userid")); out.println("The file was uploaded succesfully"); Part part = null; ParamPart paramPart = null; FilePart filePart = null; long size =0; String fileName = null; try {

MultipartParser mp = new MultipartParser(request, 100 * 1024 *

1024); // 10MB

while ((part = mp.readNextPart()) != null) { String name = part.getName();

System.out.println(" the name of the part is " + name); if (part.isParam()) { // it's a parameter part System.out.println(" a parameter got wow"); paramPart = (ParamPart) part; if ( name.equals("userid") )

{

paramPart = (ParamPart) part; String value = paramPart.getStringValue();

}

out.println("param; name=" + name + ", value=" +

((ParamPart) part).getStringValue());

}

144

else if (part.isFile()) { System.out.println("part as file" + part.getName()); // it's a file part filePart = (FilePart) part; filePart.writeTo(new File(dirName)); fileName = filePart.getFileName(); out.println("file; " + "; filename=" + fileName + ",

filePath="

 

+ filePart.getFilePath() + ", content

type="

 

+ filePart.getContentType() + ",

size=" + size);

}

}

} catch (IOException lEx) { this.log( "error reading or saving file",lEx);

}

/*

*

MultipartRequest mr = new MultipartRequest(request , "D:\\test2");

*

System.out.println(mr.getParameter("userid"));

*/ String userid = paramPart.getStringValue(); File finalFile = new File ( finaldirName + File.separatorChar + paramPart.getStringValue() + File.separatorChar + fileName); File tempFile = new File ( dirName + File.separatorChar + fileName); BufferedOutputStream buffer = null; FileOutputStream out2 = null; BufferedReader reader = null; try {

out2 = new FileOutputStream(finalFile, true);

buffer = new BufferedOutputStream(out2); reader = new BufferedReader(new FileReader(tempFile)); String temp2 = null; while ( (temp2 = reader.readLine())!= null)

{

temp2 = temp2 + "\n";

buffer.write(temp2.getBytes());

}

buffer.close();

reader.close();

145

tempFile.delete();

}

catch( Exception e)

{

e.printStackTrace();

}

/*if (fileName != null) { // the part actually contained a file String temp = dirName + File.separatorChar + paramPart.getStringValue(); System.out.println(" temp " + temp); size = filePart.writeTo(new File(temp));

} else {

// the field did not contain a file out.println("file; name=" + "; EMPTY");

}*/

out.flush();

}

}

En cuanto a la implementación de los algoritmos de Redes Neuronales en Java, se ha visto conveniente utilizar el Framework JOONE engine, que provee un conjunto de librerías especialmente modelas y diseñadas para dicha tarea. Como primer paso, instalar dichas librerías ejecutando el instalador:

JooneEditor1.2.1-Win.exe.

En resumen, se ha investigado y desarrollado adaptaciones de aplicaciones en Java que permitan analizar las señales ECG utilizando diversas técnicas:

Análisis en el Tiempo.

Análisis en Frecuencia.

Análisis Wavelet.

Análisis empleando Redes Neuronales.

Asimismo se realizo el modelado web empleando Servlets para desplegar un site donde se gestiona la Base de Datos de los pacientes, en donde adicionalmente se pueden guardar las señales ECG, así como la información adicional requerida para su diagnostico.

146

Apéndice B B.1: Glosario de Términos

A continuación se detalla algunos de los términos usados en la tesis:

Término

Definición

SE

Software Engineering o Ingeniería de Software.

FIIS

Facultad de Ingeniería Industrial y de Sistemas.

UML

Lenguaje de Modelado Unificado.

TIC

Tecnología de Información y Comunicación.

J2EE

Java para Edición Empresarial.

JVM

Máquina Virtual de Java.

JSP

Página de Servidor Java.

J2SE

Java para Edición Estándar.

J2ME

Java para Micro Edición.

W3C

World Wide Web Consortium.

TCP/IP

Protocolo de Control de Transmisión / Protocolo de Internet.

RPC

Llamada a Procedimiento Remoto.

IEEE

Instituto de Ingenieros Electricistas y Electrónicos.

AIC

Advanced Industrialized Countries.

TIC

Tecnologías de la información y la comunicación.

RPC

Llamada a Procedimiento Remoto.

TCP

Protocolo de Control de Transmisión.

IP

Protocolo de Internet.

RMI

Java Remote Method Invocation.

OMG

Grupo de Gestión de Objetos.

DCOM

Modelo de Objetos de Componentes Distribuidos.

RMI-IIOP

Internet Inter-Orb Protocol.

JNDI

Interfaz de Nombrado y Directorio Java.

JDBC

Java Database Connectivity.

JTS

Java Transaction Service.

147

B.2: Nomenclatura y Acrónimos

A continuación se detalla algunos de los términos usados en la tesis:

CWT Transforma da Wavelet Continua . DWT Transforma da Wavelet Discreta . SWT Transforma da Wavelet Semidiscreta . FT Transforma da de Fourier . FFT Transforma da Rápida de Fourier .

WT

IWT Transforma da Wavelet Inversa .

ECG

Transforma da Wavelet .

~

Sen al

Electrocardiográfica .

FIR Filtro de respuesta impulsiona l finita .

IIR

SNR Relación

Filtro de respuesta impulsiona l infinita .

~

Sen al a Ruido

148

Nomenclatu ra :

f

( t )

 

Función continua

.

f

[

n

]

Función Discreta

.

 

)

Coeficient

es

de la transforma da Wavelet continua

.

]

Coeficient

es

de la transforma da Wavelet discreta

.

Smbolo para " unión de

".

Smbolo para inclusión de

"

".

Smbolo para pertenece a

"

".

t

)

Wavelet continua

.

 

C a b

(

,

C i j

(

Ψ

t

Ψ

[

,

a

,

[

n

( )

n

[

]

j k

,

b

φ

a b

,

φ

j k

,

]

Wavelet discreta

Función de escalado continua

Función de escalado discreta

.

.

.

h [

n

]

Filtro pasa bajo discreto

.

g

[ n

]

Filtro pasa alto discreto

.

G

Operador de pasa alto y diezmado por dos .

H

Operador de pasa bajo y diezmado por dos .

G H
G
H

Operador de pasa alto e interpolac ión por dos .

Operador de pasa bajo e interpolac ión por dos .

G H G H

,

,

,

Representación matricial de los operadores anteriores

I

Matriz Identidad .

W

Matriz Wavelet .

N

δ

(

µ σ

,

2

)

R

s

2

Z

s

(

2

x n

[

]

x dx

[

]

)

n

Ruido blanco gausiano de media y varianza

µ

σ

Umbral para recortar los coeficientes Wavelet .

Energía

de la

Energía

de la

~

sen al contínua s x

(

).

~

sen al discreta s n

[

].

~

Valor medio de la sen al discreta x n

[

].

2

.

149

.

Apéndice C Referencias de Internet

La siguiente lista es una recopilación de dominios públicos los cuales

fueron consultados durante el desarrollo de esta Tesis durante los primeros

meses del 2002 , algunos de ellos ya no estan disponibles debido al constante

cambio, motivo por el cual se adjunta su contenido en el CD elaborado por el

autor, el cual servirá como aporte para futuras investigaciones en esta área.

http://www.stats.bris.ac.uk/pub/reports/Wavelets/WavByTop.html

Artculos y papers de wavelet aplicado a problemas de estadstica principalmente.

http://www.oslo.sintef.no/wavelets/theory.html

Descripción y Teora sobre Análisis Multi - Resolución.

http://www.cetaceanresearch.com/software.html

Software para análisis de señales acústicas.

http://www.ecgcorp.com/velav/index.html

Información principalmente sobre acústica y vibraciones.

http://lcavwww.epfl.ch/ minhdo/wavelet _ course/

Información útil sobre procesamiento de señales digitales mediante wavelets, con ejercicios en Matlab.

http://www.cosy.sbg.ac.at/ uhl/wav.html

Links a otras páginas dedicadas a wavelets y procesamiento de señales.

http://www.che.utexas.edu/ misra/wavelet.html

Pequeña gua de libros y software para utilización de wavelets.

http://www-stat.stanford.edu/ wavelab/

Completo Software para Matlab.

http://www.isye.gatech.edu/ brani/

Página de Brani Vidakovic, Profesor investigador en el campo de wavelets aplicado a problemas de estadstica y limpieza de ruido.

http://www.dsp.rice.edu/publications/

Completa guia de papers clasificada por temas.

http://www.prosoniq.com

Software de Audio con implementaciones que utilizan algoritmos basados en wavelets.

http://cas.ensmp.fr/ chaplais/Wavetour _ presentation/Wavetour _ presentation _ US.html

Información sobre wavelet y Fourier, con tópicos tales como: análisis de frecuencia, wavelets diádicas y filtrado discreto, entre otros.

150

http://www.spd.eee.strath.ac.uk/ interact/fourier/fft.html

Tutorial sobre la Transformada Rápida de Fourier.

http://users.ox.ac.uk/ ball0597/Fourier/

Información variada sobre análisis de Fourier.

http://www.spd.eee.strath.ac.uk/ interact/fourier/dft.html

Tutorial sobre la Transformada Discreta de Fourier.

http://www.med.harvard.edu/JPNM/physics/didactics/improc/intro/fourier1.html

Introducción a la Transformada de Fourier.

http://archives.math.utk.edu/topics/fourierAnalysis.html

Lista de direcciones online dedicadas a diferentes aplicaciones que utilizan tanto teora de Fourier como de wavelets.

http://www.amara.com/current/wavelet.html

Completa página con links a software, libros, papers, dedicados tanto a teora como aplicaciones de wavelets.

http://www.mame.syr.edu/faculty/lewalle/tutor/tutor.html

Tutorial de Wavelets.

http://sepwww.stanford.edu/public/docs/pvi/toc _ html/index.html

Información sobre Fourier y Wavelet.

http://www.wavelet.org

Completa página sobre el tema.

http://www.mathsoft.com/wavelets.html

Gran lista de papers sobre wavelets clasificados por temas de investigación.

http://www.princeton.edu/ icd/

Página de Ingrid Daubechies, cuyo campo de interés se focaliza en el análisis tiempo- frecuencia utilizando wavelets.

http://www-stat.stanford.edu/ donoho/

Página de Dave Donoho, cuya principal campo de investigación es limpieza de ruido utilizando métodos estadsticos en conjunto con wavelets.

http://www.ukc.ac.uk/IMS/statistics/people/T.Sapatinas/

Página de Teophanis Sapatinas, cuyas áreas de interés son: Teora y aplicación de wavelets en el análisis estadstico de señales de tiempo, Utilización de wavelets en el procesamiento de señal e imágen.

http://euclides.uniandes.edu.co/ wavelets/

Página de la Universidad de los Andes, Colombia, con información teórica sobre wavelets.

http://www.public.iastate.edu/ rpolikar/WAVELETS/WTtutorial.html

Práctico tutorial wavelet.

151

Apéndice D D.1: Generalidades de los Microprocesadores

En este anexo se presentan los conceptos de las tecnologías de los sistemas web y se discuten algunas metodologías de construcción de software así como la tecnología de los Microcontroladores de la familia Microchip.

Descripción del Hardware del Microcontrolador

Para el prototipo en hardware hemos ajustado algunas restricciones, a

decir:

Uso de la tarjeta de desarrollo Explorer 16 de Microchip que

contiene el microcontrolador DSPIC33FJ256GP710.

La comunicación con la PC será a través del puerto serial RS232.

Para obtener la señal ECG de simulación desde el

microcontrolador, previamente se grabarán las muestras desde la base de datos ECG del MIT.

Características generales del DSPIC33FJ256GP710

Un microcontrolador es un computador completo (microprocesador + puertos de E/S + memoria + otros periféricos) (Fig. D.1), aunque de limitadas prestaciones, se destina a gobernar una sola tarea con el programa que reside en su memoria, sus líneas de entrada/salida soportan el conexionado de los sensores y actuadores del dispositivo a controlar. (Fig. D.1)

152

Figura D.1: Componentes internos de un Microcontrolador. Diferencia entre microprocesador y microcontrolador Las

Figura D.1: Componentes internos de un Microcontrolador.

Diferencia entre microprocesador y microcontrolador

Las siguientes El microprocesador es un circuito integrado que contiene la unidad de procesamiento central (CPU), también llamada procesador de un computador. La CPU está formada por la unidad de control, que interpreta las instrucciones, y el camino de datos que las ejecuta. Los pines de un microprocesador sacan al exterior las líneas de sus buses de direcciones, datos y control, para permitir conectarle con la Memoria y los módulos de E/S y configurar un computador implementando por varios circuitos integrados. Se dice que un microprocesador es un sistema abierto porque su configuración es variable de acuerdo con la aplicación a la que destine.

153

Figura D.2: Un Microprocesador dentro del Microcontrolador. Arquitectura interna del Microcontrolador La arquitectura

Figura D.2: Un Microprocesador dentro del Microcontrolador.

Arquitectura interna del Microcontrolador

La arquitectura tradicional de computadoras y microprocesadores se basa en el esquema propuesto por John Von Neumann, en el cual la unidad de procesamiento central o CPU, esta conectada a una única memoria que contiene tanto las instrucciones del programa como los datos (Fig. D.4).

El tamaño de la unidad de datos o instrucciones esta fijado por el ancho del bus de la memoria. Es decir que un microprocesador de 8 bits, que tiene además un bus de 8 bits que lo conecta con la memoria, deberá manejar datos e instrucciones de una o más unidades de 8 bits (bytes) de longitud. Cuando deba acceder a una instrucción o dato de más de un byte de longitud, deberá realizar más de un acceso a la memoria. Por otro lado este bus único limita la velocidad de operación del microprocesador, ya que no se puede buscar en memoria una nueva instrucción, antes de que finalicen las transferencias de datos que pudieran resultar de la instrucción anterior.

Es

decir

que

las

dos

principales

limitaciones

de

esta

arquitectura

tradicional son:

 
 

154

• Que la longitud de las instrucciones esta limitada por la unidad de longitud de los datos, por lo tanto el microprocesador debe hacer varios accesos a memoria para buscar instrucciones complejas.

• Que la velocidad de operación (o ancho de banda de operación) esta limitada por el efecto de cuello de botella que significa un bus único para datos e instrucciones que impide superponer ambos tiempos de acceso.

La arquitectura von Neumann permite el diseño de programas con código automodificable mas no auto reconfigurable en cuanto a su arquitectura interna, es decir se puede reconfigurar el código de aplicación, mas no su arquitectura interna del microprocesador que se encuentra dentro del microcontrolador.

CPU

que se enc uentra dentro del microcontrolador. CPU Memoria Figura D.3: Arquitectura Von Newman. La

Memoria

Figura D.3: Arquitectura Von Newman.

La arquitectura conocida como Harvard, consiste simplemente en un esquema en el que el CPU esta conectado a dos memorias por intermedio de dos buses separados. Una de las memorias contiene solamente las instrucciones del programa, y es llamada Memoria de Programa. La otra memoria solo almacena los datos y es llamada Memoria de Datos (Fig. D.3). Ambos buses son totalmente independientes y pueden ser de distintos anchos.

Para un procesador que utiliza un Conjunto de Instrucciones Reducidas de Cómputo, o RISC (Reduced Instruction Set Computer), el conjunto de instrucciones y el bus de la memoria de programa pueden diseñarse de manera tal que todas las instrucciones tengan una sola posición de memoria de programa. Además, como los buses son independientes, el CPU puede estar accediendo a los datos para completar la ejecución de una instrucción, y al mismo tiempo estar leyendo la próxima instrucción a ejecutar. Se puede observar claramente que las principales ventajas de esta arquitectura son:

• Que el tamaño de las instrucciones no esta relacionado con el de los datos, y

por lo tanto puede ser optimizado para que cualquier instrucción ocupe una sola

posición de memoria de programa, logrando así mayor velocidad y menor longitud de programa.

• Que el tiempo de acceso a las instrucciones puede superponerse con el de los datos, logrando una mayor velocidad de operación.

155

Una pequeña desventaja de los procesadores con arquitectura Harvard, es que deben poseer instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario incluir en los programas, ya que estas tablas se encontraran físicamente en la memoria de programa (por ejemplo en la EPROM de un microprocesador). (Fig. D.4)

Memoria

De Programa

de un microprocesador). (Fig. D.4) Memoria De Programa CPU Memoria De Datos Figura D.4: Arquitectura Harvard.

CPU

de un microprocesador). (Fig. D.4) Memoria De Programa CPU Memoria De Datos Figura D.4: Arquitectura Harvard.

Memoria

De Datos

Figura D.4: Arquitectura Harvard.

El microcontrolador dsPIC33FJ256GP710 posee una arquitectura

Hardvard con una memoria de programa de 12MB, y una memoria de datos de

64 KB. Internamente posee un bus de comunicación de 16 bits entre la memoria

de Data y la CPU, y un bus de comunicación de 24 bits entre la Memoria de

Programa y la CPU. Una característica especial de los microcontroladores

Microchip es que cuentan con un mecanismo de ventana directo de 16 bits para

transferir data directamente desde la Memoria de Programa hacia la Memoria

de Data o viceversa, dicha técnica se conoce como PSV o visibilidad de espacio

de programa que en esencia segmenta la memoria de Programa en páginas que

encaja en tamaño con un segmento de memoria PSV previamente definido en la

Memoria de Data, de modo que a través de un puntero de Memoria de página en

la Memoria de Data pueda ser copiado a este segmento de memoria PSV

previamente definido en la Memoria de Data (Fig. D.5).

156

16 – bit window Memoria de Memoria de dsPIC33F Programa Data RISC (12MB) MAC 16
16 – bit
window
Memoria de
Memoria de
dsPIC33F
Programa
Data
RISC
(12MB)
MAC
16 (64KB)
24 CPU
(dsPIC)
Figura D.5: Arquitectura Harvard de la familia dsPIC33F.

El Procesador Microchip

Es el elemento más importante del microcontrolador y determina sus

principales características, tanto a nivel hardware como software. Se encarga de

direccionar la memoria de instrucciones, recibir la instrucción en curso, su

descodificación y la ejecución de la operación que implica dicha instrucción, así

como la búsqueda de los operándoos y el almacenamiento del resultado. Existen

tres orientaciones en cuanto a la arquitectura u funcionalidad de los

procesadores actuales, estos son:

CISC (Computadores de Juego de Instrucciones Complejo): Un gran número de procesadores usados en los microcontroladores están basados en la filosofía CISC. Disponen de más de 80 instrucciones maquina en su repertorio algunas de las cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para una ejecución.

RISC (Computadores de Juego de Instrucciones Reducido): Tanto la industria de los computadores comerciales como la de los microcontroladores están decantándose hacia la filosofía RISC. En estos procesadores el repertorio de instrucciones maquine es muy reducido y las instrucciones son simples y, generalmente, se ejecutan en un ciclo. La sencillez y rapidez de estas instrucciones permiten optimizar el hardware y el software del procesador.

SISC (Computadores de Juego de Instrucciones Especifico): En los microcontroladores destinados a aplicaciones muy concretas, el juego de

157

instrucciones, además de ser muy reducido, es “especifico”, es decir, las instrucciones se adaptan a las necesidades de la aplicación prevista.

La familia del dsPIC33F tiene una velocidad de procesamiento máxima de 30 MIPS (millones de instrucciones por segundo), lo cual quiere decir que tiene un reloj interno de 120 MHz. La arquitectura del Hardware es una modificación de la Harvard, y requiere cuatro pulsos de reloj para incrementar el puntero de instrucciones. Todos los dsPIC vienen en diversas versiones: 20 MIPS, 30 MIPS ó 40 MIPS dependiendo de la familia seleccionada.

INTRC w/PLL (3-9) 16b/32b Timers 12 – 256 KB Flash Memory 1 – 30 KB
INTRC w/PLL
(3-9) 16b/32b Timers
12 – 256 KB
Flash Memory
1 – 30 KB
Data Memory
8-channel
DMA
WDT & Pwr Mgmt.
(1-2) 1.1Msps 10b ADC
Memory Bus
(1-2) 500Ksps 12b ADC
(1-2) UART w/LIN & IrDA ®
40 MIPS 16-bit
(1-2) I 2 C™
16b ALU
16 x 16b W
Register Array
(1-2) SPI ™
Input Capture
17b x 17b
Multiply
Dual AGU
X & Y
Output Compare/PWM
(0-2) ECAN™
JTAG
Barrel
Interface
Shifter
Codec I/F
Dual 40b
(4-8) MC PWM
DSP Engine
Accumulators
MC QEI
18 - 100-pin Packages
Interrupt
Control
Peripheral Bus

Figura D.6: Arquitectura de la Familia DSPIC33F.

Las características básicas del dsPIC se señalan a continuación:

o

El registro de instrucciones tiene 24 bits de tamaño con 16 bits para mantener los datos y 8 bits para la localización de comandos. La palabra en hardware tiene 16 bits o 2 bytes al igual que el bus de datos, lo que define al dsPIC como una maquina de 16 bits.

o

Existen 30 fuentes de interrupciones, las cuales mapean a todos los elementos internos y externos del microcontrolador.

o

La fuente de tensión puede ir de 2.5 V a 5 V con voltaje regulado.

158

INTRC w/PLL (2-5) 16b/32b Timers 12 - 144 KB 0.5 - 8 KB 1 -
INTRC w/PLL
(2-5) 16b/32b Timers
12 - 144 KB
0.5 - 8 KB
1 - 4 KB
WDT & Pwr Mgmt.
Flash Memory
Data Memory
EEPROM
1 Msps 10b ADC
Memory Bus
-or- 200 Ksps 12b ADC
(1-2) UART w/LIN & IrDA ®
30 MIPS 16-bit
(1-2) I 2 C™
16
x 16b W
(1-2) SPI
16b ALU
Register Array
Input Capture
Dual AGU
17b x 17b
Multiply
Output Compare/PWM
X
& Y
(0-2) CAN™
JTAG
Barrel
Codec I/F
Interface
Shifter
MC PWM
Dual 40b
DSP Engine
Accumulators
MC QEI
18 - 80-pin Packages
Interrupt
Control
Peripheral Bus

Figura D.7: Arquitectura de la Familia DSPIC30F.

12 – 256 KB Flash Memory 1 – 16 KB Data Memory 8 Channel INTRC
12 – 256 KB
Flash Memory
1 – 16 KB
Data Memory
8 Channel
INTRC w/PLL
DMA
(3-9) 16b/32b TimersYY
WDT & Pwr Mgmt.
Memory Bus
1.1 Msps 10b ADC
500 Ksps 12b ADC
40 MIPS 16-bit Core
(1-2) UART w/LIN & IrDA ®
Interrupt 16b ALU
Control
16
x
16b W
(1-2) I 2 C™
Register Array
(1-2) SPI
Address
17b x 17b
Multiply
Input Capture
Generator
Output Compare/PWM
JTAG
Multi-bit
Interface
Shifter
(0-2) ECAN™
18 - 100-pin Packages
Interrupt
Control
Peripheral Bus

Figura D.8: Arquitectura de la Familia PIC24H.

159

INTRC w/PLL WDT & Pwr Mgmt. 16 – 128 KB Flash Memory 4 – 8
INTRC w/PLL
WDT & Pwr Mgmt.
16 – 128 KB
Flash Memory
4 – 8 KB
500 Ksps 10b ADC
Data Memory
(2) Comparators
Memory Bus
(5) 16b/32b Timers
Input Capture
16 MIPS 16-bit Core
Output Compare/PWM
Interrupt 16b ALU
Control
16 x 16b W
Register Array
(2) UART w/LIN & IrDA ®
(2) SPI
Address
17b x 17b
Multiply
(2) I²C™
Generator Unit
CRC
JTAG
Multi-bit
Interface
Shifter
Real Time CC
PMP
28 - 100-pin Packages
Interrupt
Control
Peripheral Bus
Peripheral Pin Select

Figura 2.9: Arquitectura de la Familia PIC24F.

o

Se tiene pines de salidas o entradas generales, capaces de brindar o soportar 25 mA cada uno. Nunca se debe usar el procesador para manejar cargas de potencia, a pesar de que el dsPIC pueda soportarlo. Incluso el dsPIC puede soportar disipar 1 watt de potencia.

o

o

También se tiene temporizadores de 16 bits y también permite reagruparlos en un bloque de 32 bits.

o

o

9 pines conectados a módulos conversores analógico a digital de 10 bits, que trabajan a 500 Ksps (kilo muestras por segundo)

o

o

Debido a que el dsPIC es un procesador digital de señales, es capaz de realizar operaciones matemáticas muy rápido, así la multiplicación, suma y resta se realizan en un ciclo de reloj.

o

Memoria de Datos y de Programa

Como podemos observar (Fig. D.10 y Fig. D.11) la memoria del dsPIC

memoria para el

esta dividida en dos grandes partes: una es el espacio de

160

Espacio de Usuario

Espacio de Configuración

usuario y otro es el espacio de memoria para configuración. En el primer espacio

nos interesa particularmente el área de memoria de programa FLASH donde se

ubicará el programa, y el área de memoria EEPROM donde se ubicarán los

datos. En el área de registros de configuración se ubican los registros con los

cuales modificaremos el comportamiento del dsPIC.

23

0

0

PC<22:1>

0

Vector Reset

Tabla del Vector de Interrupción

Tabla Alternativa del Vector de Interrupción

Memoria Flash del Usuario en el Chip

Configuración Flash

No implementado

Registros de Configuración

ID del Dispositivo

000000000000hh

000000000044hh

000000110044hh

000000220000hh

77FFFFFFFFEEhh

FFFFFFFFFFEEhh

Figura D.10: Organización de la Memoria del Programa.

161

Características de la Visibilidad del Espacio de Programa PSV

Esta técnica ofrece ventajas tales como:

No se necesita la asignación de recurso del CPU para transferir data de la Memoria de Programa hacia la Memoria de Datos o viceversa.

Libera recursos del CPU para tareas que realmente requieran dicho recurso.

16-bits Dirección Dirección Byte MS Byte LS MSB LSB 2 KB 0x0000 0x0001 Espacio SFR
16-bits
Dirección
Dirección
Byte MS
Byte LS
MSB
LSB
2
KB
0x0000
0x0001
Espacio SFR
Espacio SFR
0x07FF
0x07FE
0x0801
0x0800
Memoria de
RAM Data X
Data Cercana
8 KB
Espacio SRAM
RAM Data Y
0x1FFE
2
KB
Puerto Dual RAM
Puerto-Dual
DMA RAM
0x8001
0x8000
No
Mapeo opcional
hacia la Memoria de
Programa usando
PSV
implementado
0xFFFF
0xFFFE

Figura D.11: Organización de la Memoria de Datos.

Interrupciones

Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos. El dsPIC33F tiene 30 fuentes de interrupción y 4 excepciones de procesador, los cuales están basados en un esquema de prioridades.

162

CCoonnttrroollaaddoorr ddee IInntteerrrruuppcciióónn TTRRAAPPSS CCPPUU 1155 IInntteerrrruuppcciióónn 77 88
CCoonnttrroollaaddoorr ddee
IInntteerrrruuppcciióónn
TTRRAAPPSS
CCPPUU
1155
IInntteerrrruuppcciióónn
77
88
ddeell
IInntteerrrruuppttss
CCPPUU
77
00
PPrriioorrii
ddaadd
DDiirreecccciióónn
NNaattuurraall
VVeeccttoorr ddee
00
PRIORIDADPRIORIDAD
DEL CPUDEL CPU
DDiirreecccciióónn
111177
00
SeleccionablePrioridad
Prioridad Seleccionable
PrioridaPriorida
Usuariopor
por el
el Usuario
dd
EstáticaEstática

Figura D.12: Organización de la Memoria de Datos.

El funcionamiento de las interrupciones es similar al de las subrutinas de las cuales se diferencian principalmente en los procedimientos que las ponen en marcha. Así como las subrutinas se ejecutan cada vez que son llamadas por un comando escrito en el código fuente, las interrupciones se ponen en marcha al aparecer en cualquier instante un evento externo al programa, es decir por un mecanismo hardware.

Cuando se produce cualquiera de los sucesos indicados anteriormente, se origina una petición de interrupción, que si se acepta, guarda el valor del PC actual en la Pila. Cada causa de interrupción está controlada mediante dos bit. Uno de ellos actúa como señalizador o flag que indica si se ha producido o no la interrupción, y la otra funciona como bit de permiso o prohibición de la interrupción en sí.

En el dsPIC todos los flags de interrupción son muestreados en el comienzo de cada instrucción por el registro IFSx. Un requerimiento de interrupción pendiente (IRQ) es indicado por un bit de flag igual a ‘1’ en un

163

registro IFSx. El IRQ causa una interrupción que ocurre si el correspondiente bit en el registro de habilitación de interrupción IECx es igual a ‘1’.

Si hay una IRQ pendiente con una prioridad de mayor nivel que la prioridad del proceso actual en los bits del IPL, el proceso será interrumpido. El procesador entonces almacena el contador de programa y el byte bajo del registro de estado del procesador (SRL), como se muestra en la figura 5.2. El byte bajo del registro de estado contiene el nivel de prioridad del proceso actual.

El CPU es responsable de leer la Tabla de Vectores de Interrupción (IVT) y transferir la dirección que contiene el vector de interrupción al contador de programa. La tabla de vectores de interrupción (IVT) y la tabla de interrupciones alternativa (AIVT) están cerca del comienzo del programa de memoria (0x000004). EL IVT y el AIVT se ven en la figura 2.12. Las interrupciones y excepciones son habilitadas, priorizadas y controladas usando registros con funciones especiales:

o IFS0<15:0>, IFS1<15:0>, IFS2<15:0>

Todas las banderas de petición de interrupción se encuentran en estos tres registros. Las banderas son activadas por sus respectivos periféricos o señales externas y son reseteadas vía software.

o IEC0<15:0>, IEC1<15:0>, IEC2<15:0>

Todos los bits de control que habilitan interrupciones están en estos tres registros. Estos bits de control son usados para individualmente habilitar

interrupciones desde los periféricos o señales externas.

o IPC<15:0>… IPC<7:0>

El nivel de prioridad asignable por el usuario asociado con cada una de estas interrupciones esta centralmente en estos doce registros.

o IPL<3:0>

El nivel actual de prioridad esta explícitamente almacenado en los bits IPL. IPL<3> esta presente en el registro CORCON, así como IPL<2:0> esta presente en el registro de estado (SR: Status Register) en el núcleo del procesador.

o INTCON1<15:0>, INTCON2<15:0>

Funciones de control global de interrupciones se derivan de estos dos registros, INTCON1 contiene las banderas de control y estado para las excepciones del procesador. El registro INTCON2 controla el comportamiento de las señales de petición de interrupción externa y el uso de la tabla alternativa de interrupciones.

Los bits de Prioridad de Interrupción asignable por el usuario (IP<2:0>) para cada fuente de interrupción individual están ubicadas en los bits LS 3 de cada nibble (1/2 byte) dentro del registro IPCx. El bit 3 de cada nibble no es usado y

164

es leído como cero ‘0’. Estos bits definen el nivel de prioridad asignado a una interrupción en particular, por el usuario. Los niveles de prioridad elegibles empiezan en 0, como la prioridad más baja, y nivel 7, como la más alta prioridad.

Dado que a más de una interrupción se le puede asignar la misma prioridad, se provee una tabla de prioridades con un nivel dado de prioridad, este método se llama orden natural de prioridades (Natural Order Priority), con lo que si una interrupción tiene la misma prioridad que otra, entonces se recurre a la prioridad dada en tabla natural de prioridades, y la que interrupción esta primero en esta tabla se ejecuta primero.

Interface de Comunicación Serial RS232

Para comprender el protocolo de comunicación serial, hay que tener en cuenta

que este tipo de comunicación eléctrica precede en bastantes años a la

aparición de los ordenadores electrónicos. La comunicación serie tiene sus

raíces en el telégrafo, que posteriormente derivó en el teleimpresor (Telex),

donde se utilizaron diversos protocolos de comunicación; los más famosos el

Morse el Baudot y el ASCII. Posteriormente las comunicaciones serie

informáticas adoptaron algunos de los usos y costumbres existentes

adaptándolos a las nuevas necesidades, empezando por su propio sistema de

códigos (ASCII), pero que conservando algunas reminiscencias de sus

ancestros telegráficos.

Tanto el sistema de codificación ASCII (American Standard Code for

Information Interchange, como el propio estándar RS-232, nacieron pensado en

transmisiones serie utilizadas casi exclusivamente para tele-impresión. Las

señales y protocolos empleados se referían a cuestiones tales como sonar una

campana para recabar la atención del operador, y enviar un retorno de carro CR

(Carriage Return) o un salto de línea LF (Line feed) -eran impresoras

electromecánicas-. La comunicación serie entre ordenadores no requiere tantas

señales. Sin embargo, se siguieron utilizando la terminología y muchas de las

señales del estándar primitivo.

165

En la comunicación serie los bits se transmiten uno detrás de otro (de ahí

el nombre), lo que hace que sean mucho más lentas que sus homólogas

"paralelo" en las que se transmiten varios bits a la vez. La ventaja es que puede

utilizarse un solo par de hilos, o incluso uno solo (si el retorno se realiza por la

tierra).

Existen varias formas de transmisiones serie:

o

Simplex: Un equipo transmite, el otro recibe.

o

Half-duplex: Transmiten ambos equipos pero no simultáneamente; los equipos se alternan en la transmisión, uno transmite mientras el otro recibe.

o

Full-duplex: Ambos equipos transmiten simultáneamente. Para ello se requieren dos líneas independientes, transmisión y recepción; la línea de transmisión de un equipo se conecta a la entrada de recepción del otro y viceversa. Los puertos serie del PC son capaces de utilizar este modo.

o

Síncronas: Los dispositivos que comunican se sincronizan en el momento inicial de la transmisión y constantemente se intercambian información a una cadencia predefinida. Con objeto de mantener la sincronización, cuando no existen datos que enviar se transmiten caracteres sin valor ("idle characters). Esta transmisión es más rápida que la asíncrona porque no es necesario transmitir señales de inicio o fin de dato; constantemente se reciben caracteres que pueden ser de datos o sin valor (de relleno).

o

Asíncronas: En este modo de transmisión no existe sincronización; no es necesario enviar caracteres de relleno, pero hay que indicar cuando empieza un dato y cuando termina. Esto se hace incluyendo en la transmisión señales de inicio y fin de dato (bits de "start" y "stop"). En la comunicación asíncrona, la información (cada carácter) es enviada en el interior de un cuadro ("Frame") de tamaño variable, que comienza con la mencionada señal de inicio y termina con la de final; es el tipo de comunicación utilizada en los puertos serie del PC.

En este tipo de comunicación, el estado de reposo (cuando no se transmite nada) se identifica con un "1" (marca). Cuando se recibe un bit de inicio, que es un "0" (espacio), el receptor toma nota que va a comenzar a recibir un dato.

Los parámetros que caracterizan estas comunicaciones son: velocidad, paridad, bits de datos y bits de parada. En la literatura sobre el tema es frecuente expresar estos datos en forma resumida. Por ejemplo: 1200 8 N 1 para indicar una transmisión de 1200 baudios con 8 bits de datos sin paridad y un bit de Stop.

166

Los parámetros anteriores están relacionados con la forma en que se transmite la información serie. En esta comunicación cada carácter va incluido en un cuadro ("Frame"); generalmente el comienzo es un bit de inicio (siempre un 1); después le sigue el dato, que puede ser de 5 a 8 bits de longitud; después puede haber un bit de control de paridad, y por último un bit final (siempre es un 1) de longitud variable (el equivalente a 1, 1.5 o 2 bits).

Velocidad de transmisión ("Connection speed") es la cantidad de datos transmitidos en unidad de tiempo. Se expresa en bits por segundo (bps). En las transmisiones serie a través de líneas telefónicas, en las que se emplean módems era frecuente utilizar como medida de velocidad el Baudio ("Baud rate"), en honor de Emile Baudot. Baudio se define como el número de veces que cambia la portadora en un segundo. La velocidad que puede emplearse depende en gran medida de la calidad del medio de transmisión (calidad de la línea), que si (como es frecuente) se trata de líneas telefónicas, depende a su vez de la distancia.

Longitud del carácter ("Char length"). Se han utilizado caracteres de 5, 6, 7 y 8 bits, aunque actualmente los datos son enviados como caracteres ASCII, por lo que pueden utilizarse 7 u 8 bits según se trate del juego de caracteres US-ASCII o el extendido. El conjunto de bits que componen un carácter se denominan bits de dato ("Data bits")

Paridad ("Parity"). Para poder comprobar la calidad de la transmisión se suele utilizar un sistema de control de paridad que añade un bit a los bits de datos. Los sistemas utilizados son:

o

Paridad par ("Even")

o

Paridad impar ("Odd")

o

Paridad marca ("Marck")

o

Paridad espacio ("Space")

o

Sin paridad (no se añade ningún bit de paridad al datagrama)

167

16 Internal Data Bus Word/Byte Word Write Write UxMODE UxSTA UTX8 UxTXREG Transmit Control Transmit
16
Internal Data Bus
Word/Byte
Word Write
Write
UxMODE
UxSTA
UTX8
UxTXREG
Transmit Control
Transmit FIFO
- Control UxTSR
- Control Buffer
-Generate Flags
Load UxTSR
UxTXIF
UTXBRK
Transmit Shift Register
UxTSR
(Start)
(Stop)
UxTX
Parity
÷16
Generator
Divider
UxCTS

Figura D.13: Modo de Transmisión del UART.

RS-232.C significa literalmente "Recomended Standard232 revisión C" (también conocida como EIA 232). Es un estándar publicado en 1969 por la EIA ("Electronic Standard Association") que define las características eléctricas que deben presentar los elementos de conexión para la comunicación serie entre ordenadores y equipos periféricos. Su título dice exactamente: "Conexión entre un Equipo Terminal de Datos y un Equipo de Comunicación de Datos empleando un intercambio de datos binario serie", y comprende diversos apartados:

Recordemos que en la comunicación serie, como en cualquier otra comunicación informática, existen dos aspectos complementarios: Uno relativo a las características físicas de la conexión; en este caso las características eléctricas y mecánicas, aspectos que están contemplados en el estándar RS- 232 (a estos elementos los denominaremos capa física). Otros son los protocolos de comunicación, que incluyen los sistemas de codificación de la señal que se enviará por la capa física (los denominamos capa lógica).

168

1166 Internal Data Bus WWoorrdd//BByyttee WWoorrdd RReeaadd UUxxMMOODDEE UUxxSSTTAA RReeaadd UURRXX88
1166
Internal Data Bus
WWoorrdd//BByyttee
WWoorrdd RReeaadd
UUxxMMOODDEE
UUxxSSTTAA
RReeaadd
UURRXX88 UUxxRRXXRREEGG
RReecceeiivvee CCoonnttrrooll
RReecceeiivvee FFIIFFOO
--GGeenneerraattee FFllaaggss
--GGeenneerraattee IInntteerrrruupptt
--SShhiifftt DDaattaa CChhaarraacctteerr
LLPPBBAACCKK
LLooaadd UUxxRRXXRREEGG
UUxxRRXXIIFF
UUxxTTXX
RReecceeiivveeSShhiifftt RReeggiisstteerr
UUxxRRSSRR
--SSttaarrtt bbiitt
UUxxRRXX
ddeetteecctt
--PPaarriittyy cchheecckk
÷÷1166 DDiivviiddeerr
1166xx BBaauudd CClloocckk
BBCCLLKKxx//UUxxRRTTSS
UUEENN
BBCCLLKKxx
SSeelleeccttiioonn
UUxxRRTTSS
UUxxCCTTSS
UUxxCCTTSS

Figura D.14: Modo de Recepción del UART.

Las principales características del modulo UART son:

o

Comunicación de datos de 8 o 9-bit, Full-duplex

o

Bit de paridad par, impar o sin paridad

o

Uno o dos bits de Stop

o

Generador de baudios con pre-escala de 16-bit

o

Tasas de baudio desde 38 bps a 1.875 Mbps con 30 MHz de ciclo de instrucción.

o

Buffer de transmisión de 4 palabras

o

Buffer de recepción de 4 palabras

o

Detección de error de rebose de buffer y paridad

o

Interrupciones separadas para transmisión y recepción

El modulo UART se habilita seteando el bit UARTEN en el registro UxMODE (donde x = 1 or 2). Una vez habilitado, los pines UxTX y UxRX son configurados como salida y entrada respectivamente sobrescribiendo los bits de los registros TRIS y LATCH correspondientes. El pin UxTX se mantiene en estado lógico ‘1’ cuando no hay transmisión.

Para transmitir datos se deben seguir los siguientes pasos:

169

1.

Configurar el UART:

2. Habilitar el UART seteando el bit UARTEN (UxMODE<15>).

3. Setear el bit UTXEN (UxSTA<10>), es decir habilitar la transmisión.

4. Escribir el byte a ser transmitido en UxTXREG.

5. Un bit de interrupción se genera UTXISEL (UxSTA<15>).

Para la recepción de datos se deben seguir los siguientes pasos:

1. Configurar el UART.

2. Habilitar el UART.

3. Una interrupción se genera. URXISEL bits (UxSTA<7:6>).

4. Leer el bit OERR para determinar si existen errores.

5. Leer el dato recibido de UxRXREG.

Puedo enviar DDTTEE DDCCEE RRTT RRTT 1166-- MMoodd bbiitt eemm CCTT CCTT MMiiccrr oo Ok,
Puedo enviar
DDTTEE
DDCCEE
RRTT
RRTT
1166--
MMoodd
bbiitt
eemm
CCTT
CCTT
MMiiccrr
oo
Ok, go ahead

RS232

Modo Simple

Listo para Listo para DDTTEE DDTTEE RRTT RRTT 1166-- PPCC bbiitt CCTT MMiiccrr CCTT oo
Listo para
Listo para
DDTTEE
DDTTEE
RRTT
RRTT
1166--
PPCC
bbiitt
CCTT
MMiiccrr
CCTT
oo

RS232

Modo de Control de Flujo

Figura D.15: Modos de Control de Transmisión del UART.

El dsPIC tiene un generado de tasa de baudios de 16-bit que permite una flexibilidad máxima. El registro de generación de tasa de baudios (UxBRG) se puede leer y escribir. La tasa de baudios se calcula como sigue:

Tasa de Baudios = Fcy /(16*(BRG+1))

o

BRG = registro UxBRG de 16-bit (0 hasta 65535)

o

FCY = Tasa del reloj de instrucción (1/TCY) FCY=Valor del cristal * PLL / 4 Máxima tasa de baudios: FCY /16 (si BRG = 0), Mínima tasa de baudios: FCY /16 / (16* 65536).

Entorno de Programación MPLAB IDE

MPLAB IDE es un programa de software que corre en una PC

convencional para desarrollar aplicaciones para los microcontroladores

Microchip. Es denominado Entorno de Desarrollo Integrado (Integrated

170

Development Environment), IDE en adelante, debido a que provee un entorno

simple para desarrollar código para microcontroladores. Es recomendable utilizar

las actualizaciones de la ayuda On-line de MPLAB IDE para las últimas

versiones. Se puede descargar el software MPLAB de www.microchip.com. Es

recomendable bajarlo de la web del fabricante porque allí se encuentra la última

actualización del software mencionado.

Los principales componentes del MPLAB IDE son los siguientes:

o Administrador de Proyectos

El administrador de proyectos provee integración y comunicación entre el entorno de desarrollo (simulación, configuración, emulación y depuración) con las herramientas de programación (lenguaje de programacion maquina, C30)

o Editor

El editor es un editor de texto se utiliza para escribir los códigos fuente con

muchas características para programación y también sirve como ventana para la depuración de los programas.

o Ensamblador/Enlazador y Herramientas de Lenguaje

El ensamblador puede ser usado solo sin ayuda para ensamblar un archivo, o puede ser usado como enlazador o linker para construir un proyecto de diferentes archivos fuente, librerías y objetos recompilados. El enlazador es responsable de posicionar el código compilado en áreas de memoria del microcontrolador destino.

o Motores de Ejecución

Existe software de simulación en MPLAB IDE para todos los dispositivos MCU PICmicro y dsPIC DSC. Estos simuladores utilizan una PC para simular las instrucciones y algunas funciones periféricas de los dispositivos MCU PICmicro y dsPIC DSC. Opcionalmente se tiene emuladores y depuradores en-circuito también disponibles para probar como corre la aplicación en el hardware.

o Herramientas de Lenguaje Compilador

Los compiladores de MPLAB C18 y MPLAB C30 C de Microchip proveen código totalmente integrado y optimizado. Los compiladores de HI-TECH, IAR, micro Engineering Labs, CCS y Byte Craft, pueden ser invocados por el administrador de proyectos de MPLAB IDE para compilar código que es automáticamente cargado en el debugger destino para instancias de prueba y verificación.

o Depurador

El depurador Microchip permite breakpoints, correr el programa paso a paso,

ventanas de visualización (Watch Windows) y todas las características de un

171

depurador moderno. Trabaja en conjunto con el editor para referirse a la información destino siendo el código fuente depurado en realimentación.

o Programador

PICSTART Plus, PICkit 1 y 2, PRO MATE II, MPLAB PM3 tanto como MPLAB ICD 2 pueden programar código en los dispositivos destino. MPLAB IDE ofrece control total sobre programación de código y datos, tanto como de bits configuración para definir los diferentes modos de operación de los microcontroladores destino o dsPIC.

o Emulador en-Circuito

MPLAB ICE 2000 y MPLAB ICE 4000 son emuladores con características completas para los dispositivos MCU PICmicro y dsPIC DSC. Ellos conectan la

PC vía puertos I/O y permiten un control total sobre la operación de los microcontroladores en las aplicaciones destino.

o Depurador en-Circuito

MPLAB ICD 2 provee una alternativa económica a un emulador. Usando algunos de los recursos sobre en chip, MPLAB ICD 2 puede descargar código en el microcontrolador destino insertado en la aplicación, fijar breakpoints, ejecutar en pasos simples y monitorear los registros y variables.

en pasos simples y monitorear los registros y variables. Figura D.16: Tarjeta de Desarrollo Explorer 16

Figura D.16: Tarjeta de Desarrollo Explorer 16 de Microchip.

El IDE MPLAB permite escribir, compilar, depurar, simular y grabar los

programas desarrollados, para ello la aplicación MPLAB instalada en la PC

172

utiliza un dispositivo hardware externo que se encarga de transferir el código ejecutable desde la PC hacia la tarjeta re configurable de desarrollo Explorer 16 (Fig. 2.16), existen diversos modelos del grabador hardware tales como ICD2, ICD3, Real ICE, ello dependiendo del tipo de familia de microcontrolador que se está usando en el desarrollo de la aplicación.

Lenguaje de Programación del Microcontrolador

MPLAB C-30 es una adaptación al ANSI x3.159-1989, optimizando el compilador C que incluye extensiones para aplicaciones de control con el dsPIC DSC. El compilador es una aplicación para entorno Windows que provee una plataforma de desarrollo en código C.

Fuente en C Fuente en Asembler Librerias Compilador PA Asembler Enlazador Archivo Asembler Archivo Objeto
Fuente en C
Fuente en Asembler
Librerias
Compilador
PA
Asembler
Enlazador
Archivo Asembler
Archivo Objeto
Archivo Ejecutable

Figura D.17: Estructura de Compilación del microcontrolador.

MPLAB C-30 compila archivos fuente en C, produciendo archivos en lenguaje ensamblador. Estos archivos compilados y producidos por la compilación se enlazan con otros archivos objeto y librerías para producir la aplicación final en ejecutable en formato COFF o ELF. Los archivos COFF o ELF pueden ser cargados por MPLAB IDE, donde pueden ser probados y depurados,

173

o también utilizar el utilitario de conversión para pasar de COFF o ELF a formato

hex de Intel, adecuado para cargarlo en la línea de comandos para la simulación

o el respectivo programador. En (Fig. 2.17) vemos el diagrama de flujo de

desarrollo del software.

o Estándar ANSI C

El

compilador MPLAB C30 es un compilador totalmente validado que conforma

el

estándar ANSI C como fue definido por la especificación ANSI descrita por

Kernighan y Ritchie’s. El estándar ANSI C incluye extensiones a la definición original C que ahora con características estándar del lenguaje. Estas extensiones incrementan la portabilidad y ofrece una mayor capacidad.

o Optimización

El compilador utiliza un conjunto sofisticado de optimización que emplea muchas

técnicas avanzadas para generar eficiente y compacto código desde código fuente C. Esta optimización toma ventaja determinadas particularidades del dsPIC.

o Soporte de librerías del Estándar ANSI C

MPLAB C30 es distribuido con una completa librería del estándar ANSI C. Todas

las funciones de la librería han sido validadas, y conforman el estándar de librería ANSI C. Las librerías incluyen funciones para manejo de caracteres, asignación de memoria dinámica, conversión de datos y funciones matemáticas. Las funciones estándar de Entrada/Salida para la manipulación de archivos también están incluidas y distribuidas, las cuales soportan acceso total al sistema de archivos usando el simulador de línea de comandos.

o Modelo de Memoria Flexible

El compilador soporta modelo de código y datos, pequeño y grande. El modelo

de código pequeño tiene la ventaja de tener formas más eficientes de instrucciones call y branch, mientras que el modelo de datos pequeño soporta el uso de instrucciones compactas para acceder a los datos.

o Driver del compilador

MPLAB C30 incluye un potente driver de programa de línea comandos. Usando

el driver de programa, programas de aplicación pueden ser compilados, ensamblados y enlazados en un simple paso.

174

D.2: Generalidades de las Tecnologías Web

Tecnologías Web y Descripción del Software

Para aplicaciones pequeñas en donde se requiera una comunicación entre aplicaciones Java y dispositivos DSP en su mayoría programados en C, se utiliza JNI, que en esencia es una interface nativa Java que mapea o enlaza los tipos de datos entre el lenguaje de programación java y C a nivel de código objeto, otra alternativa más simple es a través del uso de protocolos de comunicación serial tal como el RS232 que permite independencia al momento de seleccionar un entorno de programación gráfica en la Interface de usuario, usualmente se usa Visual Basic ó Java por su fácil entorno de programación. Antes de describir la arquitectura J2EE, es importante describir algunos aspectos de Java y los estilos de arquitectura de las aplicaciones distribuidas contemporáneas: las arquitecturas de nivel 2, nivel 3 y nivel n. Aunque estos estilos de arquitectura se encuentran con bastante frecuencia en las empresas de la actualidad, merece la pena señalar que estos estilos surgieron debido a la llegada de nuevas plataformas de hardware para clientes y servidores más baratas y de tecnología de redes. Anteriormente, los motores de las empresas eran sistemas principales con todos los servicios informáticos (desde la generación de usuario-interfaz hasta procesamiento de transacciones de gran volumen) centralizados. Consecuentemente, la tecnología cliente servidor fue la que provocó una automatización masiva de la empresa. Dentro de la evolución de la tecnología Java, es importante mencionar algunas diferencias:

Applet

Es bajado desde un Servidor Web y es ejecutado en un Browser.

Java Beans

Son componentes de software hechos en Java, su desarrollo se basa en un

175

modelo de programación de componentes, para su desarrollo hay que seguir ciertos estándares y son reutilizables. Pueden ser utilizados en entornos visuales de programación y auto describen sus propiedades y pueden ser vistas y alteradas en una herramienta de desarrollo visual.

Características:

Sus variables no se acceden directamente sino a través de métodos estándares (getters y setters).

La nomenclatura de estos métodos siguen ciertos estándares.

Una clase BeanInfo acompaña a la clase principal.

Esta clase describe al JavaBean y permite que se pueda utilizar en un ambiente de desarrollo visual.

Los JavaBeans pueden ser visuales (widgets) o no visuales (solo lógica).

Servlets

Un servlet es una clase Java que corre en el Web Server (o un proceso lógicamente vinculado al Web Server). Un servlet acepta los requerimientos HTTP y responde con páginas HTML. El HTML es normalmente dinámico y reeja información que el servlet obtiene de varios sistemas empresariales.

Características:

Son independientes del servidor utilizado y de su sistema operativo.

Los servlets pueden llamar a otros servlets, e incluso a métodos concretos de otros servlets.

Los servlets pueden obtener fácilmente información acerca del cliente.

Los servlets permiten la generación dinámica de código HTML Los servlets son a los servidores, como los applets a los navegadores.

176

JSP

Los Java Server Pages son similares a un HTML solo que el contenido se construye dinámicamente dentro de la página web. Los JSP soportan todos los tags de HTML. El diseño puede variar sin modi car el contenido dinámico y es una extensión de la tecnología de los servlets y esta basado en la reutilización de componentes.

Características:

Separación entre generación de contenido y presentación.

Con HTML o XML se da formato a la página.

Mediante etiquetas JSP, script o Java Beans se añade el componente dinámico.

Independencia de la plataforma tanto cliente como servidor.

Fácil de administrar y de usar.

Ventajas:

Frente a un ASP:

El código está escrito en Java.

Portable entre Sistemas Operativos.

Se compilan y permanecen en memoria, no son interpretadas.

Frente a un Servlet:

Permite separar el diseño de la página web del código.

Facilita el mantenimiento.

Frente a Java Script:

Java Script genera HTML dinámicamente en el cliente.

177

No puede acceder a recursos del servidor.

Tecnologías J2EE

Las

comunicaciones.

tecnologías

Componentes

J2EE

están

basadas

en

Componentes del lado del cliente

Applets.

Application Clients.

componentes,

Componentes del lado del servidor

EJBs.

Web Components (Servlets, JSP).

Servicios

servicios

y

Funciones utilizadas por los componentes J2EE.

APIs implementadas por el proveedor de la plataforma J2EE.

Comunicación

Permite la comunicación entre componentes.

Proveído por el contenedor.

Servicios y Comunicaciones J2EE

178

Servicios de Nombres:

Java Naming and Directory Interface: JNDI.

Servicios de Base de Datos:

Java Data Base Connectivity: JDBC.

Servicios de Transacciones:

Java Transaction API: JTA.

Java Transaction Service: JTS.

Servicio de Comunicaciones:

Remote Method Invocation over Internet InterORB Protocol: RMI-IIOP.

Java Mail.

Java Beans Activation Framework: JAF.

Java Message Service: JMS.

Contenedor J2EE

Cada componente corre dentro de un contenedor que es ofrecido por el proveedor de la plataforma, este contenedor provee servicios especí cos a la implementación y ejecución del componente (ciclo de vida, seguridad, transacciones, etc) Los servicios brindados dependen del tipo de contenedor.

Plataformas Soportadas

Sistemas Operativos:

AIX 4.3.3 ML 10, 5.1 ML2, 5.2.

Linux 2.4 Kernel.

Red Hat Advanced Server 2.1.

SuSE 7.3, SuSE 8, SLES 7.

Solaris 8.

179

HP/UX 11.

Microsoft (Windows NT 4.0 SP6a, W2K Server SP3, Advanced Server SP3, Win2003).

OS/400 OS/390, zOS,zLinux.

Servidores Web Soportados:

Apache.

Microsoft Internet Information Server.

Sun One (iPlanet) Web Server.

Domino Web Server.

Especicaciones implementadas:

J2EE 1.3.

Web Services

SOAP 2.3, WSIF.

UDDI clients.

Web Services Gateway.

UDDI Registry - for private UDDI registry.

Seguridad.

Java 2, JAAS, CSIv2.

Soporte para crypto card Eracom CSA 8000.

Arquitectura de dos niveles

Los sistemas cliente servidor típicos están basados en la arquitectura de dos niveles, donde existe una clara separación entre los datos y la lógica de presentación de la empresa. Estos sistemas están generalmente controlados por datos, siendo el servidor, en gran cantidad de ocasiones, un servidor de base de datos. Aunque este enfoque nos permite compartir datos en la empresa, tiene

180

muchos inconvenientes.

En una aplicación tradicional de 2 niveles, la carga de procesamiento es facilitada al PC cliente mientras que el servidor actúa simplemente como controlador del trá co entre la aplicación y los datos. Como resultado, el rendimiento de la aplicación no sólo sufre debido a los recursos limitados de la PC sino que el tráco de la red también tiende a aumentar. Cuando la aplicación completa es procesada en una PC, la aplicación es forzada a realizar múltiples peticiones de datos antes incluso de presentar algo al usuario. Estas múltiples peticiones de bases de datos pueden sobrecargar la red.

Otro problema típico relacionado con el enfoque de 2 niveles es el del mantenimiento. Incluso el menor cambio realizado a una aplicación puede conllevar una completa alteración en la base del usuario. Aunque sea posible automatizar el proceso, todavía debe enfrentarse a la actualización de cada instalación de cliente.

Es más, algunos usuarios pueden que no estén preparados para una alteración total y posiblemente ignoren los cambios mientras que otro grupo puede que insista en realizar los cambios de inmediato. Esto puede provocar que diferentes instalaciones de cliente utilicen diferentes versiones de la aplicación.

Arquitectura de tres niveles

Con el afán de solucionar estos inconvenientes, la comunidad de software desarrolló la noción de una arquitectura de 3 niveles. Una aplicación se divide en tres capas lógicas distintas, cada una de ellas con un grupo de interfaces perfectamente de nidas. La primera capa se denomina capa de presentación y normalmente consiste en una interfaz grá ca de usuario de algún tipo. La capa intermedia, o capa de empresa, consiste en la aplicación o lógica de empresa, y la tercera capa, la capa de datos, contiene los datos necesarios para la

181

aplicación.

La capa intermedia (lógica de aplicación) es básicamente el código al que recurre el usuario (a través de la capa de presentación) para recuperar los datos deseados. La capa de presentación recibe entonces los datos y los formatea para su presentación. Esta separación entre la lógica de aplicación de la interfaz de usuario añade una enorme exibilidad al diseño de la aplicación. Pueden construirse y desplegarse múltiples interfaces de usuario sin cambiar en absoluto la lógica de aplicación, siempre que la lógica de aplicación presente una interfaz claramente de nida en la capa de presentación.

J2EE ofrece diversas abstracciones para satisfacer las necesidades de cada uno de estos niveles. Por ejemplo, los EJB ofrecen mecanismos para abstraer tanto el acceso a datos como la lógica de empresa. De un modo similar, los servlets y las páginas Java Server permiten abstraer la capa de presentación y su interacción con la capa de empresa.

La tercera capa contiene los datos necesarios para la aplicación. Estos datos consisten en cualquier fuente de información, incluido una base de datos de empresa como Oracle o Sybase, un conjunto de documentos XML o incluso un servicio de directorio como el servidor LDAP.

Arquitectura de n niveles

Este tipo de sistema puede dar cabida a varias con guraciones diferentes. En una arquitectura de n niveles, la lógica de aplicación está lógicamente dividida por funciones y no físicamente. Una arquitectura de n niveles se descompone en las siguientes partes:

Una interfaz de usuario que maneja la interacción del usuario con la aplicación. Esta puede ser un navegador Web que se transmite mediante la salida WAN de un rewall, una aplicación de escritorio o incluso un dispositivo inalámbrico.

182

Una lógica de presentación que dene lo que muestra la interfaz de usuario y como son gestionadas las demandas del usuario. Dependiendo de las interfaces de usuario que se mantengan, puede que sea necesario contar con versiones de la lógica de presentación ligeramente diferentes para satisfacer al cliente adecuadamente.

Una lógica de empresa que modele las reglas de empresa de la aplicación, a menudo a través de la interacción con los datos de la aplicación.

Servicios de infraestructura que proporcionen la funcionalidad adicional requerida por los componentes de la aplicación, tales como mensajería y apoyo transaccional. La capa de datos donde residen los datos de la empresa.

Las aplicaciones basadas en esta arquitectura emplean esencialmente el patrón Modelo-Vista-Controlador (MVC). Lo que esto signi ca fundamentalmente es que los datos (el modelo) son independientes respecto de la presentación de la información (la vista). En una posición intermedia se encuentra la lógica de aplicación/empresa (el controlador) que controla el ujo de información. De este modo, una aplicación es diseñada a partir de estos tres componentes funcionales (modelo, vista y controlador) interactuando entre sí.

En el prototipo desarrollado se utiliza la plataforma J2EE sobre Tomcat que permite la publicación de los Servlets que contiene la aplicación de analisis computaciones de las muestras digitalizadas de señales ECG tomadas de la base de datos del MIT a través del puerto serial RS232 simuladas como entradas desde el microcontrolador dsPIC33FJ256GP710 contenida en la tarjeta de desarrollo Explorer 16 de Microchip.

Patrones de Diseño de Software

183

En el desarrollo del prototipo en el lenguaje de programación java se utilizó técnicas avanzadas de ingeniería de software tanto a nivel metodológico como el RUP ó Proceso Unificado Racional para el manejo del proyecto como tal, así como a nivel de aplicación a través de los patrones de diseño de software para garantizar un enfoque robusto de la aplicación. A continuación se listan los más resaltantes:

Patrón de Diseño Iterator

Contexto:

1. Un objeto agregado contiene elementos objetos.

2. Clientes necesitan acceder a los elementos de los objetos.

3. El objeto agregado no deberá exponer su estructura interna.

4. Múltiples clientes podrían desear acceso independiente.

Solución:

1. Denir un iterador que procesa un elemento en un determinado momento.

2. Cada objeto iterador mantiene grabación de la posición del siguiente elemento.

3. Si hay múltiples variaciones aggregate/iterator, es mejor que las clases

aggregate e iterator implementen tipos de interfaces comunes.

Patrón de Diseño Model/View/Controller

Contexto:

1. Algunos programas tienen múltiples vistas que pueden ser editadas.

2. Ejemplo: Editor HTML.

vista de la estructura.

vista de la fuente.

184

vista de WYSIWYG (lo que vemos en pantalla es idéntico a lo que se imprimirá).

3. Editando una vista actualiza la otra.

4. La actualización parece instantánea.

Solución:

1. Modelo: estructura de la data, no tiene representación visual.

2. Vista: representación visual.

3. Controlador: interacción con el usuario Patrón.

4. Las Vistas y los Controladores actualizan el modelo.

5. El Modelo le dice a las Vistas que la data ha cambiado.

6. Las Vistas se re dibujan a si mismas

Patrón de Diseño Observer

Contexto

1. Un objeto, llamado el sujeto (subject), es la fuente de eventos.

2. Uno o más objetos observadores (observers) desean ser noticados cuando ese evento ocurra.

Solución:

1. De na un tipo de interface observer. Todos los concrete observers lo deben implementar.

2. El subject mantiene una colección de observadores.

3. El subject proporciona métodos para añadir y descartar observers.

4. En cualquier instante que un evento ocurra, el subject notica a todos los

185

observers.

5. El Modelo notica a las Vistas cuando algo interesante sucede.

6. El Botón notica a los oidores de acciones (action listeners) cuando algo interesante sucede.

7. Las Vistas se adicionan ellas mismas al Modelo para poder ser noticadas.

8. Los Oidores de Acciones (Action listeners) se adicionan ellos mismos al Botón para poder ser noticados.

9. Generalizar: Observadores se añaden por si mismos al sujeto.

Patrón de Diseño Strategy

Contexto

1. Una clase puede bene ciarse de las diferentes variantes para un algoritmo.

2. Los Clientes algunas veces desean reemplazar algoritmos estándar con versiones a la medida.

Solución

1. Dena un tipo de interface que es una abstracción para el algoritmo.

2. Actualmente estas clases strategy implementan este tipo de interface.

3. Los Clientes pueden proporcionar objetos strategy.

4. En cualquier momento que el algoritmo necesite ser ejecutado, el contexto de la clase llama al método apropiado del objeto strategy.

Patrón de Diseño Composite

Contexto

1. Objetos primitivos pueden ser combinados con objetos composite.

2. Clientes manejan un objeto composite como un objeto primitivo.

186

Solución

1. Dene un tipo de interface que es una abstracción para los objetos primitivos.

2. Los Objetos Composite coleccionan objetos primitivos.

3. Clases primitivas y Composite implementan el mismo tipo de interface.

4. Cuando se implementa un método desde el tipo de interface, la clase composite aplica el método a sus objetos primitivos y combina el resultado.

Patrón de Diseño Decorator

Contexto

1.

Los

objetos

Componentes

pueden

ser

decorados

(visual

o

con

comportamiento mejorado).

 

2.

El objeto decorado puede ser usado del mismo modo que el objeto no

decorado.

3. La clase del componente no desea tomar responsabilidad de la decoración.

4. Ahí puede existir un conjunto abierto cerrado de posibles decoraciones.

Solución

1. Dena un tipo de interface que sea una abstracción para el componente.

2. Las clases Concrete Component implementan este tipo de interface.

3. Las clases Decorator también implementan este tipo de interface.

4. Un objeto decorador administra el objeto componente que este decora.

5. Cuando se implementa un método desde el tipo de interface component, la clase decorator aplica el método al componente decorado y combina el resultado con el efecto de la decoración.

Patrón de Diseño Template Method

Contexto

187

1.

Un algoritmo es aplicable para múltiples casos.

2. El algoritmo puede ser descompuesto en operaciones primitivas.

3. Las operaciones primitivas pueden ser diferentes para cada caso.

4. El orden de las operaciones primitivas no depende del caso Patrón Template Method.

Solución

1. De na una super clase que tenga un método para el algoritmo y métodos abstractos para las operaciones primitivas.

2. Implemente el algoritmo para llamar a las operaciones primitivas en el orden apropiado.

3. No dena las operaciones primitivas en la super clase, o en todo caso defínalos para que tengan un comportamiento apropiado por defecto.

4. Cada subclase dene las operaciones primitivas pero no el algoritmo.

Patrón de Diseño Facade

Contexto

1. Un sub sistema consiste de múltiples clases, haciendo su uso un tanto

complicado para los clientes.

2. El Implementador podría desear cambiar las clases del sub sistema.

3. Deseo de dar un punto de entrada coherente.

Solución

1. De na una clase facade que exponga todas las capacidades del sub sistema como métodos.

2. El método facade delega las solicitudes a las clases del sub sistema.

3. Las clases del sub sistema no conocen acerca de la clase facade.

188

Patrón de Diseño Prototype

Contexto

1. Un sistema instancia objetos de las clases que no son conocidas cuando el sistema es construido.

2. No se desea requerir de una clase separada para cada tipo de objeto.

3. Se desea evitar una jerarquía separada de clases cuya responsabilidad es crear los objetos.

Solución

1.

creados.

2. Proporcione un objeto prototipo para cada tipo de objeto que el sistema crea.

3. Clone el objeto prototipo cada vez que el nuevo objeto del tipo dado sea requerido.

De na un tipo de interface prototipo que sea común a todos los objetos

Patrón de Diseño Adapter

Contexto

1. Se desea usar una clase existente (adaptee) sin necesidad de modicarla.

2. El contexto en el cual se desea usar la clase requiere la interface destino que es diferente de la del adaptee.

3. La interface destino y la interface adaptee están conceptualmente

relacionadas.

Solución

1. Dena una clase adapter que implemente la interface objetivo.

2. La clase adapter mantiene una referencia al adaptee. Traslada los métodos

189

objetivos para los métodos adaptee.

3. El cliente envuelve el adaptee en un objeto de la clase adapter.

Patrón de Diseño Command

Contexto

1. Se desea implementar comandos que se comporten como objetos:

Debido a que se necesita almacenar información adicional con comandos.

Debido a que se desea coleccionar comandos.

Solución

1.

comando.

2. Proporcionar métodos en el tipo de interface command para manipular el estado de los objetos command.

De nir un tipo de interface command con un método para ejecutar el

3. Cada clase concreta command implementa el tipo de interface command.

4. Para invocar el command, llamar al método execute.

Patrón de Diseño Factory Method

Contexto

1. Un tipo (el creador) crea objetos de otro tipo (el producto).

2. Subclases del tipo creador necesitan crear diferentes especies de objetos producto.

3. Los clientes no necesitan conocer el tipo exacto de los objetos producto.

Solución

1. Denir un tipo creator que exprese lo general de todos los creadores.

2. Denir un tipo product que expresa lo general de todos productos.

190

3.

De ne un método, llamado el método factory, en el tipo creator. El método

factory emite un objeto product.

4. Cada clase concreta creator implementa el método factory de tal modo que

retorne un objeto de una clase concreta product.