Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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
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