69
UNIDAD 7 7.1 CONCEPTOS BÁSICOS DE GRAFICAS Resolución Las imágenes gráficas mostradas en un monitor de computadora se componen de pequeños puntos llamados píxeles, los cuales están distribuidos en la pantalla en filas; existe una cantidad específica de filas y cada fila tiene una cantidad específica de píxeles. La cantidad de píxeles usada en la pantalla se conoce como resolución. Cada modo gráfico tiene una resolución particular. Inicializar el monitor en modo gráfico para habilitar el monitor en modo gráfico y utilizar sus píxeles y funciones de gráficos, es necesario incluir el encabezado #include <graphics.h> que contiene las declaraciones y funciones relacionadas con graficación e inicializar el monitor en modo gráfico y utilizar sus píxeles con la función initgraph()Dicha función requiere las siguientes declaraciones: int monitor=DETECT; // Variable para detectar el tipo // de monitor int modo; // Modo de operación del monitor también se puede declarar e inicializar con un tipo de monitor específico como: int monitor=VGA;

Programacion Basica

  • Upload
    jccl16

  • View
    68

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Programacion Basica

UNIDAD 77.1 CONCEPTOS BÁSICOS DE GRAFICAS

Resolución

Las imágenes gráficas mostradas en un monitor de computadora se componen de pequeños puntos llamados píxeles, los cuales están distribuidos en la pantalla en filas; existe una cantidad específica de filas y cada fila tiene una cantidad específica de píxeles. La cantidad de píxeles usada en la pantalla se conoce como resolución. Cada modo gráfico tiene una resolución particular.

Inicializar el monitor en modo gráfico para habilitar el monitor en modo gráfico y utilizar sus píxeles y funciones de gráficos, es necesario incluir el encabezado #include <graphics.h>que contiene las declaraciones y funciones relacionadas con graficación e inicializar el monitor en modo gráfico y utilizar sus píxeles con la función initgraph()Dicha función requiere las siguientes declaraciones:

int monitor=DETECT; // Variable para detectar el tipo // de monitor int modo; // Modo de operación del monitor

también se puede declarar e inicializar con un tipo de monitor específico como:

int monitor=VGA; // Variable para usar el monitor // tipo VGA int modo=VGAHI; // Usar el monitor VGA a su //maxima resolución

Para terminar de usar el monitor en modo gráfico y devolverlo a su modo de texto normal se usa la función closegraph( ).

Uso de coordenadas

Page 2: Programacion Basica

Una vez que se inicializa el monitor en modo gráfico, las coordenadastienen al píxel como unidad de medida. La función getmaxx()calcula la cantidad de píxeles por renglón y la función getmaxy()calcula la cantidad de renglones de la pantalla. Las funciones de gráficos tienen como estándar el orden de manejo de coordenadas como columna, renglón; es decir, primero se anota la columna y después el renglón para posicionarse en dicha coordenada. Cabe destacar que el conteo de columnas y renglones inicia partiendo de la esquina superior izquierda del monitor.

Líneas, figuras geométricas, colores y rellenos

La función line() esta función se utiliza para dibujar una línea entre 2 puntos. Para ello, la función requiere 4 parámetros que representan las coordenadas (en pixeles) de los dos puntos que se desea unir mediante una línea recta. L

line(50,100,300,200);

La función setlinestyle()

Esta función se utiliza para determinar el tipo de línea o trazo que se desea. Se pueden utilizar trazos con línea continua, línea punteada, línea interrumpida, o un patrón de línea definido por el usuario. Esta función requiere 3 argumentos: 1)Tipo de línea: Puede ser SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE o USERBIT_LINE. 2)Patrón: Este argumento regularmente es ignorado (excepto cuando se trata de un tipo de línea definido por el usuario). 3)Ancho de línea: Define la amplitud del trazo.

La función circle() Esta función dibuja un círculo y requiere 3 argumentos: 1)Coordenada de la columna del centro (en pixeles). 2)Coordenada del renglón del centro (en pixeles). 3)Radio del círculo (en pixeles).

circle(300,150,27);

La función rectangle()

Page 3: Programacion Basica

Esta función dibuja un rectángulo indicando las coordenadas de las esquinas superior izquierda e inferior derecha respectivamente.

rectangle(50,100,400,250);

La función setcolor()

Se utiliza esta función para definir el color de los trazos siguientes; es decir, antes de dibujar un trazo de un color específico, éste debe definirse. Esta función sólo tiene un argumento que representa el código del color deseado.

cómo mostrar mensajes en modo gráfico Aunque el monitor se encuentre habilitado en modo gráfico, se puede combinar la colocación de texto y gráficas en la pantalla; sin embargo, en esta sección se hace énfasis en la colocación de mensajes en formato gráfico, definiendo el tipo de letra, dirección y tamaño del mensajedeseado.

La función settextstyle()

Antes de mostrar un mensaje, debe seleccionarse el tipo de letra, dirección y tamaño del mensaje mediante la función setfillstyle()la cual requiere 3 argumentos: 1)El tipo de letra. 2)La dirección del mensaje (horizontal o vertical). 3)Tamaño.

La función outtextxy()

Una vez definido el tipo de letra, dirección y tamaño correspondiente, se usa la función outtextxy() para desplegar un mensaje gráfico en la pantalla. Esta función requiere 3 argumentos: 1)Coordenada de la columna donde se desea mostrar el mensaje. 2)Coordenada del renglón. 3)Mensaje a mostrar.

outtextxy(100,200,”Tec Laredo”);

http://www.itnuevolaredo.edu.mx/takeyas/Articulos/ProgramacionC/Articulo-Conceptos%20basicos%20de%20Graficacion%20en%20C_2004-I.pdf

Page 4: Programacion Basica

7.2 Introducción básica al manejo de graficas

Resumen: En numerosas ocasiones los estudiantes requieren representar gráficamente el comportamiento de modelos matemáticos, estadísticos, de investigación de operaciones, etc. mediante programas computacionales diseñados “a la medida” sin necesidad de apoyarse en paquetes de cómputo comerciales. Por esto, se presentan las siguientes consideraciones básicas de graficación en lenguaje C++, Palabras claves: Graficación, resolución, píxel, lenguaje C++, monitor. 1 INTRODUCCIÓN Tal como un artista selecciona diversos medios para representar sus pinturas, los programadores, escogen un modo y formato especial para habilitar el monitor para graficar. Cada modo proporciona ciertas características como la resolución, número posible de colores, modo texto o modo gráfico y otros elementos donde cada modo requiere de cierto equipo (hardware). 1.1 Resolución Las imágenes gráficas mostradas en un monitor de computadora se componen de pequeños puntos llamados píxeles, los cuales están distribuidos en la pantalla en filas; existe una cantidad específica de filas y cada fila tiene una cantidad específica de píxeles. La cantidad de píxeles usada en la pantalla se conoce como resolución. Cada modo gráfico tiene una resolución particular. 1.2 Inicializar el monitor en modo gráfico Para habilitar el monitor en modo gráfico y utilizar sus píxeles y funciones de gráficos, es necesario incluir el encabezado #include <graphics.h> que contiene las declaraciones y funciones relacionadas con graficación e inicializar el monitor en modo gráfico y utilizar sus píxeles con la función initgraph(). Dicha función requiere las siguientes declaraciones: int monitor=DETECT; // Variable para detectar el tipo // de monitor int modo; // Modo de operación del monitor también se puede declarar e inicializar con un tipo de monitor específico como: int monitor=VGA; // Variable para usar el monitor // tipo VGA int modo=VGAHI;

Page 5: Programacion Basica

// Usar el monitor VGA a su

1.3 Uso de coordenadas Una vez que se inicializa el monitor en modo gráfico, las coordenadas tienen al píxel como unidad de medida. La función getmaxx() calcula la cantidad de píxeles por renglón y la función getmaxy() calcula la cantidad de renglones de la pantalla.

Las funciones de gráficos tienen como estándar el orden de manejo de coordenadas como columna, renglón; es decir, primero se anota la columna y después el renglón para posicionarse en dicha coordenada. Cabe destacar que el conteo de columnas y renglones inicia partiendo de la esquina superior izquierda del monitor.

http://www.itnuevolaredo.edu.mx/takeyas/Articulos/ProgramacionC/Articulo-Conceptos%20basicos%20de%20Graficacion%20en%20C_2004-I.pdf

Page 6: Programacion Basica

7.3 uso de librerías para la realización de gráficos

En muchas ocasiones es inevitable utilizar gráficas para mostrar estadísticas o informes de datos en nuestros proyectos. Una imágen vale mas que mil palabras, de aquí la importancia que reviste el correcto uso de las gráficas, para visualizar de forma amena dichos datos.

A continuación os muestro una recopilación que realicé de varias bibliotecas para la implementación de gráficos y diagramas sobre web, de cada uno se explican sus características más importantes así como algunas ventajas o desventajas a mi consideración:

1. Open Flash Chart

Open Flash Chart

En mi opinión una de las mejores librerías para la realización de gráficos que existen en la actualidad en Internet, dentro de sus características fundamentales se destaca el dinamismo y la animación de sus gráficos, así como su diversidad en la implementación.

Open Flash Chart, esta basado principalmente en PHP para la lectura de los datos y en Flash para mostrar los mismos en forma de grafico. También encontraremos implementaciones en otros lenguajes, pero menos fiables según el autor.

A su favor: Gratis, Licencia GPL, diversidad de gráficos, diseño agradable.En su contra: conocimientos medios o avanzados en PHP para su completa implementación.Requerimientos: Flash player 9

Ejemplos | Descarga

Page 7: Programacion Basica

2. FusionCharts

FusionCharts

FucionCharts es una librería libre y de código abierto para la creación de gráficos y diagramas en flash, dentro de sus mejores características están la interactividad y los excelentes efectos de animación en la muestra de los datos en forma de gráfico, además de que no sólo puede ser usado en webs, sino tambien en aplicaciones de escritorio y presentaciones.

A su favor: excelente diseño con buenos efectos de animación al mostrar los gráficos, se puede usar también en aplicacions de escritorio, puede usarse con PHP, ASP.NET, ColdFusion , Pyton.En su contra: requerimientos medios o avanzados de programaciónRequerimientos: Flash player 9.

Ejemplos | Descarga3. XML/SWF Charts

Page 8: Programacion Basica

XML/SWF Charts

Excelente librería para crear atractivos diagramas y gráficos que tiene al igual que el anterior un excelente diseño de presentación y diversidad de tipos. Esta librería se basa en XML para obtener los datos y en películas SWF para mostrar sus resultados en forma de gráficas.

A su favor: de licencia GPL, diversidad de gráficos, diseño agradable.En su contra: si los datos son tomados de una BD es obligatorio la creación de un fichero XML intermedio entre la BD y la película de flash que muestra el gráfico.Requerimientos: Flash player 9

Ejemplos | Descarga4. Max’s Charts

Page 9: Programacion Basica

Max’s Charts

Sencilla y simple librería para la creación de gráficos de tipo horizontal y vertical en PHP, se caracteriza por su facilidad en la implementación, aunque una de sus principales desventajas es que sólo puede usarse en gráficos verticales y horizontales, es decir, una buena recomendación para principiantes o para la creación de Webs con informes y gráficas sencillas. Los resultados se muestran utilizando CSS con un diseño relativamente agradable.

A su favor: de libre distribución, buen diseño, uso de CSS.En su contra: poca diversidad en tipos de gráficos.Requerimientos: cualquier navegador

Ejemplos   | Descarga5. pChart

pChart

Page 10: Programacion Basica

pChart es una clase orientada al trabajo con framework, para la creación de gráficos y diagramas en PHP, los datos pueden ser tomados desde extructuras SQL, ficheros CVS o introducidos manualmente, esta librería está actualmente bajo desarrollo y pueden surgir nuevas versiones en un futuro. Los datos se muestran creando imágenes utilizando la librería GD de PHP.

A su favor: de libre distribución, puede tomar datos tanto de BD como de ficheros CVSEn su contra: no tiene un diseño tan refinado como las anteriores, y debe tener instalado la librería GD en su servidor de PHP.Requerimientos: cualquier navegador.

Ejemplos | Descarga6. QGoogleVisualizationAPI

QGoogleVisualizationAPI

Útil y excelente clase para generar gráficas con Google Visualization API. La misma provee una clase que puede generar código HTML el cual puede incluir gráficos generados por Google Visualization API en sus webs. También provee diferentes tipos de gráficos como son barras, pastel, lineales, etc.

A su favor: buena presentación de las gráficas, excelente para diagramas de pamas, diversos tipos de diagramas y graficos.En su contra: conocimientos medios y avanzados de programación para la implementación.Requerimientos: cualquier navegador.

http://www.bitacoradewebmaster.com/2010/01/04/6-librerias-para-graficas-y-diagramas-con-php/

Page 11: Programacion Basica

7.4 Graficación de puntos y líneas rectasSería muy difícil considerar todas las opciones posibles de todas las funciones degraficación; sin embargo, en esta antología se tratan los temas fundamentales paraimplementar este tipo de funciones. Básicamente mostraremos que antes de utilizar uncolor, un tipo de línea, de relleno, etc. es necesario definirlo.

2.1 Píxeles, líneas, figuras geométricas, colores y rellenosEn esta sección se presentan las funciones básicas de graficación, utilizadas paracolocar pixeles, líneas, figuras geométricas, etc. en la pantalla.

2.1.1 La función putpixel()Tal como se mencionó en la sección anterior, al habilitar el monitor en modográfico, la pantalla se divide en pequeños puntos llamados pixeles. La funciónputpixel() coloca un punto o píxel de un color específico en determinadacoordenada de la pantalla. Esta función requiere 3 argumentos (Fig. 5):1) Columna del punto (coordenada x).2) Renglón del punto (coordenada y).3) Color del píxel.putpixel(int x, int y, int color);Fig.5.La función putpixel()El código fuente del programa de la Fig. 6 muestra un ejemplo que inicializa elmonitor en modo gráfico y coloca , en forma aleatoria, múltiples pixeles de colores en lapantalla hasta que se oprima cualquier tecla

2.1.2 La función line()Esta función se utiliza para dibujar una línea entre 2 puntos. Para ello, la funciónrequiere 4 parámetros que representan las coordenadas (en pixeles) de los dos puntosque se desea unir mediante una línea recta. La Fig. 7 muestra un ejemplo que une lospuntos 50,100 y 300,200 (columna, renglón respectivamente)./*Programa para inicializar el monitor en modo graficoMiniTaller: Tecnicas avanzadas de programacion en Lenguaje C++Instructor: M.C. Bruno Lopez Takeyas*/#include <graphics.h> // Encabezado con declaraciones degraficos#include <conio.h> // Para el uso de kbhit()#include <stdlib.h> // Para el uso de random()#include <dos.h> // Para el uso de delayvoid main(void){int monitor=VGA, modo=VGAHI; // Declaracion de tipo de monitory modoinitgraph(&monitor,&modo,"\\tc\\bgi");

Page 12: Programacion Basica

// Inicializa el modo grafico indicando el monitor y modoutilizado// El subdirectorio \\tc\\bgi indica la ruta de localizacion delos// archivos *.BGI (monitores) y *.CHR (tipos de letras)while(!kbhit()) // Mientras no se oprima cualquier tecla{putpixel(random(getmaxx()),random(getmaxy()),random(getmaxcolor()));// Coloca un pixel en la pantalla, seleccionando al azar lacolumna// (1..getmaxx), el renglon (1..getmaxy) y el color(1..getmaxcolor)delay(5);}closegraph(); // Termina el modo grafico (vuelve a su modonormal)}

2.1.3 La función setlinestyle()Esta función se utiliza para determinar el tipo de línea o trazo que se desea. Sepueden utilizar trazos con línea continua, línea punteada, línea interrumpida, o unpatrón de línea definido por el usuario. Esta función requiere 3 argumentos:1) Tipo de línea: Puede ser SOLID_LINE, DOTTED_LINE, CENTER_LINE,DASHED_LINE o USERBIT_LINE.2) Patrón: Este argumento regularmente es ignorado (excepto cuando se trata de untipo de línea definido por el usuario).3) Ancho de línea: Define la amplitud del trazo.setlinestyle(DOTTED_LINE,0, NORM_WIDTH);line(50,100,300,200);

2.1.4 La función circle()Esta función dibuja un círculo y requiere 3 argumentos:1) Coordenada de la columna del centro (en pixeles).2) Coordenada del renglón del centro (en pixeles).3) Radio del círculo (en pixeles).La Fig. 9 dibuja un círculo cuyo centro se encuentra en el punto 300,150 y su radio esde 27 pixeles.circle(300,150,27);

Se pueden combinar funciones de graficación para obtener trazos específicos odeterminados colores, sólo es cuestión de definir previamente el color o tipo de trazodeseado para después invocar la función de graficación deseada. Muestra el código necesario para dibujar un círculo con un trazo interrumpido. Eneste caso primeramente se define el tipo de línea (trazo) deseado y posteriormente seinvoca la función circle() con los parámetros adecuados.setlinestyle(DASHED_LINE,0, NORM_WIDTH);

Page 13: Programacion Basica

circle(300,150,27);2.1.5 La función rectangle()Esta función dibuja un rectángulo indicando las coordenadas de las esquinassuperior izquierda e inferior derecha respectivamente. La Fig. 11 muestra un ejemplo deuna función que dibuja un rectángulo desde el punto 50,100 hasta el punto 400,250.rectangle(50,100,400,250);.2.1.6 La función ellipse()Se usa esta función para dibujar un arco elíptico o una elipse completa. Estafunción requiere 6 argumentos:1) Columna del centro de la elipse (coordenada x).2) Renglón del centro de la elipse (coordenada y).3) Ángulo inicial del arco.4) Ángulo donde termina el arco.5) Radio horizontal de la elipse.6) Radio vertical de la elipse.Se puede dibujar una elipse completa indicando el ángulo inicial como 0° (cero) yel ángulo final como 359° . La Fig. 12 dibuja una elipse completa con centro en 100,150,con radio horizontal de 25 y radio vertical de 40 pixeles.ellipse(100,150,0,359,25,40);

2.1.7 La función arc()Se usa esta función para dibujar un arco circular. Esta función requiere 5argumentos:1) Columna del centro del arco (coordenada x).2) Renglón del centro del arco (coordenada y).3) Ángulo inicial del arco.4) Ángulo donde termina el arco.5) Radio.Los puntos de inicio y final del arco se especifican por medio de sus ángulosmedidos en el sentido de las manecillas del reloj; es decir, con 0° en las 3:00, 90° en las12:00 y así sucesivamente. La Fig. 13 dibuja un arco de 30° con centro en 100,150 yradio 40 pixeles.arc(100,150,0,29,40);.2.1.8 La función setcolor()Se utiliza esta función para definir el color de los trazos siguientes; es decir,antes de dibujar un trazo de un color específico, éste debe definirse. Esta función sólotiene un argumento que representa el código del color deseado. P. ejem. BLACK, RED,BLUE, GREEN, YELLOW, etc. o bien su número entero correspondiente. La Fig. 14muestra la tabla de colores y sus respectivos valores.Constante Valor

Page 14: Programacion Basica

BLACK 0BLUE 1GREEN 2CYAN 3RED 4MAGENTA 5BROWN 6LIGHTGRAY 7DARKGRAY 8LIGHTBLUE 9LIGHTGREEN 10LIGHTCYAN 11LIGHTRED 12LIGHTMAGENTA 13YELLOW 14WHITE 15.La Fig. 15 muestra un ejemplo del uso de la función setcolor() donde sedibuja un circulo de color rojo y después un rectangulo de color azul.setcolor(RED);circle(300,150,27);setcolor(BLUE);rectangle(50,100,400,250);.2.1.9 Definiendo el tipo de relleno de una figura con la función setfillstyle()Si se desea rellenar una figura, es necesario definir previamente el patrón y colordel relleno. La Fig. 16 muestra los patrones de relleno disponibles.PATRÓN VALOR DESCRIPCIÓNEMPTY_FILL 0 Color del fondoSOLID_FILL 1 Relleno sólido con el color determinadoLINE_FILL 2 Relleno con línea (---)LTSLASH_FILL 3 Relleno con /// líneas de ancho normalSLASH_FILL 4 Relleno con /// líneasBKSLASH_FILL 5 Relleno con \\\ líneasLTBKSLASH_FILL 6 Relleno con \\\ líneas de ancho normalHATCH_FILL 7 Relleno de líneas cruzadas ligerasXHATCH_FILL 8 Relleno de líneas cruzadas gruesasINTERLEAVE_FILL 9 Relleno de líneasWIDE_DOT_FILL 10 Relleno de puntos espaciadosCLOSE_DOT_FILL 11 Relleno de puntos cercanosUSER_FILL 12 Relleno definido por el usuarioFig. 16. Patrones de relleno de la función setfillstyle()Por ejemplo, si se desea definir el patrón de relleno de puntos cercanos de colorrojo, se usa la función setfillstyle() como lo muestra la Fig. 17.

Page 15: Programacion Basica

setfillstyle(CLOSE_DOT_FILL, RED);

2.1.10 La función floodfill()Una vez seleccionado el patrón de relleno mediante la funciónsetfillstyle(), se procede a rellenar una figura usando la función floodfill().Es muy importante resaltar que la figura que se desea rellenar esté completamentecerrada, ya que esta función contiene un algoritmo que busca el contorno de la figura y,en caso de encontrar una apertura, la función extralimitará la figura y también rellenarála parte externa de la misma. La función floodfill() requiere identificar un puntoque se encuentre dentro del contorno de la figura y necesita 3 argumentos:1) Coordenada de la columna del punto interno de la figura.2) Coordenada del renglón del punto interno de la figura.3) Color del borde de la figura.El ejemplo mostrado en la Fig. 18 dibuja un circulo de color ROJO y lo rellena decolor AZUL sólido.setcolor(RED);circle(300,150,27);setfillstyle(SOLID_FILL,BLUE);floodfill(300,150,RED);

Nótese que la función floodfill() requiere como argumento el color delcontorno de la figura que se desea rellenar.

Page 16: Programacion Basica

http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/ProgramacionC/Apuntes/Antologia%20de%20Graficacion%20en%20Lenguaje%20C/Antologia%20de%20Graficacion%20en%20Lenguaje%20C%20(2004-I).pdf7.5 Graficación de Funciones Matemáticas en el plano cartesiano.

En estas breves notas, desarrolladas por Juan-Antonio Infante y José María Rey, profesores del Departamento de Matemática Aplicada de la Universidad Complutense de Madrid , se pretende dar un primer paso en el aprendizaje del uso de MATLAB.  En lo que sigue, se supone que el usuario teclea lo que aparece en color rojo (de hecho, lo óptimo sería que el aprendiz de MATLAB reprodujera éstos y parecidos ejemplos por sí mismo) y precedido del símbolo >>, que  hace el papel del prompt de la máquina. En color negro aparecerá la respuesta de MATLAB a la instrucción tecleada. Los comentarios aparecerán en color verde.

Antes de comenzar, hagamos algunas consideraciones generales:

MATLAB distingue entre mayúsculas y minúsculas. La comilla ' es la que, en un teclado estándar, se encuentra en la tecla

de la interrogación. Los comentarios deben ir precedidos por % o, lo que es lo mismo,

MATLAB ignora todo lo que vaya precedido por el símbolo %. La ayuda de MATLAB es bastante útil; para acceder a la misma basta

teclear help. Es recomendable usarlo para obtener una información más precisa sobre la sintaxis y diversas posiblidades de uso de los comandos.

A grandes rasgos, los temas aquí introducidos son:

Generalidades . Vectores y matrices . Operaciones con vectores y matrices . Variables lógicas . Polinomios . Derivadas y primitivas . Gráficas de funciones . Programación con MATLAB .

Los cálculos que no se asignan a una variable en concreto se asignan a la variable de respuesta por defecto que es ans (del inglés, answer): 

Page 17: Programacion Basica

>>2+3

ans = 5

Sin embargo, si el cálculo se asigna a una variable, el resultado queda guardado en ella: 

>>x=2+3

x = 5

Para conocer el valor de una variable, basta teclear su nombre: 

>>x

x = 5

 Si se añade un punto y coma (;) al final de la instrucción, la máquina no muestra la respuesta... 

>>y=5*4;

... pero no por ello deja de realizarse el cálculo. 

>>y

y = 20

Las operaciones se evalúan por orden de prioridad: primero las potencias, después las multiplicaciones y divisiones y, finalmente, las sumas y restas. Las operaciones de igual prioridad se evalúan de izquierda a derecha:

>>2/4*3

ans = 1.5000

>>2/(4*3)

ans =

Page 18: Programacion Basica

0.1667

 Se pueden utilizar las funciones matemáticas habituales. Así, por ejemplo, la función coseno,

>>cos(pi) % pi es una variable con valor predeterminado 3.14159...

ans = -1

o la función exponencial 

>>exp(1)    % Función exponencial evaluada en 1, es decir, el número e

ans = 2.7183

 Además de la variable pi , MATLAB tiene otras variables con valor predeterminado; éste se pierde si se les asigna otro valor distinto. Por ejemplo: 

>>eps       % Épsilon de la máquina. Obsérvese que MATLAB trabaja en doble precisión

ans = 2.2204e-016

pero... 

>>eps=7

eps = 7

 Otro ejemplo de función matemática: la raíz cuadrada; como puede verse, trabajar con complejos no da ningún tipo de problema. La unidad imaginaria se representa en MATLAB como  i o j, variables con dicho valor como predeterminado: 

>>sqrt(-4)

ans = 0+ 2.0000i

Page 19: Programacion Basica

 El usuario puede controlar el número de decimales con que aparece en pantalla el valor de las variables, sin olvidar que ello no está relacionado con la precisión con la que se hacen los cálculos, sino con el aspecto con que éstos se muestran: 

>>1/3

ans = 0.3333

>>format long

>>1/3

ans = 0.33333333333333

>>format       % Vuelve al formato estándar que es el de 4 cifras decimales

 

  Para conocer las variables que se han usado hasta el momento: 

>>who

Your variables are: ans eps x y

o, si se quiere más información (obsérvese que todas las variables son arrays): 

>>whos

Name  Size  Bytes      Class  ans   1x1    8     double array  eps   1x1    8     double array    x   1x1    8     double array    y   1x1    8     double array

Grand total is 4 elements using 32 bytes

Para deshacerse de una variable

>>clear y 

Page 20: Programacion Basica

>>who

Your variables are: ans eps x

Volver al índice general

 Para definir un vector fila, basta introducir sus coordenadas entre corchetes: 

>>v=[1 2 3]     % Vector de 3 coordenadas

v= 1 2 3

>>w=[4 5 6];

El operador ' es el de trasposición (en realidad trasposición y conjugación): 

>>w'

ans = 4 5 6

Si queremos declarar un vector de coordenadas equiespaciadas entre dos dadas, por ejemplo, que la primera valga 0, la última  20  y la distancia entre coordenadas sea 2, basta poner:

>>vect1=0:2:20

vect1 = 0 2 4 6 8 10 12 14 16 18 20

Page 21: Programacion Basica

Equivalentemente, si lo que conocemos del vector es que la primera coordenada vale 0, la última 20 y que tiene 11 en total, escribiremos: 

>>vect2=linspace(0,20,11)

vect2 = 0 2 4 6 8 10 12 14 16 18 20

A las coordenadas de un vector se accede sin más que escribir el nombre del vector y, entre paréntesis, su índice: 

>>vect2(3)

ans = 4

y se pueden extraer subvectores, por ejemplo: 

>>vect2(2:5)

ans= 2 4 6 8

o,

>>vect1(:)

ans= 0 2 4 6 8 10 12 14 16 18 20

 Las matrices se escriben como los vectores, pero separando las filas mediante un punto y coma; así una matriz 3x3: 

Page 22: Programacion Basica

>>M=[1 2 3;4 5 6;7 8 9]

M = 1 2 3 4 5 6 7 8 9

>>M'                  % Su traspuesta (su adjunta)

ans = 1 4 7 2 5 8 3 6 9

>>mat=[v;w;0 0 1]     % También es una matriz 3x3

mat = 1 2 3 4 5 6 0 0 1

A los elementos de una matriz se accede sin más que escribir el nombre de la matriz y, entre paréntesis, los respectivos índices: 

>>mat(1,3)    % Elemento en la primera fila y tercera columna de la matriz mat

ans = 3

También se puede acceder a un fila o columna completas,

>>mat(:,2)    % Segunda columna de mat

ans = 2 5 0

>>mat(2,:)    % Su segunda fila

ans = 4 5 6

Page 23: Programacion Basica

acceder a la matriz como si fuera una columna, 

>>M(2:7)      % Los elementos segundo a séptimo de la matriz como columna

ans = 4 7 2 5 8 3

o acceder a cualquiera de sus submatrices 

>>mat(2:3,[1 3])   % Submatriz formada por los elementos que están en                  % "todas" las filas que hay entre la segunda y la tercera y                  % en las columnas primera y tercera

ans = 4 6 0 1

Existen algunas matrices definidas previamente; por ejemplo, la matriz identidad, 

>>eye(5)    % eye se pronuncia en inglés como I

ans = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1

la matriz nula,

>>zeros(3)

ans = 0 0 0 0 0 0 0 0 0

Page 24: Programacion Basica

o la matriz cuyos elementos valen todos 1:

>>ones(4)

ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Se puede conocer el tamaño de una matriz y la longitud de un vector:

>>size(mat) % Dimensiones de la matriz mat (número de filas y de columnas)

ans = 3 3

>>size(v)

ans = 1 3

>>length(v) % Longitud del vector (número de coordenadas)

ans = 3

Existen comandos que permiten crear de forma sencilla matrices. Por ejemplo:

>>diag(v)  % Matriz diagonal cuya diagonal es el vector v

ans = 1 0 0 0 2 0 0 0 3

>>diag(diag(M)) % Matriz diagonal con la diagonal de M. La sentencia diag(M) da                    % el vector formado por la diagonal de la matriz M

ans = 1 0 0 0 5 0

Page 25: Programacion Basica

0 0 9

>>diag(ones(1,4),1)+diag(ones(1,4),-1) % Matriz tridiagonal 5x5 con 0 en la diagonal                                        % principal y 1 en la sub y superdiagonal

ans = 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0

>>tril(M) % Matriz formada por la parte triangular inferior de M.

ans = 1 0 0 4 5 0 7 8 9

>>triu(M) % Matriz formada por la parte triangular superior de M.

ans = 1 2 3 0 5 6 0 0 9

Page 26: Programacion Basica

7.6 Introducción a la potencia gráfica

TIRO PARABÓLICO

El movimiento parabólico completo se puede considerar como la composición de un avance horizontal rectilíneo uniforme y un lanzamiento vertical hacia arriba, que es un movimiento rectilíneo uniformemente acelerado hacia abajo (MRUA) por la acción de la gravedad.

En condiciones ideales de resistencia al avance nulo y campo gravitatorio uniforme, lo anterior implica que:

Ø Un cuerpo que se deja caer libremente y otro que es lanzado horizontalmente desde la misma altura tardan lo mismo en llegar al suelo.

Ø La independencia de la masa en la caída libre y el lanzamiento vertical es igual de válida en los movimientos parabólicos.

Ø Un cuerpo lanzado verticalmente hacia arriba y otro parabólicamente completo que alcance la misma altura tarda lo mismo en caer.

Ø Se denomina movimiento parabólico al realizado por un objeto cuya trayectoria describe una parábola.

MÉTODO DE BISECCIÓN

Este es uno de los métodos más sencillos y de fácil intuición para resolver ecuaciones en una variable. Se basa en el teorema del valor intermedio (TVI), el cual establece que toda función continua f en un intervalo cerrado [a,b] toma todos los valores que se hallan entre f(a) y f(b). Esto es que todo valor entre f(a) y f(b) es la imagen de al menos un valor en el intervalo [a,b]. En caso de que f(a) y f(b) tengan signos opuestos, el valor cero sería un valor intermedio entre f(a) y f(b), por lo que con certeza existe un p en [a,b] que cumple f(p)=0. De esta forma, se asegura la existencia de al menos una solución de la ecuación f(a)=0.

El método consiste en lo siguiente:

Debe existir seguridad sobre la continuidad de la función f(x) en el intervalo [a,b]

A continuación se verifica que

Page 27: Programacion Basica

Se calcula el punto medio m del intervalo [a,b] y se evalúa f(m) si ese valor es igual a cero, ya hemos encontrado la raíz buscada

En caso de que no lo sea, verificamos si f(m) tiene signo opuesto con f(a) o con f(b)

Se redefine el intervalo [a, b] como [a, m] ó [m, b] según se haya determinado en cuál de estos intervalos ocurre un cambio de signo

Con este nuevo intervalo se continúa sucesivamente encerrando la solución en un intervalo cada vez más pequeño, hasta alcanzar la precisión deseada

En la siguiente figura se ilustra el procedimiento descrito.

El método de bisección es menos eficiente que el método de Newton, pero es mucho más seguro para garantizar la convergencia. Si f es una función continua en el intervalo [a, b] y f(a)f(b) < 0, entonces este método converge a la raíz de f.

Programa en C++ del tiro parabólicoInterfaz Grafica

Parámetros para el cálculo de las incógnitas

Parámetros para el cálculo de la altura máxima con el método de bisección.

Page 29: Programacion Basica

CONCUSIONEl aplicar métodos numéricos es muy sencillo cuando se trata de ecuaciones encillas que calculan o solucionan algún problema de la vida cotidiana como lo es el calcular

el alcance máximo o la altura máxima.Para el método de bisección la ecuación que use que muy bien y arroja un buen

resultado ya que el intervalo se da de manera que encierra a la raíz pero se llega a la solución después de un numero grande de iteraciones.

La razón por la que escogimos esta ecuación es porque nos daba un acercamiento similar a otros métodos aunque usaba más iteraciones no las iteraciones que usaba..

Page 30: Programacion Basica

Unidad 88.1 Introducción a la potencia gráfica.

En el modo gráfico existe una enorme cantidad de funciones que realizan desde la tarea mas sencilla como es pintar un píxel, hasta la tarea mas compleja como pudiera ser dibujar un carácter por medio de trazos. Para trabajar el modo gráfico es necesario incluir la librería graphics.h como hacer uso de la BGI (Borlan Graphics Interphase) Para usar cualquier función es necesario colocar el adaptador de video en modo grafico y esto se logra a través de la función initgraph(); y al terminares necesario regresar al modo original a través de la función closegraph(); Para iniciar un programa en ambiente gráfico es recomendable correr una subrutina de inicialización de gráficos y detección de errores. Algunos ejemplos de las funciones que se pueden encontrar en la librería de gráphics.h son:Line(); circle(); arc(); elipse();rectangle(); ottextxy(); putpixel();Para saber mas de las funciones de la librería de gráficos lo pueden buscar en el índice de turbo c NOTA: Para dar de alta en tu computadora el modo de gráficos tienes que hacer los siguientes pasos: OPTIONS ->LINKER->LIBRARIE->seleccionar GRAPHICS LIBRARYEJEMPLO:#include<graphics.h>#include<conio.h>

Page 31: Programacion Basica

#include<math.h>int main(void){ clrscr();  double fx; int graphdriver=DETECT,graphmode; initgraph(&graphdriver,&graphmode,"..\\bgi"); outtextxy(30,30,”GRAFICACION DE SENO “); setbkcolor(RED); for (int x=0;x<=90;x++) {   fx=(1+sin(x))*40+200;  putpixel(x*15,fx,YELLOW);  }  setcolor(BLUE); line(310,100,310,400); line(100,240,500,240);  getch();  closegraph(); return 0;}   ESTRUCTURA DEL PROGRAMA #include <graphics.h>  #include <stdlib.h>#include <stdio.h>#include <conio.h> int main(void){     VARIABLES PARA INICIALIZAR MODO GRAFICO   int gdriver = DETECT, gmode, errorcode;    INICIALIZAR MODO GRAFICO   initgraph(&gdriver, &gmode, "");   DETECTA SI HAY ALGUN ERROR PARA USAR MODO GRAFICO

Page 32: Programacion Basica

   errorcode = graphresult();     if (errorcode != grOk)   {      printf("Graphics error: %s\n", grapherrormsg(errorcode));      printf("Press any key to halt:");      getch();      exit(1);   }    line(0, 0, 50,50 ); DIBUJA UNA LINEA    getch();   closegraph(); CERRAR MODO GRAFICO   return 0;} FUNCIONES PARA DIBUJAR cleardevice(void); LIMPIA LA PANTALLA setcolor(int color); COLOR DE LINEA setbkcolor(int color); COLOR DE FONDO (PANTALLA) 

480 

Page 33: Programacion Basica

   

line(int x1, int y1, int x2, int y2); DIBUJA UNA LINEA rectangle(int left, int top, int right, int bottom); DIBUJA UN RECTANGULOrectangle(izqierda,arriba,derecha,abajo); putpixel(int x, int y, int color); PINTA UN PIXEL outtextxy(int x, int y, char far *textstring); DIBUJA TEXTOouttextxy(100,100,”Programa 1”); settextstyle(int font, int direction, int charsize); TIPO DE LETRA A USARsettextstyle(tipo letra, direccion, tamaño letra); TIPOS DE LETRA (FONT) 0   DEFAULT_FONT       1   TRIPLEX_FONT        2   SMALL_FONT            3   SANS_SERIF_FONT  4   GOTHIC_FONT            

640 

Page 34: Programacion Basica

DIRECTION 0   HORIZ_DIR   1   VERT_DIR     settextjustify(int horiz, int vert); JUSTIFICAR TEXTO HORIZ   0   LEFT_TEXT     IZQUIERDA1   CENTER_TEXT   CENTRADO2   RIGHT_TEXT   DERECHA VERT    0   BOTTOM_TEXT  ABAJO1   CENTER_TEXT   CENTRADO2   TOP_TEXT      ARRIBA RELLENADO DE FIGURAS floodfill(int x, int y, int border); RELLENAR FIGURA setfillstyle(int pattern, int color); TIPO DE RELLENO Y COLOR A USAR TIPOS DE RELLENADO(FILL PATTERNS) 0   EMPTY_FILL       1   SOLID_FILL       2   LINE_FILL        3   LTSLASH_FILL     4   SLASH_FILL       5   BKSLASH_FILL     6   LTBKSLASH_FILL   7   HATCH_FILL       8   XHATCH_FILL      9   INTERLEAVE_FILL  10 WIDE_DOT_FILL   11 CLOSE_DOT_FILL  12 USER_FILL       

Page 35: Programacion Basica

 COLORES 0   BLACK         1   BLUE          2   GREEN          3   CYAN          4   RED           5   MAGENTA       6   BROWN         7   LIGHTGRAY     8   DARKGRAY      9   LIGHTBLUE     10 LIGHTGREEN   11 LIGHTCYAN    12 LIGHTRED     13 LIGHTMAGENTA 14 YELLOW       15 WHITE         128  BLINK        EJEMPLO DE ANIMACION #include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <dos.h> // EJEMPLO DE ANIMACION int main(void){   int gdriver = DETECT, gmode, errorcode;//variables para detectar modo grafico   int x1,x2,y1,y2,x,y; //variables para tama¤o de la figura y para moverla   clrscr();   initgraph(&gdriver, &gmode, ""); //inicializar modo grafico   errorcode = graphresult();   if (errorcode != grOk) //detecta si hay algun error

Page 36: Programacion Basica

   {      printf("Graphics error: %s\n", grapherrormsg(errorcode));      printf("Press any key to halt:");      getch();      exit(1);   }    x1=1;x2=100;y1=1;y2=100;x=3;y=3; //valores para las variables    //dibuja un cuadro relleno   setcolor(2); //color de linea   setfillstyle(1,2); //tipo de rellenado y color   rectangle(x1,y1,x2,y2); //dibujar cuadrado   floodfill(x,y,2); //rellena la figura. Los valores de "x" y "y" deben                             //estar dentro de la figura a rellenar   getch();   //animacion   for(int i=0;i<=640;i++)   {     cleardevice(); //limpia la pantalla     setcolor(2);     setfillstyle(1,2);     rectangle(x1+i,y1,x2+i,y2);//sumamos "i" a los valores de x1 y x2 para mover la figura     floodfill(x+i,y,2);     delay(5); //tiempo que tarda en repetir el ciclo   }    getch();   closegraph();//cerrar modo grafico   return 0;}   Cuando utilizamos gráficos  usamos coordenadas ”x”  y  “y” y se mide en píxeles en c standard   y dependiendo de la computadora ,”x” tiene un máximo de “639”, y tiene un máximo de 479. El modo para inicializar gráficos es : 

Page 37: Programacion Basica

Int gdriver=DETECT,gmode;Initgraph(&gdriver,&gmode,”dirección de la carpeta bgi de tc”); Existen varias funciones estándar con las que podemos trabajar en gráficos: Cleardevice();  //limpia pantallaSetbkcolor( int Color); // pone el color de fondo de la pantallaSetcolor( int color); //elige el color  de los trazos que se agan BLACK          0 BLUE           1 GREEN          2 CYAN           3 RED            4 MAGENTA        5 BROWN          6 LIGHTGRAY      7 DARKGRAY       8 LIGHTBLUE      9 LIGHTGREEN    10 LIGHTCYAN     11 LIGHTRED      12 LIGHTMAGENTA  13 YELLOW        14 WHITE                15 Line(int x1, int y1, int x2, int y2); //hace una lineaCircle(int x, int y, int radio);  //hace un circulo;Ellipce(int x, int y, int angulo inicial, int angulo final); //hace una elipseRectangle(int x izq,int y izq superior, int x der, int y der inferior); //hace un rectánguloPutpixel(int x, int y ,int color); //pone un pixel Settextstyle(int tipo de letra, int orientación, int tamaño); Orientación   o  horizontal, 1  verticalTipo de letra:  0           DEFAULT_FONT

1                    TRIPLEX_FONT2                    SMALL_FONT3                    SAN_SERIF_FONT4                    GOTHIC_FONT

Page 38: Programacion Basica

  Outtextxy(int x, int y,” texto”); Setfillstylke(int tipo de relleno, in t color); //selecciona el color y tipo de relleno Floodfill(int x, int y, int color dentro del que se va a rellenar);//rellena dando las

coordenadas dentro de la figura a rellenar;EMPTY_FILL      ³  0  ³SOLID_FILL      ³  1  ³LINE_FILL       ³  2  ³LTSLASH_FILL    ³  3  ³SLASH_FILL      ³  4  ³BKSLASH_FILL    ³  5  ³LTBKSLASH_FILL  ³  6  ³HATCH_FILL      ³  7  ³XHATCH_FILL     ³  8  ³INTERLEAVE_FILL ³  9  ³WIDE_DOT_FILL   ³ 10  ³CLOSE_DOT_FILL  ³ 11  ³USER_FILL       ³ 12  ³   Y 0X 0Para poder graficar una función debemos tener en cuanta que  el eje y esta invertido a como lo necesitamos:       Primero trazamos los ejes donde vamos a graficar, supongamos que las coordenadas de intersección entre las líneas  es (449,159)  esto significa que este es nuestro origen 0 Usando la función  “ double evaluafuncion(char [], double);”Evaluamos nuestra función  utilizando un ciclo, en donde se incremente el valor double que le enviamos a nuestra función.

Page 39: Programacion Basica

  double result;a=0.0;Ciclo{a=a+.01; por ejemplo.evaluarfuncion(función ,a)result=result*-1; //por que este es el valor del eje y que esta invertidoputpixel((a*escala)+449,(result*escala)+159,int color);}y este es el principio básico para poder graficar una función. Existe diferentes formas para poder hacer una animación. Una de las mas sencillas es hacer un algoritmo de incremento de coordenadas combinado con limpieza de pantalla , dentro de un ciclo.       for(int k=0;k<50;k++)      {      cleardevice();//borra pantalla      setcolor(LIGHTBLUE);//elije el color para las líneas      line(26*k*.1,36*k*.1,76*k*.1,36*k*.1);      line(26*k*.1,36*k*.1,16*k*.1,46*k*.1);      line(76*k*.1,36*k*.1,76*k*.1,46*k*.1);      line(76*k*.1,46*k*.1,56*k*.1,46*k*.1);      line(56*k*.1,46*k*.1,56*k*.1,76*k*.1);      line(56*k*.1,76*k*.1,40*k*.1,76*k*.1);      line(40*k*.1,76*k*.1,40*k*.1,46*k*.1);      line(40*k*.1,46*k*.1,16*k*.1,46*k*.1);      setfillstyle(1,1);//tipo de relleno      floodfill(40*k*.1,40*k*.1,9);//rellenado      settextstyle(2,0,1*k*2*.2);//tipo de texto      outtextxy(65*k*.1,66*k*.1,"Soft.");//texto             delay(100);//retardo del ciclo       }  otra forma es  usar las siguientes herramientas

Page 40: Programacion Basica

 unsigned int imagesize(int xizq,int y superior,x der,y inferior);  //tamaño de imagengetimage(int xizq,int y superior,int xderm, int y inferior,void mapa de bits);putimage(int xizq,int y superior,void mapa de bits,int operador);COPY_PUT    0XOR_PUT     1OR_PUT      2AND_PUT     3NOT_PUT     4 Moveto(intx,int y);  Ejemplo:   maxx = getmaxx();   x = 0;   y = getmaxy() / 2;    /* draw the image to be grabbed */   draw_arrow(x, y);    /* calculate the size of the image */   size = imagesize(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE);    /* allocate memory to hold the image */   arrow = malloc(size);    /* grab the image */   getimage(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE, arrow);    /* repeat until a key is pressed */   while (!kbhit())   {      /* erase old image */      putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);       x += ARROW_SIZE;      if (x >= maxx)

Page 41: Programacion Basica

        x = 0;       /* plot new image */      putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);   }    /* clean up */   free(arrow);   closegraph();   getch();   return 0; } void draw_arrow(int x, int y){   /* draw an arrow on the screen */   moveto(x, y);   linerel(4*ARROW_SIZE, 0);   linerel(-2*ARROW_SIZE, -1*ARROW_SIZE);   linerel(0, 2*ARROW_SIZE);   linerel(2*ARROW_SIZE, -1*ARROW_SIZE);}

Page 42: Programacion Basica

8.2 Configuracion del puerto paralelo de la PC.PRECAUCIONES: Conectar dispositivos al puerto paralelo implica el riesgo de daños permanentes a  la tarjeta madre de la PC, ahí que tener siempre presente que aún los profesionales cometen errores, por lo tanto no está de más recomendar extremo cuidado al trabajar en el puerto paralelo.

Los puertos de comunicación de la PC son de particular interés para el estudioso de la electrónica ya que le permiten utilizar una computadora personal para controlar todo tipo circuitos electrónicos utilizados, principalmente, en actividades de automatización de procesos, adquicisión de datos, tareas repetitivas y otras actividades que demandan precisión. Éste artículo es el primero de una serie que analizará diversos usos para el puerto paralelo de la PC.

Conceptos básicos

Existen dos métodos básicos para transmisión de datos en las computadoras modernas. En un esquema de transmisión de datos en serie un dispositivo envía datos a otro a razón de un bit a la vez a través de un cable. Por otro lado, en un esquema de transmisión de datos en paralelo un dispositivo envía datos a otro a una tasa de n número de bits a través de n número de cables a un tiempo. Sería fácil pensar que un sistema en paralelo es n veces más rápido que un sistema en serie, sin embargo ésto no se cumple, básicamente el impedimiento principal es el tipo de cable que se utiliza para interconectar los equipos. Si bién un sistema de comunicación en paralelo puede utilizar cualquier número de cables para transmitir datos, la mayoría de los sistemas paralelos utilizan ocho líneas de datos para transmitir un byte a la vez, como en todo, existen excepciones, por ejemplo el estándar SCSI permite transferencia de datos en esquemas que van desde los ocho bits y hasta los treinta y dos bits en paralelo. En éste artículo nos concentraremos en transferencias de ocho bits ya que ésta es la configuración del puerto paralelo de una PC.Un típico sistema de comunicación en paralelo puede ser de una dirección (unidireccional) o de dos direcciones (bidireccional). El más simple mecanismo utilizado en un puerto paralelo de una PC es de tipo unidireccional y es el que analizaremos en primer lugar. Distinguimos dos elementos: la parte transmisora y la parte receptora. La parte transmisora coloca la información en las líneas de datos e informa a la parte receptora que la información (los datos) están disponibles; entonces

Page 43: Programacion Basica

la parte receptora lee la información en las líneas de datos e informa a la parte transmisora que ha tomado la información (los datos).

El handshaking

Para implementar el handshaking se requieren dos líneas adicionales. La línea de estroboscopio (en inglés strobe) es la que utiliza la parte transmisora para indicarle a la parte receptora la disponibilidad de información. La línea de admisión (acknowledge) es la que utiliza la parte receptora para indicarle a la parte transmisora que ha tomado la información (los datos) y que está lista para recibir más datos. El puerto paralelo provee de una tercera línea de handshaking llamada en inglés busy (ocupado), ésta la puede utilizar la parte receptora para indicarle a la parte transmisora que está ocupada y por lo tanto la parte transmisora no debe intentar colocar nueva información en las líneas de datos.

Parte transmisora:

La parte transmisora checa la línea busy para ver si la parte receptora está ocupada. Si la línea busy está activa, la parte transmisora espera en un bucle hasta que la línea busyesté inactiva.

La parte transmisora coloca la información en las líneas de datos.La parte transmisora activa la línea de strobe.La parte transmisora espera en un bucle hasta que la línea acknowledge está activa.La parte transmisora inactiva la línea de strobe.La parte transmisora espera en un bucle hasta que la línea acknowledge esté inactiva.La parte transmisora repite los pasos anteriores por cada byte a ser transmitido.

Parte receptora:

La parte receptora inactiva la línea busy (asumiendo que está lista para recibir información).La parte receptora espera en un bucle hasta que la línea strobe esté activa.La parte receptora lee la información de las líneas de datos (y si es necesario, procesa los datos).La parte receptora activa la línea acknowledge.La parte receptora espera en un bucle hasta que esté inactiva la línea de strobe.La parte receptora inactiva la línea acknowledge.La parte receptora repite los pasos anteriores por cada byte que debe recibir.

Se debe ser muy cuidadoso al seguir éstos pasos, tanto la parte transmisora como la receptora coordinan sus acciones de tal manera que la parte transmisora no intentará colocar varios bytes en las líneas de datos, en tanto que la parte receptora no debe leer más datos que los que le envíe la parte transmisora, un byte a la vez.

El hardware del puerto paralelo

El puerto paralelo de una típica PC utiliza un conector hembra de tipo D de 25 patitas (DB-25 S), éste es el caso más común, sin embargo es conveniente mencionar los tres tipos de conectores

Page 44: Programacion Basica

definidos por el estándar IEEE 1284, el primero, llamado 1284 tipo A es un conector hembra de 25 patitas de tipo D, es decir, el que mencionamos al principio. El orden de las patitas del conector es éste:

El segundo conector se llama 1284 tipo B que es un conector de 36 patitas de tipo centronics y lo encontramos en la mayoría de las impresoras; el tercero se denomina 1284 tipo C, se trata de un conector similar al 1284 tipo B pero más pequeño, además se dice que tiene mejores propiedades eléctricas y mecánicas, éste conector es el recomendado para nuevos diseños. La siguiente tabla describe la función de cada patita del conector 1284 tipo A:

Patita E/S Polaridad activa Descripción

1 Salida 0 Strobe

2 ~ 9 Salida -Líneas de datos(bit 0/patita 2, bit 7/patita 9)

10 Entrada 0Línea acknowledge(activa cuando el sistema remoto toma datos)

11 Entrada 0Línea busy

(si está activa, el sistema remoto no acepta datos)

12 Entrada 1Línea Falta de papel(si está activa, falta papel en la impresora)

13 Entrada 1Línea Select(si está activa, la impresora se ha seleccionado)

14 Salida 0Línea Autofeed(si está activa, la impresora inserta una nuevalínea por cada retorno de carro)

15 Entrada 0 Línea Error

Page 45: Programacion Basica

(si está activa, hay un error en la impresora)

16 Salida 0

Línea Init(Si se mantiene activa por al menos 50micro-segundos, ésta señalautoinicializa la impresora)

17 Salida 0Línea Select input(Cuando está inactiva, obliga a laimpresora a salir de línea)

18 ~ 25 - - Tierra eléctrica

Tabla 1: Configuración del puerto paralelo estándar

Puedo observar que el puerto paralelo tiene 12 líneas de salida (8 líneas de datos, strobe, autofeed, init, y select input) y 5 de entrada (acknowledge, busy, falta de papel, select y error). El estándar IEEE 1284 define cinco modos de operación:

1. Modo compatible

2. Modo nibble

3. Modo byte

4. Modo EPP, puerto paralelo ampliado

5. Modo ECP, puerto de capacidad extendida

El objetivo del estándar es diseñar nuevos dispositivos que sean totalmente compatibles con el puerto paralelo estándar (SPP) definido originalmente por la IBM (en éste artículo trataré solamente el modo compatible). Hay tres direcciones de E/S asociadas con un puerto paralelo de la PC, éstas direcciones pertenecen al registro de datos, el registro de estado y el registro de control. El registro de datos es un puerto de lectura-escritura de ocho bits. Leer el registro de datos (en la modalidad unidireccional) retorna el último valor escrito en el registro de datos. Los registros de control y estado proveen la interface a las otras líneas de E/S. La distribución de las diferentes señales para cada uno de los tres registros de un puerto paralelo esta dada en las siguientes tablas:

Dirección Nombre Lectura/Escritura Bit # Propiedades

Base + 0 Puerto de datos Escritura Bit 7 Dato 7

Page 46: Programacion Basica

Bit 6 Dato 6

Bit 5 Dato 5

Bit 4 Dato 4

Bit 3 Dato 3

Bit 2 Dato 2

Bit 1 Dato 1

Bit 0 Dato 0

Tabla 2: Registro de datos

Dirección Nombre Lectura/Escritura Bit # Propiedades

Base + 1 Puerto de estado Sólo Lectura Bit 7 Busy

Bit 6 Acknowledge

Bit 5 Falta de papel

Bit 4 Select In

Bit 3 Error

Bit 2 IRQ (Not)

Bit 1 Reservado

Bit 0 Reservado

Tabla 3: Registro de estado

Dirección Nombre Lectura/Escritura Bit # Propiedades

Base + 2 Puerto de control Lectura/Escritura Bit 7 No usado

Bit 6 No usado

Bit 5Permite puertobidireccional

Bit 4 Permite IRQ através de lalínea

Page 47: Programacion Basica

acknowledge

Bit 3Seleccionaimpresora

Bit 2Inicializaimpresora

Bit 1Nueva líneaautomática

Bit 0 Strobe

Tabla 4: Registro de control

Una PC soporta hasta tres puertos paralelo separados, por tanto puede haber hasta tres juegos de registros en un sistema en un momento dado. Existen tres direcciones basepara el puerto paralelo asociadas con tres posibles puertos paralelo: 0x3BCh, 0x378h y 0x278h, nos referimos a éstas como las direcciones base para el puerto LPT1, LPT2 yLPT3, respectivamente. El registro de datos se localiza siempre en la dirección base de un puerto paralelo, el registro de estado aparece en la dirección base + 1, y el registro de control aparece en la dirección base + 2. Por ejemplo, para un puerto LPT2 localizado en 0x378h, ésta es la dirección del registro de datos, al registro de estado le corresponde la dirección 0x379h y su respectivo registro de control está en la dirección 0x37Ah. Cuando la PC se enciende el BIOS ejecuta una rutina para determinar el número de puertos presentes en el sistema asignando la etiqueta LPT1 al primer puerto localizado, si existen más puertos entonces se asignarán consecutivamente las etiquetas LPT2 y LPT3 de acuerdo a la siguiente tabla:

Dirección inicial Función

0000:0408 Dirección base para LPT1

0000:040A Dirección base para LPT2

0000:040C Dirección base para LPT3

0000:040E Dirección base para LPT4

Tabla 5: Direcciones base en el BIOS

Para trabajar con el puerto paralelo necesitamos en primer lugar conocer la dirección base asignada por el BIOS (estamos hablando de una PC compatible con IBM), podemos utilizar un programa llamado Debug.exe que nos indique la(s) dirección(es) asignada(s): en la plataforma Windows vamos al menú inicio, seleccionamos programas y luegoMS-DOS para abrir una ventana

Page 48: Programacion Basica

de Símbolo de MS-DOS y aquí podemos introducir los comandos indicados más abajo. Si se trabaja en ambiente DOS basta con teclear en la línea de comandos la palabra debug, el programa responde colocando un signo de menos - en donde tecleamos sin dejar espacios en blanco d040:08L8 y presionamos la tecla entrar, entonces el programa debug.exe nos indica en una serie de números la(s) dirección(es) para el (los) puerto(s) paralelo(s) disponibles en nuestro sistema, la siguiente imagen muestra el resultado obtenido en mi máquina:

Por supuesto, también podemos conocer la dirección asignada al puerto paralelo utilizando un programa, donde el código es el siguiente:

/* Determina la direccion del puerto paralelo */

Page 49: Programacion Basica

#include <stdio.h>

#include <dos.h>

int main()

{

unsigned int __far *puntero_a_direccion;

int i;

puntero_a_direccion=(unsigned int __far *)0x00000408;

for (i=0; i<3; i++)

{

if (*puntero_a_direccion == 0)

printf("No se encontro puerto asignado a LPT%d \n", i+1);

else

printf("La direccion asignada a LPT%d es 0x%Xh\n",

i+1, *puntero_a_direccion);

puntero_a_direccion++;

}

return 0;

}

El programa es muy sencillo, necesitamos un puntero que señale a la ubicación de memoria que almacena la información para las diferentes direcciones asignadas al puerto paralelo, lo llamamos puntero_a_direccion, éste puntero debe ser de al menos dos bytes, por ésta razón se declara como de tipo unsigned int __far

Page 50: Programacion Basica

Interfaz para el puerto paralelo

Actualmente, la mayoría de los puertos instalados en las computadoras son de tipo multimodal configurables a través del BIOS de la máquina, en éste artículo me refiero expresamente al modo Normal (SPP), además de éste están las opciones Bidireccional,

Por cada línea de entrada que tomamos directamente del puerto paralelo existe una etapa amplificadora-separadora dentro del circuito integrado 74LS244 que nos permite trabajar con una tasa de entrega de corriente suficiente para desplegar en los diodos emisores de luz la información escrita en las líneas de datos del puerto. Además es posible habilitar ó deshabilitar el despliegue del nibble de orden inferior ó superior del byte escrito en el puerto. Colocando en un nivel lógico alto la patita 1 del CI 74LS244 inhabilitamos el despliegue del nibble de orden bajo, un nivel lógico alto en la patita 19 evita el despliegue del nibble de orden alto. Para comodidad, conecto las patitas 1 y 19 permanentemente a tierra de tal manera que sea posible visualizar la actividad en los diodos emisores de luz (LED). En el diagrama se especifican con números las correspondientes

Page 51: Programacion Basica

patitas del conector DB-25. Obviamente se requiere de una fuente regulada de 5 Voltios para operar éste circuito, además los siguientes materiales:

1. Circuito Integrado TTL 74LS244.

8. Diodos Emisores de Luz.

8. Resistencias de 220 Ohms, 1/2 Watt.

1. Cable y conector para el puerto paralelo.

En primer lugar apague la computadora y el circuito. Conecte el cable al puerto paralelo asegurándose que el conector esté firme en su sitio. Encienda el circuito y por último encienda la computadora, por regla general, el circuito de restablecimiento de la computadora coloca inicialmente en las líneas de datos del puerto paralelo un valor igual a 0x0h, por lo tanto todos los diodos deben estar apagados una vez que la computadora ha terminado su proceso de arranque, sin embargo, si algún diodo permanece encendido ésto no indica una condición de falla, es responsabilidad del software que Usted escriba para controlar el puerto inicializarlo con un valor adecuado antes de realizar cualquier otra operación.

8.3 instrucciones para el manejo de puertos paralelos.Comunicaciones seriales en Lenguaje C. En lenguaje C, existe una instrucción especial para manejar las comunicaciones seriales. Esta instrucción posee la siguiente sintaxis:

int bioscom (int cmd, char abyte, int port);

En realidad, esta instrucción acude a la interrupción 14H para permitir la comunicación serial sobre un puerto. Para este caso, cada uno de los parámetros tiene el siguiente significado:

cmdEspecifica la operación a realizar

abytees un caracter que se enviará por el puerto serial

Page 52: Programacion Basica

portes la identificación del puerto serial (desde 0 para COM1 hasta 3 para COM4)

El parámetro cmd puede tener los siguientes valores y significados:

0 Inicializa el puerto port con los valores dados por abyte 1 Envía el caracter abyte por el puerto port 2 Lee el caracter recibido por el puerto port 3 Retorna el estado del puerto port

Para la inicialización del puerto, el caracter abyte tiene las interpretaciones que se muestran en la siguiente Tabla.

0x02 0x03

7 bits de datos 8 bits de datos

0x00 0x04

1 bits de parada 2 bits de parada

0x00 0x08 0x18

Sin paridad Paridad impar Paridad par

0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0

110 baudios 150 baudios 300 baudios 600 baudios 1200 baudios 2400 baudios 4800 baudios 9600 baudios

Para configurar el puerto con algunos parámetros, bastará con realizar una operación OR con los deseados, por ejemplo, para 1200 baudios, sin bit de paridad, sin bit de parada y 8 bits, bastará con seleccïonar la palabra dada por:

abyte = 0x80 | 0x00 | 0x00 | 0x03

Page 53: Programacion Basica

o lo que es equivalente,

abyte = 0x83

Para la lectura de un caracter que se haya recibido o del estado del puerto, se deben utilizar variables en las cuales se almacenarán los valores de retorno; en ambos caso se obtienen valores de 16 bits. Para la lectura de un dato recibido, los 8 bits menos significativos corresponden al dato y los 8 más significativos al estado del puerto; si alguno de estos últimos está en "1 ", un error ocurrió; si todos están en "0", el dato fue recibido sin error.

Cuando el comando es 2 ó 3 (leer el caracter o el estado del puerto), el argumento abyte no se tiene en cuenta. Para configurar el puerto COM1 con los parámetros del ejemplo dado anteriormente, bastará con la instrucción:

bioscom (0,0x83,0); /*(inicializar, parámetros, COM1)*/

La utilización de los comandos y las instrucciones para la configuración de los puertos aquí expuestos sólo tendrán sentido en la medida en que utilicemos el puerto serial para establecer una comunicación bien con otros computadores o bien con dispositivos electrónicos como microcontroladores.

Comunicación con el puerto paralelo en Lenguaje C. El lenguaje C permite tanto la lectura como la escritura de los puertos paralelo. Para leer el puerto existen las instrucciones inport e inportb, mientras que para escribir están las instrucciones outport y outportb. La sintaxis de estas instrucciones es la siguiente:

unsigned inport (unsigned portid); unsigned char inportb (unsigned portid); void outport (unsigned portid, unsigned value); void outportb (unsigned portid, unsigned char value);

Ejemplo:

Palabra = inport(puerto); outport (puerto,Palabra); Byte = inportb (puerto); outportb (puerto,Byte);

Page 54: Programacion Basica

Las instrucciones que terminan en b ese refieren a la lectura o escritura de un byte, mientras que las que no terminan en esta letra se refieren a una palabra(dos byte). La variable puerto debe contener la dirección de memoria del puerto paralelo, este valor puede ser 378h, 3BCh ó 278h. Por ultimo no hay que olvidar colocar la siguiente directiva del preprocesador que le indica al C que se usarán las funciones inport, outport, inportb u outportb, declaradas en el archivo dos.h.

#include <dos.h>

El siguiente programa consulta la dirección del primer puerto paralelo disponible:

#include <conio.h> #include <dos.h> void main(void) { int puerto;

clrscr(); puerto=peekb(0x40,0x8); printf("Dirección: %Xh",puerto); getch(); }

Como verán la utilización del puerto paralelo es mucho más sencillo que la serial.

Referencias utilizadas: 1.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Interface serial RS-232". Año I Nº10. Pag. 71-76 2.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Kinder de programación en C". Año I Nº9. Pag. 71-76