UNIVERSIDAD POLITÉCNICA DE VALENCIAcsahuqui/julio/pfc/memoria1.pdf · 2004-01-20 · universidad...

119
UNIVERSIDAD POLITÉCNICA DE VALENCIA ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL DE VALENCIA PROYECTO: VERIFICACIÓN DE CIRCUITOS ELECTRÓNICOS ASISTIDA POR COMPUTADOR 1.- MEMORIA PROYECTO FIN DE CARRERA REALIZADO POR : D. JULIO MARTÍNEZ JUAN DIRIGIDO POR : D. EDUARDO GARCÍA BREIJÓ ESPECIALIDAD : ELÉTRICA SECCIÓN : ELECTRÓNICA Valencia a 31 de Mayo de 1992

Transcript of UNIVERSIDAD POLITÉCNICA DE VALENCIAcsahuqui/julio/pfc/memoria1.pdf · 2004-01-20 · universidad...

UNIVERSIDAD POLITÉCNICA DE VALENCIA

ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIALDE VALENCIA

PROYECTO:VERIFICACIÓN DE CIRCUITOS ELECTRÓNICOS ASISTIDA

POR COMPUTADOR

1.- MEMORIA

PROYECTO FIN DE CARRERAREALIZADO POR : D. JULIO MARTÍNEZ JUANDIRIGIDO POR : D. EDUARDO GARCÍA BREIJÓESPECIALIDAD : ELÉTRICASECCIÓN : ELECTRÓNICAValencia a 31 de Mayo de 1992

ÍNDICE (MEMORIA)

1.- ENUNCIADO Y OBJETO DEL PROYECTO . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.- NECESIDADES DEL PROYECTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.1.- Necesidad académica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.2.- Descripción y Justificación técnica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

3.- INTRODUCCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4.- DESCRIPCIÓN Y UTILIZACIÓN DEL PSPICE . . . . . . . . . . . . . . . . . . . . . . . . 7

4.1.- INTRODUCCIÓN: LA SIMULACIÓN DE CIRCUITOS

ELECTRÓNICOS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

4.2.- SIMULACIÓN PSPICE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

4.2.1.- Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4.2.1.1.- Fichero de análisis. . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4.2.1.2.- Tipos de análisis. . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1.- Análisis en continua . . . . . . . . . . . . . . . . . . . . 10

2.- Análisis transitorio . . . . . . . . . . . . . . . . . . . . . 10

3.- Análisis en alterna . . . . . . . . . . . . . . . . . . . . . 10

4.- Análisis de Montecarlo y Peor caso . . . . . . . . . 10

4.2.1.3.- Simulación Analógico-Digital . . . . . . . . . . . . . . . . . 11

4.3.- CONSECUCIÓN DEL FICHERO .TXT . . . . . . . . . . . . . . . . . . . . . . . 11

I

4.4.- FORMATO DEL FICHERO PSPICE .TXT . . . . . . . . . . . . . . . . . . . . 12

4.5.- REPRESENTACIÓN DE ONDAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

5.- ADQUISICIÓN DE DATOS. TARJETA PCLAB-812 . . . . . . . . . . . . . . . . . . . . 16

5.1.- INTRODUCCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5.2.3.- Entrada Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5.2.4.- Salida Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5.2.5.- Temporizador/Contador programable . . . . . . . . . . . . . . . . . . . 21

5.2.6.- Canal de interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

5.2.7.- Canal de acceso directo a memoria (ADM) . . . . . . . . . . . . . . 22

5.2.8.- CONVERSIÓN ANALÓGICA/DIGITAL (A/D). . . . . . . . . . . 22

5.2.8.1.- Disparo por programa y transferencia por programa . . 25

5.2.8.2.- Disparo por temporizador (interno) y transferencia por

programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

5.2.8.3.- Disparo externo . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5.2.9.- CONVERSIÓN DIGITAL/ANALÓGICA. . . . . . . . . . . . . . . . 42

6.- DESCRIPCIÓN Y UTILIZACIÓN DE TURBO PASCAL . . . . . . . . . . . . . . . . . 45

6.1.- INTRODUCCIÓN HISTÓRICA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6.2.- LA PROGRAMACIÓN ESTRUCTURADA . . . . . . . . . . . . . . . . . . . . 48

6.3.- ESTRUCTURA BÁSICA DE LA PROGRAMACIÓN EN TURBO

PASCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

6.3.1.- Estructura de un programa Pascal . . . . . . . . . . . . . . . . . . . . . 49

6.3.1.2.- La sentencia PROGRAM . . . . . . . . . . . . . . . . . . . . . 50

II

6.3.1.2.- La declaración de unidades (sentencia USES) . . . . . . . 50

6.3.1.3.- La declaración de etiquetas (sentencia LABEL) . . . . . . 51

6.3.1.4.- La declaración de constantes (CONST) . . . . . . . . . . . 51

6.3.1.5.- La declaración de los tipos (TYPE) . . . . . . . . . . . . . . 52

6.3.1.6.- La declaración de variables (VAR) . . . . . . . . . . . . . . 52

6.3.1.7.- Definición de procedimientos y funciones

(PROCEDURE, FUNCTION) . . . . . . . . . . . . . . . . . . . 52

6.3.1.8.- El programa principal . . . . . . . . . . . . . . . . . . . . . . . 53

6.3.2.- Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

6.3.3.- Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

LongInt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Single . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Extended . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Comp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

6.3.4.- Estructuras de control y decisión . . . . . . . . . . . . . . . . . . . . . . 57

If-Then . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

III

If-Then-Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

For-Do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Repeat-Until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

While-Do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

6.3.5.- Lista de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

ABS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

ADDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

APPEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

ARC {Unidad Graph} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

ARCTAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

ASSIGN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

ASSIGNCRT {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . 62

BAR {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

BAR3D {Unidad Graph} . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

BLOCKREAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

BLOCKWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

CHDIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

CHR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

CIRCLE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . . . 63

CLEARDEVICE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . 63

CLEARVIEWPORT {Unidad GRAPH} . . . . . . . . . . . . . . . . 64

CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

IV

CLOSEGRAPH {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . 64

CLREOL {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

CLRSCR {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

CONCAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

COPY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

COS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

CSEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

DEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

DELAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

DISKSIZE {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . . 65

DISPOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

DOSVERSION {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . 65

EOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

EOLN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

EXEC {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

EXIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

FILESIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

FILLCHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

FINDFIRST {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . 66

FINDNEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

FREEMEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

GETCOLOR {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 67

GETDATE {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . 67

V

GETDIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

GETGRAPHMODE {Unidad GRAPH} . . . . . . . . . . . . . . . . . 68

GETIMAGE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 68

GETMAXMODE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . 68

GETMAXX {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 68

GETMAXY {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 68

GOTOXY {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . 68

GRAPHRESULT {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . 69

HALT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

IMAGESIZE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 69

INITGRAPH {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . 69

INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

INTR {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

IORESULT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

KEEP {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

LENGTH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

LINE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

LINEREL {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . . 70

LN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

LOWVIDEO {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . 71

MARK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

MKDIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

MOVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

MSDOS {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

VI

NEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

NORMVIDEO {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . 71

NOSOUND {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . 72

PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

PIESLICE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . . 72

POS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

PTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

PUTIMAGE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . 72

PUTPIXEL {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . . . 73

READ (READLN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

READKEY {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . 73

RECTANGLE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . . . 73

RELEASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

RESET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

RESTORECRTMODE {Unidad CRT} . . . . . . . . . . . . . . . . . 74

REWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

ROUND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

SEEK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

SETCOLOR y SETBKCOLOR {Unidad GRAPH} . . . . . . . . . 74

SETGRAPHMODE {Unidad GRAPH} . . . . . . . . . . . . . . . . . 75

SETLINESTYLE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . . 75

SETTEXTSTYLE {Unidad GRAPH} . . . . . . . . . . . . . . . . . . 75

SIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

SIZEOF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

VII

SOUND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

SQR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

SQRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

STR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

SWAPVECTORS {Unidad DOS} . . . . . . . . . . . . . . . . . . . . . 76

TEXTBACKGROUND {Unidad CRT} . . . . . . . . . . . . . . . . . 76

TEXTCOLOR {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . 76

TEXTMODE {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . 76

UPCASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

VAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

WHEREX {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . 77

WHEREY {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . 77

WINDOW {Unidad CRT} . . . . . . . . . . . . . . . . . . . . . . . . . . 77

WRITE(LN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

6.3.6.- Unidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

6.3.7.- Ficheros Include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

6.3.8.- Directivas de compilación . . . . . . . . . . . . . . . . . . . . . . . . . . 84

$A+/- : Alineamiento por palabra . . . . . . . . . . . . . . . . . . . . . 85

$B+/- : Evaluación booleana . . . . . . . . . . . . . . . . . . . . . . . . 86

$D+/- : Generar información para depurado . . . . . . . . . . . . . . 86

$E+/- : Emulación de coma flotante . . . . . . . . . . . . . . . . . . . 86

$F+/- : Forzar llamadas lejanas . . . . . . . . . . . . . . . . . . . . . . . 87

$I+/- : Detección de errores de E/S . . . . . . . . . . . . . . . . . . . . 87

$I<nombre de fichero> : incluir fichero . . . . . . . . . . . . . . . . . 88

VIII

$L<nombre de fichero> : Enlace de fichero objeto . . . . . . . . . 88

$M<tamaño de la pila>,<mínimo del heap (montón)>,<máximo

del heap (montón)> : Asignación de memoria . . . . . . . 88

$N+/- : Procesador matemático . . . . . . . . . . . . . . . . . . . . . . . 89

$O+/- : Activación de compilación de unidades como

overlays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

$O<nombre de unidad> : Especificación de nombre de unidad

overlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

$R+/- : Comprobación de error de rango en un índice . . . . . . . 90

$S+/- : Comprobación del desbordamiento de la pila . . . . . . . . 90

$V+/- : Comprobación de la longitud de cadenas pasadas por

referencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

6.4.- DIFERENCIAS ENTRE LA PROGRAMACIÓN ORIENTADA A

GRÁFICOS Y LA PROGRAMACIÓN TEXTO . . . . . . . . . . . . . . . . 91

6.5.- INTERRUPCIONES DOS Y BIOS . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6.6.- PROGRAMACIÓN ORIENTADA A OBJETO (POO) Y TURBO

VISIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Código y datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Encapsulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

7.- ESPECIFICACIONES DE UNA MAGNITUD PERIÓDICA . . . . . . . . . . . . . . . 98

A) Valor eficaz o RMS (Root Mears Square) . . . . . . . . . . . . . . . . . . . . . . . 98

B) Valor medio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

IX

C) Factor de forma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

D) Factor de rizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

8.- SOLUCIÓN AL PROBLEMA PLANTEADO . . . . . . . . . . . . . . . . . . . . . . . . 100

9.- BIBLIOGRAFÍA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

X

1.- ENUNCIADO Y OBJETO DEL PROYECTO

El presente proyecto, cuyo enunciado es : " Verificación de circuitos

electrónicos asistida por computador ", tiene como objeto el desarrollo de un programa

informático para ordenadores personales compatibles, capaz de analizar y verificar un circuito

electrónico, implementado en una placa de circuito impreso, de una forma programada de

antemano.

2.- NECESIDADES DEL PROYECTO

2.1.- Necesidad académica :

La realización del presente proyecto tiene como una de sus necesidades la

obtención del título de Ingeniero Técnico en la especialidad Eléctrica, sección Electrónica,

para su autor.

El proyecto ha sido realizado en la Escuela Universitaria de Ingeniería Técnica

Industrial (Universidad Politécnica de Valencia), a raíz de una propuesta del Departamento

de Ingeniería Electrónica, teniendo como director al profesor titular D. Eduardo García

Breijó.

2.2.- Descripción y Justificación técnica :

1

La descripción del proyecto la realizaremos sobre la base de los siguientes

puntos :

- Necesitamos un sistema que sea capaz de capturar datos de un circuito

electrónico real y a su vez realizar una simulación teórica del circuito electrónico.

- El sistema deberá ser capaz de comparar los datos obtenidos realmente con

los de la simulación teórica y bajo unas especificaciones previas realizar un diagnostico

funcional del circuito analizado.

- Todo ello asistido con el máximo número posible de ayudas y desde un

entorno cómodo y de fácil utilización.

- Además deberemos añadir las cualidades de economía y fácil adquisición de

todos los elementos que configuran el sistema.

Para poder implementar el procedimiento anteriormente descrito hemos

considerado que el sistema básico a controlar por el programa estará compuesto por :

1.- Un ordenador personal tipo PC XT ò AT, compatible. Este configurará

el soporte físico para el programa a diseñar y sus aplicaciones.

2.- Un sistema de adquisición de datos que sea capaz de conectar el

ordenador con el mundo exterior. Con él conseguiremos efectuar las

lecturas necesarias del circuito a analizar para procesarlas

2

MEMORIA

posteriormente.

Siguiendo las directrices de economía, fiabilidad y facilidad de

adquisición, nos hemos decidido por la tarjeta comercial de adquisición

PCLAB-812, cuyas características se describirán con más detalle en

apartados sucesivos.

3.- Un sistema de simulación de circuitos electrónicos. Consideraremos

para ello la utilización del programa PSPICE(R) de la casa

MICROSOFT(R), que permite la simulación de circuitos electrónicos

tanto analógicos como digitales; desarrollaremos el programa de

análisis, por cuestiones de economía, de forma que sea capaz de utilizar

la versión de evaluación (o versión reducida) del PSPICE(R) que es

suministrada gratuitamente por MICROSOFT(R), aunque el programa ha

de ser capaz de funcionar con la versión comercial (distribuida con la

correspondiente licencia y honorarios).

La Justificación técnica de la realización del proyecto se desprende de la

necesidad de disponer de un sistema de verificación de circuitos electrónicos, que sea

económico y de fácil utilización. Llenamos así un gran vacío existente en el mercado, pues

si bien existen excelentes herramientas informáticas para el diseño o la simulación de circuitos

electrónicos a un precio razonable, en cambio para la verificación de circuitos electrónicos

las ayudas que podemos encontrar en el mercado se ofrecen a un precio elevado para una

Universidad, pequeña empresa y en general para los profesionales de la electrónica.

3

MEMORIA

Podemos, también, integrar el proyecto en un concepto más amplio : " La

fabricación de circuitos electrónicos asistida por computador ", en el que comprobaríamos

que realmente el circuito fabricado se adapta a las especificaciones dadas por el cliente.

4

3.- INTRODUCCIÓN

En este proyecto pretendemos realizar un programa, que llamaremos

EVALUACIÓN 1.00, que sea capaz de realizar un diagnóstico de un circuito electrónico real.

Para ello el programa debe disponer de un sistema de captura de datos del exterior (placa de

adquisición de datos PCLAB-812) y además un sistema que permita realizar un análisis

teórico (programa de simulación de circuitos electrónicos PSPICE), según el esquema de la

figura 1 :

Figura 1 : Diagnóstico de un circuito electrónico.

5

MEMORIA: Introducción

Como podemos ver del gráfico de la página anterior, el programa objeto de este

proyecto (EVALUACIÓN 1.00) toma los datos de la simulación teórica (PSPICE) y los datos

del circuito físico (PCLAB-812), combinándolos y dando lugar a un informe y diagnostico

del circuito. Para desarrollar el objetivo de este programa deberemos conocer ampliamente

las características y funciones, tanto de la tarjeta de adquisición de datos PCLAB-812, como

del programa de simulación de circuitos electrónicos PSPICE, que en los apartados siguientes

detallaremos.

6

4.- DESCRIPCIÓN Y UTILIZACIÓN DEL PSPICE

4.1.- INTRODUCCIÓN: LA SIMULACIÓN DE CIRCUITOS ELECTRÓNICOS.

La simulación de circuitos electrónicos es hoy en día una de las fases más

importantes en el diseño electrónico. Con la simulación se crea un modelo del circuito a

ensayar que nos permite verificar si son correctas nuestras hipótesis de trabajo, todo ello sin

necesidad de efectuar el montaje de un prototipo que en otro caso sería imprescindible.

Con la simulación comprobamos que el diseño que pretendemos realizar

funcionará según unas especificaciones y características determinadas.

Deberemos, pues, distinguir la simulación a realizar en nuestro prediseño

(analógica, digital o mixta), ya que no es posible conseguir un simulador de circuitos

electrónicos en general. Ello es debido a los distintos tipos de señales que podemos encontrar

habitualmente. Así dependiendo de los dos tipos de simulaciones básicas (analógica y digital),

los simuladores actuarán de forma distinta en su funcionamiento.

La simulación digital tratará señales con dos niveles de apreciación ("0" y "1"

lógicos), o cuatro estados ("0", "1", "indeterminado" y "alta impedancia"), por lo que la

simulación irá encaminada a determinar cualquiera de estos estados en cualquier punto.

Los simuladores analógicos, por el contrario, deberán resolver complicadas

ecuaciones antes de alcanzar a conocer los valores de tensión y corriente que se dan en

7

MEMORIA: Pspice

cualquier circuito.

El problema surge con los circuitos analógico-digitales. En la actualidad

aparecen en el mercado simuladores potentes que tratan el problema de muy distintas formas.

Desde los que disponen de dos simuladores por separado (analógico y digital) hasta los que

realizan la simulación global, la era de la simulación electrónica no ha hecho más que

comenzar.

4.2.- SIMULACIÓN PSPICE.

El programa informático PSPICE es derivación del SPICE (Simulation Program

With Integrated Circuit), y permite la simulación de circuitos digitales y mixtos, análisis

estadístico o de Montecarlo y peor caso. Además incluye un entorno de trabajo integrado con

el dibujo de esquemas electrónicos y una serie de programas auxiliares que facilitan su uso

(editor y modelado de estímulos, procesador gráfico...).

El simulador PSPICE podemos obtenerlo de dos formas diferentes. Por un lado

la casa distribuidora suministra una versión profesional del simulador (previo pago de

honorarios y licencia correspondiente) que prácticamente no posee limitación en cuanto al

número de nudos y transistores sobre los que realizar la simulación. Por otro lado distribuye

también una versión reducida (versión de evaluación) que es gratuita, pero que posee el

inconveniente de una gran limitación en el uso del conjunto nudos-transistores que permite

simular (número máximo de nudos = 25, número máximo de transistores = 10).

8

MEMORIA: Pspice

4.2.1.- Características.

4.2.1.1.- Fichero de análisis.

Antes de proceder a analizar el circuito en cuestión, éste debe de haber sido

ingresado en el editor del simulador. Para ello se puede capturar directamente desde el propio

circuito dibujado por el programa OrCad SDT III (captura en formato PSPICE mediante las

líneas de código correspondientes), o bien podemos describir el circuito con un editor de texto

en ASCII cualquiera (Edlin o como el que el simulador PSPICE pone a tal fin).

El formato del fichero a analizar debe contener los siguientes bloques :

1.- LÍNEA DE TITULO.

2.- DESCRIPCIÓN DEL CIRCUITO.

3.- MODELOS DE COMPONENTES.

4.- TIPOS DE ANÁLISIS.

* La línea de título se puede introducir con el editor SHELL (editor en

ASCII).

* La descripción del circuito es facilitada por el OrCad SDT III.

* Los modelos de los dispositivos se encuentran en las librerías

PSPICE correspondientes.

* El tipo de análisis se puede añadir desde el propio entorno del

programa.

9

MEMORIA: Pspice

4.2.1.2.- Tipos de análisis.

El tipo de análisis determinará la simulación que va a realizar el programa.

Estos tipos son :

1.- Análisis en continua. Para obtener el punto de funcionamiento en

continua de elementos no lineales, así como la función de transferencia

de cualquier circuito. (PSPICE se encargará de cortocircuitar las

bobinas y dejar en circuito abierto los condensadores).

2.- Análisis transitorio. Para obtener la respuesta del circuito en función

del tiempo. (PSPICE fijará las fuentes no dependientes a su valor de

continua).

3.- Análisis en alterna. Para obtener la respuesta en función de la

frecuencia.

4.- Análisis de Montecarlo y Peor caso. Es el análisis que permite realizar

cualquiera de los anteriores, pero teniendo en cuenta las tolerancias,

tanto de los componentes pasivos como las de los parámetros de los

dispositivos semiconductores. El tratamiento de las tolerancias se

realiza mediante uno de los dos procedimientos disponibles :

Sensibilidad (peor caso), o Montecarlo. En el primero obtenemos la

variable de salida analizándose el circuito en las variaciones de todos

sus componentes, resultando la salida como la variación máxima (peor

caso). En el segundo se realiza el análisis estadístico mediante un

número especificado de simulaciones, y tomando de forma aleatoria

10

MEMORIA: Pspice

variaciones de los elementos del circuito; así las formas de onda

obtenidas en las sucesivas simulaciones representan desviaciones

probables de las obtenidas con los valores nominales.

4.2.1.3.- Simulación Analógico-Digital.

La simulación mixta nos permite la posibilidad de simular circuitos con

componentes analógicos y digitales.

PSPICE analiza de forma diferente cada uno de estos componentes, con lo que

se enlazarán entre ellos mediante nudos denominados de interface, que enlazan partes

analógicas con partes digitales, y viceversa.

4.3.- CONSECUCIÓN DEL FICHERO .TXT

Entre los ficheros que genera el PSPICE como salida, existe uno que es de vital

interés para el funcionamiento del programa de Evaluación. Es el fichero de los resultados

de la simulación.

El fichero resultado de la simulación del circuito electrónico aparecerá en el

directorio de trabajo y mantendrá un formato de lectura para que el procesador gráfico pueda

capturarlo en cualquier momento y realizar la visualización de formas de onda.

El usuario de PSPICE podrá elegir el formato de salida del fichero simulación

11

MEMORIA: Pspice

en dos tipos : binario y texto. Situándose sobre el submenú del comando PROBE elegirá la

opción FORMAT, que nos permite seleccionar entre formato binario (dándonos el archivo

.DAT de salida), y el formato texto en ASCII (obteniéndose el archivo .TXT de salida).

El usuario de EVALUACIÓN 1.00 creará los archivos en modo texto de los

circuitos sobre los que utilizará el programa de verificación.

Los archivos así creados pueden ser visualizados en cualquier momento

mediante un procesador de textos ASCII, o mediante la orden TYPE de su sistema operativo

(por ejemplo TYPE C:\C1.TXT|MORE).

4.4.- FORMATO DEL FICHERO PSPICE .TXT

El formato del archivo texto que se obtienen en la simulación del PSPICE

consta de los siguientes puntos :

-Cabecera del fichero. Encerrada entre almohadillas "#" nos revela la

información básica del circuito simulado. Esta información irá siempre entre

apóstrofes (’).

Fuente PSPICE (título y versión).

Título del circuito (TITLE).

Subtítulo del circuito (SUBTITLE).

Fecha y Temperatura ambiente (TIME, DATE, TEMPERATURE).

Tipo de análisis (ANALYSIS).

12

MEMORIA: Pspice

Número de nudos (NODES).

Intervalo de representación (XBEGIN, XEND).

...

Esta información se aprecia en el ejemplo final encerrada entre las señales

"#H" y "#N".

- Representación de los nudos de tensión y corriente que convienen en la

simulación. Encerrada entre las marcas "#N" y "#C" y separados entre ";" se

encuentran el conjunto de nudos equipotenciales (Ver ejemplo final).

Aquí tendremos en cuenta que los nudos de valor que nos interesan son

aquellos que no poseen subíndice (tensión no seguida de ningún número o

letra, o cualquier corriente que se caracteriza por ir representada al final de

la serie).

- A continuación aparecerán los tiempos (tras la marca "#C") con el número de

nudos separados por un espacio en blanco; y los valores asociados al conjunto

de nudos (diferenciados de los tiempos tras un salto de línea y retorno de

carro, y numerados en hexadecimal tras la señal ":"). El valor correspondiente

a un nudo elegido será aquel que ocupe la misma posición en la cadena de

lectura que el propio nudo en la declaración de nudos (entre #N y #C),

teniendo en cuenta que los únicos nudos válidos son los referenciados en el

punto anterior.

13

MEMORIA: Pspice

El ejemplo de un fichero .TXT resultado de una simulación PSPICE es el siguiente :

Ejemplo de un archivo resultado de la simulación PSPICE en formato texto (.TXT).

#HSOURCE=’PSPICE’ VERSION=’Evaluation PSpice (September 1991)’TITLE=’AMPLIFICADOR EN E.C.’SUBTITLE=’’TIME=’11:56:49’ DATE=’01/05/93’ TEMPERATURE=’2.700E01’ANALYSIS=’Transient Analysis’ SERIALNO=’72226’ALLVALUES=’YES’ COMPLEXVALUES=’NO’ NODES=’17’SWEEPVAR=’Time’ SWEEPMODE=’VAR_STEP’XBEGIN=’0.000E00’ XEND=’3.000E-02’FORMAT=’0 VOLTSorAMPS;EFLOAT : NODEorBRANCH;NODE ’DGTLDATA=’NO’#N’V(3)’;’V1(R1)’;’V1(RC)’;’V1(VCC)’ ’V(2)’;’VB(Q1)’;’V2(R1)’;’V1(R2)’;’V2(RG)’’V(4)’;’VC(Q1)’;’V2(RC)’ ’V(5)’;’V1(CE)’;’VE(Q1)’;’V1(RE)’ ’V(1)’;’V1(RG)’;’V1(VG)’ ’I(CE)’ ’I(R1)’ ’I(R2)’ ’I(RC)’ ’I(RE)’ ’I(RG)’ ’I(VCC)’ ’I(VG)’’IC(Q1)’ ’IB(Q1)’ ’IE(Q1)’’IS(Q1)’#C 0.0000000000E00 171.200E01:1 2.206E00:2 5.172E00:3 1.511E00:4 0.000E00:5 0.000E00:6 2.084E-04:7 8.171E-05:86.828E-03:9 6.866E-03:a -8.824E-05:b-7.036E-03:c 8.824E-05:d 6.828E-03:e 3.843E-05:f -6.866E-03:10 0.000E00:11#C 6.0000000000E-06 171.200E01:1 2.214E00:2 3.089E00:3 1.511E00:4 3.770E-01:5 2.096E-03:6 2.082E-04:7 8.201E-05:88.911E-03:9 6.868E-03:a -7.349E-05:b-9.119E-03:c 7.349E-05:d 8.920E-03:e 5.276E-05:f -8.973E-03:10 0.000E00:11#C 6.5880355835E-06 171.200E01:1 2.215E00:2 2.894E00:3 1.511E00:4 4.139E-01:5 2.292E-03:6 2.082E-04:7 8.203E-05:89.106E-03:9 6.868E-03:a -7.204E-05:b-9.314E-03:c 7.204E-05:d 9.106E-03:e 5.412E-05:f -9.160E-03:10 0.000E00:11#C 7.7641067505E-06 171.200E01:1 2.216E00:2 2.499E00:3 1.511E00:4 4.878E-01:5 2.690E-03:6 2.082E-04:7 8.209E-05:89.501E-03:9 6.868E-03:a -6.914E-05:b-9.709E-03:c 6.914E-05:d 9.501E-03:e 5.694E-05:f -9.558E-03:10 0.000E00:11#C 1.0116249084E-05 171.200E01:1 2.219E00:2 1.744E00:3 1.511E00:4 6.356E-01:5 3.450E-03:6 2.081E-04:7 8.218E-05:81.026E-02:9 6.869E-03:a -6.333E-05:b-1.046E-02:c 6.333E-05:d 1.026E-02:e 6.260E-05:f -1.032E-02:10 0.000E00:11#C 1.2356620789E-05 171.200E01:1 2.219E00:2 1.661E00:3 1.511E00:4 7.764E-01:5 3.538E-03:6 2.081E-04:7 8.220E-05:81.034E-02:9 6.869E-03:a -5.772E-05:b

14

MEMORIA: Pspice

Cabe señalar que todo fichero de texto resultado de la simulación termina con

la señal "#;" no apareciendo en todo el archivo ningún otra señal de punto y coma (;).

4.5.- REPRESENTACIÓN DE ONDAS

Una vez introducido el circuito a simular en el editor de las distintas formas

posibles (enlace OrCad SDT por captura esquemática, creación por cualquier editor ASCII...),

realizaremos la simulación eligiendo las opciones correspondientes con los menús de pantalla

(tipo de análisis...); si ésta se realizó adecuadamente automáticamente entraremos en el

procesador gráfico (PROBE) que nos permitirá representar gráficamente tensión, corriente,

potencia, energía... de cualquier nudo del circuito, así como sacar por impresora gráfica el

resultado obtenido.

Para obtener información adicional consultar bibliografía recomendada.

15

5.- ADQUISICIÓN DE DATOS.

TARJETA PCLAB-812

En la actualidad conocer y comprender el funcionamiento de adquisición de

datos mediante una tarjeta comienza a ser importante, pues es una forma que tiene el

ordenador de conocer, comunicarse e intercambiar datos con el exterior.

Esto modifica notoriamente los hábitos de comportamiento de cualquier

programador, ya que añade un número de señales que debe tratar y comprender para la

correcta lectura de información.

Dentro de ésta iniciativa se incluye la tarjeta de adquisición de datos

PCLAB-812, que direccionada en posiciones de memoria determinadas, sirve de interfase al

manejo y distribución de información analógica y digital.

La representación esquemática de la tarjeta de adquisición PCLAB-812 se

realiza en la figura de la página siguiente (figura 2). El lector recurrirá en su lectura a ésta

figura para esclarecer la posición de los distintos conectores que determinan la configuración

de la misma.

16

MEMORIA: PCLAB-812

Figura 2 : TARJETA DE ADQUISICIÓN PCLAB-812

17

MEMORIA: PCLAB-812

5.1.- INTRODUCCIÓN

Entre las diferentes formas de implementar un sistema de adquisición, una de

las soluciones más adoptadas en la actualidad, son las tarjetas de adquisición de datos

conectadas al ordenador como un periférico más (teclado, monitor, unidades de disco...); que

direccionadas en posiciones de memoria RAM, incluyen todos los bloques de un sistema

convencional: convertidor Analógico/Digital, multiplexor...

La expansión de este tipo de tratamiento de señales ha venido favorecida por

la difusión y desarrollo de los lenguajes de programación (lenguajes de alto nivel). La

facilidad de programación y lectura de las tarjetas de adquisición (la mayoría) frente a otros

tipos de implementaciones es enorme; bien con la programación incluida por el fabricante,

como la creada por el propio usuario.

Como aplicaciones de la utilización de tarjetas de adquisición cabe señalar que

aunando la precisión de las medidas, el número de canales que muestrean a la vez y las

diferentes formas de disparo, destaca por su uso en el control de procesos industriales donde

al requerimiento de una señal de entrada es preciso responder con señales de salida que

controlen y varíen el flujo del proceso a conveniencia del usuario.

Como es natural tendremos una entrada al proceso, con la cual se controla el

funcionamiento de éste; una salida, que nos indicará el funcionamiento del mismo; y entre

medias todas la conversiones y lecturas necesarias para el gobierno de dicho proceso.

18

MEMORIA: PCLAB-812

5.2.- CARACTERÍSTICAS DE LA PCLAB-812

Las características de la tarjeta de adquisición son las siguientes :

5.2.1.- Entradas Analógicas (Convertidor A/D) :

Canales : 16 con masa común.

Resolución : 12 bits.

Rango de entrada : Bipolar: ±10, ±5, ±2, ±1 Voltios.

Tensión límite : ±30 V. máxima continua.

Tipo de conversión : Aproximaciones sucesivas.

Convertidor : HADO574Z.

Velocidad de conversión : 30KHz.

Precisión : 0.015% de la lectura (±1 bit).

Modos de disparo : Disparo por programa.

Disparo utilizando el temporizador de la misma.

Disparo por señal externa.

Transferencia de los datos: Por programa.

Por interrupciones.

Por acceso directo a memoria.

19

MEMORIA: PCLAB-812

5.2.2.- Salidas Analógicas (Convertidor D/A) :

Canales : 2 canales.

Resolución : 12 bits.

Rango de salida : De 0 a 5V. por referencia interna.

±10V. por referencia interna.

Tensión de referencia : Interna: -5V. (±0.05 V).

Externa: ±10V máxima(DC o AC).

Tipo de conversión : Multiplicador monolítico (R-2R).

Convertidor : DAC7541AKN o equivalente.

Linealidad : ±1/2 bit.

Carga de salida : ±5 mA máxima.

Tiempo de establecimiento : 30 microsegundos.

5.2.3.- Entrada Digital :

Canal : 16 bits.

Nivel : Compatible TTL.

Tensión de entrada : Nivel bajo: 0.8 V máxima.

Nivel alto: 2.0 V máxima.

Carga de entrada : Nivel bajo: 0.40 mA máxima.

20

MEMORIA: PCLAB-812

Nivel alto: 0.05 mA máxima.

5.2.4.- Salida Digital :

Canal : 16 bits.

Nivel : Compatible TTL.

Tensión salida : Nivel L: 8 mA a 0.5 V máxima.

Nivel H: 0.4 mA a 2.4 V mínima.

5.2.5.- Temporizador/Contador programable :

Dispositivo : INTEL 8253-5.

Contadores : 3 canales, 16 bits.

2: generación de disparos.

1: libre para el usuario.

Entrada : Compatible TTL/DTL/CMOS.

Base de tiempos : 2 MHz.

Salida/disparo : 35 minutos/pulso a 0.5 MHz.

5.2.6.- Canal de interrupciones :

Nivel : IRQ: 2 a 7.

21

MEMORIA: PCLAB-812

Habilitación : S0, S1 y S2 (reg. control).

5.2.7.- Canal de acceso directo a memoria (ADM) :

Nivel : 1 ò 3.

Habilitación : S0, S1 y S2 (reg. control).

5.2.8.- CONVERSIÓN ANALÓGICA/DIGITAL (A/D).

Mediante este tipo de conversión vamos a poder introducir el valor de tensión

que tenemos en el canal de entrada al interior del ordenador.

Esta es la conversión que hemos utilizado en la elaboración del conjunto del

programa, puesto que únicamente se ha precisado de lecturas de valores por los canales de

entrada.

Se tendrá en cuenta que como la resolución de la tarjeta es de 12 bits, un

registro de 8 bits no será suficiente para almacenar la información. Se utilizan pues dos

registros localizados en direcciones consecutivas.

La parte baja del dato se almacena en el primer registro (de 0 a 71 en BASE+42), y la parte

1bits

2Si denominamos BASE a la dirección de memoria a partir de la cual se halla direccionada la tarjeta deadquisición (generalmente $200), las sucesivas direcciones con las que trabaja se determinarán como BASE+1,BASE+2...

22

MEMORIA: PCLAB-812

alta en el siguiente (de 0 a 33 en BASE+5).

El número del canal de entrada por el que se ha realizado la conversión está

disponible en el registro BASE+10 y en las posiciones de 0 a 34.

La conversión analógica/digital puede ser iniciada mediante una de las

siguientes formas de disparo :

a) Disparo por programa.

b) Disparo interno (por temporizador).

c) Disparo mediante señal externa.

Y las transferencias de los datos se pueden realizar por :

a) Transferencias por programa.

b) Transferencias por interrupciones.

c) Transferencias por acceso directo a memoria (ADM).

Para la realización adecuada de las conversiones, hay que tener en cuenta los

siguientes aspectos :

3bits de menor peso

4bits de menor peso

23

MEMORIA: PCLAB-812

- Seleccionar el rango de tensión analógica mediante las una de las cinco

posiciones del conmutador DIP SW2 (ver colocación en figura general). El

valor de la muestra digital leída en cualquier canal, tendrá asociado un

determinado valor que depende del rango de tensión que se le haya

seleccionado. Previamente se habrá calibrado el convertidor A/D en un rango

determinado, mediante los potenciómetros multivuelta de la placa. Las

posiciones del conmutador SW2 son las siguientes :

CONMUTADOR SW2 RANGOBIPOLAR

1 2 3 4 5

ON OFF ON OFF X ± 10 V.

OFF ON ON OFF X ± 5 V.

ON OFF OFF ON X ± 2 V.

OFF ON OFF ON X ± 1 V.

- Selección del canal de entrada correspondiente al escribir su número (0..15) en

el nybble bajo del registro multiplexor (BASE+10).

- Cuando se ha ajustado el rango de tensión y los canales sobre los que realizar

el muestreo, hay que indicar el modo de disparo que vamos a realizar. Esto se

hace programando de forma adecuada los bits 0, 1 y 2 del registro de control

de la placa (BASE+11).

24

MEMORIA: PCLAB-812

Estudiaremos los tipos de disparo utilizados con transferencia de datos

determinada.

5.2.8.1.- Disparo por programa y transferencia por programa.

Para realizar el disparo por programa, hay que escribir en el registro de control

(BASE+11) la combinación :

BYTE DEL REGISTRO DE CONTROL (BASE+11)

7 6 5 4 3 2 1 0

X X X X X S2 S1 S0

S2 S1 S0

0 0 1

Una vez habilitado, el disparo se consigue escribiendo cualquier valor en el

registro BASE+12.

La transferencia de datos por programa usa el concepto de encuesta. Una vez

realizado el disparo, el programa comprobará el bit DRDY (data ready, bit 4 (0..7) de

BASE+5) del registro de datos del convertidor. Cuando el bit ha tomado el valor 0, el dato

muestreado se puede transferir a la memoria del ordenador.

25

MEMORIA: PCLAB-812

Incluiremos dos pequeños programas en Turbo Pascal que gobiernan el control

de la tarjeta para este modo de disparo y transferencia. Así el primer (1) programa es para

un único canal, y el segundo (2) para el conjunto de canales elegidos por el usuario. Hay que

hacer mención a que en ambos casos se utiliza la memoria dinámica del ordenador para listar

los datos obtenidos.

Programa Nº 1 :

(*DISPARO POR PROGRAMA,TRANSFERENCIA POR PROGRAMA, UN CANAL*)(*CON TRANSFORMACIÓN DE LOS DATOS A Nº REALES*)(*TRANSFERENCIA DE DATOS A MEMORIA DINÁMICA*)

PROGRAM ADQUISICIÓN_DE_DATOS;USES DOS, CRT;CONST

BASE=$200;REGCONT1=BASE+1;REGCONT2=BASE+2;CONTCONTR=BASE+3;DATOADL=BASE+4;DATOADH=BASE+5;DATODA1L=BASE+4;DATODA1H=BASE+5;DATODA2L=BASE+6;DATODA2H=BASE+7;CLEARINT=BASE+8;CANALMUX=BASE+10;REGCONTROL=BASE+11;REGDISPARO=BASE+12;

TYPEPUNTEROV=^V;

V=RECORDVmuestras:REAL;CANAL:INTEGER;DATO:INTEGER;SIG:PUNTEROV;END;

VARFIN_CONVERSIÓN,DATO_BAJO,DATO_ALTO:BYTE;

26

MEMORIA: PCLAB-812

I,J,MAX,CAN,TENS,MUESTRA:INTEGER;PRIMERO,ANTERIOR,ACTUAL:PUNTEROV;MUEST:REAL;TECLA:CHAR;

(*---Escribe en memoria dinámica las muestras con su Nº de CANAL---*)

PROCEDURE OTRAMUESTRA(C,D:INTEGER;V:REAL);BEGINCLRSCR;V:=TENS+(2*TENS/4095)*(V-4095);

IF PRIMERO=NIL THENBEGINNEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=D;PRIMERO:=ACTUAL;ACTUAL^.SIG:=NILEND

ELSEBEGINANTERIOR:=ACTUAL;NEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=D;ANTERIOR^.SIG:=ACTUAL;ACTUAL^.SIG:=NILEND

END;

(*-------------Lee las muestras de memoria dinámica-------------*)

PROCEDURE LEERMUESTRAS;VAR

MTRA:PUNTEROV;

BEGINMTRA:=PRIMERO;WHILE MTRA<>NIL DO

BEGINWITH MTRA^ DO

WRITELN(’CANAL Nº ’,CANAL,’ ; MUESTRA Nº’,DATO,’ = ’,Vmuestras);MTRA:=MTRA^.SIGEND

END;

(*-------------------Programa principal-------------------*)

BEGINREPEAT

PRIMERO:=NIL; (*--------Inicializa el puntero--------*)CLRSCR;PORT[REGCONTROL]:=0;

27

MEMORIA: PCLAB-812

WRITELN(’INTRODUCE EL Nº DE CANAL AL CUAL HAS CONECTADO LA PCLAB(0 A 15)= ’);

READ(CAN);WRITELN(’TENSION DE LA PCLAB=’);READ(TENS);WRITELN(’INTRODUCE EL NUMERO DE MUESTRAS A EFECTUAR= ’);READ(MAX);PORT[CANALMUX]:=CAN;PORT[REGCONTROL]:=1;

FOR I:=0 TO MAX-1 DOBEGINPORT[REGDISPARO]:=0;REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION<=$F;DATO_BAJO:=PORT[DATOADL];DATO_ALTO:=PORT[DATOADH] MOD 16;MUEST:=DATO_ALTO*256+DATO_BAJO;OTRAMUESTRA(J,I,MUEST)END;

PORT[REGCONTROL]:=0;LEERMUESTRAS;WRITELN(’ ’);WRITELN(’PULSAR CUALQUIER TECLA PARA REPETIR, ESCAPE PARA SALIR’);TECLA:=READKEY

UNTIL TECLA=#27END.

Programa Nº 2 :

(*DISPARO POR PROGRAMA,TRANSFERENCIA POR PROGRAMA, VARIOS CANALES*)(*CON TRANSFORMACION DE LOS DATOS A Nº REALES*)(*TRANSFERENCIA DE DATOS A MEMORIA DINAMICA*)

PROGRAM ADQUISICION_DE_DATOS;USES DOS, CRT;CONST

BASE=$200;REGCONT1=BASE+1;REGCONT2=BASE+2;CONTCONTR=BASE+3;DATOADL=BASE+4;DATOADH=BASE+5;DATODA1L=BASE+4;DATODA1H=BASE+5;DATODA2L=BASE+6;DATODA2H=BASE+7;CLEARINT=BASE+8;CANALMUX=BASE+10;REGCONTROL=BASE+11;

28

MEMORIA: PCLAB-812

REGDISPARO=BASE+12;

TYPEPUNTEROV=^V;

V=RECORDVmuestras:REAL;CANAL:INTEGER;DATO:INTEGER;SIG:PUNTEROVEND;

VARFIN_CONVERSION,DATO_BAJO,DATO_ALTO:BYTE;I,J,MAX,CAN,TENS,MUESTRA:INTEGER;PRIMERO,ANTERIOR,ACTUAL:PUNTEROV;MUEST:REAL;TECLA:CHAR;

(*---Escribe en memoria dinámica las muestras con su Nº de CANAL---*)

PROCEDURE OTRAMUESTRA(C,D:INTEGER;V:REAL);BEGINCLRSCR;V:=TENS+(2*TENS/4095)*(V-4095);

IF PRIMERO=NIL THENBEGINNEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=D;PRIMERO:=ACTUAL;ACTUAL^.SIG:=NILEND

ELSEBEGINANTERIOR:=ACTUAL;NEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=D;ANTERIOR^.SIG:=ACTUAL;ACTUAL^.SIG:=NILEND

END;

(*-------------Lee las muestras de memoria dinámica-------------*)

PROCEDURE LEERMUESTRAS;VAR

MTRA:PUNTEROV;

BEGINMTRA:=PRIMERO;WHILE MTRA<>NIL DO

29

MEMORIA: PCLAB-812

BEGINWITH MTRA^ DO

WRITELN(’CANAL Nº ’,CANAL,’ ; MUESTRA Nº’,DATO,’ = ’,Vmuestras);MTRA:=MTRA^.SIGEND

END;

(*-------------------Programa principal-------------------*)

BEGINREPEAT

PRIMERO:=NIL; (*--------Inicializa el puntero--------*)CLRSCR;PORT[REGCONTROL]:=0;WRITELN

(’INTRODUCE EL Nº DE CANALES CONECTADOS A LA PCLAB(0 A 15)= ’);READ(CAN);WRITELN(’TENSION DE LA PCLAB=’);READ(TENS);WRITELN(’INTRODUCE EL NUMERO DE MUESTRAS A EFECTUAR= ’);READ(MAX);PORT[REGCONTROL]:=1;

FOR J:=0 TO CAN DOFOR I:=0 TO MAX-1 DO

BEGINPORT[CANALMUX]:=J;PORT[REGDISPARO]:=0;REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION<=$F;DATO_BAJO:=PORT[DATOADL];DATO_ALTO:=PORT[DATOADH] MOD 16;MUEST:=DATO_ALTO*256+DATO_BAJO;OTRAMUESTRA(J,I,MUEST)END;

PORT[REGCONTROL]:=0;LEERMUESTRAS;WRITELN(’ ’);WRITELN(’PULSAR CUALQUIER TECLA PARA REPETIR, ESCAPE PARA SALIR’);TECLA:=READKEY

UNTIL TECLA=#27END.

5.2.8.2.- Disparo por temporizador (interno) y transferencia por programa.

Cuando no conviene utilizar el disparo por programa, se suele utilizar esta

forma de disparo, en la que los datos son obtenidos a frecuencia determinada y elegida por

30

MEMORIA: PCLAB-812

el programador. Para ello se utilizará el temporizador de la tarjeta (temporizador/contador

programable 8253 de Intel).

En este caso en el registro de control se escribirá lo siguiente:

S2 S1 S0

1 1 0

Para conseguir la frecuencia de muestreo se utilizará como señal de disparo la

salida del contador 1. Los contadores 1 y 2 están conectados en cascada, y funcionan como

un conjunto divisor de frecuencia de la señal de entrada al contador 2. (Ver esquema de la

placa).

La frecuencia la obtendremos de la forma siguiente :

Siendo :

HB1 = parte alta del contenido del contador 1.

HB2 = parte alta del contenido del contador 2.

LB1 = parte baja del contenido del contador 1.

LB2 = parte baja del contenido del contador 2.

31

MEMORIA: PCLAB-812

El contenido de cada contador deberá ser mayor o igual a 2; en caso contrario

no se generará señal alguna.

Para realizar esta conversión deberemos programar el modo de disparo al

principio del programa. A continuación sólo tendremos que esperar que el bit de fin

conversión se ponga a nivel bajo, obteniendo después los datos de muestreo.

Aquí es el temporizador quien se encarga de realizar los disparos para tomar las muestras

correspondientes.

Como ejemplo añadiremos unos sencillos programas de Turbo Pascal que

gestionan este tipo de disparo y transferencia. El primero (3) es disparo interno para un canal

con memoria dinámica, el segundo (4) es para varios canales, y el tercero (5) nos permite

salvar en disco (duro o flexible) el conjunto de muestras efectuadas.

Programa Nº 3 :

(*DISPARO INTERNO, TRANSFERENCIA POR PROGRAMA, UN CANAL*)(*CON TRANSFORMACION DE LOS DATOS A Nº REALES*)(*TRANSFERENCIA DE DATOS A MEMORIA DINAMICA*)

PROGRAM ADQUISICION_DE_DATOS;USES DOS, CRT;CONST

BASE=$200;REGCONT1=BASE+1;REGCONT2=BASE+2;CONTCONTR=BASE+3;

32

MEMORIA: PCLAB-812

DATOADL=BASE+4;DATOADH=BASE+5;DATODA1L=BASE+4;DATODA1H=BASE+5;DATODA2L=BASE+6;DATODA2H=BASE+7;CLEARINT=BASE+8;CANALMUX=BASE+10;REGCONTROL=BASE+11;REGDISPARO=BASE+12;

TYPEPUNTEROV=^V;

V=RECORDVmuestras:REAL;CANAL:INTEGER;DATO:INTEGER;SIG:PUNTEROVEND;

VARFIN_CONVERSION,DATO_BAJO,DATO_ALTO:BYTE;FRE,I,MAX,CAN,TENS,MUESTRA:INTEGER;PRIMERO,ANTERIOR,ACTUAL:PUNTEROV;MUEST:REAL;TECLA:CHAR;

(*---Escribe en memoria dinámica las muestras con su Nº de CANAL---*)

PROCEDURE OTRAMUESTRA(C,M:INTEGER;V:REAL);(*Transferencia de las muestras a memoria dinámica*)BEGINCLRSCR;V:=TENS+(2*TENS/4095)*(V-4095);

IF PRIMERO=NIL THENBEGINNEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;PRIMERO:=ACTUAL;ACTUAL^.SIG:=NILEND

ELSEBEGINANTERIOR:=ACTUAL;NEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;ANTERIOR^.SIG:=ACTUAL;ACTUAL^.SIG:=NILEND

END;

33

MEMORIA: PCLAB-812

(*-------------Lee las muestras de memoria dinámica-------------*)

PROCEDURE LEERMUESTRAS;

VARMTRA:PUNTEROV;

BEGINMTRA:=PRIMERO;WHILE MTRA<>NIL DO

BEGINWITH MTRA^ DO

WRITELN(’CANAL Nº ’,CANAL,’; MUESTRA Nº ’,DATO,’=’,Vmuestras);MTRA:=MTRA^.SIGEND

END;

(*-------------Programación de la Frecuencia----------------*)

PROCEDURE FRECUENCIA (FRECUENCIA:INTEGER);VAR D1,D2,AUX:LONGINT;BEGIN

AUX:=2000000 DIV FRECUENCIA;D1:=ROUND(SQRT(AUX));D2:=D1;PORT[CONTCONTR]:=$74;PORT[REGCONT1]:=D1 MOD 256;PORT[REGCONT1]:=D1 DIV 256;PORT[CONTCONTR]:=$B4;PORT[REGCONT2]:=D2 MOD 256;PORT[REGCONT2]:=D2 DIV 256

END;

(*-------------------Programa principal-------------------*)

BEGINREPEAT

PRIMERO:=NIL; (*-------Inicializa el puntero-----*)CLRSCR;WRITELN(’INTRODUCE LA FRECUENCIA DE MUESTREO: ’);READ(FRE);PORT[REGCONTROL]:=0;WRITELN

(’INTRODUCE EL Nº DE CANAL AL CUAL HAS CONECTADO LA PCLAB (0 A 15)= ’);READLN(CAN);WRITELN(’INTRODUCE EL Nº DE MUESTRAS: ’);READ(MAX);WRITELN(’INTRODUCE EL VALOR DE LA TENSION MAXIMA EN LA PCLAB’);READLN(TENS);PORT[CANALMUX]:=CAN;PORT[REGCONTROL]:=6;FRECUENCIA(FRE);

FOR I:=0 TO MAX-1 DOBEGIN

REPEAT FIN_CONVERSION:=PORT[DATOADH];

34

MEMORIA: PCLAB-812

UNTIL FIN_CONVERSION<=$F;DATO_BAJO:=PORT[DATOADL];DATO_ALTO:=PORT[DATOADH] MOD 16;MUEST:=DATO_ALTO*256+DATO_BAJO;OTRAMUESTRA(CAN,I,MUEST);

REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION>$F

END;PORT[REGCONTROL]:=0;LEERMUESTRAS;WRITELN(’ ’);WRITELN(’PULSAR CUALQUIER TECLA PARA REPETIR, ESCAPE PARA SALIR’);TECLA:=READKEY

UNTIL TECLA=#27;PORT[REGCONTROL]:=0END.

Programa Nº 4 :

(*DISPARO INTERNO, TRANSFERENCIA POR PROGRAMA, VARIOS CANALES*)(*CON TRANSFORMACION DE LOS DATOS A Nº REALES*)(*TRANSFERENCIA DE DATOS A MEMORIA DINAMICA*)

PROGRAM ADQUISICION_DE_DATOS;USES DOS, CRT;CONST

BASE=$200;REGCONT1=BASE+1;REGCONT2=BASE+2;CONTCONTR=BASE+3;DATOADL=BASE+4;DATOADH=BASE+5;DATODA1L=BASE+4;DATODA1H=BASE+5;DATODA2L=BASE+6;DATODA2H=BASE+7;CLEARINT=BASE+8;CANALMUX=BASE+10;REGCONTROL=BASE+11;REGDISPARO=BASE+12;

TYPEPUNTEROV=^V;

V=RECORDVmuestras:REAL;CANAL:INTEGER;

35

MEMORIA: PCLAB-812

DATO:INTEGER;SIG:PUNTEROVEND;

VARFIN_CONVERSION,DATO_BAJO,DATO_ALTO:BYTE;FRE,I,J,MAX,CAN,TENS,MUESTRA:INTEGER;PRIMERO,ANTERIOR,ACTUAL:PUNTEROV;MUEST:REAL;TECLA:CHAR;

(*---Escribe en memoria dinámica las muestras con su Nº de CANAL---*)

PROCEDURE OTRAMUESTRA(C,M:INTEGER;V:REAL);(*Transferencia de las muestras a memoria dinámica*)BEGINCLRSCR;V:=TENS+(2*TENS/4095)*(V-4095);

IF PRIMERO=NIL THENBEGINNEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;PRIMERO:=ACTUAL;ACTUAL^.SIG:=NILEND

ELSEBEGINANTERIOR:=ACTUAL;NEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;ANTERIOR^.SIG:=ACTUAL;ACTUAL^.SIG:=NILEND

END;

(*-------------Lee las muestras de memoria dinámica-------------*)

PROCEDURE LEERMUESTRAS;

VARMTRA:PUNTEROV;

BEGINMTRA:=PRIMERO;WHILE MTRA<>NIL DO

BEGINWITH MTRA^ DO

WRITELN(’CANAL Nº ’,CANAL,’; MUESTRA Nº ’,DATO,’=’,Vmuestras);MTRA:=MTRA^.SIGEND

END;

36

MEMORIA: PCLAB-812

(*-------------Programación de la Frecuencia----------------*)

PROCEDURE FRECUENCIA (FRECUENCIA:INTEGER);VAR D1,D2,AUX:LONGINT;BEGIN

AUX:=2000000 DIV FRECUENCIA;D1:=ROUND(SQRT(AUX));D2:=D1;PORT[CONTCONTR]:=$74;PORT[REGCONT1]:=D1 MOD 256;PORT[REGCONT1]:=D1 DIV 256;PORT[CONTCONTR]:=$B4;PORT[REGCONT2]:=D2 MOD 256;PORT[REGCONT2]:=D2 DIV 256

END;

(*-------------------Programa principal-------------------*)

BEGINREPEAT

PRIMERO:=NIL; (*-------Inicializa el puntero-----*)CLRSCR;WRITELN(’INTRODUCE LA FRECUENCIA DE MUESTREO: ’);READ(FRE);PORT[REGCONTROL]:=0;WRITELN

(’INTRODUCE EL Nº DE CANALES CONECTADOS A LA PCLAB(0 A 15)= ’);READLN(CAN);WRITELN(’INTRODUCE EL Nº DE MUESTRAS: ’);READ(MAX);WRITELN(’INTRODUCE EL VALOR DE LA TENSION MAXIMA EN LA PCLAB’);READLN(TENS);PORT[REGCONTROL]:=6;FRECUENCIA(FRE);

FOR J:=0 TO CAN DOFOR I:=0 TO MAX-1 DO

BEGINPORT[CANALMUX]:=J;

REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION<=$F;

DATO_BAJO:=PORT[DATOADL];DATO_ALTO:=PORT[DATOADH] MOD 16;MUEST:=DATO_ALTO*256+DATO_BAJO;OTRAMUESTRA(J,I,MUEST);

REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION>$F

END;PORT[REGCONTROL]:=0;LEERMUESTRAS;WRITELN(’ ’);WRITELN(’PULSAR CUALQUIER TECLA PARA REPETIR, ESCAPE PARA SALIR’);TECLA:=READKEY

UNTIL TECLA=#27;PORT[REGCONTROL]:=0END.

37

MEMORIA: PCLAB-812

Programa Nº 5 :

(*DISPARO INTERNO, TRANSFERENCIA POR PROGRAMA, VARIOS CANALES*)(*CON TRANSFORMACION DE LOS DATOS A Nº REALES*)(*TRANSFERENCIA DE DATOS A MEMORIA DINAMICA*)(*POSIBILIDAD DE TRANSFERIR LOS DATOS A DISCO*)

PROGRAM ADQUISICION_DE_DATOS;USES DOS, CRT;CONST

BASE=$200;REGCONT1=BASE+1;REGCONT2=BASE+2;CONTCONTR=BASE+3;DATOADL=BASE+4;DATOADH=BASE+5;DATODA1L=BASE+4;DATODA1H=BASE+5;DATODA2L=BASE+6;DATODA2H=BASE+7;CLEARINT=BASE+8;CANALMUX=BASE+10;REGCONTROL=BASE+11;REGDISPARO=BASE+12;

TYPEPUNTEROV=^V;

V=RECORDVmuestras:REAL;CANAL:INTEGER;DATO:INTEGER;SIG:PUNTEROVEND;

VARFIN_CONVERSION,DATO_BAJO,DATO_ALTO:BYTE;FRE,I,J,MAX,CAN,TENS,MUESTRA:INTEGER;PRIMERO,ANTERIOR,ACTUAL:PUNTEROV;MUEST:REAL;TECLA,T:CHAR;ARCHIVO:FILE OF V;

(*-------------Lectura de muestras del disco--------------*)

PROCEDURE LEER_MUESTRAS_DEL_DISCO;

VARF:FILE OF V;N:STRING;

38

MEMORIA: PCLAB-812

V1:V;

BEGINCLRSCR;WRITELN(’ESCRIBE EL NOMBRE DEL ARCHIVO A LEER...’);READ(N);ASSIGN(F,N);CLRSCR;RESET(F);WHILE NOT EOF(F) DO

BEGINREAD(F,V1);WITH V1 DO

BEGINWRITELN(’CANAL Nº ’,CANAL,’; MUESTRA Nº ’,DATO,’=’,Vmuestras)END

END;CLOSE(F);WRITELN;WRITE(’PULSE INTRO...’);READLN;READLNEND;

(*---Escribe en memoria dinámica las muestras con su Nº de CANAL---*)

PROCEDURE OTRAMUESTRA(C,M:INTEGER;V:REAL);BEGINCLRSCR;V:=TENS+(2*TENS/4095)*(V-4095);

IF PRIMERO=NIL THENBEGINNEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;PRIMERO:=ACTUAL;ACTUAL^.SIG:=NILEND

ELSEBEGINANTERIOR:=ACTUAL;NEW(ACTUAL);ACTUAL^.CANAL:=C;ACTUAL^.Vmuestras:=V;ACTUAL^.DATO:=M;ANTERIOR^.SIG:=ACTUAL;ACTUAL^.SIG:=NILEND

END;

(*-------------Lee las muestras de memoria dinámica-------------*)

PROCEDURE LEERMUESTRAS;

39

MEMORIA: PCLAB-812

VARMTRA:PUNTEROV;D:CHAR;NOM:STRING;

BEGINWRITELN(’DESEAS GUARDAR LOS DATOS OBTENIDOS EN DISCO (S/N)’);D:=READKEY;CLRSCR;

IF D=’S’ THENBEGINWRITELN(’ESCRIBE RUTA Y NOMBRE DE FICHERO PARA LOS DATOS’);READLN(NOM);ASSIGN(ARCHIVO,NOM);REWRITE(ARCHIVO);MTRA:=PRIMERO;WHILE MTRA<>NIL DO

BEGINWRITE(ARCHIVO,MTRA^);MTRA:=MTRA^.SIGEND;

CLOSE(ARCHIVO)END;

MTRA:=PRIMERO;WHILE MTRA<>NIL DO

BEGINWITH MTRA^ DO

WRITELN(’CANAL Nº ’,CANAL,’; MUESTRA Nº ’,DATO,’=’,Vmuestras);MTRA:=MTRA^.SIGEND

END;

(*-------------Programación de la Frecuencia----------------*)

PROCEDURE FRECUENCIA (FRECUENCIA:INTEGER);VAR D1,D2,AUX:LONGINT;BEGIN

AUX:=2000000 DIV FRECUENCIA;D1:=ROUND(SQRT(AUX));D2:=D1;PORT[CONTCONTR]:=$74;PORT[REGCONT1]:=D1 MOD 256;PORT[REGCONT1]:=D1 DIV 256;PORT[CONTCONTR]:=$B4;PORT[REGCONT2]:=D2 MOD 256;PORT[REGCONT2]:=D2 DIV 256

END;

(*-------------------Programa principal-------------------*)

BEGINCLRSCR;WRITELN(’DESEAS VER ALGUN FICHERO CON DATOS DE LA PCLAB (S/N)’);T:=READKEY;

40

MEMORIA: PCLAB-812

IF T=’S’ THENREPEAT

BEGINLEER_MUESTRAS_DEL_DISCO;WRITELN(’L)eer otro fichero C)continuar --*PULSA LA OPCION DESEADA’);T:=READKEYEND

UNTIL T=’C’;

REPEATPRIMERO:=NIL; (*-------Inicializa el Puntero-----*)CLRSCR;WRITELN(’INTRODUCE LA FRECUENCIA DE MUESTREO: ’);READ(FRE);PORT[REGCONTROL]:=0;WRITELN

(’INTRODUCE EL Nº DE CANALES CONECTADOS A LA PCLAB(0 A 15)= ’);READLN(CAN);WRITELN(’INTRODUCE EL Nº DE MUESTRAS: ’);READ(MAX);WRITELN(’INTRODUCE EL VALOR DE LA TENSION MAXIMA EN LA PCLAB’);READLN(TENS);PORT[REGCONTROL]:=6;FRECUENCIA(FRE);

FOR J:=0 TO CAN DOFOR I:=0 TO MAX-1 DO

BEGINPORT[CANALMUX]:=J;

REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION<=$F;

DATO_BAJO:=PORT[DATOADL];DATO_ALTO:=PORT[DATOADH] MOD 16;MUEST:=DATO_ALTO*256+DATO_BAJO;OTRAMUESTRA(J,I,MUEST);

REPEAT FIN_CONVERSION:=PORT[DATOADH];UNTIL FIN_CONVERSION>$F

END;PORT[REGCONTROL]:=0;LEERMUESTRAS;WRITELN(’ ’);WRITELN(’PULSAR CUALQUIER TECLA PARA REPETIR, ESCAPE PARA SALIR’);TECLA:=READKEY

UNTIL TECLA=#27;PORT[REGCONTROL]:=0END.

Se propone al lector que modifique los programas presentados para que liberen

(dispongan) la memoria dinámica (usada) una vez se termina su ejecución (bucle dispose).

41

MEMORIA: PCLAB-812

5.2.8.3.- Disparo externo.

La última forma de disparo es el disparo externo. Mediante una señal externa

conectada al pin 5 del conector 1 de la placa realizamos los disparos de muestreo.

Para habilitar este modo hay que situar el jumper JP1 en el modo TRG EXT.

A continuación, hay que definir el tipo de transferencia para los datos estableciendo la

combinación correspondiente en el registro de control.

5.2.9.- CONVERSIÓN DIGITAL/ANALÓGICA.

En la conversión D/A obtendremos por uno de los canales de salida de la

tarjeta una tensión analógica correspondiente a una tensión digital previa (12 bits).

La tarjeta de adquisición PCLAB-812 posee dos canales. Cada uno de ellos

tiene asociado dos registros de datos de sólo escritura. Es aquí donde escribiremos el valor

de la tensión que queremos ver convertida; incluyendo que el byte menos significativo deberá

de ser escrito antes en su registro correspondiente, y después el más significativo (sobre 4 bits

efectivos). Una vez escritos ambos, serán sumados y pasados al convertidor digital/analógico.

La tarjeta de adquisición PCLAB-812 suministra unas tensiones de referencia

de -5V ò -10V obteniéndose unas tensiones de salida máximas entre ±5V para el primer caso,

y ±10V para el segundo.

42

MEMORIA: PCLAB-812

La posición de los registros de la placa, respecto de una dirección fija (BASE)

se muestra en la siguiente tabla :

Dirección E/S Lectura Escritura

BASE+0 Contador 0 Contador 0

BASE+1 Contador 1 Contador 1

BASE+2 Contador 2 Contador 2

BASE+3 No utilizado Control contador

BASE+4 A/D byte bajo CH1 D/A bajo

BASE+5 A/D byte alto CH1 D/A alto

BASE+6 D/I byte bajo CH2 D/A bajo

BASE+7 D/I byte alto CH2 D/A alto

BASE+8 -------- --------

BASE+9 No utilizado No utilizado

BASE+10 No utilizado R. Multiplexor

BASE+11 No utilizado R. Control

BASE+12 No utilizado Disparosoft A/D

BASE+13 No utilizado D/O byte bajo

BASE+14 No utilizado D/O byte alto

BASE+15 No utilizado No utilizado

D/I = Entrada digital.D/O = Salida digital.

43

MEMORIA: PCLAB-812

Dicha dirección (BASE), se direcciona según los indicadores del conector SW1

(Ver conjunto), de la siguiente forma :

DIRECCIÓN E/S

(HEXA.)

CONMUTADOR SW1

A9 A8 A7 A6 A5 A4 A3

200-20F 1 0 0 0 0 0 X

210-21F 1 0 0 0 0 1 X

220-22F 1 0 0 0 1 0 X

300-3FF 1 1 0 0 0 0 X

3F0-3FF 1 1 1 1 1 1 X

44

6.- DESCRIPCIÓN Y UTILIZACIÓN DE TURBO

PASCAL

6.1.- INTRODUCCIÓN HISTÓRICA.

Resumir de forma breve los comienzos de la programación PASCAL, es

introducirnos en el cambio producido por el paso a los lenguajes de alto nivel. Antes de la

llegada de la programación estructurada, los lenguajes de bajo nivel (código máquina) e

intermedios (Basic) colmaban las delicias de los programadores, quienes sin disponer de una

herramienta potente con que dirigir sus programas, se enfrascaban delante de pequeños

ordenadores consiguiendo sacar todo el provecho a pequeñas unidades de memoria.

En ese momento la programación orientada a interminables e indescifrables

líneas de código llenaba por completo el quehacer de los profesionales en la programación.

La programación así entendida era privilegio de unos pocos que, entendidos en la materia, se

afanaban en defender las ventajas del lenguaje de bajo nivel.

Los lenguajes así conocidos estaban llegando al fin de su vida operativa; no

porque no tuvieran ventajas, que si las tienen y muchas, si no porque con la extensión de la

memoria en la aparición de potentes ordenadores personales (IBM PC, y compatibles) el

mercado demandaba la necesidad de crear programas intermedios para el entendimiento entre

el usuario y su ordenador, aún a costa de sacrificar espacio de memoria y velocidad de

ejecución.

45

MEMORIA: Turbo Pascal

La historia nos remonta pues a 1971 cuando Niklaus Wirth escribió la

definición de lenguaje PASCAL, en su libro Pascal: User Manual and Report. Este libro

contenía una descripción detallada de lo que un lenguaje debe hacer.

Hay que establecer aquí la diferencia entre la definición de un lenguaje y la

versión de dicho lenguaje.

La definición debe versar sobre lo que tiene que hacer dicho lenguaje introduciendo fórmulas

eficientes para llevar a la práctica al mismo. La versión debe llegar más allá, combinando la

definición y llenando las lagunas que la práctica puede encontrar en su camino de

programación.

Sin embargo cuando Wirth escribió su definición no existía en ese momento

ningún programa compilador real que lea un fichero fuente y produzca como resultado, a

partir de él, un fichero de código ejecutable.

Desde ese momento aparecieron programas, primero para mainframes (como

el CDC 6600), y luego para microordenadores.

Estos programas compiladores materializaban funcionalmente la definición del

lenguaje Pascal tal como la expresó Wirth. Pero tal definición constaba de muchos puntos

débiles que la condenaban a tener una aplicación limitada (no trataba el manejo de cadenas,

los ficheros de acceso aleatorio, las llamadas al sistema operativo...).

46

MEMORIA: Turbo Pascal

Es entonces donde la realización de la versión del lenguaje propiamente dicha

debe operar de forma autónoma, y muchos de estos programas comenzaron a poner

limitaciones a los programadores que la definición de Wirth no tenía en cuenta.

Desde entonces hasta hoy en día la programación de alto nivel (Pascal, y demás

lenguajes que conjugan instrucciones complejas con llamadas simples) no ha parado de variar

y las primeras versiones de TURBO PASCAL pronto se quedaron obsoletas dando paso a

nuevas versiones más actualizadas, más potentes y capaces de aprovechar al máximo todas

las propiedades de los ordenadores personales.

Es importante recordar que Turbo Pascal tiene de Pascal lo que la

programación estructurada hace de nuestros programas. La diferencia viene dada por los

detalles. Y en informática, los detalles son importantes.

47

MEMORIA: Turbo Pascal

6.2.- LA PROGRAMACIÓN ESTRUCTURADA.

Pascal, por su diseño es un lenguaje estructurado.

A diferencia de otros lenguajes, impone a sus programas una estructura. Cada

sentencia debe ir encadenada de una manera determinada, y el compilador se encargará de que

ello haya sido dispuesto por el programador. Un programa debe ser codificado en ciertas

partes. Cada una ha de ir en el lugar que le corresponde. Algunas cosas no pueden colocarse

juntas, por el contrario, otras deben ir siempre asociadas.

El objetivo de esta insólita estructuración es potenciar cierta forma de

programar. Esta forma de programar no es más que la materialización de las ideas de Wirth

sobre la creación de programas que puedan ser comprendidos de forma sencilla por cualquier

programador, sin necesidad de complicados y extensos diagramas de flujo.

Esto es la programación estructurada; y aunque se puede utilizar en muchos lenguajes (Basic

incluido), Pascal es uno de los pocos que exige su utilización.

La estructuración del Pascal es una programación que utiliza palabras sencillas

inglesas (y aún falta mucho para que podamos programar en castellano) formadas a su vez

por caracteres ASCII. Hay un número pequeño de palabras reservadas (palabras con

significado especial en la programación Pascal : ABSOLUTE, AND, ARRAY...), un número

mayor de palabras denominadas identificadores estándar y un número ilimitado de

identificadores creados por el programador.

48

MEMORIA: Turbo Pascal

6.3.- ESTRUCTURA BÁSICA DE LA PROGRAMACIÓN EN TURBO PASCAL.

6.3.1.- Estructura de un programa Pascal.

Todo programa en Pascal, y por ende, todo programa en Turbo Pascal, debe

de estar constituido por una serie de elementos o instrucciones básicas que nos definen la

realización del mismo. En su estructuración está el secreto de la definición, y por tanto, será

el formato de programación el que nos determine la utilidad del mismo.

En este apartado vamos a descubrir como debe ser el contenido de un programa

para que cada cosa se sitúe en el sitio que le corresponde; para ello el programa contendrá

todas las sentencias, expresiones y declaraciones que explicaremos en apartados posteriores,

sin embargo conviene tener claro la estructura antes de introducirnos en este campo.

El programa debe construirse a partir de elementos sencillos de una forma

particular. Esta planificación se hace para facilitar la comprensión de los programas de una

forma clara y estructurada.

La figura siguiente contiene un diagrama de lo que acontece al conjunto de un

programa. No es imprescindible que su programa conste de todos los apartados que se

mencionan para su correcto funcionamiento, pero la utilización de los mismos facilita la

elaboración y comprensión del mismo.

49

MEMORIA: Turbo Pascal

Estructura de un programa Turbo Pascal

PROGRAM

USES

LABEL

CONST

TYPE

VAR

(PROCEDURE) (FUNCTION)

BEGIN

PROGRAMA PRINCIPAL

END.

A continuación desarrollaremos una explicación de cada uno de los elementos

que lo componen, con el propósito de complementar el diagrama.

6.3.1.2.- La sentencia PROGRAM.

Asocia un nombre al programa y avisa al compilador que su trabajo comienza

aquí.

6.3.1.2.- La declaración de unidades (sentencia USES).

50

MEMORIA: Turbo Pascal

Turbo Pascal difiere del Pascal estándar en que permite la compilación

independiente. Con ella podemos desarrollar el trabajo de nuestro programa principal

utilizando subprogramas (unidades), mediante procedimientos y funciones compilados

anteriormente.

Su utilización puede omitirse si no se desea utilizar ningún tipo de unidad, pero

si se declara, debe ser lo inmediato después de la sentencia program.

6.3.1.3.- La declaración de etiquetas (sentencia LABEL).

A continuación viene la declaración de etiquetas del programa. Mediante la

palabra reservada LABEL, seguida por las etiquetas convenientes, declaramos los nombres

de los lugares a los que una vez situadas en el programa podemos realizar un salto de

ejecución por las sentencias GOTO.

Si un programa no contiene sentencias GOTO, no precisa de declaración de

etiquetas. Hay que hacer incapié en la necesidad de no alimentar el programa con muchas

sentencias GOTO que oscurecen su desarrollo y comprensión; pero habrá veces en que su

inclusión será inevitable.

6.3.1.4.- La declaración de constantes (CONST).

Si se van a utilizar constantes en un programa, el compilador espera

51

MEMORIA: Turbo Pascal

encontrarlas a continuación de la declaración de etiquetas. Las constantes son valores que se

definen durante el tiempo de compilación y permanecen invariables durante la ejecución del

programa. Declarar una constante consiste en especificar el identificador de esa constante y

su valor, separados por el signo "=".

6.3.1.5.- La declaración de los tipos (TYPE).

A continuación de la declaración de constantes del programa aparece la

declaración de tipos.

Esta declaración la realiza el programador a su conveniencia para la creación

de variables formadas por variables estándar, o por variables elegidas y creadas por el propio

programador.

6.3.1.6.- La declaración de variables (VAR).

Las variables determinan elementos que en la ejecución del programa pueden

cambiar su valor de forma arbitraria o controlada por el propio programa.

6.3.1.7.- Definición de procedimientos y funciones (PROCEDURE, FUNCTION).

Después de la definición de las variables que va a utilizar el programa, se han

de definir los procedimientos y funciones que no se incorporen en las unidades declaradas

52

MEMORIA: Turbo Pascal

mediante la sentencia USES.

Los procedimientos y las funciones son subrutinas en Pascal que pueden ser

llamadas en cualquier momento de la ejecución del programa realizando una operación que

acorta el tamaño del fichero a compilar y hace transparente la comprensión del programa.

La declaración de los procedimientos y funciones debe seguir un orden bien

establecido para poder realizar sus respectivas llamadas. Un procedimiento (o función) puede

llamar a otro que se haya declarado antes, pero no al revés. Esto implica que la posición de

un procedimiento (o función) respecto a otro establece una jerarquía de llamadas.

6.3.1.8.- El programa principal.

Encerrado entre las sentencias BEGIN-END se halla el cuerpo del programa

principal.

Cuando el ordenador empieza a ejecutar el programa compilado, no comienza

la ejecución por el principio del fichero fuente, sino por el BEGIN que marca el comienzo

del programa principal. Cuando encuentra el END correspondiente, abandona el programa y

devuelve el control al sistema operativo. Mientras a realizado todo el trabajo que tenía a su

cargo.

6.3.2.- Identificadores.

53

MEMORIA: Turbo Pascal

El ordenador se utiliza para crear programas. Los programas son colecciones

de cosas (datos) e instrucciones que indican como almacenar, modificar y presentar estas

cosas (sentencias). El ordenador accede a todas esas cosas mediante su dirección en memoria.

Los nombres en lenguaje común que damos a los datos, programas, funciones y

procedimientos. Es el conjunto de identificadores.

Los identificadores aparecen en el fichero fuente pero en ningún caso en el

fichero de código.

Los identificadores deben cumplir las siguientes reglas:

1. Deben ser secuencias de 127 caracteres de longitud máxima.

2. Los caracteres legales incluyen letras, dígitos y subrayados. No es

permitido espacios y símbolos ($,&,!,*,%,¡...).

3. Los identificadores deben comenzar con una letra, nunca con un dígito

(0..9).

4. La diferencia entre mayúsculas y minúsculas es ignorada.

5. Los subrayados son legales y significativos, y la longitud del indicativo

es siempre tenida en cuenta por el compilador.

6.3.3.- Tipos de datos :

54

MEMORIA: Turbo Pascal

Con Turbo Pascal el conjunto de los tipos de datos es muy grande, y cada uno

de los cuales sirven para un propósito específico.

Una variable de tipo Byte ocupa un byte, y es un valor numérico sin signo que

abarca un rango que va desde 0 hasta 255.

Al igual que la variables byte, las variables Integer albergan valores numéricos

sin signo. Pero al tener dos bytes de longitud pueden variar su valor desde -32.768 a 32767.

Las variables LongInt ocupan cuatro bytes en memoria y tienen un rango de -

2.147.483.648 a 2.147.483.647.

Para números con parte decimal o con magnitudes que excedan el valor

máximo positivo del LongInt, Turbo Pascal proporciona el tipo de datos Real, conocido como

tipo de coma flotante. Una variable Real requiere seis bytes de almacenamiento, y su rango

puede variar de 2,9*10E-39 hasta 1,7*10E38.

Al igual que el tipo Byte, el tipo de datos Char (carácter) ocupa un byte de

memoria. Sin embargo este tipo se utiliza para comparar texto.

El tipo de datos String guarda información de texto. Puede tener una longitud

de 1 a 255 caracteres, y por tanto la cantidad de memoria de almacenamiento que utiliza

dependerá de la extensión que decida el programador.

55

MEMORIA: Turbo Pascal

Además de los datos anteriores, Turbo Pascal soporta otros cuatro tipos de

datos numéricos : Single, Double, Extended y Comp.

El Single es un Real corto (4 bytes).

El Double es un Real largo (8 bytes).

Y el Extended es el mayor de todos (10 bytes).

El Comp utiliza 8 bytes, y no es de coma flotante.

Estos últimos cuatro tipos son de base especial para el coprocesador de la

familia 87; pero no debe preocuparse si no posee alguno, porque Turbo Pascal permite el

acceso a todos ellos con el modo de Emulación.

El Registro (Record) es una combinación de otros tipos de datos en un nuevo

tipo de datos, que se accede mediante campos.

Por último trataremos de forma breve el Array (matriz). Un Array es una

variable que repite un tipo de datos un número especificado de veces; el formato que utiliza

es el siguiente :

Array[Limitinferior..LimitSuperior] Of Tipo de Datos;

Aquí el Array es unidimensional, pero puede tener tantas dimensiones como

memoria disponible poseamos para asignarle.

56

MEMORIA: Turbo Pascal

6.3.4.- Estructuras de control y decisión :

La forma más sencilla de bifurcación condicional es la sentencia If-Then (Si

.. Entonces), que hace que se ejecute una instrucción o bloque de programa si se cumple

cierta condición.

Lo primero que realiza esta sentencia es evaluar la información que se le ha

proporcionado en forma de sentencia booleana. La evaluación produce uno de los dos posibles

resultados (cierto-falso). Si la sentencia es cierta, el programa ejecuta el bloque de código que

está inmerso después de la sentencia If-Then. Si el resultado es falso, el programa se salta

dicho bloque.

Una variación de la anterior es la estructura If-Then-Else (Si .. Entonces .. Si

No .. ). La metodología de funcionamiento es la misma, pero incluye la propiedad de que si

la evaluación boolena a resultado falsa, se ejecutará el bloque de código que es precedido por

la sentencia Else.

Si se utilizan a menudo tipos simples de datos en los programa, se puede

utilizar la sentencia Case en lugar de If-Then. Case proporciona una estructura lógica clara

para bifurcación múltiple.

La sentencia también realiza una evaluación booleana, pero a diferencia, permite que las

bifurcaciones de los bloques de código sean ilimitados.

57

MEMORIA: Turbo Pascal

En un programa tenemos que tener en cuenta las estructuras de control

repetitivas.

El bucle For-Do es un ejemplo de ello. Al realizar un conjunto de instrucciones

que abarque el bucle, debe de especificarse un punto inicial, y un punto de comienzo; el

conjunto se ejecutará el número de veces indicado por inicio y comienzo.

Por ejemplo :

For i:=1 To 100 Do

Begin

Sentencias

End;

El bucle Repeat-Until es una notable mejora del anterior. Aquí el conjunto se

ejecuta hasta que una condición booleana sea cierta.

Por ejemplo :

Repeat

Sentencias

Until (condición booleana);

El bucle While-Do es similar al Repeat-Until, exceptuando que el While-Do

examina Una condición booleana antes de ejecutar cualquier sentencia o bloque de sentencias.

Por ejemplo :

While (condición booleana) Do

58

MEMORIA: Turbo Pascal

Begin

Sentencias

End;

Por último trataremos la bifurcación no condicionada. Se trata de los saltos

Goto hacia etiquetas (Label).

La sentencia Goto realiza el salto de programa al punto indicado por una etiqueta declarada

en la sentencia Label.

Por ejemplo :

...

Label 1;

...

Sentencias

...

1 :

Sentencias

...

Goto 1;

...

Sentencias

...

End.

59

MEMORIA: Turbo Pascal

6.3.5.- Lista de instrucciones.

En este apartado veremos los distintos tipos de instrucciones que configuran

la utilización óptima de Turbo Pascal.

Únicamente nombraremos las instrucciones por orden alfabético, profundizando

de forma limitada en aquellas que pueden considerarse más interesantes. Será a partir de aquí

cuando el lector recurrirá a la bibliografía recomendada para conseguir más información al

respecto.

Instrucciones :

ABS

Función que devuelve el valor absoluto del parámetro que se le pasa.sintaxis : Function Abs(r:Real) : Real;

Function Abs(i:Integer) : Integer;

ADDR

Addr devuelve la dirección de una variable, constante con tipo, o procedimiento.El resultado es un puntero (Pointer).Sintaxis : Addr(Var Variable) : Pointer

APPEND

Append abre un archivo de texto para escritura colocando el puntero del archivoal final del mismo. Con la instrucción escribiremos en el archivo sin perder elcontenido anterior.sintaxis : Procedure Append(Var F : Text);

60

MEMORIA: Turbo Pascal

ARC {Unidad Graph}

Arc dibuja un círculo alrededor de unas coordenadas, con radio determinado, ydibujándose desde un ángulo inicial hasta un ángulo final. (En el sentido de lasagujas del reloj).Sintaxis : Procedure Arc (X,Y : integer; AngIni,AngFin, Radio : Word);

ARCTAN : Función que devuelve el valor del arcotangente que se le pasa como parámetro(generalmente Real).

ASSIGN

Assing enlaza una variable de archivo F al archivo indicado mediante Nombre. Espreciso utilizar éste procedimiento para leer o escribir sobre un archivo de disco,ya que en el programa se enlazará un archivo lógico a uno físico.Sintaxis : Procedure Assign(Var F : File; Nombre : String);

ASSIGNCRT {Unidad CRT} : Procedimiento que permite al usuario enviar informaciónal monitor de vídeo mediante la escritura en el archivoF. (Var F : Text);

BAR {Unidad GRAPH}

En pantalla gráfica, el procedimiento nos crea un rectángulo relleno, con el patrónactual de relleno, según las coordenadas de vértice superior izquierdo e inferiorderecho.Sintaxis : Procedure Bar(X1,Y1,X2,Y2);

BAR3D {Unidad Graph} : Dibuja en pantalla un área rectangular de coordenadasdeterminadas, con profundidad y altura escogida.

61

MEMORIA: Turbo Pascal

BLOCKREAD

Procedimiento de lectura de un número determinado de registros de un archivo sintipo en el buffer. RegistrosLeidos indica el número de registros que se han leídoen realidad.Sintaxis : Procedure BlockRead (Var F : File; Var B : Tipo; NumeroRegistros

: Integer; Var RegistrosLeidos : Integer);

BLOCKWRITE

Procedimiento que graba un número de registros del Buffer B en el archivo sintipo F. Es utilizado, junto con el procedimiento anterior, para copiar archivos entresí.Sintaxis : Procedure BlockWrite (Var F : File; Var B : Tipo; NumRegs :

Integer);

CHDIR

ChDir cambia el directorio actual de trabajo por el indicado en una variable string.Sintaxis : ChDir(Direc : String);

CHR : Nos devuelve el carácter ASCII correspondiente al entero (Integer) que se lepasa.

CIRCLE {Unidad GRAPH} : Nos dibuja un círculo en las coordenadas determinadas,de radio expuesto.

CLEARDEVICE {Unidad GRAPH} : Como procedimiento borra la pantalla actual degráficos.

62

MEMORIA: Turbo Pascal

CLEARVIEWPORT {Unidad GRAPH} : Como procedimiento borra la ventanagráfica actual.

CLOSE

Close vacía el buffer del archivo liberando el manejador de archivo que se estabautilizando; a su vez cierra el archivo correspondiente.Sintaxis : Procedure Close(Var F : File);

CLOSEGRAPH {Unidad GRAPH} : Procedimiento que restaura el monitor de vídeoal modo en que se encontraba antes de realizarla llamada a gráficos.

CLREOL {Unidad CRT} : Nos borra la línea actual de la pantalla desde la posicióndel cursor hasta el extremo derecho de la pantalla.

CLRSCR {Unidad CRT} : Procedimiento que borra la pantalla y sitúa el cursor enla posición inicial de la misma. (1,1).

CONCAT : Función que concatena un número cualquiera de cadenas y las devuelve en unasola. Si la longitud de la cadena concatenada es mayor que 255, se generaráun error en tiempo de ejecución.

COPY : Devuelve una parte de una cadena contando a partir de cierto número,determinados caracteres. Function Copy(S : String; P,L : Integer) : String;

COS : Cos nos devuelve el coseno de el real (Real) que se le pasa.

CSEG : Devuelve la dirección del segmento del código del programa (mediantevariable de tipo Word).

DEC : Procedimiento que decrementa una variable escalar (Scalar) en N valores(LongInt).

63

MEMORIA: Turbo Pascal

DELAY : Procedimiento de retardo de milisegundos en la ejecución del programa.

DELETE

Delete elimina N caracteres de la cadena C comenzando por el carácter P.Sintaxis : Procedure Delete(C : String; N,P : Integer);

DISKSIZE {Unidad DOS}

DiskSize es una función que nos devuelve el tamaño, expresado en bytes, de launidad (1=A, 2=B, 0=Unidad por defecto).Sintaxis : Function DiskSize(Unidad : word) : LongInt;

DISPOSE

Dispose nos libera la memoria del montón asignada a una variable de tipo puntero(Pointer). Se usa en conjunto con New.Sintaxis : Procedure Dispose(P : Pointer);

DOSVERSION {Unidad DOS} : Devuelve el código de salida de un subproceso(0=terminación normal, 1=terminación por Ctrl-C,2=terminación por error en dispositivo, 3=terminaciónmediante el procedimiento Keep.

EOF

Como función, devuelve TRUE cuando el puntero alcanza el final del archivo.Sintaxis : Function Eof(F : File) : Boolean;

64

MEMORIA: Turbo Pascal

EOLN

Eoln devuelve TRUE cuando el puntero del archivo F alcanza el fin de línea o elfin de archivo.Sintaxis : Function Eoln(F : File) : Boolean;

EXEC {Unidad DOS}

Este procedimiento ejecuta el archivo especificado en el encaminamiento, con losparámetros de línea que se le quieran pasar.Sintaxis : Procedure Exec(Encaminamiento, Línea de órdenes : String);

EXIT

Procedimiento que hace que el programa salga del bloque que se está ejecutandoen ese momento.Sintaxis : Procedure Exit;

FILESIZE

FileSize devuelve el número de registros que actualmente contiene el archivo.Sintaxis : FileSize(F : File) : Integer;

FILLCHAR

Procedimiento que rellena un número determinado de bytes de memoria con elvalor escalar comenzando en la dirección elegida.Sintaxis : Procedure FillChar(Variable : Tipo; I, Código : Scalar);

65

MEMORIA: Turbo Pascal

FINDFIRST {Unidad DOS}

FindFirst devuelve información del primer archivo encontrado en el directorioseñalado cuyos atributos coinciden con Attrib.Sintaxis : Procedure FindFirst (Encaminamiento : String; Attrib : Word; Var

S : SerchRec);

FINDNEXT

FindNext devuelve información del siguiente archivo encontrado en el directorioespecificado, definido en FindFirst cuyos atributos coinciden con los de FindFirst.Si la búsqueda se produce con éxito, el valor de DosError será cero.Sintaxis : Procedure FindNext(Var S : SearchRec);

FREEMEM

Procedimiento que libera I bytes del montón de memoria asociado con una variablede tipo puntero, que se debe haber asignado con GetMem.Sintaxis : Procedure FreeMem(Var P : Pointer; I : Integer);

GETCOLOR {Unidad GRAPH} : Devuelve el color del dibujo actual en el modográfico.

GETDATE {Unidad DOS} : Devuelve la fecha determinada mediante el reloj delsistema, sobre unas variables (año, mes, día, díasemana)de tipo Word.

GETDIR : Obtiene el directorio de la unidad especificado por U. El directorio se devuelveen una variable cadena. Si U es cero, GetDir busca en la unidad por defecto.GetDir(U : Byte; Var S : String);

66

MEMORIA: Turbo Pascal

GETGRAPHMODE {Unidad GRAPH}

Función que devuelve el modo gráfico actual. El valor numérico del modo gráficose deberá interpretar conjuntamente con la información sobre el controlador degráficos usado.Sintaxis : Function GetGraphMode : Integer;

GETIMAGE {Unidad GRAPH}

GetImage guarda en una variable una porción rectangular de una pantalla gráfica,delimitada por sus coordenadas.Sintaxis : Procedure GetImage(X1,Y1,X2,Y2 : Integer; Var MapaBits);

GETMAXMODE {Unidad GRAPH}

Nos devuelve un valor que indica el modo gráfico de mayor resolución de latarjeta gráfica que se encuentra instalada.Sintaxis : Function GetMaxMode : Word;

GETMAXX {Unidad GRAPH}

GetMaxX devuelve la máxima coordenada horizontal del modo gráfico actual.Sintaxis : Function GetMaxX : Integer;

GETMAXY {Unidad GRAPH}

Devuelve la máxima coordenada vertical del modo gráfico actual.Sintaxis : Function GetMaxY : Integer;

67

MEMORIA: Turbo Pascal

GOTOXY {Unidad CRT}

Es el procedimiento que ,nos sitúa el cursor en las coordenada de la pantallaseñaladas.Sintaxis : Procedure GotoXY(X,Y : Integer);

GRAPHRESULT {Unidad GRAPH}

Devuelve un código de error relativo al último procedimiento de gráficos utilizado.Sintaxis : Function GraphResult : Integer;

HALT

Halt termina la ejecución de un programa.Sintaxis : Procedure Halt;

IMAGESIZE {Unidad GRAPH}

Es la función que devuelve el número de bytes requerido para almacenar el mapade bits de la porción de la pantalla definida por sus coordenadas.Sintaxis : Function ImageSize(X1,Y1,X2,Y2 : Integer);

INITGRAPH {Unidad GRAPH}

Para inicializar la entrada al modo gráfico utilizaremos este procedimiento, quebusca, según un encaminamiento, los ficheros .BGI de los controladores gráficos.Si controlador es cero, el procedimiento detecta automáticamente el adaptador degráficos disponible, ajustando la máxima resolución.Sintaxis : Procedure InitGraph (Var Controlador : Integer; ModoGráfico :

Integer; Encaminamiento : String);

68

MEMORIA: Turbo Pascal

INSERT : Inserta la cadena fuente en la posición determinada de la cadena destino.Procedure Insert(Fuente : String; Var Destino : String; Indice : Integer).

INTR {Unidad DOS} : Llamada a la interrupción del BIOS.

IORESULT

Nos informará del código de error ocurrido al realizar una operación deentrada/salida. Con valor distinto de cero, significa que se ha producido error.Sintaxis : Function IOResult : Word;

KEEP {Unidad DOS} : Termina la ejecución del programa dejándolo residente. Elprocedimiento pasa un código de salida como un código deerror estándar del DOS. Procedure Keep(Código : Word);

LENGTH

Es la función que determina la longitud de cualquier cadena.Sintaxis : Function Length(C :String) : Integer;

LINE {Unidad GRAPH}

Dibuja una línea entre los puntos de coordenadas X e Y.Sintaxis : Procedure Line(X1,Y1,X2,Y2 : integer);

LINEREL {Unidad GRAPH}

LineRel dibuja una línea desde la posición actual del cursor hasta la coordenadadefinida.Sintaxis : LineRel(X,Y : Integer);

69

MEMORIA: Turbo Pascal

LN : Nos devuelve el logaritmo Neperiano del entero señalado.

LOWVIDEO {Unidad CRT}

LowVideo ajusta el monitor de vídeo a baja densidad, consiguiendo el color actualque no destaque por su brillo.Sintaxis : Procedure LowVideo;

MARK : Almacena en un puntero la dirección de comienzo del montón. ProcedureMark(P : Pointer);

MKDIR

Es el procedimiento que construye el subdirectorio según el texto incluido en unacadena.Sintaxis : Procedure MkDir(S : String);

MOVE

Move copia un número de bytes (B) de memoria desde la posición de la variableV1 hasta la posición de la variable V2.Sintaxis : Procedure Move(Var V1,V2,B : Integer);

MSDOS {Unidad DOS}

Es la llamada que ejecuta los servicios del DOS utilizando los valores establecidosen Regs.Sintaxis : Function MsDos(Var Regs : Registers);

NEW

Es el procedimiento que asigna memoria del montón para el puntero P. Desde esemomento la variable se referenciará como P^.Sintaxis : Procedure New(Var P : Pointer);

70

MEMORIA: Turbo Pascal

NORMVIDEO {Unidad CRT}

NormVideo Restaura los atributos de pantalla implícitos a los valores que estabanfijados en la posición del cursor cuando se inició el programa. Generalmente seutiliza para activar el brillo del monitor.Sintaxis : Procedure NormVideo;

NOSOUND {Unidad CRT} : Elimina cualquier tono que se esté generando por elaltavoz.

PI : Devuelve el valor de la variable numérica Pi. La precisión de la representacióndependerá de la activación o no del modo de emulación 8087.

PIESLICE {Unidad GRAPH}

Instrucción que nos dibuja un trozo de diagrama de tarta con centro y radio dado,y desde un ángulo inicial a uno final.Sintaxis : Procedure PieSlice (X,Y : Integer; AngIni, AngFin, Radio :

Word);

POS

Función que nos devuelve la posición de una cadena que puede estar contenida enotra mayor. Si la cadena no se encuentra en ninguna posición se obtendrá el valorcero.Sintaxis : Function Pos(SubC, C : String) : Integer;

PTR

Ptr Toma como parámetros dos enteros que indican una dirección y sudesplazamiento, y devuelve un valor de puntero de 32 bits.Sintaxis : Function Ptr(Seg, Desp : Integer) : Pointer;

71

MEMORIA: Turbo Pascal

PUTIMAGE {Unidad GRAPH}

Procedimiento que muestra el contenido de Mapa comenzando en X e Y. Bitindica el proceso con que se efectúa el relleno y posee los valores de 0 a 4 :

0= los pixels sustituyen a los anteriores1 = realiza el Xor2 = realiza el Or3 = And4 = Not.

Sintaxis : Procedure PutImage(X,Y : Integer; Var Mapa, Bit : Word);

PUTPIXEL {Unidad GRAPH} : Dibuja un punto gráfico en las coordenadas descritas,con el color señalado. PutPixel(X,Y : Integer; Color :Word);

READ (READLN)

Read(ln) Acepta entrada de datos desde el dispositivo estándar de su sistema(generalmente el teclado), o desde un archivo especificado (F). Readln realiza lamisma función que Read pero incluye en su función el salto de línea y retorno decarro.Sintaxis : Procedure Read({Var F : File,} Parámetros);

Procedure Readln({Var F : File,} Parámetros);

READKEY {Unidad CRT} : Lee un carácter desde el teclado sin realizar eco. Si elcódigo que se obtiene es #0, indica que se ha pulsadouna tecla especial y hay que llamar otra vez a la funciónpara leer la segunda parte del código. Function Readkey: Char;

RECTANGLE {Unidad GRAPH}

Dibuja un rectángulo de coordenadas vértice superior izquierda y vértice inferiorderecha.Sintaxis : Procedure Rectangle(X1, Y1, X2, Y2 : Integer);

72

MEMORIA: Turbo Pascal

RELEASE : Recupera la memoria que ha sido antes asignada mediante la orden Mark. Seusa para almacenar en P la dirección de lo alto del montón. ProcedureRelease(Var P : Pointer);

RESET

Reset abre un archivo par su lectura. Si el archivo no tiene tipo se puedeespecificar (en I) el tamaño de registro.Sintaxis : Procedure Reset(Var F : File; {I : Integer});

RESTORECRTMODE {Unidad CRT} : Procedimiento que restaura de formarápida el monitor de vídeo al modo quetenía antes de inicializar los gráficos.

REWRITE

Orden que prepara un archivo para escritura. Si no existía será creado, y si elarchivo ya existía, la instrucción borrará su contenido.Con un archivo sin tipo puede especificarse el tamaño de registro.Sintaxis : Procedure Rewrite(Var F : File; {I : Integer});

ROUND : Nos redondea al entero más próximo el valor del real que se le pasa. FunctionRound(R : Real) : Integer;

SEEK : Mueve el puntero del archivo al lugar del registro que se apunta con A.Procedure Seek(Var F : File; A : Integer);

SETCOLOR y SETBKCOLOR {Unidad GRAPH} : Procedimientos para establecer elcolor de texto y de fondo.

73

MEMORIA: Turbo Pascal

SETGRAPHMODE {Unidad GRAPH}

Es el procedimiento que establece el modo gráfico actual al especificado en Modo.Sintaxis : Procedure SetGraphMode(Modo : Integer);

SETLINESTYLE {Unidad GRAPH}

Determina el estilo, patrón y grosor de las líneas dibujadas en el modo gráfico.Sintaxis Procedure SetLineStyle (Estilo : Word; Patrón : Word; Grosor :

Word);

SETTEXTSTYLE {Unidad GRAPH}

Determina la forma en que se muestran los caracteres en modo gráfico. Lascaracterísticas incluyen la fuente, dirección de escritura y tamaño de los caracteres.Sintaxis : Procedure SetTexStyle (Fuente : Word; Dirección : Word; Tamaño

: Word);

SIN : Devuelve el seno del real que se le pasa.

SIZEOF : Devuelve el número de bytes requerido por una variable o un tipo de datos.Function SizeOf(Var Variable) : Word;

SOUND : Genera un tono en el altavoz del ordenador de frecuencia determinada. Lomantendrá hasta recibir la instrucción NoSound. Procedure Sound(Frecuencia: Word);

SQR : Devuelve el cuadrado de un real.

74

MEMORIA: Turbo Pascal

SQRT : Devuelve la raíz cuadrada del real que se le pasa.

STR : Convierte un número real o entero en una cadena. Procedure Str(I : Integer; [:Longitud,] Var S : String); Procedure Str(R : Real; [:Longitud : Decimales,]Var S : String);

SWAPVECTORS {Unidad DOS}

Intercambia los valores actuales de la tabla de vectores de interrupción con los quese salvaron cuando el programa comenzó a ejecutarse.Sintaxis : Procedure SwapVectors;

TEXTBACKGROUND {Unidad CRT}

Nos cambia el color de fondo de cada celdilla de carácter en el modo texto.Sintaxis : Procedure TextBackGround(Color : Byte);

TEXTCOLOR {Unidad CRT}

Nos cambia el color del carácter que se escribirá en pantalla (para el modo texto).Sintaxis : Procedure TextColor(Color : Byte);

TEXTMODE {Unidad CRT}

Procedimiento que activa uno de los modo de texto que soporta Turbo Pascal.Estos modos son : BW40 = 40 columnas en blanco y negro.

C40 = 40 columnas en color.BW80 = 80 columnas en B/N.C80 = 80 columnas en color.

Sintaxis : Procedure TextMode(Modo : Word);

75

MEMORIA: Turbo Pascal

UPCASE : Devuelve la mayúscula del carácter que se le pasa, siempre que sea minúscula.Function UpCase(C : Char) : Char;

VAL : Intenta convertir una cadena en un valor numérico entero o real. ProcedureVal(S : String; Var R : Real (ò I : Integer); Var Código : Integer); en códigocontiene un entero que representa el carácter de la cadena donde se haproducido error en la conversión.

WHEREX {Unidad CRT} : Devuelve la coordenada de la columna donde estásituado el cursor dentro de la ventana actual. FunctionWhereX : Byte;

WHEREY {Unidad CRT} : Devuelve la coordenada de la fila donde está situado elcursor en la ventana actual. Function WhereY : Byte;

WINDOW {Unidad CRT} : Limita la ventana de edición en modo texto a la ventanade coordenadas especificadas, situando el cursor en laposición (1,1) de la misma. Procedure Window(X1, Y1,X2, Y2 : Byte);

WRITE(LN) : Toma una lista de parámetros y los imprime en el dispositivo activo enese momento (generalmente pantalla de vídeo). Writeln añade a Writeun salto de línea y retorno de carro. Procedure Write(ln) ({Var F :File,} Parámetros);

Hemos resumido aquí el conjunto de instrucciones (en forma de procedimientos

y funciones) que hemos utilizado en la construcción del programa. Aún así la cantidad de

instrucciones es superada con las señaladas anteriormente. Dejamos pues a decisión del lector

ampliar sus conocimientos sobre las mismas recurriendo a la bibliografía recomendada.

76

MEMORIA: Turbo Pascal

No obstante otras instrucciones de interés serían las siguientes :

DelLine(Unidad CRT)

DetectGraph(Unidad GRAPH)

DiskFree(Unidad DOS)

DosExitCode(Unidad DOS)

DrawPoly(Unidad GRAPH)

Dseg

EnvCount(Unidad DOS)

EnvStr(Unidad DOS)

Erase

Exp

FExpand(Unidad DOS)

FilePos

FillEllipse(Unidad GRAPH)

FillPoly(Unidad GRAPH)

FloodFill(Unidad GRAPH)

Flush

Frac

FSearch(Unidad DOS)

FSplit(Unidad DOS)

GetArcCoord(Unidad GRAPH)

GetAspecRatio(Unidad GRAPH)

GetCBreak(Unidad DOS)

77

MEMORIA: Turbo Pascal

GetDefaultPalette(Unidad GRAPH)

GetDriverName(Unidad GRAPH)

GetEnv(Unidad DOS)

GetFAttrib(Unidad DOS)

GetFillPattern(Unidad GRAPH)

GetFillSettings(Unidad GRAPH)

GetFTime(Unidad DOS)

GetIntVec(Unidad DOS)

GetLineSettings(Unidad GRAPH)

GetMaxColor(Unidad GRAPH)

GetModeName(Unidad GRAPH)

GetModeRange(Unidad GRAPH)

GetPalette(Unidad GRAPH)

GetPaletteSize(Unidad GRAPH)

GetPixel(Unidad GRAPH)

GetTextSettings(Unidad GRAPH)

GetTime(Unidad DOS)

GetVerify(Unidad DOS)

GetViewSettings(Unidad GRAPH)

GetX(Unidad GRAPH)

GetY(Unidad GRAPH)

GraphDefaults(Unidad GRAPH)

GraphErrorMsg(Unidad GRAPH)

78

MEMORIA: Turbo Pascal

Hi

HighVideo(Unidad CRT)

Inc

InsLine(Unidad CRT)

InstallUserDriver(Unidad GRAPH)

InstallUserFont(Unidad GRAPH)

Int

KeyPressed(Unidad CRT)

LineTo(Unidad GRAPH)

Lo

MaxAvail

MemAvail

MoveRel(Unidad GRAPH)

MoveTo(Unidad DOS)

Odd

Ofs

Ord

OutText(Unidad GRAPH)

OutTextXY(Unidad GRAPH)

PackTime(Unidad DOS)

ParamCount

ParamStr

Pred

79

MEMORIA: Turbo Pascal

Random

Randomize

RegisterBGIDriver(Unidad GRAPH)

RegisterBGIFont(Unidad GRAPH)

Rename

RmDir

RunError

Sector(Unidad GRAPH)

SeekEof

SeekEoln

Seg

SetActivePage(Unidad GRAPH)

SetAllPalette(Unidad GRAPH)

SetAspectRatio(Unidad GRAPH)

SetCBreak(Unidad DOS)

SetDate(Unidad DOS)

SetFAttr(Unidad DOS)

SetFillPattern(Unidad GRAPH)

SetFillStyle(Unidad GRAPH)

SetFTime(Unidad DOS)

SetGraphBufSize(Unidad GRAPH)

SetIntVec(Unidad DOS)

SetPalette(Unidad GRAPH)

80

MEMORIA: Turbo Pascal

SetRBGPalette(Unidad GRAPH)

SetTextBuf

SetTextJustify(Unidad GRAPH)

SetTime(Unidad DOS)

SetUserCharSize(Unidad GRAPH)

SetVerify(Unida DOS)

SetViewPort(Unida GRAPH)

SetVisualPage(Unidad GRAPH)

SetWriteMode(Unidad GRAPH)

SPtr

SSeg

Succ

Swap

TextHeight(Unidad GRAPH)

TextWidth(Unidad Graph)

Trunc

Truncate

TypeOf

UnPackTime(Unidad DOS)

81

MEMORIA: Turbo Pascal

6.3.6.- Unidades.

Las unidades son archivos completos e independientes que contienen un

conjunto de procedimientos y funciones que pueden ser llamados por cualquier programa que

contenga la declaración de dicha unidad como etiqueta USES. Por ejemplo en el programa

presentado se incluye la unidad ERR mediante la declaración inicial USES

CRT,DOS,GRAPH,ERR. Aquí CRT, DOS, GRAPH, también son unidades, pero pertenecen

al estándar de TURBO PASCAL.

Toda unidad contendrá su nombre (ej. UNIT ERR), que coincidirá con el

nombre del fichero (sin contar la extensión), una parte de interfase, que incluirá únicamente

los procedimientos y funciones de que se compone y que puede utilizar el programa, así como

las variables declaradas como globales. Y una parte de implementación que desarrolla todos

y cada uno de los procedimientos y funciones de que consta la unidad.

El empleo de unidades hace de un programa su sencillez y comodidad en el

manejo; y a su vez obtiene la versatilidad necesaria para que los procedimientos y funciones

utilizados puedan aplicarse de forma fácil en otros programas.

Para utilizar dichas unidades se compilaran éstas sobre disco, creándose la

unidad .TPU (Unidad de Turbo Pascal; en nuestro caso por ej.ERR.TPU), que es el código

ejecutable de dicha unidad y que todo programa que tenga declarada esa unidad (por USES)

incluirá a la llamada de un procedimiento (o función) que contenga dicha unidad.

82

MEMORIA: Turbo Pascal

6.3.7.- Ficheros Include.

Ficheros así diseñados contienen texto (ASCII) de instrucciones en PASCAL

que el compilador incluirá en el programa principal al convertirlo en código ejecutable.

Estos ficheros incluirán procedimientos, funciones o parte del programa

principal que hará más comprensible el mismo.

Para poder ser incorporados por el compilador éstos archivos deberán

encontrarse en el directorio señalado en la opción directorios include del programa TURBO

PASCAL (Options-Directories-Include). El compilador los incluirá en la posición del

programa principal donde sean llamados mediante la directiva de compilación :

{$I nombre del fichero}

6.3.8.- Directivas de compilación.

Para controlar la naturaleza del código que va a generar el compilador existen

dos maneras que realizan la misma función. Una de ellas es mediante el menú Options de

Turbo Pascal. Otra es mediante las directivas de compilación.

Con el menú Options (opciones) damos al programa unas directivas de

compilación que asumirá por defecto.

83

MEMORIA: Turbo Pascal

Sin embargo mediante las directivas de compilación, es el compilador quien,

a la hora de transformar el fichero fuente en código ejecutable, las tendrá en cuenta.

Existen tres tipos, muy diferentes, de directivas de compilación :

* Directivas de cambio de estado: activan o desactivan alguna

condición. Dando su nombre (ver más adelante) y a continuación el

signo "+" quedan activadas; con el signo "-" se desactivan.

* Directivas de parámetro: proporcionan parámetros al compilador,

tales como nombres de fichero o direcciones de posiciones de memoria.

* Directivas de condición: permiten la compilación de diferentes partes

de un fichero fuente dependiendo de ciertos parámetros definidos por

el programador.

Todas estas directivas se activan al colocar su nombre correspondiente junto

el signo "+", encerrado todo ello entre llaves (ejemplo {$B+}, {$I+},...). Y se desactiva al

colocar el signo "-" (ejemplo {$B-}, {$I-}). Veremos cuales son todas estas directivas :

$A+/- : Alineamiento por palabra (por defecto +).

La familia 86 de microprocesadores puede acceder más

rápidamente a los datos si éstos están alineados por palabras, es

decir, que el comienzo y final de cualquier dato formen

direcciones alternas. Si un dato contiene un número impar de

bytes, el compilador añadirá un byte al conjunto en cuestión

84

MEMORIA: Turbo Pascal

para que el dato quede alineado por palabra. La alineación

aumenta la velocidad de ejecución del código (no mucho), y

aumenta la cantidad de memoria de código (no mucho).

$B+/- : Evaluación booleana (por defecto -).

Existen dos formas en que el compilador puede generar el

código para la evaluación booleana: completa y en

cortocircuito.

La evaluación completa determina la comprobación de todas la

expresiones booleanas formadas por subexpresiones (unidas

mediante operadores OR y AND); aunque una de las

subexpresiones determine el resultado de la evaluación.

La evaluación en cortocircuito se detiene tan pronto se

determina el resultado de la expresión.

$D+/- : Generar información para depurado (por defecto -).

Para localizar la posición de error de ejecución dentro del

código fuente, el compilador necesita más información que

simplemente la dirección en la que se produjo el error.

$E+/- : Emulación de coma flotante (por defecto +).

Con la activación, el compilador tiene la capacidad de emular

el funcionamiento de la familia 87 de coprocesadores

85

MEMORIA: Turbo Pascal

matemáticos sobre un sistema que no disponga de ellos. Esto

permite hacer uso de los tipos en coma flotante Single, Double,

Extended, y Comp. Su desactivación implica la necesidad del

coprocesador para la utilización de estos tipos.

$F+/- : Forzar llamadas lejanas (por defecto -).

El código de llamada a procedimientos y funciones puede ser

generado de dos formas. Si la llamada debe aventurarse más

allá de las 64K de código actual, será una llamada lejana; en

caso contrario, una llamada cercana.

Generalmente es el propio programa compilador quien decide

si una llamada hay que hacerla lejana o cercana; pero se pueden

presentar casos en que el compilador decida llamada cercana

cuando en realidad el programa en su ejecución puede salirse de

la extensión de 64K de código actual (por ejemplo en las

llamadas a ficheros ejecutables, procedimiento de salida

Exitproc,...).

$I+/- : Detección de errores de E/S (por defecto +).

El compilador en su trabajo genera tras cada instrucción o

sentencia unas líneas de código que reaccionan a cualquier error

en tiempo de ejecución parando el programa y devolviendo el

control al sistema operativo. Si desactivamos ésta opción, se

86

MEMORIA: Turbo Pascal

desactiva esta reacción del compilador informándose el usuario

del error producido mediante la función IORESULT; pero

dejando a la elección del programador el tomar las medidas

oportunas en su tratamiento.

$I<nombre de fichero> : incluir fichero.

Esta directiva no tiene nada que ver con la anterior aunque por

su apariencia ($I) pueda creerse. Mediante ésta directiva el

compilador buscará los ficheros (con texto Pascal) en el

directorio dado al menú Options(include) y lo incluirá

convertido en código en la posición del programa principal

donde se realizó la llamada a incluir.

$L<nombre de fichero> : Enlace de fichero objeto.

Mediante ésta llamada, el compilador buscará en el directorio

dado en el menú OPTIONS(Directories) el fichero externo en

código máquina para enlazarlo en la compilación.

$M<tamaño de la pila>,<mínimo del heap (montón)>,<máximo del

heap (montón)> : Asignación de memoria (por defecto {$M

16384,0,655360}).

El primer parámetro indica la memoria que se le asignará a la

pila; el segundo es la cantidad mínima de memoria RAM que

87

MEMORIA: Turbo Pascal

el sistema operativo pondrá a disposición del programa para su

ejecución. Si no pudiera proveer al programa la cantidad de

memoria aquí especificada, no se ejecutaría el programa. Y el

tercer parámetro es la cantidad de memoria máxima que el

sistema pondrá a disposición del programa si es que dispone de

ella.

$N+/- : Procesador matemático (por defecto -).

El compilador Turbo Pascal puede detectar la presencia o

ausencia de coprocesador matemático como el 8087, 80287 u

80387. Su presencia permite utilizar los tipos Single, Double,

Extended, y Comp. Pero no debemos preocuparnos si no existe

puesto que la emulación permite su utilización sin ningún

problema.

$O+/- : Activación de compilación de unidades como overlays (por

defecto -).

Para que una unidad sea compilada como overlay debe contener

una directiva {$O+}. Esta directiva no fuerza a compilar como

overlay, únicamente lo permite.

$O<nombre de unidad> : Especificación de nombre de unidad

overlay.

88

MEMORIA: Turbo Pascal

Cada unidad que vaya a utilizarse como overlay debe nombrarse

como tal en el fichero fuente del programa principal. Cada

unidad debe tener su propia directiva independiente que

aparecerá después de la sentencia USES.

$R+/- : Comprobación de error de rango en un índice (por defecto -

).

Cuando intentamos acceder a un índice dentro de un array o

cadena que se excede fuera de los límites del mismo,

obtenemos datos sin sentido que provienen de zonas adyacentes.

Los errores suelen resultar difíciles de clasificar . Para resolver

este problema está la opción de activar la comprobación de

errores de rango en índices, de forma que cuando se produce un

error de este tipo, Turbo Pascal detectará un error de ejecución

y detendrá el programa.

$S+/- : Comprobación del desbordamiento de la pila (por defecto +).

La comprobación del tamaño de la pila es necesario para que en

cada momento que el programa deba introducir algo en ella

tenga espacio suficiente para realizarlo. Si no se dispone de

espacio, se producirá un error de ejecución y se detendrá el

programa.

89

MEMORIA: Turbo Pascal

$V+/- : Comprobación de la longitud de cadenas pasadas por

referencia (por defecto +).

Los tipos de cadena tienen una longitud especificada por el

programador. Cuando se pasa por referencia una variable de

tipo cadena a una función o procedimiento es necesario que la

longitud física del parámetro formal y la longitud física del

parámetro real sean iguales. Si no es así se generará un error de

compilación. La directiva permite activar o desactivar esta

restricción.

6.4.- DIFERENCIAS ENTRE LA PROGRAMACIÓN ORIENTADA A GRÁFICOSY LA PROGRAMACIÓN TEXTO.

Las diferencias entre la programación en modo texto y programación gráfica

se reducen al control que realizamos sobre el tipo de monitor. Uno de los rasgos principales

del ordenador son sus posibilidades gráficas.

En modo texto el control se realiza sobre cada una de las celdillas que

componen los dígitos que escribimos y que el ordenador mantiene permanentemente en

memoria (caracteres ASCII). De esta manera dependiendo del número de columnas y de filas

obtendremos el conjunto de celdillas sobre las que realizamos el control. Mostrar información

en pantalla es tan sencillo como colocar caracteres ASCII en posiciones específicas de

memoria.

90

MEMORIA: Turbo Pascal

Por ejemplo para el modo texto de 80 columnas y 25 filas (lo general),

conseguimos 2000 celdillas (80*25).

Sobre cada celda podemos controlar el color de fondo y el color del carácter

que representamos en su interior (de forma individual para cada celdilla).

Por el contrario en el modo gráfico el control sobre el monitor se hace más

patente ya que accedemos de forma independiente a cada uno de los pixels (puntos) que

configuran el conjunto de la pantalla de su monitor. Un carácter en la pantalla es la asociación

de muchos pixels organizados según un patrón.

Evidentemente la resolución de la pantalla a la que esté conectado su ordenador

dependerá del tipo de monitor (monocromo o color), y en gran medida de la tarjeta gráfica

que posea en configuración. Actualmente existen más de diez adaptadores de gráficos

disponibles que abarcan más de dos docenas de modos gráficos diferentes.

El tipo de ordenador nos limitará el conjunto de colores que podremos

diferenciar a la vez en la pantalla; pero la tarjeta gráfica nos permitirá aumentar el control

sobre los pixels (puntos) al reducir el tamaño de éstos. La pantalla de gráficos está formada

por pixels ordenados en líneas horizontales y verticales. De esta forma, una tarjeta gráfica

potente permitirá dividir la pantalla en un número más grande de puntos que una tarjeta

inferior (generalmente tendremos una configuración de 640 puntos en horizontal por 480

puntos en vertical (640*480), que se corresponde con el adaptador VGA).

91

MEMORIA: Turbo Pascal

Aquí nos encontramos el gran problema de la programación en entorno gráfico.

Por un lado el mayor control que poseemos sobre el tipo de monitor nos hace tener en cuenta

que las distintas configuraciones de tarjetas limitan la utilización de unas coordenadas que

sean válidas para todos los ordenadores personales y compatibles y que nunca serán absolutas.

La utilización de la programación gráfica en TURBO PASCAL es un gran

escollo a salvar. Si bien la programación así entendida es, sin lugar a dudas, la auténtica

programación (puesto que todo el esfuerzo debe emplearse en la programación de cada uno

de los puntos del monitor), hay que añadir que el interfase gráfico de Borland (BGI), no

limita la utilización de sus coordenadas al mundo del ordenador. Con ello queremos decir que

con TURBO PASCAL la colocación de los pixels (puntos) en la pantalla sólo se harán

visibles en el campo que caiga dentro de la pantalla de su monitor. Si colocamos un pixel en

la posición (X=3024,Y=2018) evidentemente no lo veremos (pues se excede de las

coordenadas que limitan el monitor de su ordenador), pero su ordenador si lo dibujará y por

tanto empleará el tiempo necesario para efectuar dicha operación.

En la utilización de gráficos deberemos tener siempre en cuenta los distintos

tipos de modos gráficos existentes en el mercado, para que nuestro programa de aplicación

no rebase nunca las coordenadas de la configuración disponible.

6.5.- INTERRUPCIONES DOS Y BIOS.

El Sistema Operativo de Disco (DOS), y el Sistema Básico de Entrada Salida

92

MEMORIA: Turbo Pascal

(BIOS) son el conjunto de rutinas que controlan los dispositivos físicos de su ordenador

(impresora, teclado, unidad de disco flexible...), asegurando que los datos vienen y van al

lugar correcto sin que se produzcan errores.

Mediante la programación en TURBO PASCAL no es necesario conocer cuales

son los servicios que nos presentan el DOS y el BIOS, porque mediante funciones,

procedimientos, e instrucciones estándar del programa podemos acceder a la mayoría de

dichos servicios (así por ejemplo al escribir o leer en un disco utilizamos los servicios del

DOS).

Aún así, aunque TURBO PASCAL proporciona inteligentes y eficientes

procedimientos a muchos de estos servicios, no utiliza todos ellos. Si se quiere tener un

control absoluto sobre el PC se deberá controlar la potencia de los servicios DOS y BIOS.

TURBO PASCAL 6 (y versiones anteriores) proporciona una unidad estándar

llamada DOS que contiene el conjunto de rutinas para acceder al entorno DOS y BIOS.

La unidad DOS también contiene dos procedimientos, MSDOS e INTR, que se pueden usar

para llamar a servicios específicos del DOS y del BIOS.

La familia de microprocesadores 8088 contiene un conjunto estándar de 14

registros, o posiciones internas de memoria, que las computadoras usan para ejecutar órdenes.

Cada registro tiene una longitud de 16 bits (word-palabra), y son utilizados como áreas de

propósito que almacenan datos usados en cálculo, comparaciones, como almacén del segmento

93

MEMORIA: Turbo Pascal

del programa (datos, pila, operaciones especiales...).

Mediante la unidad DOS se accederá a la mayor parte de estos registros para

ejecutar ordenes especiales y obtener información sobre las unidades de disco y archivos de

la computadora.

Por ejemplo: Información sobre el espacio libre en disco, obtención y ajuste

de los atributos de un archivo, listado de directorio, servicios de

vídeo, ajuste del tamaño del cursor, lectura de carácter por

pantalla, obtención y ajuste de fecha y hora, acceso mayor al

teclado, manejo de procesos externos...

Para conocer la potencia de la programación DOS y BIOS consultar

bibliografía de manuales de sistemas operativos.

6.6.- PROGRAMACIÓN ORIENTADA A OBJETO (POO) Y TURBO VISIÓN.

Como su nombre implica, la programación orientada a objetos se basa

94

MEMORIA: Turbo Pascal

fuertemente en el concepto objeto. Cada uno de nosotros se halla familiarizado con el

conjunto de objetos que rodean nuestra vida sin ni siquiera distinguir entre sus elementos

físicos y su comportamiento. Así cuando usamos una calculadora corriente no distinguimos

entre el conjunto técnico (elementos resistivos, pantalla de cuarzo... ) y el comportamiento o

utilidad que de ella obtenemos (realización de operaciones).

Mediante los objetos se pretende que la programación sea un fiel reflejo del

mundo real. Para ello los objetos deben contener tres conceptos básicos : Combinación de

código y datos, herencia y encapsulación.

Para utilizar la programación orientada a objeto no será necesario volver a

aprender a programar, únicamente familiarizarse con unos nuevos conceptos y por supuesto

utilizarlos.

Código y datos. Con los conocimientos básicos de programación, se pueden

definir procedimientos y funciones. En la programación objeto (en lo sucesivo POO) los datos

y los procedimientos se combinan en objetos. Un objeto contendrá las características de una

entidad (sus datos) y su comportamiento (sus procedimientos).

Herencia. Los objetos a pesar de contener sus propios métodos y datos,

también pueden heredarlos de otros objetos.

Encapsulación. Con ella nos referimos a la creación de objetos como entidades

95

MEMORIA: Turbo Pascal

completas. El programador no necesita acceder directamente a los campos del objeto; en vez

de ésto, se definirán métodos dentro del objeto que gobiernen la manipulación de los datos.

TURBO VISIÓN es el conjunto que engloba los procedimientos y mecanismos

que ha utilizado Borland para construir su Entorno Integrado de Desarrollo (EID) y que ha

partir de TURBO PASCAL 6 está a disposición del programador. De esta manera a la hora

de crear cualquier menú o submenú podemos acceder de forma sencilla a los mismos

parámetros que ha utilizado TURBO PASCAL en su creación.

Con TURBO VISIÓN la apariencia de sus programas serán similares al entorno

del programa TURBO PASCAL 6.

7.- ESPECIFICACIONES DE UNA MAGNITUD

PERIÓDICA

96

En la comparación de ondas periódicas podemos tener en cuenta únicamente

una serie de valores o conceptos (siempre que dicha comparación la realicemos de forma

simple). Nos referiremos a ella de forma breve y concisa sin preocuparnos que la adquisición

de las mismas no sea eficaz y fiable cien por cien. Ello será debido a que las formas de onda

periódicas, por su naturaleza, llevarán incorporados un conjunto de armónicos que se

despreciarán en la comparación, y porque las tolerancias sobre los elementos que actúan

superan con creces los márgenes de captura y muestreo de las mismas.

Se definen :

A) Valor eficaz o RMS (Root Mears Square) :

B) Valor medio :

C) Factor de forma :

97

MEMORIA: Especificaciones de una magnitud periódica

Así, por ejemplo para una onda senoidal el factor de forma sería infinito,

puesto que su valor medio es cero. Para una onda contínua este factor de forma es 1, ya que

el valor medio y eficaz coinciden. Para el resto de combinaciones de formas de onda, los

valores variarán entre estos dos valores límite.

D) Factor de rizado :

También definido como :

98

8.- SOLUCIÓN AL PROBLEMA PLANTEADO

La solución adquirida al problema planteado se basa en el compromiso de

conseguir un sistema fiable y económico en la verificación de la simulación de cualquier

circuito electrónico.

Se llega, por tanto, a la comparación de 2 archivos conseguidos de dos formas

distintas :

- Un archivo contendrá la simulación teórica del circuito sobre el que queremos

comprobar su funcionamiento. Dicha simulación teórica la obtendremos

mediante uno de los paquetes informáticos más utilizados y expandidos en el

mercado (simulación PSPICE). El archivo así obtenido será aquel que en

formato de texto (ASCII), resulte de la simulación PSPICE (archivo de salida

generado por dicho paquete informático, con extensión .TXT).

- Un segundo archivo deberá contener los datos del funcionamiento real del

mismo circuito sobre el que anteriormente realizamos la simulación PSPICE.

Este archivo será obtenido como resultado de la adquisición de tensiones por

una tarjeta de adquisición potente y expandida en el mercado

(PCLABCARD-812). Con ella, y con la implementación física del circuito a

comprobar, el usuario podrá elegir el nudo (o serie de nudos) sobre los cuales

se adquirirán datos para la posterior comparación.

99

MEMORIA: Solución al problema planteado

Estos dos archivos contendrán toda la información necesaria para comprobar

y verificar el correcto (o incorrecto) funcionamiento del circuito electrónico ideado.

El proyecto de aplicación informática (EVALUACIÓN 1.00) que relaciona

ambos archivos (y que asume la responsabilidad de captura del segundo archivo) trata de ser

una herramienta cómoda, sencilla y de potente uso, que, en análisis transitorio y régimen

permanente es capaz de dar resultados fiables al usuario sobre el funcionamiento de cualquier

circuito electrónico.

La comparación de ambos archivos (que no son sino datos que leemos y

almacenamos), se ha realizado dependiendo de una tolerancia o margen de error dictada e

impuesta por el usuario del conjunto. De esta forma, se subsana los problemas provenientes

de la adquisición fiable de los datos (ya que habrá que tener en cuenta que cualquier tarjeta

en su adquisición y dependiendo de su potencia de conversión, se acerca más o menos al

valor real del dato que muestrea), y de la propia tolerancia de los elementos propios del

circuito (resistencias, condensadores...). El control de la calidad se hace palpable al ser el

propio usuario quien decide el rigor con que testeará el circuito en su comprobación.

Siguiendo la premisa de comodidad, se ha ideado el programa dentro de un

entorno gráfico de fácil uso, que reune un conjunto de aplicaciones y utilidades que ayudan

su manejo. Así, listar un directorio (o subdirectorio), localizar un fichero o grupos de ficheros,

actualizar la hora del sistema, elegir el directorio de trabajo o incluso salir momentáneamente

al sistema operativo, puede realizarse desde el propio programa.

100

MEMORIA: Solución al problema planteado

Para que el control y resultado de la comparación de los datos teóricos y reales

sea máximo el programa permite visualizar y capturar las formas de onda (en función del

tiempo) de los nudos que interesen, así como obtener gráficas (por impresora gráfica) y

resultados de tensión y frecuencia de dichas ondas (es la opción de osciloscopio, unidad

visual). También permite almacenar en disco las formas de onda capturadas, y por tanto

recuperarlas en cualquier momento.

El control del circuito a verificar se completa con la obtención de un archivo

de salida que el programa crea sobre el directorio de trabajo y que contiene la transformación

y filtro a un formato adecuado y conocido, del archivo de simulación PSPICE. El usuario

podrá ver su contenido (texto en ASCII) y localizar posibles errores, comprensión de los

valores teóricos del circuito.

Todo el conjunto del programa que adoptamos como solución incluye una

gestión eficiente de los errores (unidad err) que puedan producirse en tiempo de ejecución;

evitando que el usuario pueda conducir el programa hacia cauces no debidos (bucles infinitos,

procedimientos sin retorno...). Se logra que el usuario sea informado de los errores que se

produzcan y que tome las decisiones adecuadas según demanda del propio programa.

Un esquema sencillo de lo que constituye la implementación del programa sería

la siguiente :

101

MEMORIA: Solución al problema planteado

Esquema de la solución adoptada, donde se aprecia la comparación entre los datosteóricos y los datos reales. Obtenemos una respuesta del programa, y una respuestade comparación del propio usuario.

102

9.- BIBLIOGRAFÍA

La bibliografía que aquí se detalla está ordenada por materias de interés en la

ampliación del proyecto realizado, y dentro de cada materia utilizada se establece una

jerarquía de importancia de los libros señalados a continuación.

"La biblia de TURBO PASCAL (V. 5.0).

Autor : Jeff Duntemann.

Editorial : Anaya Multimedia.

"TURBO PASCAL 6, manual de referencia".

Autor : Stephen O’Brien.

Editorial : McGraw-Hill.

"TURBO PASCAL 5.5 y 6".

Autor : Servando Suero Molina.

Editorial : Paraninfo S. A.

"Domine TURBO PASCAL 6".

Autor : Francisco Pascual González.

Editorial : RA-MA.

103

"TURBO PASCAL 6.0 TÉCNICAS Y UTILIDADES".

Autor : Neil J. Rubenking.

Editorial : Anaya.

"TURBO PASCAL 6.0 A SU ALCANCE".

Autor : Luis Goyanes Aguilar.

Editorial : McGraw-Hill.

"Fundamentos de programación, Pascal y aplicaciones en arquitectura".

Autores : Agustín Pérez García. Luis A. de Garrido Talavera. Enrique Gil Benso.

Editorial : Servicio de Publicaciones de la Universidad Politécnica de Valencia

(SPUPV. 88.064).

"Programación en Pascal".

Autor : Peter Grogono.

Editorial : Fondo Educativo Interamericano.

"TURBO PASCAL".

Autor : Paul L. Schlieve.

Editorial : Anaya Multimedia.

"Programación en Pascal Turbo Pascal".

Autor : Rodnay Zaks.

Editorial : Anaya.

104

"Iniciación al lenguaje Pascal".

Autores : Luis Mata Parreño. Carmen Ballester Ricart. Ana González Aragón.

Editorial : Marfil.

"Pascal estructurado".

Autores : Jean-Paul Tremblay. Richard B. Bunt. Lyle M. Opseth.

Editorial : McGraw-Hill.

"Manual de Turbo Pascal (Guía del programador, Versiones 2.XX y 3.XX).

Autores : J. A. Díaz Calero. L. Suja Goffin.

Editorial : RA-MA.

"Programación en lenguaje Pascal".

Autores : F. J. Sanchis Llorca. A. Morales Lozano.

Editorial : Paraninfo S. A.

"TURBO PASCAL manual de referencia (versión 4.0)".

Autor : Stephen O’Brien.

Editorial : Borland-Osborne/McGraw-Hill.

"Sistema operativo DOS 4, introducción, conceptos avanzados y servicios del

sistema".

Autor : Jaime de Iraolagoitia.

Editorial : Paraninfo.

105

"MS-DOS en la práctica hasta la versión 3.3".

Autor : Ana Aguilar-Amat.

Editorial : Gustavo Gil S. A.

"El PC para principiantes".

Autores : H. Tornsdorf. M. Tornsdorf.

Editorial : Marcombo, Boixareu editores.

"Conceptos de informática".

Autor : Peter Bishop.

Editorial : Anaya Multimedia.

"Harvard Graphics 3.0 a su alcance".

Autor : Mary Campbell.

"Manual para Quickbasic 4.5".

Autor : Fco. Javier Ceballos.

Editorial : RA-MA.

"Programación en Quick Basic 4.0/4.5".

Autor : Luis Joyanes Aguilar.

Editorial : McGraw-Hill.

106

"Guía práctica para usuarios de WordPerfect 5.1".

Autores : Esteban Cueva. Antoine Saint-Bois.

Editorial : Anaya Multimedia.

"Guía práctica para usuarios de WordPerfect 5.0".

Autores : Esteban Cueva. Antonio Saint-Bois.

Editorial : Anaya Multimedia.

"El ABC de WordPerfect 5.1".

Autor : Alan R. Neibauer.

Editorial: SYBEX.

"SPICE for circuits and electronics using PSPICE(R)".

Autor : Muhammad H. Rashid.

Editorial : Prentice-Hall International Editions.

"PSPICE(R) : A TUTORIAL".

Autor : L. H. Fenical.

Editorial : REGENTS/PRENTICE HALL.

"GENESIS USER’S GUIDE".

Versión 5.1 (1992).

107

"AutoCad avanzado V.10".

Autores : J. López Fernández. J. C. Bartolomé Larrinaga.

Editorial : McGraw-Hill.

"Introducción al dibujo asistido por ordenador".

Autores : Guillermo Peris Fajarnés. Mariano Alcañiz Raya.

Editorial : Servicio de Publicaciones de la Universidad Politécnica de Valencia

(SPUPV.91.051).

"Electronic Instrumentation" (Capítulo 3).

Autores : j. Alloca. A. Stuart.

Editorial : Reston Publishing Company, 1983.

"Integrate Circuits Date Book" (Volumen 33).

Autor : Burr-Brown 1989.

"Microprocessor & Peripheral Handbook" (Volumen I : Microprocessors).

Autor : INTEL 1989.

"PCL-812 Enhanced Multi-Lab Card. User’s Manual".

PC-LABCARD 1989.

108