<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux, Java y programación &#187; C++</title>
	<atom:link href="http://casidiablo.net/category/programacion/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Configurar Gmail como cliente de correo predeterminado</title>
		<link>http://casidiablo.net/gmail-cliente-mail-por-defecto/</link>
		<comments>http://casidiablo.net/gmail-cliente-mail-por-defecto/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 04:01:20 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[gmail]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=1683</guid>
		<description><![CDATA[Se trata de un tip bastante sencillo que permite que cuando hagamos clic en enlaces tipo mailto:juanito@putico.com se abra una pestaña en el Firefox con los campos necesarios para enviar un correo vía GMail. Lo primero es descargar este script, guardarlo en tu home y darle permisos de ejecución: wget http://casidiablo.net/wordpress/descargar/gmail unzip gmail.zip mv gmail.sh [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fgmail-cliente-mail-por-defecto%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Configurar%20Gmail%20como%20cliente%20de%20correo%20predeterminado%22%20%7D);"></div>
<p>Se trata de un tip bastante sencillo que permite que cuando hagamos clic en enlaces tipo <em>mailto:juanito@putico.com</em> se abra una pestaña en el Firefox con los campos necesarios para enviar un correo vía GMail.</p>
<p>Lo primero es descargar <a class="tooltip" title="Descargar ZIP con el script" href="http://casidiablo.net/descargar/gmail">este script</a>, guardarlo en tu <em>home</em> y darle permisos de ejecución:</p>
<div class="consola">wget http://casidiablo.net/wordpress/descargar/gmail<br />
unzip gmail.zip<br />
mv gmail.sh $HOME<br />
chmod a+x $HOME/gmail.sh</div>
<p>Ahora debemos ejecutar <strong>Aplicaciones Preferidas</strong>:</p>
<p style="text-align: center;"><img class="tooltip" title="Bonito, bonito..." src="http://casidiablo.net/wordpress/wp-content/uploads/2008/09/appreferidas.png" alt="" /></p>
<p>Estando allí, vas a la sección <strong>Lector de correo</strong> y seleccionas <strong>Personalizar</strong>; luego, en la caja de texto <strong>Campo</strong> colocas: &#8220;<em>/home/usuario/gmail.sh %s</em>&#8221; (sin comillas ) reemplazando &#8220;usuario&#8221; por el nombre de tu usuario:</p>
<p style="text-align: center;"><img class="tooltip" title="Aplicaciones preferidas" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/09/apppreferidas.png" alt="Aplicaciones preferidas" /></p>
<p>El contenido del script, por si te interesa es el siguiente:</p>
<p><code>#!/bin/sh<br />
firefox -remote "openurl(https://mail.google.com/mail?view=cm&amp;tf=0&amp;to=`echo $1 | sed 's/mailto://'`,new-tab)"</code></p>
<p>Lo que hace es abrir una nueva pestaña del Firefox en la URL que utiliza Gmail para enviar correos, y usando el comando <code>sed</code> acomoda la variable <em>to</em> de la petición GET de acuerdo a la dirección de correo del destinatario.</p>
<div class="nota"><strong>Nota</strong>: si deseas que el script esté oculto basta con renombrarlo con un punto al principio, es decir: <em>.gmail.sh</em>. Por supuesto deberás cambiar también la ruta en <strong>Aplicaciones Preferidas</strong>.</div>
<p><a class="tooltip download" title="Descargar ZIP con el script" href="http://casidiablo.net/descargar/gmail">este script</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/gmail-cliente-mail-por-defecto/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Programación C++ sobre Linux</title>
		<link>http://casidiablo.net/programacion-c-sobre-linux/</link>
		<comments>http://casidiablo.net/programacion-c-sobre-linux/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 19:51:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=360</guid>
		<description><![CDATA[Nota: este es un artículo que escribí hace mucho tiempo, y que decidí rescatar y actualizar un poco. Si se dan cuenta habla sobre RCS y CVS en vez de SVN y GIT, pero bueno, a alguien le servirá. Pueden descargar la versión PDF con todos los artículos incluidos. Este artículo pretende orientar un poco [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fprogramacion-c-sobre-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Programaci%C3%B3n%20C%2B%2B%20sobre%20Linux%22%20%7D);"></div>
<p class="avisolegal"><em><strong>Nota</strong></em>: este es un artículo que escribí hace mucho tiempo, y que decidí rescatar y actualizar un poco. Si se dan cuenta habla sobre RCS y CVS en vez de SVN y GIT, pero bueno, a alguien le servirá. Pueden descargar la versión PDF con todos los artículos incluidos.</p>
<p style="text-align: justify">Este artículo pretende orientar un poco acerca de lo que es la programación en C++ sobre linux. Esto NO es un tutorial de referencia de C++, si lo que buscas es eso puedes buscar en el google que hay bastantes. Posiblemente ya hayas programado en C++ sobre Windows, y has utilizado algún compilador como el C++ Builder de Borland, el Visual Studio de Microsoft o en el mejor de los casos DevC++.</p>
<p style="text-align: justify">Ok, esto es un buen comienzo. Pero lo que aquí vamos a ver es: qué nos proporciona Linux para programar en C++. Como sabes en Linux las cosas ya no son tan fáciles, pero tampoco difÃ­ciles; de hecho C++ es famoso gracias a Linux, son como uña y mugre. La cuestión es que nos centraremos en la programación desde la consola. Si lo tuyo no es la consola puedes echarle un vistazo a la sección que trata sobre <a title="Visitar página web de Anjuta" href="http://www.anjuta.org/">Anjuta</a>, que es un IDE para C++ en Linux, pero te recomiendo que leas todo el artículo, te aseguro que te servirá.</p>
<p style="text-align: justify">Vamos a tratar los siguientes temas (y talvez algunos más):</p>
<ul>
<li><a title="Ver capítulo" href="http://casidiablo.net/editores-de-texto-en-linux/">Editores</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/compiladores-de-cc-en-linux/">Compiladores</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/bibliotecas-compartidas-de-c-en-linux/">Bibliotecas y enlace</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/construccion-o-creacion-uso-del-comando-make/">Creación de archivos ejecutables con make</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/depuracion-programas-linux/">Depuración con gdb</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/control-de-versiones-con-rcs-y-cvs/">Control de versiones con RCS y CVS</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/crear-documentacion-comando-man/">Creación de documentación para el comando man</a></li>
<li><a title="Ver capítulo" href="http://casidiablo.net/anjuta-ide-c-linux/">Anjuta, un IDE para Linux</a></li>
</ul>
<p style="text-align: justify">Esta es realmente la base de la programación en C++: cruda, sin vestimentos, tal como es.</p>
<p><a class="download tooltip" title="Descargar el tutorial!!!" href="http://casidiablo.net/descargar/Programaci%C3%B3n+C+Sobre+Linux">Descargar el tutorial completo en PDF</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/programacion-c-sobre-linux/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>[libro] Programación en Linux</title>
		<link>http://casidiablo.net/programacion-linux/</link>
		<comments>http://casidiablo.net/programacion-linux/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 17:16:35 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/03/04/programacion-linux/</guid>
		<description><![CDATA[Este es un libro bastante bueno acerca de la Programación en Linux, teniendo en cuenta que Linux es el kernel (que no el sistema) de la mayoría de sistemas operativos GNU. En el libro se expone el API y se explica el funcionamiento del kernel Linux. Acerca al desarrollador al mundo de la programación bajo [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fprogramacion-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Blibro%5D%20Programaci%C3%B3n%20en%20Linux%22%20%7D);"></div>
<p>Este es un libro bastante bueno acerca de la Programación en Linux, teniendo en cuenta que <a href="http://en.wikipedia.org/wiki/Linux_kernel">Linux es el <strong>kernel</strong></a> (que no el sistema) de la mayoría de sistemas operativos <a href="http://en.wikipedia.org/wiki/GNU_Project">GNU</a>.</p>
<p>En el libro se expone el API y se explica el funcionamiento del kernel Linux. Acerca al desarrollador al mundo de la programación bajo Linux, explica detalladamente cómo funcionan los procesos internamente, habla acerca de las <a href="http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html">señales</a>, sistema de archivos, manejo de entradas y salidas, gestión de memoria, terminales POSIX, comunicación mediante pipes (tuberías), administración, etc.</p>
<p>La verdad está bastante completo, y es de lectura impresindible para desarrolladores y para los curiosos que desean aprender como funciona internamente su sistema.</p>
<p><a href="http://casidiablo.es/ProgramacionLinux2_1.rar">Descargar version en PDF</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/programacion-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Curso de programación en C para GNU/Linux</title>
		<link>http://casidiablo.net/curso-de-programacion-en-c-para-gnulinux/</link>
		<comments>http://casidiablo.net/curso-de-programacion-en-c-para-gnulinux/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 14:48:38 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2008/01/21/curso-de-programacion-en-c-para-gnulinux/</guid>
		<description><![CDATA[Ya hace un tiempo que escribí un manual de programación de C++ sobre Linux; esta vez Pablo Garaizar ha hecho un tutorial de referencia aún más completo acerca de este tema tan importante e interesante. En él se explican varios aspectos que circundan la programación en C sobre Linux, como el uso del gcc, make, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fcurso-de-programacion-en-c-para-gnulinux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Curso%20de%20programaci%C3%B3n%20en%20C%20para%20GNU%2FLinux%22%20%7D);"></div>
<p><img src="http://www.casidiablo.net/wordpress/wp-content/uploads/2008/01/24-rx.png" align="left" />Ya hace un tiempo que escribí un manual de <a href="http://www.casidiablo.net/wordpress/index.php/2007/03/03/programacion-c-sobre-linux/">programación de C++ sobre Linux</a>; esta vez Pablo Garaizar ha hecho un tutorial de referencia aún más completo acerca de este tema tan importante e interesante. En él se explican varios aspectos que circundan la programación en C sobre Linux, como el <a href="http://www.casidiablo.net/wordpress/index.php/2007/03/02/compiladores-de-cc-en-linux/">uso del gcc</a>, <a href="http://www.casidiablo.net/wordpress/index.php/2007/03/02/construccion-o-creacion-uso-del-comando-make/">make</a>, <a href="http://www.casidiablo.net/wordpress/index.php/2007/03/02/bibliotecas-compartidas-de-c-en-linux/">librerías</a>, <a href="http://www.casidiablo.net/wordpress/index.php/2007/03/02/depuracion-de-programas-en-linux/">debugging</a>, etc.</p>
<p>Para descargar el archivo en PDF o en ODT, <a href="http://blog.txipinet.com/2006/11/11/50-curso-de-programacion-en-c-para-gnu-linux-final/">ve directamente a la página del autor</a>.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/curso-de-programacion-en-c-para-gnulinux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programación de Microcontroladores PIC16X84 [Diagramas de montaje + Programas]</title>
		<link>http://casidiablo.net/programacion-de-microcontroladores-pic16x84-diagramas-de-montaje-programas/</link>
		<comments>http://casidiablo.net/programacion-de-microcontroladores-pic16x84-diagramas-de-montaje-programas/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 04:00:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=298</guid>
		<description><![CDATA[Diagramas y SeudoEsquemas para implementar los Microcontroladores PIC16X84 en circuitos reales o protoboards + Programas en ASM y C ¡¡¡Put0 título tan largo que me he inventado xD!!! Nada, decir que obviamente los programas no los he inventado yo, sino que son la recopilación de los &#8220;ejemplos práticos&#8221; más usados. Los he sacado de unos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fprogramacion-de-microcontroladores-pic16x84-diagramas-de-montaje-programas%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Programaci%C3%B3n%20de%20Microcontroladores%20PIC16X84%20%5BDiagramas%20de%20montaje%20%2B%20Programas%5D%22%20%7D);"></div>
<p align="center"><span style="font-size: 11px"><span style="text-decoration: underline"><strong>Diagramas y SeudoEsquemas para implementar los Microcontroladores PIC16X84 en circuitos reales o protoboards + Programas en ASM y C</strong></span></span></p>
<p>¡¡¡Put0 título tan largo que me he inventado xD!!! Nada, decir que obviamente los programas no los he inventado yo, sino que son la recopilación de los &#8220;ejemplos práticos&#8221; más usados. Los he sacado de unos cuantos libros cuyo nombre no me sé (en realidad son unas fotocopias que encontré por casualidad). Y aclarar que los dibujos los hice yo en Visio, y que talvez tengan uno que otro fallo, la verdad es que me costó un huevo hacer esos put0s dibujos; en fín, si encontrais algún fallo me lo comunicas por privado. Sino conoceis como es este rollo de los Microcontroladores PIC, podeis hecharle un vistazo a este post: <a href="http://foro.elhacker.net/index.php/topic,117200.0.html" target="_blank"><span style="text-decoration: underline"><strong><span style="color: Navy">Introducción a microcontroladores PIC [simulando nuestro programas en ASM y C]</span></strong></span></a> (no te demoras sino 20 o 30 minutillos leyéndolo).</p>
<hr /><span style="text-decoration: underline"><strong>Primer Ejemplo</strong></span>: Explorando interruptores y encendiendo luces.</p>
<p align="center"><strong>SeudoEsquema de Montaje</strong><br />
<img src="http://img338.imageshack.us/img338/3092/27wq.png" border="0" /></p>
<p><strong>Descripción</strong>: Lee el número binario introducido mediante 3 interruptores conectados a la puerta A, luego suma 2 unidades a ese valor y visualiza el resultado mediante 4 diodos led conectados a la puerta B.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
LIST    P=16C84         ;Comando que indica el PIC usado<br />
RADIX   HEX             ;Los valores se representar n en hexadecimal<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
PUERTAA EQU     0X05    ;La etiqueta &#8220;PUERTAA&#8221; queda identificada con<br />
;la dirección 0&#215;05, que si corresponde con el<br />
;banco 0 es el valor de PUERTAA y si es del<br />
;banco 1 con el de TRISA.<br />
PUERTAB EQU     0X06    ;Equivalencia de la etiqueta PUERTAB<br />
ESTADO  EQU     0X03    ;Estado corresponde con el valor 0&#215;03.<br />
W       EQU     0       ;Identifica W con el valor 0.<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
ORG     0               ;Comando que indica al Ensamblador la<br />
;dirección de la memeoria donde se<br />
;situar  la instrución siguiente<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
bsf     ESTADO,5        ;Pone a 1 el bit 5 de ESTADO para direccionar<br />
;la p gina 1 de la memoria de datos.<br />
movlw   0xff            ;W &lt;&#8211; FF(Hex)     movwf   PUERTAA         ;W &#8211;&gt; TRISA<br />
movlw   0&#215;00            ;W &lt;&#8211; 0     movwf   PUERTAB         ;W &#8211;&gt; TRISB (Las líneas de PB salidas)<br />
bcf     ESTADO,5        ;Pone a 0 el bit 5 de ESTADO pasando a<br />
;acceder al banco 0.  inicio movf PUERTAA,W   ;W &lt;&#8211; PUERTAA. Se introduce el valor binario                             ;de los interruptores.     addlw   2               ;W &lt;&#8211; W + 2     movwf   PUERTAB         ;W &#8211;&gt; PUERTAB. El valor de W sale por las<br />
;líneas de PB a los led.<br />
goto    inicio          ;Salta a la instrucción precedida por la<br />
;etiqueta de inicio.<br />
END</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#INCLUDE &lt;16c84.h&gt;<br />
void main(void)<br />
{<br />
int valor;              /* Valor temporal */<br />
int * p_puertaa= 0&#215;05;  /* Puntero a PuertaA */<br />
int * p_puertab= 0&#215;06;  /* Puntero a PuertaB */  SET_TRIS_A (0xff);      /* 0xff &#8211;&gt; TRISA */<br />
SET_TRIS_B (0&#215;00);      /* 0&#215;00 &#8211;&gt; TRISB */<br />
do<br />
{<br />
valor = * p_puertaa;/* PuertaA &#8211;&gt; valor  */<br />
valor += 2;         /* se incrementa valor en 2 */<br />
*p_puertab = valor;<span style="white-space: pre"> </span>/* valor &#8211;&gt; puertaB */<br />
}while(true);          /* Bucle infinito */<br />
}</p>
<hr /><span style="text-decoration: underline"><strong>Segundo Ejemplo</strong></span>: Más interruptores y diodos led.</p>
<p align="center"><strong>Esquema de Montaje</strong><br />
<img src="http://img515.imageshack.us/img515/3502/30or.png" border="0" /></p>
<p><strong>Descripción</strong>: Muestra por cinco diodos led en la puerta B la entrada que proporcionan cinco interruptores en la puerta A.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">    LIST    p=16c84    ; Se usa el PIC16C84<br />
RADIX   hex        ; Se emplea el sistema de numeración hexadecimal; ZONA DE ETIQUETAS&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
W    EQU    0      ; Cuando el destino es W, d = 0<br />
F    EQU    1      ; Cuando el destino es el registro f, d = 1<br />
PUERTAA EQU 0&#215;05   ; La Puerta A (datos) ocupa la dirección 5 del<br />
; banco 0 y el registro de configuración la<br />
; dirección 5 del banco 1<br />
PUERTAB EQU<span style="white-space: pre"> </span>0&#215;06   ; La misma etiqueta para el registro de datos y el<br />
; de configuración de la Puerta B<br />
ESTADO  EQU 0&#215;03   ; El registro Estado ocupa dirección 3 de los dos bancos</p>
<p>; COMIENZO DEL PROGRAMA &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>ORG    0           ; El programa comienza en la dirección 0 (Vector Reset)<br />
goto   inicio      ; Se salta a la etiqueta “inicio”<br />
ORG<span style="white-space: pre"> </span>5              ; Se asigna la dirección 5 a la siguiente instrucción</p>
<p>inicio bsf ESTADO,5 ; Pone a 1 el bit 5 de Estado. Acceso al banco 1.<br />
clrf    PUERTAB     ; Se configuran como salidas las líneas de la Puerta B<br />
movlw   0xff        ; El registro W se carga con unos<br />
movwf   PUERTAA     ; Se configuran como entradas las líneas de la Puerta A<br />
bcf     ESTADO,5    ; Pone a 0 el bit 5 de Estado. Acceso al banco 0.<br />
bucle movf PUERTAA,W; Carga el registro de datos de Puerta A en W<br />
comf    PUERTAA,W   ; Complementa a 1 la entrada y la deposita en W<br />
movwf   PUERTAB     ; El contenido de W se deposita en el registro de datos de<br />
; la Puerta B<br />
goto    bucle       ; Se crea un bucle cerrado e infinito</p>
<p>END                 ; Fin del programa</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#include &lt;16c84.h&gt;<br />
#byte   puertaa = 05<span style="white-space: pre"> </span>  /* Posición de la puerta A */<br />
#byte   puertab = 06      /* Posición de la puerta B */<br />
void main( void )<br />
{<br />
int temp;<br />
set_tris_a( 0xFF );     /* Puerta A configurada para entrada */<br />
set_tris_b( 0&#215;00 );     /* Puerta B configurada para salida  */<br />
do<br />
{<br />
/* La variable temporal es necesaria porque    */<br />
temp = ~puertaa;    /* la complementación se traduce en dos pasos: */<br />
puertab = temp;     /* a) Copia de puertaa en temp                 */<br />
}<br />
/* b) Complementación de temp                  */<br />
/* De no hacerlo así los LED parpadearían      */<br />
while( TRUE );/* Repetir ininterrumpidamente       */<br />
}</p>
<hr /><span style="text-decoration: underline"><strong>Tercer Ejemplo</strong></span>: Contando y visualizando.</p>
<p align="center"><strong>Esquema de Montaje</strong><br />
<img src="http://img329.imageshack.us/img329/2189/49pf.png" border="0" /></p>
<p><strong>Descripción</strong>: Hace un conteo desde 0 hasta 0x5f y muestra en las patitas RB.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
LIST    P=16C84<br />
RADIX   HEX<br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-  W       EQU     0&#215;00    ; Comienzo del campo de etiquetas.<br />
F       EQU     0&#215;01<br />
PUERTAB EQU     0&#215;06<br />
ESTADO  EQU     0&#215;03<br />
CONTA   EQU     0x0C</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>ORG     0               ; El programa comienza en la dirección 0 y<br />
goto    inicio          ; salta a la dirección 5 para sobrepasar<br />
ORG     5               ; el vector de interrupción.</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>inicio  bsf     ESTADO,5    ; Seleciona el banco 1<br />
movlw   0&#215;00            ; Se configura PuertaB como salida<br />
movwf   PUERTAB<br />
bcf     ESTADO,5        ; Selección del banco 0</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>clrf    CONTA           ; CONTA = 0<br />
bucle1  incf  CONTA,F   ; CONTA + 1 &#8211;&gt; CONTA<br />
movf    CONTA,W         ; CONTA se carga en W<br />
movwf   PUERTAB         ; W se carga en el registro de datos PB<br />
movlw   0x5f            ; W &lt;&#8211; 0x5f         subwf   CONTA,W         ; CONTA &#8211; W &#8211;&gt; W<br />
btfss   ESTADO,2        ; Explora Z y si vale 1 se produce &#8220;brinco&#8221;<br />
goto    bucle1          ; Si Z = 0 se vuelve a bucle1</p>
<p>bucle2  goto    bucle2  ; si Z = 1 se produce un bucle infinito<br />
end</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#include &lt;16c84.h&gt;<span style="white-space: pre"> </span><span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Tipo de PIC a usar */<br />
#byte<span style="white-space: pre"> </span>puertab=0&#215;06<br />
#byte<span style="white-space: pre"> </span>conta=0x0C<br />
void main(void)<br />
{<br />
set_tris_b(0&#215;00);    /* Configura la PB como salida */<br />
for (conta=0;conta&lt;=0x5f;++conta)    /* Bucle que incrementa CONTA de 0 */         puertab=conta;                   /* a 0x5f */ }</p>
<hr /><span style="text-decoration: underline"><strong>Cuarto Ejemplo</strong></span>: Controlando el tiempo.</p>
<p align="center"><strong>SeudoEsquema de Montaje</strong><br />
<img src="http://img515.imageshack.us/img515/2184/52xl.png" border="0" /></p>
<p><strong>Descripción</strong>: Programa que ilustra cómo realizar una temporización sin emplear interrupciones.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">    LIST     P=16C84<br />
RADIX    HEX<br />
; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;  PUERTAA  EQU  0&#215;06<br />
OPTION   EQU  0&#215;01<br />
ESTADO   EQU  0&#215;03<br />
TMR      EQU  0&#215;01</p>
<p>; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>ORG   0    ; Inicio del programa en<br />
; dirección 0</p>
<p>; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>bsf    ESTADO,5     ; Banco 1<br />
movlw  b 1101 0110  ; Valor a cargar en<br />
; OPTION<br />
movwf  OPTION<br />
movlw  0&#215;00<br />
movwf  PUERTAB      ; La Puerta B salida<br />
bcf    ESTADO,5     ; Banco 0<br />
clrf   PUERTAB      ; Las líneas de salida<br />
; de PB a 0</p>
<p>parpa bsf PUERTAB,7 ; Enciende el led RB7 = 1<br />
call  retardo       ; Llamada a subrutina de<br />
; RETARDO<br />
bcf   PUERTAB,7     ; Apaga el led, RB7 = 0<br />
call  retardo<br />
goto  parpa</p>
<p>retardo<span style="white-space: pre"> </span>clrf TMR0   ; TMR0 = 0 y empieza su<br />
; incremento</p>
<p>explora<span style="white-space: pre"> </span>btfss TMR0,4; TMR0&lt;4&gt; = 1?<br />
goto   explora      ; No ha llegado TMR0 a 16d<br />
return              ; Ha llegado TMR0 al<br />
; valor 16d  y retorna<br />
; al programa principal</p>
<p>END</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#include &lt;16c84.h&gt;<br />
#use<span style="white-space: pre"> </span> delay( clock = 1000000 )  /* Especifica reloj de 1 MHz */<br />
#byte<span style="white-space: pre"> </span> puertab = 06              /* Dirección de la puerta B  */<br />
void main( void )<br />
{<br />
set_tris_b( 0&#215;00 );<br />
puertab = 0;<br />
do<br />
{<br />
delay_us( 8700 );    /* Crea un bucle de espera de 8700 microsegundos */<br />
bit_set(puertab,7);  /* Enciende el LED */<br />
delay_us(8700);      /* Espera */<br />
bit_clear(puertab,7);/* Apaga el LED */<br />
}while(true);            /* Repetir siempre */<br />
}</p>
<hr /><span style="text-decoration: underline"><strong>Quinto Ejemplo</strong></span>: Manejando Interrupciones.</p>
<p align="center"><strong>SeudoEsquema de Montaje</strong><br />
<img src="http://img295.imageshack.us/img295/2892/69mt.png" border="0" /></p>
<p><strong>Descripción</strong>: Refleja el estado de dos interruptores situados en RA0 y RA1 en RB0 y RB1 mientras hace parpadear un diodo en la línea RB7.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-  LIST    P=16C84<br />
RADIX   HEX</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>W    EQU    0<br />
F    EQU    1<br />
TMR_OPT EQU 0&#215;01   ; TMRO en banco 0 OPTION en banco 1<br />
ESTADO EQU  0&#215;03<br />
PUERTAA EQU 0&#215;05   ; PA en banco 0 TRISA en banco1<br />
PUERTAB EQU 0&#215;06   ; PB en banco 0 TRISB en banco1<br />
INTCON EQU  0x0B   ;<br />
CONTA  EQU  0&#215;10   ; Contador auxiliar</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>ORG    0        ; Vector de Reset<br />
goto   inicio</p>
<p>ORG    4        ; Vector de Interrupción<br />
goto   inter    ; Salta a comienzo de rutina de interrupción<br />
ORG    5</p>
<p>inicio bsf  ESTADO,5        ; Selección del banco 1<br />
clrf   PUERTAB              ; Configura PUERTA B como salida</p>
<p>movlw   b&#8217;00000011&#8242;         ; Configura RA0, RA1 como entradas<br />
movwf   PUERTAA</p>
<p>movlw   b&#8217;00000111&#8242;<br />
movwf   TMR_OPT</p>
<p>bcf     ESTADO,5            ; Banco 0</p>
<p>movlw   b&#8217;10100000&#8242;         ; Se permite interrupción del<br />
movwf   INTCON              ; TMR0 y la globla (GIE)</p>
<p>movlw   0&#215;10<br />
movwf   CONTA               ; Se carga CONTA con 16 decimal</p>
<p>movlw   0x0c<br />
movwf   TMR_OPT             ; Se carga TMR0 con 12 decimal</p>
<p>bucle   btfsc   PUERTAA,0   ; Explora RA0 y brinco si vale 0<br />
goto    ra0_1           ; salta a RA0_1<br />
bcf     PUERTAB,0       ; Si RA0 = 0 sa saca por RB0 un 0<br />
goto    ra1x            ; A explorar RA1</p>
<p>ra0_1 bsf   PUERTAB,0   ; Si RA0 = 1 se saca por RB0 un 1</p>
<p>ra1x  btfsc PUERTAA,1   ; Examina ra1  y brinco si es 0<br />
goto    ra1_1           ; Salta  si RA1 = 1<br />
bcf     PUERTAB,1       ; Si RA1 = 0, RB1 = 0</p>
<p>goto    bucle2<br />
ra1_1   bsf  PUERTAB,1  ; Si RA1 = 1 , RB1 = 1<br />
bucle2  goto    bucle       ; Bucle indefinido, se sale por la interupción</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>inter   decfsz  CONTA,1     ; RSI. Decrementa CONTA y brinco si vale 0<br />
goto    seguir</p>
<p>conta_0 movlw   0&#215;10        ; Si CONTA = 0 se carga<br />
movwf   CONTA</p>
<p>btfsc   PUERTAB,7       ; Si RB7 = 0, brinco<br />
goto    rb7_1<br />
bsf     PUERTAB,7       ; Si RB7 = 0, se invierte<br />
goto    seguir</p>
<p>rb7_1   bcf     PUERTAB,7   ; Si RB7 = 1 , se invierte</p>
<p>seguir  movlw   b&#8217;10100000&#8242; ; Se restaura INTCON por desactivar las<br />
movwf   INTCON          ; interrupciones el procesador<br />
movlw   0x0c<br />
movwf   TMR_OPT         ; Se recarga TMR0 con 12<br />
retfie</p>
<p>end</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#include &lt;16c84.h&gt;<span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Selección del PIC a usar */<br />
#use delay(clock= 4000000)<span style="white-space: pre"> </span>/* Reloj de 4 MHz */<br />
#BYTE<span style="white-space: pre"> </span>puertab = 6<br />
#define maximo 16<span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Constante: maximo = 16 */<br />
byte conta;<br />
/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/<br />
/* SERVICIO DE LA INTERRUPCIóN */<br />
#INT_RTCC<span style="white-space: pre"> </span><span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Interrupción por desvordamiento del timer*/<br />
clock_isr()<br />
{<br />
short valor;<br />
short novalor;<br />
valor = bit_test(puertab,7);<span style="white-space: pre"> </span>/* El bit valor es igual al contenido */<br />
/* de RB7 */  novalor = !valor;<br />
if (&#8211;conta==0)<br />
{<br />
output_bit (PIN_B7,novalor); /* Voltea RB7 */<br />
delay_us (5);<br />
conta = maximo;<br />
}<br />
}</p>
<p>/* PROGRAMA PRINCIPAL */<br />
main()<br />
{<br />
short ra0,ra1;</p>
<p>set_tris_b(0&#215;00);<span style="white-space: pre"> </span>/* Se inicializa PB */<br />
conta=maximo;<br />
set_rtcc(0);<span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Se inicializa el timer a cero */</p>
<p>setup_counters(rtcc_internal,rtcc_div_256);</p>
<p>enable_interrupts(rtcc_zero);<span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Se permite int del tmr0 */</p>
<p>enable_interrupts(GLOBAL);<span style="white-space: pre"> </span><span style="white-space: pre"> </span>/* Se activa GIE */</p>
<p>/* Rutina de control de los leds e interruptores: */<br />
do<br />
{<br />
ra0 =  input(PIN_A0);<br />
ra1 =  input(PIN_A1);</p>
<p>output_bit (PIN_B0,ra0);<br />
output_bit (PIN_B1,ra1);<br />
}<br />
while(true);<span style="white-space: pre"> </span>/* Bucle infinito */<br />
}</p>
<hr /><span style="text-decoration: underline"><strong>Séptimo Ejemplo</strong></span>: Proyecto para manejar un display de 7 segmentos.</p>
<p align="center"><strong>SeudoEsquema de Montaje</strong><br />
<img src="http://img521.imageshack.us/img521/5918/77ty.png" border="0" /></p>
<p><strong>Descripción</strong>: Programa que visualiza un número del 1 al 7 en un display de siete segmentos en la puerta B dependiendo del valor binario de tres interruptores situados en la puerta A.</p>
<p><strong>Programa en Assembler:</strong></p>
<p class="codigomain">    LIST    P=16C84<br />
RADIX <span style="white-space: pre"> </span>HEX  w<span style="white-space: pre"> </span>EQU<span style="white-space: pre"> </span>0<br />
f<span style="white-space: pre"> </span>EQU<span style="white-space: pre"> </span>1<br />
PCL<span style="white-space: pre"> </span>EQU<span style="white-space: pre"> </span>02<br />
PUERTAA<span style="white-space: pre"> </span>EQU   05<br />
PUERTAB<span style="white-space: pre"> </span>EQU   06<br />
ESTADO  EQU   03<br />
VALOR<span style="white-space: pre"> </span>EQU<span style="white-space: pre"> </span>12<span style="white-space: pre"> </span>; Registro auxiliar</p>
<p>; RUTINA PRINCIPAL: Lectura de los interruptores y c lculo del valor a visualizar</p>
<p>ORG   0<br />
goto  inicio<br />
ORG   5               ; Para saltar el Vector de<br />
; Interrupción</p>
<p>inicio bsf ESTADO,5<span style="white-space: pre"> </span>  ; Selección del banco 1<br />
clrw<br />
movwf  PUERTAB    ; Puerta B salida<br />
movlw  0xff<br />
movwf  PUERTAA    ; puerta A entrada<br />
bcf<span style="white-space: pre"> </span>ESTADO,5      ; Selección banco 0<br />
explora  movf PUERTAA,w  ; Se cargan los<br />
; interruptores en W<br />
movwf<span style="white-space: pre"> </span>VALOR     ; Se usa un registro auxiliar<br />
comf    VALOR,f   ; Invertir los niveles de interuptores<br />
clrw<br />
btfss   VALOR,0   ; Si RA0 = 1, brinca<br />
goto    bit_1     ; Salta a explorar el bit_1<br />
addlw   0&#215;01      ; Si RA0 =1, se suma<br />
bit_1 btfss VALOR,1; Si RA1 = 1, brinca<br />
goto    bit_2     ; Salta a explorar el bit_2<br />
addlw   0&#215;02      ; Si RA1 = 1, se suman 2<br />
bit_2 btfss VALOR,2; Si RA2 = 1, brinca<br />
goto    visual    ; Salta al módulo del display<br />
addlw   0&#215;04      ; Si RA2 0 1, se suman 4<br />
visual  call  display ; Salta al módulo del display</p>
<p>; DISPLAY: Rutina de visualización del acumulador en el display de 7 segmentos</p>
<p>movwf   PUERTAB       ; Al retornar de la subrutina<br />
; el valor de W se saca por la<br />
; Puerta B<br />
bucle  goto  bucle    ; bucle infinito</p>
<p>; TABLA DE CONVERSION&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>display  addwf  PCL,f  ; pcl + W -&gt; W<br />
; El pcl se incrementa con el<br />
; valor de W proporcionando un<br />
; salto<br />
retlw   0x3F           ; Retorna con el valor del<br />
; código del 0<br />
retlw   0&#215;06           ; Retorna con el código del 1<br />
retlw   0x5b           ; Retorna con el código del 2<br />
retlw   0x4f           ; Retorna con el código del 3<br />
retlw   0&#215;66           ; Retorna con el código del 4<br />
retlw   0x6d           ; Retorna con el código del 5<br />
retlw   0x7d           ; Retorna con el código del 6<br />
retlw   0&#215;07           ; Retorna con el código del 7</p>
<p>END</p>
<p><strong>Programa en C:</strong></p>
<p class="codigomain">#include &lt;16c84.h&gt;<br />
#byte puertaa = 05  /* Posición de la puerta A */<br />
#byte puertab = 06  /* Posición de la puerta B */<br />
void main( void )<br />
{<br />
int temp = 0, tabla[8]={ 0x3F, 0&#215;06, 0x5B, 0x4F, 0&#215;66, 0x6D, 0x7D, 0&#215;07 };<br />
int indice = 0;<br />
set_tris_a( 0xFF );   /* Puerta A configurada para entrada */<br />
set_tris_b( 0&#215;00 );   /* Puerta B configurada para salida  */<br />
temp = ~puertaa;      /* Se complementa la entrada de PA   */<br />
if ( bit_test( temp, 0 ) ) indice += 1;<br />
if ( bit_test( temp, 1 ) ) indice += 2;<br />
if ( bit_test( temp, 2 ) ) indice += 4;<br />
puertab = tabla[indice];<br />
}</p>
<hr />Ejemplos básicos de programación de Microcontroladores PIC16X84 <strong>sin</strong> esquemas <strong>ni</strong> diagramas; enunciados de los ejemplos:</p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/basico1.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Control de un dispositivo desde dos puntos</span></strong></span></a>: Se desea controlar una lámpara, en este caso un diodo LED desde dos interruptores, de forma que cuando los dos interruptores están abiertos el LED está apagado. A partir de esta situación, cada vez que cambie el estado de un interruptor, el estado del LED bascula  (si está apagado se enciende y viceversa)</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/basico2.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Semáforo programabe</span></strong></span></a>: Se simula un semáforo con 3 diodos LED. Se dispone de 2 interruptores que según la combinación que adopten originan una secuencia de encendido de las luces del semáforo.</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/basico3.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Dado electrónico</span></strong></span></a>: Este programa simula el juego del dado. Un dado típico tiene 6 caras, en cada una de las cuales viene dibujado un número del 1 al 6. Cada vez que se presiona un pulsador se produce un número aleatorio entre 1 y 6, el cual se visualiza en un display de 7 segmentos.</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/basico4.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Temporizador programable</span></strong></span></a>: Con 3 microrruptores se selecciona un valor entre el 0 y el 7 (binario), que representa un tiempo en segundos y que ser  visualizado por el display de 7 segmentos. Durante el tiempo que dura la temporización un LED rojo permanece activado, así como un zumbador. Al finalizar se desactivan ambos elementos y el display se pone a 0.</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/basico5.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Alarma</span></strong></span></a>: Se tienen 3 detectores digitales, cada uno de los cuales provocar la activación de un LED, diferente en cada caso. Uno de los detectores ser  un optoacoplador y los otros 2 se simularán mediante 2 microrruptores. El programa consiste en poner en marcha un zumbador cuando la alarma salte por causa de la activación de cualquiera de los detectores. También se enciende el LED correspondiente al detector. La alarma sólo funcionará cuando el microrruptor I1 de conexión esté a nivel alto.</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/walk.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Ejemplo tomado de Internet</span></strong></span></a>: (Autor: David Tait, <a href="mailto:david.tait@man.ac.uk">david.tait@man.ac.uk</a>) Este programa ilumina una serie de leds en secuencia principio-fin-principio (algo así como las luces del &#8220;El Coche Fantástico).</li>
<li type="square"><a href="http://www.casidiablo.net/wordpress/wp-content/uploads/2007/08/watchdog.zip" title="Descargar!"><span style="text-decoration: underline"><strong><span style="color: Navy">Manejo del WatchDog (perro guardián)</span></strong></span></a>: El objetivo de este programa es mostrar en la práctica el funcionamiento del Watchdog en el PIC 16c84. El programa entra en un bucle infinito del que sale tras cumplirse la temporización asiganada al watchdog, que en este caso ser n 36 ms, es decir 2 veces la temporización nominal.</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/programacion-de-microcontroladores-pic16x84-diagramas-de-montaje-programas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Video tutorial C++</title>
		<link>http://casidiablo.net/video-tutorial-c/</link>
		<comments>http://casidiablo.net/video-tutorial-c/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 22:26:27 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2007/07/02/video-tutorial-c/</guid>
		<description><![CDATA[Me pillo en un post de cheatmaster un muy buen videotutorial de C++ hecho en Flash, muy recomendado si estás empenzando en C/C++&#8230; lo puedes ver aquí: http://lnx.googlewrite.com/cpp/wimpy.swf]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fvideo-tutorial-c%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Video%20tutorial%20C%2B%2B%22%20%7D);"></div>
<p>Me pillo en un post de <a href="http://foro.elhacker.net/index.php?action=profile;u=215850" title="Ver perfil de cheatmaster">cheatmaster</a> un muy buen videotutorial de C++ hecho en Flash, muy recomendado si estás empenzando en C/C++&#8230; lo puedes ver aquí:<br />
<a href="http://lnx.googlewrite.com/cpp/wimpy.swf" title="Ver" target="_blank">http://lnx.googlewrite.com/cpp/wimpy.swf</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/video-tutorial-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tutoriales de Programación de Pics [semi-actualizados]</title>
		<link>http://casidiablo.net/tutoriales-de-programacion-de-pics-semi-actualizados/</link>
		<comments>http://casidiablo.net/tutoriales-de-programacion-de-pics-semi-actualizados/#comments</comments>
		<pubDate>Mon, 28 May 2007 19:49:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=422</guid>
		<description><![CDATA[Algunos tutoriales de Programación de Pics&#8230; Introducción a microcontroladores PIC [simulando nuestro programas en ASM y C] Programación de Microcontroladores PIC16X84 [Diagramas de montaje + Programas] Grabando nuestros programas en ASM y C en los PIC&#8217;s Espero les sirva!!!]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Ftutoriales-de-programacion-de-pics-semi-actualizados%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Tutoriales%20de%20Programaci%C3%B3n%20de%20Pics%20%5Bsemi-actualizados%5D%22%20%7D);"></div>
<p>Algunos tutoriales de Programación de Pics&#8230;</p>
<ul>
<li><a href="http://casidiablo.blogspot.com/2006/11/introduccin-microcontroladores-pic.html">Introducción a microcontroladores PIC [simulando nuestro programas en ASM y C]</a></li>
<li><a href="http://casidiablo.blogspot.com/2006/11/programacin-de-microcontroladores.html/">Programación de Microcontroladores PIC16X84 [Diagramas de montaje + Programas]</a></li>
<li><a href="http://casidiablo.blogspot.com/2006/11/grabando-nuestros-programas-en-asm-y-c.html">Grabando nuestros programas en ASM y C en los PIC&#8217;s</a></li>
</ul>
<p>Espero les sirva!!!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tutoriales-de-programacion-de-pics-semi-actualizados/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Editores de texto en Linux</title>
		<link>http://casidiablo.net/editores-de-texto-en-linux/</link>
		<comments>http://casidiablo.net/editores-de-texto-en-linux/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 01:02:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=359</guid>
		<description><![CDATA[Como ya debes saber, lo primero que necesitamos para programar es un editor de texto. Uno de los primeros resultados del proyecto GNU fue el editor emacs, y los editores estuvieron entre los primeros programas que se portaron a Linux. Pero vamos a centrar nuestra atención en el editor vim, el cual es básicamente una [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Feditores-de-texto-en-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Editores%20de%20texto%20en%20Linux%22%20%7D);"></div>
<p style="text-align: justify">Como ya debes saber, lo primero que necesitamos para programar es un editor de texto. Uno de los primeros resultados del proyecto GNU fue el editor emacs, y los editores estuvieron entre los primeros programas que se portaron a Linux.</p>
<p style="text-align: justify">Pero vamos a centrar nuestra atención en el editor vim, el cual es básicamente una interfaz basada en pantallas escrita con base en ex (otro editor muy antiguo).</p>
<p style="text-align: justify">En la mayoría de los distros de Linux encontrarás el editor vim. Aunque muchas personas piensan que vim es enigmático y difícil de utilizar, por lo general es porque nos acostumbramos al bloc de notas de Windows, emacs (en modo gráfico) y/o a los IDE&#8217;s (a lo fácil); sin embargo, vim tiene muchas ventajas con respecto a otros editores:</p>
<ul>
<li style="text-align: justify">Está disponible en prácticamente  en todos los sistemas UNIX y Linux.</li>
<li style="text-align: justify">Necesita menos recursos de sistema que emacs, y por consecuencia se ejecuta aunque el sistema no esté funcionando completamente.</li>
<li style="text-align: justify">No es tan personalizable como el emacs, por lo que sus implementaciones se comportan casi de la misma manera.</li>
</ul>
<p style="text-align: justify">Puedes utilizar cualquier otro editor de texto, aunque te recomiendo que domines los fundamentos del vim. Para comenzar puedes leerte <a href="http://casidiablo.net/mini-mini-referencia-al-editor-vim/">este pequeño (muy pequeño) artículo acerca del vim</a>.</p>
<p style="font-weight: bold"><big>ctags y etags</big></p>
<p style="text-align: justify">Al codificar un programa grande en C++, talvez sea necesario dividir las clases y métodos en archivos fuente separados. Pero después, al depurar el programa, puede resultar tediosa la tarea de navegar entre archivos. Por ejemplo, talvez esté editando el archivo A y en él haya una invocación a un método que se encuentre en otro fichero, talvez el B. Los programas ctags y etags generan archivos índice o “tag”, que vi y emacs pueden utilizar para ayudarlo a navegar por sus archivos fuente.</p>
<p style="text-align: justify">ctags genera marcas para vim, pero se puede configurar para que lo haga para emacs. etags genera marcas para emacs, pero se puede configurar para que lo haga para vim.</p>
<p style="text-align: justify">Vamos a ver un ejemplo del ctag con vim. Para ello escribimos el siguiente código en un archivo llamado HolaPrincipal.cpp:</p>
<pre class="brush: cpp; title: ; notranslate">//HolaPrincipal.cpp
#include&lt;iostream&gt;
using namespace std;
void Saludar(int i);
int main(int argc, char * argv[])
{
for(int i=0; i&lt;5; i++)
{
Saludar(i);
cout&lt;&lt;endl;
}
}</pre>
<p style="text-align: justify">y lo siguiente en Saludar.cpp:</p>
<pre class="brush: cpp; title: ; notranslate">//Saludar.cpp
#include&lt;iostream&gt;
using namespace std;
void Saludar(int i)
{
cout&lt;&lt;&quot;[&quot;&lt;&lt;i&lt;&lt;&quot;] elhackerr00lz&quot;;
}</pre>
<p style="text-align: justify">Ahora vamos al directorio donde tenemos los dos archivos y escribimos el comando:</p>
<p class="consola">ctags *.cpp</p>
<p style="text-align: justify">Hemos creado el nuevo archivo tags. Ahora vamos a probarlo, para ello abrimos el archivo  HolaPrincipal.cpp (vim HolaPrincipal.cpp); y usando las flechitas de dirección colocamos el cursor sobre la palabra Saludar. Oprime Ctrl+], y verás que el editor abre automáticamente el archivo que contiene la función (Saludar.cpp) y coloca el cursor al inicio de la misma.</p>
<p style="text-align: justify">Como he dicho anteriormente solo centraremos la atención al vim, para el emacs puedes manejar tanto el ctags como el etags. Utiliza la información en línea para ver como se utiliza.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/editores-de-texto-en-linux/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Compiladores de C/C++ en Linux</title>
		<link>http://casidiablo.net/compiladores-de-cc-en-linux/</link>
		<comments>http://casidiablo.net/compiladores-de-cc-en-linux/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 00:46:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=358</guid>
		<description><![CDATA[El compilador C de GNU se llama gcc y puede compilar C, C++ y Objective-C. El compilador de C se apega al estándar ANSI, por lo que es fácil de portar un programa C ANSI a Linux. Cómo compilar con gcc El compilador GNU se invoca con el comando gcc. De manera predeterminada este comando [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fcompiladores-de-cc-en-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Compiladores%20de%20C%2FC%2B%2B%20en%20Linux%22%20%7D);"></div>
<p style="text-align: justify">El compilador C de GNU se llama gcc y puede compilar C, C++ y Objective-C. El compilador de C se apega al estándar ANSI, por lo que es fácil de portar un programa C ANSI a Linux.</p>
<p style="font-weight: bold">Cómo compilar con gcc</p>
<p style="text-align: justify">El compilador GNU se invoca con el comando gcc. De manera predeterminada este comando preprocesará, compilará y en enlazará un programa de C. Existen muchas opciones para el gcc, y entre ellas existen controles que permiten ejecutar solo alguna fase de la secuencia preproceso/compilación/enlace.</p>
<p style="text-align: justify">El siguiente ejemplo sencillo es un programa en C que simula el lanzamiento de un dado n veces, y luego imprime el nÃºmero de veces que sale cada una de sus caras. Nota: El ejemplo lo saqué de un libro de C, espero no me demanden.</p>
<p style="text-align: justify">Crea el archivo juego.c:</p>
<pre class="brush: cpp; title: ; notranslate">#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;

int tirarDado(void);

int main(int argc, char * argv[])
{
int i, iIter, dado[6];

if(argc&lt;2)
{
printf(&quot;Uso: %s n\n&quot;,argv[0]);
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i&lt;iIter; i++)
{
dado[tirarDado() - 1]++;
}
printf(&quot;%d tiradas\n&quot;,iIter);
printf(&quot;\tCara\tTiradas\n&quot;);
for(i=0; i&lt;6; i++)
{
printf(&quot;\t%d : \t%d\n&quot;,i+1, dado[i]);
}
}</pre>
<p style="text-align: justify">Y el archivo tirador.c:</p>
<pre class="brush: cpp; title: ; notranslate">#include&lt;stdlib.h&gt;
int tirarDado(void)
{
return (rand()%6+1);
}</pre>
<p style="text-align: justify">PodrÃ­amos utilizar un solo comando para compilar y crear el programa ejecutable:</p>
<p class="consola">gcc -o juego juego.c tirador.c</p>
<p style="text-align: justify">Puede ver que -o indica el nombre del archivo de salida (el ejecutable). gcc sabe que los archivos con la extensión *.c son archivos de C y los compila como tales. Sino especifica un nombre de archivo de salida, gcc creará predeterminadamente el archivo a.out.</p>
<p style="text-align: justify">Ahora veamos otra manera de compilar nuestro programa: haciÃ©ndolo por módulos (por separado):</p>
<p class="consola">gcc -c juego.c<br />
gcc -c tirador.c<br />
gcc -o juego juego.o tirador.o</p>
<p style="text-align: justify">En este caso indicamos al compilador, con la opciÃ³n -c, que primero el archivo juego.c, luego el archivo tirador.c. Y por último le indicamos que cree el archivo binario ejecutable, utilizando los dos archivos objeto (resultados de la compilación): juego.o y tirador.o.</p>
<p style="text-align: justify; font-weight: bold">Cómo compilar con g++</p>
<p style="text-align: justify">El comando g++ nos permite compilar archivos de C++. Aunque gcc puede compilar programas de C++, no hace automáticamente todos los enlaces requeridos con las bibliotecas de clases. Necesita usar g++ para esto. Por ello es recomendable que utilices g++ si estás utilizando C++.</p>
<p style="text-align: justify">Ahora vamos a compilar la versión C++ de nuestro programa de los dados; el archivo juego.cpp:</p>
<pre class="brush: cpp; title: ; notranslate">#include&lt;iostream&gt;
#include&lt;stdlib.h&gt;
#include&lt;string.h&gt;
using namespace std;
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc&lt;2)
{
cout&lt;&lt;&quot;Uso: &quot;&lt;&lt;argv[0]&lt;&lt;&quot;n\n&quot;;
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i&lt;iIter; i++)
{
dado[tirarDado() - 1]++;
}
cout&lt;&lt;iIter&lt;&lt;&quot; tiradas\n&quot;;
cout&lt;&lt;&quot;\tCara\tTiradas\n&quot;;
for(i=0; i&lt;6; i++)
{
cout&lt;&lt;&quot;\t&quot;&lt;&lt;i+1&lt;&lt;&quot; :\t&quot;&lt;&lt;dado[i]&lt;&lt;endl;
}
}</pre>
<p style="text-align: justify">El archivo tirador.cpp:</p>
<pre class="brush: cpp; title: ; notranslate">#include&lt;stdlib.h&gt;
int tirarDado(void)
{
return (rand()%6+1);
}</pre>
<p style="text-align: justify">La compilación en g++ es muy similar a gcc en casi todos los aspectos. Para compilar con un solo comando utiliza:</p>
<p class="consola">g++ -o juego juego.cpp tirador.cpp</p>
<p style="text-align: justify">Y para compilar por módulos:</p>
<p class="consola">g++ -c juego.cpp<br />
g++ -c tirador.cpp<br />
g++ -o juego juego.o tirador.o</p>
<p class="cita"><strong>ELF</strong><br />
Cuando se compila un programa, se genera un archivo objeto, y cuando se enlaza el programa, se crea un archivo binario ejecutable. El enlazador debe entender el formato de los archivos objeto, y como el sistema operativo debe cargar y ejecutar el programa ejecutable, también debe entender este formato.<br />
Ya vio que el archivo ejecutable por defecto se llama a.out. Hace un tiempo, el formato de los archivos objeto y los archivos ejecutables se conocía como a.out. Este formato es muy antiguo y contiene bastantes defectos. El formato actual, utilizado por los sistemas UNIX y Linux se conoce como ELF (Formato Ejecutable y de Enlace). ELF es mucho más versátil que a.out, y se presta muy bien para crear bibliotecas compartidas (librerías dinámicas).</p>
<p style="text-align: justify">Puede saber cual es el formato de un archivo utilizando el comando file, por ej.:</p>
<p class="consola">file juego tirador.o /usr/bin/apt-get<br />
juego:           ELF 32-bit LSB executable, Intel 80386&#8230;<br />
tirador.o:       ELF 32-bit LSB relocatable, Intel 80386&#8230;<br />
/usr/bin/apt-get: ELF 32-bit LSB executable, Intel 80386&#8230;</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/compiladores-de-cc-en-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Bibliotecas compartidas de C++ en Linux</title>
		<link>http://casidiablo.net/bibliotecas-compartidas-de-c-en-linux/</link>
		<comments>http://casidiablo.net/bibliotecas-compartidas-de-c-en-linux/#comments</comments>
		<pubDate>Fri, 02 Mar 2007 23:30:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=361</guid>
		<description><![CDATA[A veces, varios programas necesitan hacer las mismas cosas, como E/S por ejemplo. Hace ya bastante tiempo se desarrolló el concepto de biblioteca (o librería) para adaptar esto. Las funciones se colocan en un archivo, y luego, cada vez que se crea un programa, este extrae de la biblioteca las funciones que necesita. En su [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fbibliotecas-compartidas-de-c-en-linux%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Bibliotecas%20compartidas%20de%20C%2B%2B%20en%20Linux%22%20%7D);"></div>
<p style="text-align: justify">A veces, varios programas necesitan hacer las mismas cosas, como E/S por ejemplo. Hace ya bastante tiempo se desarrolló el concepto de biblioteca (o librería) para adaptar esto. Las funciones se colocan en un archivo, y luego, cada vez que se crea un programa, este extrae de la biblioteca las funciones que necesita.</p>
<p class="importante" style="text-align: justify">En su momento, esto fue un gran avance, pero tenía varias desventajas. Los ejecutables se hacen más grandes ya que cada uno de ellos incrusta código copiado de las bibliotecas. Si se encuentra un error en la biblioteca o se agrega una característica, el ejecutable no hace uso de ella a menos que se vuelva a crear.</p>
<p style="text-align: justify">La solución a esto son las bibliotecas compartidas (o librerías dinámicas). El mecanismo de  las bibliotecas compartidas esta fuera del alcance de este artículo. Solo veremos como crearlas y utilizarlas.</p>
<p style="text-align: justify">Regresemos al programa del dado que hicimos en C. Este programa tiene dos archivos fuente. Supongamos que nuestra función tirarDado (del archivo tirador.c) nos es muy útil, no solo en nuestro programa, sino en muchos otros programas que utilicen dados. Podemos pensar entonces en colocar dicha función en una biblioteca para que otros programas puedan usarla.</p>
<p style="text-align: justify">Primero necesitamos crear la biblioteca compartida. Para ello compilamos el archivo que contiene la función así:</p>
<p class="consola">gcc -fPIC -c tirador.c</p>
<p style="text-align: justify">Ahora lo convertimos en una biblioteca compartida llamada libtirar.so.1.0:</p>
<p class="consola">gcc -shared -Wl,-soname,libtirar.so.1 -o libtirar.so.1.0 tirador.o</p>
<p style="text-align: justify">Por último crearemos un enlace para libtirar.so, para que el programa en ejecución no necesite mantener un registro de la información de versión en el nombre de la biblioteca compartida:</p>
<p class="consola">ln -s libtirar.so.1.0 libtirar.so.1<br />
ln -s libtirar.so.1 libtirar.so</p>
<p style="text-align: justify">Ahora que tenemos la biblioteca, debemos crear el programa principal para que enlace con esa biblioteca en tiempo de ejecución, en lugar de incluir el código dentro del ejecutable:</p>
<p class="consola">gcc -o juego juego.c -L. -ltirar</p>
<p style="text-align: justify">La opción -L. le indica al compilador que busque bibliotecas en el directorio actual, y la opción -ltirar le indica que busque una biblioteca llamada libtirar.so.</p>
<p style="text-align: justify">Al ejecutar el programa, el sistema operativo cargará dinámicamente la biblioteca correcta, pero tiene que saber donde buscarla. Si la biblioteca no se encuentra en un lugar estándar (/usr/lib por ejemplo), puede asignar una variable de entorno para que le indique en dónde localizar bibliotecas adicionales:</p>
<p class="consola">export LD_LIBRARY_PATH=/home/usuario/mislibrerias</p>
<p style="text-align: justify">Por último, para ver qué librerías usa un programa, utilice el comando ldd:</p>
<p class="consola">ldd juego<br />
libtirar.so.1 =&gt;/mnt/hda1/home/casidiablo/juegolibrerias/libtirar.so.1 (0&#215;40018000)<br />
libc.so.6 =&gt; /lib/libc.so.6 (0&#215;40029000)<br />
/lib/ld-linux.so.2 =&gt;/lib/ld-linux.so.2 (0&#215;40000000)</p>
<p style="font-weight: bold">Otro ejemplo de bibliotecas&#8230; crear una biblioteca estática</p>
<p style="text-align: justify">A diferencia de las bibliotecas compartidas, al momento de compilar bibliotecas estáticas, se incluyen en el programa las rutinas que utiliza de la biblioteca; en otras palabras las rutinas están insertas en el programa sin la posibilidad de ser utilizados por otro programa. Nuestra demostración se basará en la construcción de una biblioteca estática; dentro de nuestra biblioteca incluiremos un procedimiento que imprimirá un mensaje en pantalla el que será pasado por parámetro y una función que nos entrega en cálculo del factorial de un numero dado (pasado por parámetro); para que luego estas rutinas sean llamadas desde un programa de ejemplo.</p>
<p style="text-align: justify">El proceso para crear bibliotecas estáticas es escribir el código fuente, compilar a código objeto el fuente y crear la biblioteca con los archivos objetos. A continuación procederemos a escribir nuestras rutinas que serán incluidas en la biblioteca, los archivo de las rutinas serán factorial.c e imprimir.c</p>
<pre class="brush: cpp; title: ; notranslate">//imprimir.c
#include&lt;stdio.h&gt;
void imprimir_en_pantalla(const char* mensaje)
{
printf(&quot;%s&quot;,mensaje);
}</pre>
<pre class="brush: cpp; title: ; notranslate">//factorial.c
#include&lt;stdio.h&gt;
long factorial(long numero)
{
if(numero&gt;0)
return numero * factorial(numero-1);
else return 1;
}</pre>
<p style="text-align: justify">Ahora compilaremos estos archivos fuente y los convertiremos en código objeto utilizando gcc:</p>
<p class="consola">gcc -c imprimir.c factorial.c</p>
<p style="text-align: justify">Esto creará los archivos objeto (imprimir.o y factorial.o). El siguiente paso será crear nuestra biblioteca estática con estos archivos de código objeto; a la biblioteca la llamaremos libejemploestatica.a:</p>
<p class="consola">ar rsc libejemploestatica.a imprimir.o factorial.o</p>
<p style="text-align: justify">El comando ar creará nuestra biblioteca (opcion c), introducirá los archivos objeto al archivo creado (opción r) y por último creará un índice de los módulos (opción s), esto último permite que el linker (ld) al momento de compilar (ld es llamado por gcc) no tenga que leerse toda la biblioteca completa ya que se agregan los índices y descripción de los módulos. El proceso de crear el índice de los módulos también se pude realizar con ranlib.</p>
<pre class="brush: cpp; title: ; notranslate">//miprograma.c
#include&lt;stdio.h&gt;
#include &quot;libejemploestatica.h&quot;
int main()
{
printf(&quot;Programa de ejemplo de utilizacion de biblioteca\n&quot;);
imprimir_en_pantalla(&quot;Vamos a calcular un factorial\n&quot;);
printf(&quot;El valor del factorial de 4 es: %i\n&quot;,factorial(4));
}</pre>
<p style="text-align: justify">Ahora nos falta crear nuestro archivo de cabecera (header), que son los que tienen terminación .h, en este archivo se incluirán las llamadas a las rutinas de la biblioteca y es una manera elegante porque también puedes incluir estas llamadas en el programa que las vas utilizar. El archivo de cabecera libejemploestatica.h tendrá el siguiente contenido:</p>
<pre class="brush: cpp; title: ; notranslate">extern void imprimir_en_pantalla(const char*);
extern long fatorial(long);</pre>
<p style="text-align: justify">No es necesario que el archivo de cabecera y biblioteca sean iguales antes de la extensión. Ahora crearemos el archivo ejecutable en base a nuestro programa principal (miprograma.c), el cual utilizará la biblioteca que hemos creado. Para ello debemos compilarlo utilizando la biblioteca:</p>
<p class="consola">gcc -o programa_ejecutable miprograma.c -L. -lejemploestatica</p>
<p style="text-align: justify">Con la opción -L indicamos donde se encuentra nuestro archivo de cabecera, como en este se encuentra en el mismo directorio utilizamos el punto (-L.). Con la opción -l indicamos el nombre de la librería. Fíjate que no es necesario colocar el nombre completo (libejemploestatica) ya que gcc asume que los nombre de bibliotecas empiezan con el prefijo &#8220;lib&#8221;. Ahora ya tendremos el archivo ejecutable listo para correr nuestro programa:</p>
<p class="consola">$ ./programa_ejecutable<br />
Programa de ejemplo de utilizacion de biblioteca<br />
Vamos a calcular un factorial<br />
El valor del factorial de 4 es: 24</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/bibliotecas-compartidas-de-c-en-linux/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

