Las imgenes grficas mostradas en un monitor de computadora se componen de pequeos puntos llamados pxeles, los cuales estn distribuidos en la pantalla en filas; existe una cantidad especfica de filas y cada fila tiene una cantidad especfica de pxeles. La cantidad de pxeles usada en la pantalla se conoce como resolucin. Cada modo grfico tiene una resolucin particular.
Inicializar el monitor en modo grfico para habilitar el monitor en modo grfico y utilizar sus pxeles y funciones de grficos, es necesario incluir el encabezado #include <graphics.h> que contiene las declaraciones y funciones relacionadas con graficacin e inicializar el monitor en modo grfico y utilizar sus pxeles con la funcin initgraph()Dicha funcin requiere las siguientes declaraciones:
int monitor=DETECT; // Variable para detectar el tipo // de monitor int modo; // Modo de operacin del monitor
tambin se puede declarar e inicializar con un tipo de monitor especfico como:
int monitor=VGA; // Variable para usar el monitor // tipo VGA int modo=VGAHI; // Usar el monitor VGA a su //maxima resolucin
Para terminar de usar el monitor en modo grfico y devolverlo a su modo de texto normal se usa la funcin closegraph( ).
Uso de coordenadas
Una vez que se inicializa el monitor en modo grfico, las coordenadastienen al pxel como unidad de medida. La funcin getmaxx()calcula la cantidad de pxeles por rengln y la funcin getmaxy()calcula la cantidad de renglones de la pantalla. Las funciones de grficos tienen como estndar el orden de manejo de coordenadas como columna, rengln; es decir, primero se anota la columna y despus el rengln para posicionarse en dicha coordenada. Cabe destacar que el conteo de columnas y renglones inicia partiendo de la esquina superior izquierda del monitor.
Lneas, figuras geomtricas, colores y rellenos
La funcin line() esta funcin se utiliza para dibujar una lnea entre 2 puntos. Para ello, la funcin requiere 4 parmetros que representan las coordenadas (en pixeles) de los dos puntos que se desea unir mediante una lnea recta. L
line(50,100,300,200);
La funcin setlinestyle()
Esta funcin se utiliza para determinar el tipo de lnea o trazo que se desea. Se pueden utilizar trazos con lnea continua, lnea punteada, lnea interrumpida, o un patrn de lnea definido por el usuario. Esta funcin requiere 3 argumentos: 1)Tipo de lnea: Puede ser SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE o USERBIT_LINE. 2)Patrn: Este argumento regularmente es ignorado (excepto cuando se trata de un tipo de lnea definido por el usuario). 3)Ancho de lnea: Define la amplitud del trazo.
La funcin circle() Esta funcin dibuja un crculo y requiere 3 argumentos: 1)Coordenada de la columna del centro (en pixeles). 2)Coordenada del rengln del centro (en pixeles). 3)Radio del crculo (en pixeles).
circle(300,150,27);
La funcin rectangle()
Esta funcin dibuja un rectngulo indicando las coordenadas de las esquinas superior izquierda e inferior derecha respectivamente.
rectangle(50,100,400,250);
La funcin setcolor()
Se utiliza esta funcin para definir el color de los trazos siguientes; es decir, antes de dibujar un trazo de un color especfico, ste debe definirse. Esta funcin slo tiene un argumento que representa el cdigo del color deseado.
cmo mostrar mensajes en modo grfico Aunque el monitor se encuentre habilitado en modo grfico, se puede combinar la colocacin de texto y grficas en la pantalla; sin embargo, en esta seccin se hace nfasis en la colocacin de mensajes en formato grfico, definiendo el tipo de letra, direccin y tamao del mensajedeseado.
La funcin settextstyle()
Antes de mostrar un mensaje, debe seleccionarse el tipo de letra, direccin y tamao del mensaje mediante la funcin setfillstyle() la cual requiere 3 argumentos: 1)El tipo de letra. 2)La direccin del mensaje (horizontal o vertical). 3)Tamao.
La funcin outtextxy()
Una vez definido el tipo de letra, direccin y tamao correspondiente, se usa la funcin outtextxy() para desplegar un mensaje grfico en la pantalla. Esta funcin requiere 3 argumentos: 1)Coordenada de la columna donde se desea mostrar el mensaje. 2)Coordenada del rengln. 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 7.2 Introduccin bsica al manejo de graficas
Resumen: En numerosas ocasiones los estudiantes requieren representar grficamente el comportamiento de modelos matemticos, estadsticos, de investigacin de operaciones, etc. mediante programas computacionales diseados a la medida sin necesidad de apoyarse en paquetes de cmputo comerciales. Por esto, se presentan las siguientes consideraciones bsicas de graficacin en lenguaje C++, Palabras claves: Graficacin, resolucin, pxel, lenguaje C++, monitor.
1 INTRODUCCIN 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 caractersticas como la resolucin, nmero posible de colores, modo texto o modo grfico y otros elementos donde cada modo requiere de cierto equipo (hardware).
1.1 Resolucin Las imgenes grficas mostradas en un monitor de computadora se componen de pequeos puntos llamados pxeles, los cuales estn distribuidos en la pantalla en filas; existe una cantidad especfica de filas y cada fila tiene una cantidad especfica de pxeles. La cantidad de pxeles usada en la pantalla se conoce como resolucin. Cada modo grfico tiene una resolucin particular.
1.2 Inicializar el monitor en modo grfico Para habilitar el monitor en modo grfico y utilizar sus pxeles y funciones de grficos, es necesario incluir el encabezado #include <graphics.h> que contiene las declaraciones y funciones relacionadas con graficacin e inicializar el monitor en modo grfico y utilizar sus pxeles con la funcin initgraph(). Dicha funcin requiere las siguientes declaraciones:
int monitor=DETECT; // Variable para detectar el tipo // de monitor int modo; // Modo de operacin del monitor
tambin se puede declarar e inicializar con un tipo de monitor especfico como:
int monitor=VGA; // Variable para usar el monitor // tipo VGA int modo=VGAHI; // Usar el monitor VGA a su
1.3 Uso de coordenadas Una vez que se inicializa el monitor en modo grfico, las coordenadas tienen al pxel como unidad de medida. La funcin getmaxx() calcula la cantidad de pxeles por rengln y la funcin getmaxy() calcula la cantidad de renglones de la pantalla.
Las funciones de grficos tienen como estndar el orden de manejo de coordenadas como columna, rengln; es decir, primero se anota la columna y despus el rengln para posicionarse en dicha coordenada. Cabe destacar que el conteo de columnas y renglones inicia partiendo de la esquina superior izquierda del monitor.
7.3 uso de libreras para la realizacin de grficos En muchas ocasiones es inevitable utilizar grficas para mostrar estadsticas o informes de datos en nuestros proyectos. Una imgen vale mas que mil palabras, de aqu la importancia que reviste el correcto uso de las grficas, para visualizar de forma amena dichos datos. A continuacin os muestro una recopilacin que realic de varias bibliotecas para la implementacin de grficos y diagramas sobre web, de cada uno se explican sus caractersticas ms importantes as como algunas ventajas o desventajas a mi consideracin: 1. Open Flash Chart
Open Flash Chart En mi opinin una de las mejores libreras para la realizacin de grficos que existen en la actualidad en Internet, dentro de sus caractersticas fundamentales se destaca el dinamismo y la animacin de sus grficos, as como su diversidad en la implementacin. 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. Tambin encontraremos implementaciones en otros lenguajes, pero menos fiables segn el autor. A su favor: Gratis, Licencia GPL, diversidad de grficos, diseo agradable. En su contra: conocimientos medios o avanzados en PHP para su completa implementacin. Requerimientos: Flash player 9 Ejemplos | Descarga 2. FusionCharts
FusionCharts FucionCharts es una librera libre y de cdigo abierto para la creacin de grficos y diagramas en flash, dentro de sus mejores caractersticas estn la interactividad y los excelentes efectos de animacin en la muestra de los datos en forma de grfico, adems de que no slo puede ser usado en webs, sino tambien en aplicaciones de escritorio y presentaciones. A su favor: excelente diseo con buenos efectos de animacin al mostrar los grficos, se puede usar tambin en aplicacions de escritorio, puede usarse con PHP, ASP.NET, ColdFusion , Pyton. En su contra: requerimientos medios o avanzados de programacin Requerimientos: Flash player 9. Ejemplos | Descarga 3. XML/SWF Charts
XML/SWF Charts Excelente librera para crear atractivos diagramas y grficos que tiene al igual que el anterior un excelente diseo de presentacin y diversidad de tipos. Esta librera se basa en XML para obtener los datos y en pelculas SWF para mostrar sus resultados en forma de grficas. A su favor: de licencia GPL, diversidad de grficos, diseo agradable. En su contra: si los datos son tomados de una BD es obligatorio la creacin de un fichero XML intermedio entre la BD y la pelcula de flash que muestra el grfico. Requerimientos: Flash player 9 Ejemplos | Descarga 4. Maxs Charts
Maxs Charts Sencilla y simple librera para la creacin de grficos de tipo horizontal y vertical en PHP, se caracteriza por su facilidad en la implementacin, aunque una de sus principales desventajas es que slo puede usarse en grficos verticales y horizontales, es decir, una buena recomendacin para principiantes o para la creacin de Webs con informes y grficas sencillas. Los resultados se muestran utilizando CSS con un diseo relativamente agradable. A su favor: de libre distribucin, buen diseo, uso de CSS. En su contra: poca diversidad en tipos de grficos. Requerimientos: cualquier navegador Ejemplos | Descarga 5. pChart
pChart pChart es una clase orientada al trabajo con framework, para la creacin de grficos y diagramas en PHP, los datos pueden ser tomados desde extructuras SQL, ficheros CVS o introducidos manualmente, esta librera est actualmente bajo desarrollo y pueden surgir nuevas versiones en un futuro. Los datos se muestran creando imgenes utilizando la librera GD de PHP. A su favor: de libre distribucin, puede tomar datos tanto de BD como de ficheros CVS En su contra: no tiene un diseo tan refinado como las anteriores, y debe tener instalado la librera GD en su servidor de PHP. Requerimientos: cualquier navegador. Ejemplos | Descarga 6. QGoogleVisualizationAPI
QGoogleVisualizationAPI til y excelente clase para generar grficas con Google Visualization API. La misma provee una clase que puede generar cdigo HTML el cual puede incluir grficos generados por Google Visualization API en sus webs. Tambin provee diferentes tipos de grficos como son barras, pastel, lineales, etc. A su favor: buena presentacin de las grficas, excelente para diagramas de pamas, diversos tipos de diagramas y graficos. En su contra: conocimientos medios y avanzados de programacin para la implementacin. Requerimientos: cualquier navegador. http://www.bitacoradewebmaster.com/2010/01/04/6-librerias-para-graficas-y- diagramas-con-php/
7.4 Graficacin de puntos y lneas rectas Sera muy difcil considerar todas las opciones posibles de todas las funciones de graficacin; sin embargo, en esta antologa se tratan los temas fundamentales para implementar este tipo de funciones. Bsicamente mostraremos que antes de utilizar un color, un tipo de lnea, de relleno, etc. es necesario definirlo.
2.1 Pxeles, lneas, figuras geomtricas, colores y rellenos En esta seccin se presentan las funciones bsicas de graficacin, utilizadas para colocar pixeles, lneas, figuras geomtricas, etc. en la pantalla.
2.1.1 La funcin putpixel() Tal como se mencion en la seccin anterior, al habilitar el monitor en modo grfico, la pantalla se divide en pequeos puntos llamados pixeles. La funcin putpixel() coloca un punto o pxel de un color especfico en determinada coordenada de la pantalla. Esta funcin requiere 3 argumentos (Fig. 5): 1) Columna del punto (coordenada x). 2) Rengln del punto (coordenada y). 3) Color del pxel. putpixel(int x, int y, int color); Fig.5.La funcin putpixel() El cdigo fuente del programa de la Fig. 6 muestra un ejemplo que inicializa el monitor en modo grfico y coloca , en forma aleatoria, mltiples pixeles de colores en la pantalla hasta que se oprima cualquier tecla
2.1.2 La funcin line() Esta funcin se utiliza para dibujar una lnea entre 2 puntos. Para ello, la funcin requiere 4 parmetros que representan las coordenadas (en pixeles) de los dos puntos que se desea unir mediante una lnea recta. La Fig. 7 muestra un ejemplo que une los puntos 50,100 y 300,200 (columna, rengln respectivamente). /* Programa para inicializar el monitor en modo grafico MiniTaller: Tecnicas avanzadas de programacion en Lenguaje C++ Instructor: M.C. Bruno Lopez Takeyas */ #include <graphics.h> // Encabezado con declaraciones de graficos #include <conio.h> // Para el uso de kbhit() #include <stdlib.h> // Para el uso de random() #include <dos.h> // Para el uso de delay void main(void) { int monitor=VGA, modo=VGAHI; // Declaracion de tipo de monitor y modo initgraph(&monitor,&modo,"\\tc\\bgi"); // Inicializa el modo grafico indicando el monitor y modo utilizado // El subdirectorio \\tc\\bgi indica la ruta de localizacion de los // 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 la columna // (1..getmaxx), el renglon (1..getmaxy) y el color (1..getmaxcolor) delay(5); } closegraph(); // Termina el modo grafico (vuelve a su modo normal) }
2.1.3 La funcin setlinestyle() Esta funcin se utiliza para determinar el tipo de lnea o trazo que se desea. Se pueden utilizar trazos con lnea continua, lnea punteada, lnea interrumpida, o un patrn de lnea definido por el usuario. Esta funcin requiere 3 argumentos: 1) Tipo de lnea: Puede ser SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE o USERBIT_LINE. 2) Patrn: Este argumento regularmente es ignorado (excepto cuando se trata de un tipo de lnea definido por el usuario). 3) Ancho de lnea: Define la amplitud del trazo. setlinestyle(DOTTED_LINE,0, NORM_WIDTH); line(50,100,300,200);
2.1.4 La funcin circle() Esta funcin dibuja un crculo y requiere 3 argumentos: 1) Coordenada de la columna del centro (en pixeles). 2) Coordenada del rengln del centro (en pixeles). 3) Radio del crculo (en pixeles). La Fig. 9 dibuja un crculo cuyo centro se encuentra en el punto 300,150 y su radio es de 27 pixeles. circle(300,150,27);
Se pueden combinar funciones de graficacin para obtener trazos especficos o determinados colores, slo es cuestin de definir previamente el color o tipo de trazo deseado para despus invocar la funcin de graficacin deseada. M uestra el cdigo necesario para dibujar un crculo con un trazo interrumpido. En este caso primeramente se define el tipo de lnea (trazo) deseado y posteriormente se invoca la funcin circle() con los parmetros adecuados. setlinestyle(DASHED_LINE,0, NORM_WIDTH); circle(300,150,27); 2.1.5 La funcin rectangle() Esta funcin dibuja un rectngulo indicando las coordenadas de las esquinas superior izquierda e inferior derecha respectivamente. La Fig. 11 muestra un ejemplo de una funcin que dibuja un rectngulo desde el punto 50,100 hasta el punto 400,250. rectangle(50,100,400,250); . 2.1.6 La funcin ellipse() Se usa esta funcin para dibujar un arco elptico o una elipse completa. Esta funcin requiere 6 argumentos: 1) Columna del centro de la elipse (coordenada x). 2) Rengln 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) y el 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 funcin arc() Se usa esta funcin para dibujar un arco circular. Esta funcin requiere 5 argumentos: 1) Columna del centro del arco (coordenada x). 2) Rengln 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 ngulos medidos en el sentido de las manecillas del reloj; es decir, con 0 en las 3:00, 90 en las 12:00 y as sucesivamente. La Fig. 13 dibuja un arco de 30 con centro en 100,150 y radio 40 pixeles. arc(100,150,0,29,40); . 2.1.8 La funcin setcolor() Se utiliza esta funcin para definir el color de los trazos siguientes; es decir, antes de dibujar un trazo de un color especfico, ste debe definirse. Esta funcin slo tiene un argumento que representa el cdigo del color deseado. P. ejem. BLACK, RED, BLUE, GREEN, YELLOW, etc. o bien su nmero entero correspondiente. La Fig. 14 muestra la tabla de colores y sus respectivos valores. Constante Valor
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 . La Fig. 15 muestra un ejemplo del uso de la funcin setcolor() donde se dibuja un circulo de color rojo y despus 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 funcin setfillstyle() Si se desea rellenar una figura, es necesario definir previamente el patrn y color del relleno. La Fig. 16 muestra los patrones de relleno disponibles. PATRN VALOR DESCRIPCIN EMPTY_FILL 0 Color del fondo SOLID_FILL 1 Relleno slido con el color determinado LINE_FILL 2 Relleno con lnea (---) LTSLASH_FILL 3 Relleno con /// lneas de ancho normal SLASH_FILL 4 Relleno con /// lneas BKSLASH_FILL 5 Relleno con \\\ lneas LTBKSLASH_FILL 6 Relleno con \\\ lneas de ancho normal HATCH_FILL 7 Relleno de lneas cruzadas ligeras XHATCH_FILL 8 Relleno de lneas cruzadas gruesas INTERLEAVE_FILL 9 Relleno de lneas WIDE_DOT_FILL 10 Relleno de puntos espaciados CLOSE_DOT_FILL 11 Relleno de puntos cercanos USER_FILL 12 Relleno definido por el usuario Fig. 16. Patrones de relleno de la funcin setfillstyle() Por ejemplo, si se desea definir el patrn de relleno de puntos cercanos de color rojo, se usa la funcin setfillstyle() como lo muestra la Fig. 17. setfillstyle(CLOSE_DOT_FILL, RED);
2.1.10 La funcin floodfill() Una vez seleccionado el patrn de relleno mediante la funcin setfillstyle(), se procede a rellenar una figura usando la funcin floodfill(). Es muy importante resaltar que la figura que se desea rellenar est completamente cerrada, ya que esta funcin contiene un algoritmo que busca el contorno de la figura y, en caso de encontrar una apertura, la funcin extralimitar la figura y tambin rellenar la parte externa de la misma. La funcin floodfill() requiere identificar un punto que 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 rengln 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 de color AZUL slido. setcolor(RED); circle(300,150,27); setfillstyle(SOLID_FILL,BLUE); floodfill(300,150,RED);
Ntese que la funcin floodfill() requiere como argumento el color del contorno de la figura que se desea rellenar.
http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/ProgramacionC/Apuntes/Antologia %20de%20Graficacion%20en%20Lenguaje%20C/Antologia%20de%20Graficacion%2 0en%20Lenguaje%20C%20(2004-I).pdf 7.5 Graficacin de Funciones Matemticas en el plano cartesiano. En estas breves notas, desarrolladas por Juan-Antonio Infante y Jos Mara Rey, profesores del Departamento de Matemtica 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 sera que el aprendiz de MATLAB reprodujera stos y parecidos ejemplos por s mismo) y precedido del smbolo >>, que hace el papel del prompt de la mquina. En color negro aparecer la respuesta de MATLAB a la instruccin tecleada. Los comentarios aparecern en color verde. Antes de comenzar, hagamos algunas consideraciones generales: MATLAB distingue entre maysculas y minsculas. La comilla ' es la que, en un teclado estndar, se encuentra en la tecla de la interrogacin. Los comentarios deben ir precedidos por % o, lo que es lo mismo, MATLAB ignora todo lo que vaya precedido por el smbolo %. La ayuda de MATLAB es bastante til; para acceder a la misma basta teclear help. Es recomendable usarlo para obtener una informacin ms 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 lgicas. Polinomios. Derivadas y primitivas. Grficas de funciones. Programacin con MATLAB. Los clculos que no se asignan a una variable en concreto se asignan a la variable de respuesta por defecto que es ans (del ingls, answer): >>2+3 ans = 5 Sin embargo, si el clculo 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 aade un punto y coma (;) al final de la instruccin, la mquina no muestra la respuesta... >>y=5*4; ... pero no por ello deja de realizarse el clculo. >>y y = 20 Las operaciones se evalan por orden de prioridad: primero las potencias, despus las multiplicaciones y divisiones y, finalmente, las sumas y restas. Las operaciones de igual prioridad se evalan de izquierda a derecha: >>2/4*3 ans = 1.5000 >>2/(4*3) ans = 0.1667 Se pueden utilizar las funciones matemticas habituales. As, por ejemplo, la funcin coseno, >>cos(pi) % pi es una variable con valor predeterminado 3.14159... ans = -1 o la funcin exponencial >>exp(1) % Funcin exponencial evaluada en 1, es decir, el nmero e ans = 2.7183 Adems 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 mquina. Obsrvese que MATLAB trabaja en doble precisin ans = 2.2204e-016 pero... >>eps=7 eps = 7 Otro ejemplo de funcin matemtica: la raz cuadrada; como puede verse, trabajar con complejos no da ningn 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 El usuario puede controlar el nmero de decimales con que aparece en pantalla el valor de las variables, sin olvidar que ello no est relacionado con la precisin con la que se hacen los clculos, 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 estndar 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 ms informacin (obsrvese 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 >>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 trasposicin (en realidad trasposicin y conjugacin): >>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 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 ms que escribir el nombre del vector y, entre parntesis, 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: >>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] % Tambin es una matriz 3x3 mat = 1 2 3 4 5 6 0 0 1 A los elementos de una matriz se accede sin ms que escribir el nombre de la matriz y, entre parntesis, los respectivos ndices: >>mat(1,3) % Elemento en la primera fila y tercera columna de la matriz mat ans = 3 Tambin 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 acceder a la matriz como si fuera una columna, >>M(2:7) % Los elementos segundo a sptimo 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 estn 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 ingls 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 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 tamao de una matriz y la longitud de un vector: >>size(mat) % Dimensiones de la matriz mat (nmero de filas y de columnas) ans = 3 3 >>size(v) ans = 1 3 >>length(v) % Longitud del vector (nmero 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 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
7.6 Introduccin a la potencia grfica TIRO PARABLICO El movimiento parablico completo se puede considerar como la composicin de un avance horizontal rectilneo uniforme y un lanzamiento vertical hacia arriba, que es un movimiento rectilneo uniformemente acelerado hacia abajo (MRUA) por la accin 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 cada libre y el lanzamiento vertical es igual de vlida en los movimientos parablicos. Un cuerpo lanzado verticalmente hacia arriba y otro parablicamente completo que alcance la misma altura tarda lo mismo en caer. Se denomina movimiento parablico al realizado por un objeto cuya trayectoria describe una parbola.
MTODO DE BISECCIN Este es uno de los mtodos ms sencillos y de fcil intuicin para resolver ecuaciones en una variable. Se basa en el teorema del valor intermedio (TVI), el cual establece que toda funcin 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 sera 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 solucin de la ecuacin f(a)=0. El mtodo consiste en lo siguiente: Debe existir seguridad sobre la continuidad de la funcin f(x) en el intervalo [a,b] A continuacin se verifica que Se calcula el punto medio m del intervalo [a,b] y se evala f(m) si ese valor es igual a cero, ya hemos encontrado la raz 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] segn se haya determinado en cul de estos intervalos ocurre un cambio de signo Con este nuevo intervalo se contina sucesivamente encerrando la solucin en un intervalo cada vez ms pequeo, hasta alcanzar la precisin deseada En la siguiente figura se ilustra el procedimiento descrito. El mtodo de biseccin es menos eficiente que el mtodo de Newton, pero es mucho ms seguro para garantizar la convergencia. Si f es una funcin continua en el intervalo [a, b] y f(a)f(b) < 0, entonces este mtodo converge a la raz de f. Programa en C++ del tiro parablico Interfaz Grafica
Parmetros para el clculo de las incgnitas
Parmetros para el clculo de la altura mxima con el mtodo de biseccin.
Simulacin
Tabla de valores en cada iteracin y grafica
CONCUSION El aplicar mtodos numricos es muy sencillo cuando se trata de ecuaciones encillas que calculan o solucionan algn problema de la vida cotidiana como lo es el calcular el alcance mximo o la altura mxima. Para el mtodo de biseccin la ecuacin que use que muy bien y arroja un buen resultado ya que el intervalo se da de manera que encierra a la raz pero se llega a la solucin despus de un numero grande de iteraciones. La razn por la que escogimos esta ecuacin es porque nos daba un acercamiento similar a otros mtodos aunque usaba ms iteraciones no las iteraciones que usaba..
Unidad 8 8.1 Introduccin a la potencia grfica.
En el modo grfico existe una enorme cantidad de funciones que realizan desde la tarea mas sencilla como es pintar un pxel, hasta la tarea mas compleja como pudiera ser dibujar un carcter por medio de trazos.
Para trabajar el modo grfico es necesario incluir la librera graphics.h como hacer uso de la BGI (Borlan Graphics Interphase)
Para usar cualquier funcin es necesario colocar el adaptador de video en modo grafico y esto se logra a travs de la funcin initgraph(); y al terminares necesario regresar al modo original a travs de la funcin closegraph();
Para iniciar un programa en ambiente grfico es recomendable correr una subrutina de inicializacin de grficos y deteccin de errores.
Algunos ejemplos de las funciones que se pueden encontrar en la librera de grphics.h son: Line(); circle(); arc(); elipse();rectangle(); ottextxy(); putpixel(); Para saber mas de las funciones de la librera de grficos lo pueden buscar en el ndice de turbo c
NOTA: Para dar de alta en tu computadora el modo de grficos tienes que hacer los siguientes pasos: OPTIONS ->LINKER->LIBRARIE->seleccionar GRAPHICS LIBRARY EJEMPLO: #include<graphics.h> #include<conio.h> #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; }
int main(void) { int gdriver = DETECT, gmode, errorcode;//variables para detectar modo grafico int x1,x2,y1,y2,x,y; //variables para tamao de la figura y para moverla clrscr(); initgraph(&gdriver, &gmode, ""); //inicializar modo grafico errorcode = graphresult(); if (errorcode != grOk) //detecta si hay algun error { 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 grficos usamos coordenadas x y y y se mide en pxeles en c standard y dependiendo de la computadora ,x tiene un mximo de 639, y tiene un mximo de 479.
El modo para inicializar grficos es :
Int gdriver=DETECT,gmode; Initgraph(&gdriver,&gmode,direccin de la carpeta bgi de tc);
Existen varias funciones estndar con las que podemos trabajar en grficos:
Cleardevice(); //limpia pantalla Setbkcolor( int Color); // pone el color de fondo de la pantalla Setcolor( 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 linea Circle(int x, int y, int radio); //hace un circulo; Ellipce(int x, int y, int angulo inicial, int angulo final); //hace una elipse Rectangle(int x izq,int y izq superior, int x der, int y der inferior); //hace un rectngulo Putpixel(int x, int y ,int color); //pone un pixel
Settextstyle(int tipo de letra, int orientacin, int tamao);
Orientacin o horizontal, 1 vertical Tipo de letra: 0 DEFAULT_FONT 1 TRIPLEX_FONT 2 SMALL_FONT 3 SAN_SERIF_FONT 4 GOTHIC_FONT
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 0 X 0 Para poder graficar una funcin 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 interseccin entre las lneas es (449,159) esto significa que este es nuestro origen 0
Usando la funcin double evaluafuncion(char [], double); Evaluamos nuestra funcin utilizando un ciclo, en donde se incremente el valor double que le enviamos a nuestra funcin.
double result; a=0.0; Ciclo { a=a+.01; por ejemplo. evaluarfuncion(funcin ,a) result=result*-1; //por que este es el valor del eje y que esta invertido putpixel((a*escala)+449,(result*escala)+159,int color); } y este es el principio bsico para poder graficar una funcin.
Existe diferentes formas para poder hacer una animacin.
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 lneas 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
unsigned int imagesize(int xizq,int y superior,x der,y inferior); //tamao de imagen getimage(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 0 XOR_PUT 1 OR_PUT 2 AND_PUT 3 NOT_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) 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); }
8.2 Configuracion del puerto paralelo de la PC. PRECAUCIONES: Conectar dispositivos al puerto paralelo implica el riesgo de daos permanentes a la tarjeta madre de la PC, ah que tener siempre presente que an los profesionales cometen errores, por lo tanto no est de ms recomendar extremo cuidado al trabajar en el puerto paralelo. Los puertos de comunicacin de la PC son de particular inters para el estudioso de la electrnica ya que le permiten utilizar una computadora personal para controlar todo tipo circuitos electrnicos utilizados, principalmente, en actividades de automatizacin de procesos, adquicisin de datos, tareas repetitivas y otras actividades que demandan precisin. ste artculo es el primero de una serie que analizar diversos usos para el puerto paralelo de la PC. Conceptos bsicos Existen dos mtodos bsicos para transmisin de datos en las computadoras modernas. En un esquema de transmisin de datos en serie un dispositivo enva datos a otro a razn de un bit a la vez a travs de un cable. Por otro lado, en un esquema de transmisin de datos en paralelo un dispositivo enva datos a otro a una tasa de n nmero de bits a travs de n nmero de cables a un tiempo. Sera fcil pensar que un sistema en paralelo es n veces ms rpido que un sistema en serie, sin embargo sto no se cumple, bsicamente el impedimiento principal es el tipo de cable que se utiliza para interconectar los equipos. Si bin un sistema de comunicacin en paralelo puede utilizar cualquier nmero de cables para transmitir datos, la mayora de los sistemas paralelos utilizan ocho lneas de datos para transmitir un byte a la vez, como en todo, existen excepciones, por ejemplo el estndar SCSI permite transferencia de datos en esquemas que van desde los ocho bits y hasta los treinta y dos bits en paralelo. En ste artculo nos concentraremos en transferencias de ocho bits ya que sta es la configuracin del puerto paralelo de una PC. Un tpico sistema de comunicacin en paralelo puede ser de una direccin (unidireccional) o de dos direcciones (bidireccional). El ms 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 informacin en las lneas de datos e informa a la parte receptora que la informacin (los datos) estn disponibles; entonces la parte receptora lee la informacin en las lneas de datos e informa a la parte transmisora que ha tomado la informacin (los datos). El handshaking Para implementar el handshaking se requieren dos lneas adicionales. La lnea de estroboscopio (en ingls strobe) es la que utiliza la parte transmisora para indicarle a la parte receptora la disponibilidad de informacin. La lnea de admisin (acknowledge) es la que utiliza la parte receptora para indicarle a la parte transmisora que ha tomado la informacin (los datos) y que est lista para recibir ms datos. El puerto paralelo provee de una tercera lnea de handshaking llamada en ingls 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 informacin en las lneas de datos. Parte transmisora: La parte transmisora checa la lnea busy para ver si la parte receptora est ocupada. Si la lnea busy est activa, la parte transmisora espera en un bucle hasta que la lnea busyest inactiva. La parte transmisora coloca la informacin en las lneas de datos. La parte transmisora activa la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est activa. La parte transmisora inactiva la lnea de strobe. La parte transmisora espera en un bucle hasta que la lnea acknowledge est inactiva. La parte transmisora repite los pasos anteriores por cada byte a ser transmitido. Parte receptora: La parte receptora inactiva la lnea busy (asumiendo que est lista para recibir informacin). La parte receptora espera en un bucle hasta que la lnea strobe est activa. La parte receptora lee la informacin de las lneas de datos (y si es necesario, procesa los datos). La parte receptora activa la lnea acknowledge. La parte receptora espera en un bucle hasta que est inactiva la lnea de strobe. La parte receptora inactiva la lnea 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 lneas de datos, en tanto que la parte receptora no debe leer ms datos que los que le enve la parte transmisora, un byte a la vez. El hardware del puerto paralelo El puerto paralelo de una tpica PC utiliza un conector hembra de tipo D de 25 patitas (DB-25 S), ste es el caso ms comn, sin embargo es conveniente mencionar los tres tipos de conectores definidos por el estndar 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 mayora de las impresoras; el tercero se denomina 1284 tipo C, se trata de un conector similar al 1284 tipo B pero ms pequeo, adems se dice que tiene mejores propiedades elctricas y mecnicas, ste conector es el recomendado para nuevos diseos. La siguiente tabla describe la funcin de cada patita del conector 1284 tipo A: Patita E/S Polaridad activa Descripcin 1 Salida 0 Strobe 2 ~ 9 Salida - Lneas de datos (bit 0/patita 2, bit 7/patita 9) 10 Entrada 0 Lnea acknowledge (activa cuando el sistema remoto toma datos) 11 Entrada 0 Lnea busy (si est activa, el sistema remoto no acepta datos) 12 Entrada 1 Lnea Falta de papel (si est activa, falta papel en la impresora) 13 Entrada 1 Lnea Select (si est activa, la impresora se ha seleccionado) 14 Salida 0 Lnea Autofeed (si est activa, la impresora inserta una nueva lnea por cada retorno de carro) 15 Entrada 0 Lnea Error (si est activa, hay un error en la impresora) 16 Salida 0 Lnea Init (Si se mantiene activa por al menos 50 micro-segundos, sta seal autoinicializa la impresora) 17 Salida 0 Lnea Select input (Cuando est inactiva, obliga a la impresora a salir de lnea) 18 ~ 25 - - Tierra elctrica
Tabla 1: Configuracin del puerto paralelo estndar Puedo observar que el puerto paralelo tiene 12 lneas de salida (8 lneas de datos, strobe, autofeed, init, y select input) y 5 de entrada (acknowledge, busy, falta de papel, select y error). El estndar IEEE 1284 define cinco modos de operacin:
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 estndar es disear nuevos dispositivos que sean totalmente compatibles con el puerto paralelo estndar (SPP) definido originalmente por la IBM (en ste artculo 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 lneas de E/S. La distribucin de las diferentes seales para cada uno de los tres registros de un puerto paralelo esta dada en las siguientes tablas: Direccin Nombre Lectura/Escritura Bit # Propiedades Base + 0 Puerto de datos Escritura Bit 7 Dato 7 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 Direccin Nombre Lectura/Escritura Bit # Propiedades Base + 1 Puerto de estado Slo 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 Direccin Nombre Lectura/Escritura Bit # Propiedades Base + 2 Puerto de control Lectura/Escritura Bit 7 No usado Bit 6 No usado Bit 5 Permite puerto bidireccional Bit 4 Permite IRQ a travs de la lnea acknowledge Bit 3 Selecciona impresora Bit 2 Inicializa impresora Bit 1 Nueva lnea automtica 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 direccin base de un puerto paralelo, el registro de estado aparece en la direccin base + 1, y el registro de control aparece en la direccin base + 2. Por ejemplo, para un puerto LPT2 localizado en 0x378h, sta es la direccin del registro de datos, al registro de estado le corresponde la direccin 0x379h y su respectivo registro de control est en la direccin 0x37Ah. Cuando la PC se enciende el BIOS ejecuta una rutina para determinar el nmero de puertos presentes en el sistema asignando la etiqueta LPT1 al primer puerto localizado, si existen ms puertos entonces se asignarn consecutivamente las etiquetas LPT2 y LPT3 de acuerdo a la siguiente tabla: Direccin inicial Funcin 0000:0408 Direccin base para LPT1 0000:040A Direccin base para LPT2 0000:040C Direccin base para LPT3 0000:040E Direccin base para LPT4 Tabla 5: Direcciones base en el BIOS Para trabajar con el puerto paralelo necesitamos en primer lugar conocer la direccin 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) direccin(es) asignada(s): en la plataforma Windows vamos al men inicio, seleccionamos programas y luegoMS-DOS para abrir una ventana de Smbolo de MS-DOS y aqu podemos introducir los comandos indicados ms abajo. Si se trabaja en ambiente DOS basta con teclear en la lnea 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 nmeros la(s) direccin(es) para el (los) puerto(s) paralelo(s) disponibles en nuestro sistema, la siguiente imagen muestra el resultado obtenido en mi mquina:
Por supuesto, tambin podemos conocer la direccin asignada al puerto paralelo utilizando un programa, donde el cdigo es el siguiente:
/* Determina la direccion del puerto paralelo */
#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 seale a la ubicacin de memoria que almacena la informacin para las diferentes direcciones asignadas al puerto paralelo, lo llamamos puntero_a_direccion, ste puntero debe ser de al menos dos bytes, por sta razn se declara como de tipo unsigned int __far
Interfaz para el puerto paralelo Actualmente, la mayora de los puertos instalados en las computadoras son de tipo multimodal configurables a travs del BIOS de la mquina, en ste artculo me refiero expresamente al modo Normal (SPP), adems de ste estn las opciones Bidireccional, Por cada lnea 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 informacin escrita en las lneas de datos del puerto. Adems es posible habilitar deshabilitar el despliegue del nibble de orden inferior superior del byte escrito en el puerto. Colocando en un nivel lgico alto la patita 1 del CI 74LS244 inhabilitamos el despliegue del nibble de orden bajo, un nivel lgico 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 nmeros las correspondientes patitas del conector DB-25. Obviamente se requiere de una fuente regulada de 5 Voltios para operar ste circuito, adems 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 asegurndose 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 lneas 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 algn diodo permanece encendido sto no indica una condicin de falla, es responsabilidad del software que Usted escriba para controlar el puerto inicializarlo con un valor adecuado antes de realizar cualquier otra operacin. 8.3 instrucciones para el manejo de puertos paralelos. Comunicaciones seriales en Lenguaje C. En lenguaje C, existe una instruccin especial para manejar las comunicaciones seriales. Esta instruccin posee la siguiente sintaxis:
int bioscom (int cmd, char abyte, int port);
En realidad, esta instruccin acude a la interrupcin 14H para permitir la comunicacin serial sobre un puerto. Para este caso, cada uno de los parmetros tiene el siguiente significado:
cmd Especifica la operacin a realizar abyte es un caracter que se enviar por el puerto serial port es la identificacin del puerto serial (desde 0 para COM1 hasta 3 para COM4)
El parmetro cmd puede tener los siguientes valores y significados: 0 Inicializa el puerto port con los valores dados por abyte 1 Enva 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 inicializacin 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 parmetros, bastar con realizar una operacin OR con los deseados, por ejemplo, para 1200 baudios, sin bit de paridad, sin bit de parada y 8 bits, bastar con selecconar la palabra dada por:
abyte = 0x80 | 0x00 | 0x00 | 0x03
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 almacenarn 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 ms significativos al estado del puerto; si alguno de estos ltimos est en "1 ", un error ocurri; si todos estn 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 parmetros del ejemplo dado anteriormente, bastar con la instruccin:
La utilizacin de los comandos y las instrucciones para la configuracin de los puertos aqu expuestos slo tendrn sentido en la medida en que utilicemos el puerto serial para establecer una comunicacin bien con otros computadores o bien con dispositivos electrnicos como microcontroladores. Comunicacin 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 estn 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); 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 direccin 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 usarn las funciones inport, outport, inportb u outportb, declaradas en el archivo dos.h. #include <dos.h> El siguiente programa consulta la direccin del primer puerto paralelo disponible:
#include <conio.h> #include <dos.h> void main(void) { int puerto; clrscr(); puerto=peekb(0x40,0x8); printf("Direccin: %Xh",puerto); getch(); } Como vern la utilizacin del puerto paralelo es mucho ms sencillo que la serial. Referencias utilizadas: 1.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Interface serial RS-232". Ao I N10. Pag. 71-76 2.- Naranjo C. , Jhon Jairo. Electronica & Computadores."Kinder de programacin en C". Ao I N9. Pag. 71-76