<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>MicroPIC &#187; HowTo</title>
	<atom:link href="http://micropic.wordpress.com/category/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://micropic.wordpress.com</link>
	<description>Tutoriales y Proyectos con Microcontroladores PIC</description>
	<lastBuildDate>Sun, 05 Oct 2008 15:46:53 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='micropic.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/1d21e30c68a54806b77bd297c0ecf116?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>MicroPIC &#187; HowTo</title>
		<link>http://micropic.wordpress.com</link>
	</image>
			<item>
		<title>Usando Macros</title>
		<link>http://micropic.wordpress.com/2008/03/18/usando-macros/</link>
		<comments>http://micropic.wordpress.com/2008/03/18/usando-macros/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 00:23:44 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/?p=98</guid>
		<description><![CDATA[El uso de subrutinas lo vimos por primera vez en el tutorial Encendiendo y apagando LED&#8217;s&#8230; ahora con retardo! Ahí se vio la manera en la que se llama y se regresa de las subrutinas. También se dijo que el empleo de subrutinas hacía el código más entendible, otra forma de hacer el código entendible [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=98&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El uso de subrutinas lo vimos por primera vez en el tutorial <a href="http://micropic.wordpress.com/2007/02/02/tutorial-1-led%e2%80%99s-segunda-parte/" target="_blank">Encendiendo y apagando LED&#8217;s&#8230; ahora con retardo!</a> Ahí se vio la manera en la que se llama y se regresa de las subrutinas. También se dijo que el empleo de subrutinas hacía el código más entendible, otra forma de hacer el código entendible es mediante el uso de Macros.</p>
<p>Las macros son de alguna forma similares a las subrutinas ya que son conjuntos de intrucciones que se ejecutan de manera secuencial mediante una llamada a una orden de ejecución, sin embargo tiene diferencias muy significativas. Mientras que una subrutina aparece una sola vez en el código, cada vez que se &#8220;invoca&#8221; una macro se inserta el código de esta en el programa. Otra diferencia es que a una macro se le pueden especificar parámetros de entrada y a una subrutina no.</p>
<p><span id="more-98"></span>Una macro se define con la directiva macro especificando el nombre de la macro y los parámetros de entrada, si existieran, de la siguiente manera:<br />
<code><font color="#993366">nombre_macro    </font><font color="#000080"><b>macro</b></font> <font color="#993366"><i>par1, par2,...</i><br />
instrucción<br />
instrucción<br />
...</font><br />
<font color="#000080"><b>                             endm</b></font></code></p>
<p>En el programa la definición de la macro debe aparecer antes de la línea en la que se llama la macro. Cuanto mientras se ejecuta el programa se encuentra una macro esta es reemplazada por el conjunto de instrucciones que aparecen en la definición de la macro. Una manera de asegurar eso es escribiendo las macros en un archivo include (.INC) y llamando a este include al momento de llamar el include de las definiciones del micro.</p>
<p>Las macros pueden ahorrar mucho tiempo de escritura ya que si hay partes del código que se repiten mucho se pueden escribir en una macro y ese código se insertaría de manera automática al llamar la macro. Veamos esto con un ejemplo. Los cambios de banco pueden ser muy repetitivos asi que si se quiere cambiar de banco se podrían definir unas macros de la siguiente manera:</p>
<p><code><font color="#993366">banco0    </font><font color="#000080">macro                            <font color="#008000">            ; Definición de macro banco0</font></font><br />
<font color="#000080">       bcf</font><font color="#993366">    STATUS<font color="#808080">,</font>RP0</font> <font color="#008000">; Bit RP0=0 = Banco 0</font><br />
<font color="#000080">       endm               <font color="#008000">             ; Termina definición de macro</font><br />
</font></code></p>
<p><code><font color="#993366">banco1</font>    <font color="#000080">macro                        </font><font color="#008000">; Definición de macro banco1</font><br />
<font color="#000080">       bsf    </font><font color="#993366">STATUS<font color="#808080">,</font>RP0</font>  <font color="#008000">; Bit RP0=1 = Banco 1</font><br />
<font color="#000080">       endm             </font></code><code><font color="#000080">               <font color="#008000">; Termina definición de macro</font></font></code></p>
<p>Así si en el programa aparece el macro <i>banco1</i> este será sustituido por el código <i>bcf STATUS,RP0</i>.</p>
<p>Con ese ejemplo tal vez no queda muy claro la ventaja de usar una macro ya que la macro solo contiene una instrucción y no utiliza parámetros, pero ahora que definimos esos macros definamos otro que designe un bit de un puerto como salida:</p>
<p><code><font color="#993366">SALIDA</font><font color="#000080">    macro</font>    <font color="#993366">par1<font color="#808080">,</font> par2</font>     <font color="#008000">; Definición de macro</font><br />
<font color="#993366">       banco1</font>             <font color="#008000">             ; Macro para cambiar al banco 1</font><br />
<font color="#000080">       bcf</font>        <font color="#993366">par1<font color="#808080">,</font> par2</font>  <font color="#008000">; Bit dado como salida</font><br />
<font color="#993366">       banco0             </font>             <font color="#008000">; Macro para cambiar al banco 0</font><br />
<font color="#000080">       endm                </font></code><code><font color="#000080"><font color="#008000">; Termina definición de macro</font></font></code></p>
<p>Para utilizar ese macro que contiene parámetros simplemente se llama de la siguiente manera:</p>
<p><code><font color="#993366">       SALIDA   TRISA</font><font color="#808080">,</font>3</code></p>
<p>Al llamara esa macro el primer parámetro dado <i>TRISA</i> toma el lugar de <i>par1</i> mientras que el parámetro <i>3</i>, el lugar de <i>par2</i>  generando el siguiente código:</p>
<p><code><font color="#000080">    bsf</font>    <font color="#993366">STATUS<font color="#808080">,</font>RP0</font> <font color="#008000">; RP0 = 1 = Banco 1</font><br />
<font color="#000080">    bcf</font>    <font color="#993366">TRISA</font><font color="#808080">,</font>3    <font color="#008000">; Bit 3 de Puerto A como entrada</font><br />
<font color="#000080">    bcf</font>    <font color="#993366">STATUS<font color="#808080">,</font>RP0</font>    <font color="#008000">; RP0 = 0 = Banco 0</font></code></p>
<p>Como se puede ver las macros hacen muy la escritura del código y al poder manejar parámetros proveen un medio para simplificar muchas operaciones.</p>
<p>Utilizando esos macros supongamos que realizamos un programa que ponga el alto el valor del bit 3 del puerto B. El código completo del programa sería:</p>
<p><code><font color="#000080">    list    </font><font color="#993366">p</font><font color="#808080">=</font>16f628a<br />
<font color="#000080">    include</font> 	<font color="#993366">p16f628a.inc</font><br />
<font color="#000080">    include</font> 	<font color="#993366">macros.inc</font>  	<font color="#008000">; Archivo con la definición de las macros</font></code></p>
<p><code><font color="#000080">    org     0x00</font><br />
<font color="#000080">    goto</font>    <font color="#993366">INICIO</font></code></p>
<p><code><font color="#000080">    org	    0x05</font><br />
<font color="#993366">INICIO</font><br />
<font color="#993366">    SALIDA   TRISB</font><font color="#808080">,</font>3 <font color="#008000">    ; Llamada a macro salida</font><br />
<font color="#000080">    bsf         </font><font color="#993366">PORTB</font><font color="#808080">,</font>3     <font color="#008000">; Bit 3 del puerto B en alto</font></code></p>
<p><code><font color="#000080">    goto	      <font color="#808080">$       </font></font><font color="#008000">; Ciclo infinito</font></code></p>
<p><font color="#000080"><code>    end</code></font></p>
<p>El programa principal es muy sencillo y legible. El archivo macros.inc donde se definen las macros quedaría así:</p>
<p><code><font color="#993366">banco0    </font><font color="#000080">macro                            <font color="#008000">            ; Definición de macro banco0</font></font><br />
<font color="#000080">       bcf</font><font color="#993366">    STATUS<font color="#808080">,</font>RP0</font> <font color="#008000">; Bit RP0=0 = Banco 0</font><br />
<font color="#000080">       endm                            <font color="#008000">; Termina definición de macro</font><br />
</font></code></p>
<p><code><font color="#993366">banco1</font>    <font color="#000080">macro                        </font><font color="#008000">; Definición de macro banco1</font><br />
<font color="#000080">       bsf</font>    <font color="#993366">STATUS<font color="#808080">,</font>RP0</font>  <font color="#008000">; Bit RP0=1 = Banco 1</font><br />
<font color="#000080">       endm</font></code><code><font color="#000080">                            <font color="#008000">; Termina definición de macro</font></font></code></p>
<p><code><font color="#993366">SALIDA</font>    <font color="#000080">macro</font>  <font color="#993366">par1, par2</font> 	<font color="#008000">; Definición de macro SALIDA</font><br />
<font color="#993366">       banco1            </font><font color="#008000">; Llamada a macro banco1</font><br />
<font color="#000080">       bcf    </font><font color="#993366">par1<font color="#808080">,</font> par2 </font>	<font color="#008000">; Bit dado como salida</font><br />
<font color="#993366">       banco0            </font><font color="#008000">; Llamada a macro banco0</font><br />
<font color="#000080">       endm               </font><font color="#008000">             ; Termina definición de macro</font></code></p>
<p>Teniendo en cuenta las dos diferencias mencionadas podemos entonces preguntarnos ¿son mejores las macros o las subrutinas?. La respuesta final la debe dar cada quien ya que dependiendo del caso se debería usar una o la otra.</p>
<p>Más información sobre macros se puede encontrar en el <a href="http://www.mikroe.com/en/books/picbook/5_chapter.htm" target="_blank">quinto capítulo</a> de  <a href="http://www.mikroe.com/en/books/picbook/0_Uvod.htm" target="_blank">PIC microcontrollers, for beginners too</a>, de Nebojsa Matic.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/98/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/98/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=98&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2008/03/18/usando-macros/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f692212d8c3bca2ea0d6028582097e0e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">micropic</media:title>
		</media:content>
	</item>
		<item>
		<title>Teclado Matricial 4&#215;4</title>
		<link>http://micropic.wordpress.com/2007/06/13/teclado-matricial-4x4/</link>
		<comments>http://micropic.wordpress.com/2007/06/13/teclado-matricial-4x4/#comments</comments>
		<pubDate>Thu, 14 Jun 2007 02:02:57 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Rutinas]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/13/teclado-matricial-4x4/</guid>
		<description><![CDATA[Un teclado matricial es un simple arreglo de botones conectados en filas y colúmnas, de modo que se pueden leer varios botones con el mínimo número de pines requeridos. Un teclado matricial 4&#215;4 solamente ocupa 4 lineas de un puerto para las filas y otras 4 lineas para las colúmnas, de este modo se pueden [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=60&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Un <strong><em>teclado matricial</em></strong> es un simple <strong><em>arreglo de botones conectados en filas y colúmnas</em></strong>, de modo que se pueden leer varios botones con el mínimo número de pines requeridos. Un teclado matricial 4&#215;4 solamente ocupa 4 lineas de un puerto para las filas y otras 4 lineas para las colúmnas, de este modo se pueden leer 16 teclas utilizando solamente 8 líneas de un microcontrolador. Si asumimos que todas las columnas y filas inicialmente están en alto (1 lógico), la pulsación de un botón se puede detectar al poner cada fila a en bajo (0 lógico) y checar cada columna en busca de un cero, si ninguna columna está en bajo entonces el 0 de las filas se recorre hacia la siguiente y así secuencialmente.</p>
<p><span id="more-60"></span>Un modo simple de detectar la tecla presionada es incrementar una variable con la cuenta de las teclas revisadas, de este modo al detectaruna pulsación el valor de la cuenta será el valor de la tecla presionada. Si al final no se presionó ninguna tecla la variable se pone a cero y la cuenta vuelve a comenzar. <em>El puerto B del microcontrolador 16f628</em> (así como en el 16f877) <em>viene preparado especialmente para el control de un teclado matricial 4&#215;4</em>. Para tener siempre un valor de 1 lógico en las colúmnas del teclado (parte alta del puerto B del pic) es necesario conectar resistencias de pull-up, sin embargo el puerto B cuenta con resistencias de pull-up integradas, de ese modo es posible trabajar con un teclado matricial sin necesidad de ningún componente externo.</p>
<p>Las resistencias de pull-up del puerto B se habilitan poniendo en 0 el bit NOT_RBPU del registro OPTION_REG.Al método aqui expuesto para detectar la pulsación de una tecla en un teclado matricial se le conoce como muestreo secuencial. Existen otros, sin embargo esté es tal vez el más sencillo. En el siguiente ejemplo cada tecla del teclado matricial tiene un valor de 0 a F, valor que se despliega en un display de 7 segmentos. El el código necesario para leer un teclado matricial con un microcontrolador pic 16f628 es el siguiente.</p>
<p><strong>Programa principal:</strong></p>
<p><img src="http://micropic.files.wordpress.com/2007/06/tm1.png" alt="tm1.png" /></p>
<p>El programa principal es muy sencillo, simplemente configura el puerto A como salida, la parte baja del puerto B también como salida y la parte alta del puerto B como entrada. Además <em>de configurar los puertos también se habilitan las resistencias de pull-up internas</em> con la línea <strong><em>bcf OPTION_REG,NOT_RBPU</em></strong>. Después de la configuración se llama a una rutina llamada <strong><em>TECLADO</em></strong> encargada de escanear el teclado y regresar el valor de la tecla pulsada para poder desplegar el número correspondiente en un display de 7 segmentos y el programa ahí se queda en un ciclo llamando a la rutina TECLADO y después desplegando y repitiendo lo mismo cíclicamente.La rutina <em>TECLADO</em> escanea el teclado matricial usando el método que ya se mencionó.</p>
<p>Primero se carga un 0 a la primer fila, después se checa columna a columna si hay un cero, en caso de que no se detecte ningún cero, el cero de las filas se recorre y se vuelven a revisar las columnas. Si no se detectó ningún cero significa que no se presionó ninguna tecla y la rutina vuelve a comenzar. Si se detectó un cero significa que se presionó una tecla y en ese momento la salta a la rutina <strong><em>ANTIRREBOTES</em></strong>. Después de eliminar los rebotes se decodifica la tecla pulsada utilizando una tabla como la que se utilizó en el ejemplo del <a href="http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/" target="_blank">display de 7 segmentos</a>.</p>
<p><img src="http://micropic.files.wordpress.com/2007/06/tm2.png" alt="tm2.png" /></p>
<p><img src="http://micropic.files.wordpress.com/2007/06/tm3.png" alt="tm3.png" /></p>
<p>Existen otros métodos de manejar teclados matriciales, pero creo que ésta es la más sencilla. Para terminar una imágen del circuito:</p>
<p><a href="http://micropic.files.wordpress.com/2007/06/tm4.png" title="tm4.png"><img src="http://micropic.files.wordpress.com/2007/06/tm4.png" alt="tm4.png" height="281" width="429" /></a></p>
<p>Descargar el código: <a href="http://micropic.files.wordpress.com/2007/06/teclado-matricial-4x4.pdf" title="teclado-matricial-4x4.pdf">Teclado Matricial 4&#215;4</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/60/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/60/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=60&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/13/teclado-matricial-4x4/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f692212d8c3bca2ea0d6028582097e0e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">micropic</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/06/tm1.png" medium="image">
			<media:title type="html">tm1.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/06/tm2.png" medium="image">
			<media:title type="html">tm2.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/06/tm3.png" medium="image">
			<media:title type="html">tm3.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/06/tm4.png" medium="image">
			<media:title type="html">tm4.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Leer botones e interruptores</title>
		<link>http://micropic.wordpress.com/2007/04/13/leer-botones-e-interruptores/</link>
		<comments>http://micropic.wordpress.com/2007/04/13/leer-botones-e-interruptores/#comments</comments>
		<pubDate>Sat, 14 Apr 2007 05:25:02 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/04/13/leer-botones-e-interruptores/</guid>
		<description><![CDATA[Ya hace casi un mes y medio desde la última entrada, había estado ocupado con la escuela y por esa razón dejé un poco de lado este proyecto, pero ahora para continuar un poco por donde íbamos vengo con una nueva entrada, ahora sobre leer botones e interruptores.
Los botones e interruptores son dispositivos que nos sirven [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=50&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="left"><a href="http://micropic.files.wordpress.com/2007/04/esquematico1.png" title="esquematico1.png"></a>Ya hace casi un mes y medio desde la última entrada, había estado ocupado con la escuela y por esa razón dejé un poco de lado este proyecto, pero ahora para continuar un poco por donde íbamos vengo con una nueva entrada, ahora sobre leer botones e interruptores.</p>
<p>Los botones e interruptores son dispositivos que nos sirven para introducir datos a algun sistema eléctrico o electrónico. Leer botones (e interruptores) es una tarea muy sencilla, solamente hay que tener en cuenta que estos, al ser dispositivos mecanicos, no cierran (ni abren) instantaneamente sino que presentan un fenomeno conocido como <em>rebote</em>, que no es otra cosa mas que un ruido electrico que genera errores en al detectar que se presionó un botón y que hace que parezca que el botón se presiono muchas veces.</p>
<p><span id="more-50"></span></p>
<p>Teniendo en cuenta eso podemos programar algunas rutinas anti-rebotes con el pic. Dos maneras sencillas de lograrlo son: crear un ciclo para verificar el estado de un bit y no salir de este hasta que el estado sea estable; o verificar el estado de un bit, llamar a un retardo (de alrededor de 10ms, aunque este retardo depende del tipo de interruptor y no es un valor fijo) y despues volver a verificar el estado del bit, si el estado es el mismo entonces el boton se presiono.</p>
<p>Para el primer ejemplo vamos a utilizar el primer tipo de anti-rebote. Tenemos conectado un push-button al pin 0 del puerto A (RA0) y ocho leds al puerto B (RB0 a RB7). Para conectar el push-button se utiliza una resistencia de pull-up de 4.7k (es decir una resistencia de 4.7k conectada a Vcc), el push-button se conecta de un lado a la resistencia de pull-up y del otro a tierra de modo que el pic siempre estará leyendo un 1 lógico y al presionar el botón el estado cambiará a un 0 lógico. El programa consiste en llevar la cuenta de cuantas veces se ha presionado el botón, misma que se desplegará en el puerto B del pic, cada vez que se presione el botón la cuenta se incrementará. El codigo es el siguiente:</p>
<p><img align="absMiddle" src="http://micropic.files.wordpress.com/2007/04/boton1.png" alt="boton1.png" /></p>
<p>Lo único nuevo aqui es la rutina que detecta que se presiona el botón y  la rutina que elimina el rebote. Para detectar que se presionó el botón se está revisando el estádo del pin 0 del puerto A con la instrucción btfsc, mientras el estado del pin sea 1 la ejecución del programa quedará ciclada en el mismo punto, una vez que el estado cambia a 0, es decir se presionó el botón, el programa salta a la rutina antirrebote. Esta rutina lo que hace es permanecer ciclada hasta que el estado del pin de nuevo sea 1, de este modo se eliminan los rebotes. Una vez que sale de la rutina antirrebotes incrementa la cuenta incrementando el puerto B y de nuevo regresa a checar el botón. Ésta es una imágen del circuito esquemático:</p>
<p><img src="http://micropic.files.wordpress.com/2007/04/esquematico1.png" alt="esquematico1.png" /></p>
<p>Ahora veamos otro ejemplo, esta vez se conectarán 4 push-buttons en el nibble bajo del puerto B y 4 leds en el nibble alto de modo que al presionar un botón se encienda el led correspondiente. Para eso se configura el nibble bajo del puerto como entrada y el nibble alto como salida. Las rutinas de chequeo de botón y de antirrebotes ahora cambian ya que se tienen que revisar cuatro botones. El código del programa principal cambia de la siguiente manera:</p>
<p><img src="http://micropic.files.wordpress.com/2007/04/boton2.png" alt="boton2.png" /></p>
<p>El programa va checando botón a botón para saber cual se presionó, una vez que detecta que uno fue presionado llama a la rutina antirrebotes, luego llama a la rutina que enciende el led correspondiente y al regresar continua checando los botones. El circuito esquemático es el siguiente:</p>
<p><img src="http://micropic.files.wordpress.com/2007/04/esquematico2.png" alt="esquematico2.png" /></p>
<p>Estos dos ejemplos tambien servirían si se usan interruptores en lugar de botones, utilizando el mismo código o efectuando alguna pequeña modificación, sobre todo en la rutina antirrebotes. Para el otro tipo de antirrebotes, en el que se utiliza un retardo, se eliminaria la rutina incluida en estos dos ejemplos ya que al momento de detectar el cambio de estado lógico se debe llamar a una rutina de retardo (como ya se dijo de aproximadamente 10ms) y después volver a comprobar el estádo, si sigue siendo el mismo entonces el botón fue presionado, si no es el mismo entonces la detección fue erronea y no se toma en cuenta.</p>
<p>Por ahora es todo, en proximas entradas hablaré sobre las interrupciones del pic, comenzando por las interrupciones externas del puerto B. Por el momento el código de estos dos ejemplos no se puede descargar, espero solucionar ese problema pronto.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=50&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/04/13/leer-botones-e-interruptores/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f692212d8c3bca2ea0d6028582097e0e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">micropic</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/04/boton1.png" medium="image">
			<media:title type="html">boton1.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/04/esquematico1.png" medium="image">
			<media:title type="html">esquematico1.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/04/boton2.png" medium="image">
			<media:title type="html">boton2.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/04/esquematico2.png" medium="image">
			<media:title type="html">esquematico2.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalar MPLAB en Ubuntu 6.06</title>
		<link>http://micropic.wordpress.com/2007/03/01/instalar-mplab-en-ubuntu-606/</link>
		<comments>http://micropic.wordpress.com/2007/03/01/instalar-mplab-en-ubuntu-606/#comments</comments>
		<pubDate>Thu, 01 Mar 2007 15:40:20 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[MPLAB]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/03/01/instalar-mplab-en-ubuntu-606/</guid>
		<description><![CDATA[Este es un pequeño tutorial para todos aquellos que utilicen Linux y se vean en la necesidad de usar el ambiente de desarrollo MPLAB. Está basado en una excelente guía de William Spinelli (Installing MPLAB on Ubuntu 6.06) con algunas pequeñas correcciones. La instalacion de MPLAB se hara a traves de Wine y WineTools, se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=49&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Este es un pequeño tutorial para todos aquellos que utilicen Linux y se vean en la necesidad de usar el ambiente de desarrollo MPLAB. Está basado en una excelente guía de <em>William Spinelli</em> (<a href="http://www.elet.polimi.it/upload/wspinell/website/index.php?sec=20_howto/10_linux_sw&amp;id=01_Installing_MPLAB_on_Ubuntu_6__dot06" target="_blank">Installing MPLAB on Ubuntu 6.06</a>) con algunas pequeñas correcciones. La instalacion de MPLAB se hara a traves de <em>Wine</em> y <em>WineTools</em>, se instalara la version 7.31 (aun no he probado si la version 7.50 o 7.51 se pueden instalar mediante este proceso) en la version 6.06 de Ubuntu.</p>
<p><span id="more-49"></span></p>
<p><strong>Instalar Wine</strong></p>
<p>Como la version de Wine que se encuentra en el repositorio (0.9.12) no soporta la instalacion de Internet Explorer 6 (IE6) usando WineTools, la instalacion se hace en dos pasos: primero se instala una version antigua de Wine (0.9.8) y despues se actualiza a la ultima version disponible.</p>
<p>Primero se debe instalar la version antigua de Wine<br />
&nbsp;$ wget http://umn.dl.sourceforge.net/sourceforge/wine/wine_0.9.8-winehq-1_i386.deb<br />
&nbsp;$ dpkg -i wine_0.9.8-winehq-1_i386.deb</p>
<p>y los siguientes paquetes<br />
&nbsp;$ sudo apt-get update<br />
&nbsp;$ sudo apt-get install xdialog cabextract</p>
<p>Despues se debe instalar WineTools manualmente ya que no se encuentra en los repositorios<br />
&nbsp;$ mkdir winetools; cd winetools<br />
&nbsp;$ wget http://www.openoffice.de/wt/winetools-0.9jo-III.tar.gz<br />
&nbsp;$ tar -xzvf winetools-0.9jo-III.tar.gz<br />
&nbsp;$ cd winetools-0.9jo-III<br />
&nbsp;$ sudo ./install</p>
<p>Una vez instalado se debe editar el archivo &#8220;wt0.9jo&#8221; y cambiar el mirror de las fuentes ya que no funciona en la version actual de winetools. El archivo se puede editar con cualquier editor de texto. Editar el archivo<br />
&nbsp;$ sudo gedit /usr/local/winetools/wt0.9jo</p>
<p>y reemplazar la siguiente linea<br />
[ "$SFMIRROR" = "" ] &amp;&amp; SFMIRROR=&#8221;http://puzzle.dl.sourceforge.net/sourceforge&#8221;</p>
<p>por<br />
[ "$SFMIRROR" = "" ] &amp;&amp; SFMIRROR=&#8221;http://umn.dl.sourceforge.net/sourceforge&#8221;</p>
<p>Habiendo hecho eso se debe ejecutar winetools. Para eso se inicia (como un usuario normal, no como root!) con el siguiente comando<br />
&nbsp;wt</p>
<p>Para configurar Wine se debe seguir la secuencia exacta de WineTools. En <em><strong>Configuracion Base</strong></em> (<em>Base Setup</em>) se hace en secuencia:</p>
<ul>
<li><em>Crear un disco falso de windows</em> (Create fake windows drive)</li>
<li><em>Instalar las fuentes Arial</em> (TrueType Font Arial)</li>
<li><em>Installar DCOM98</em></li>
</ul>
<p>Despues de eso se debe instalar el archivo MFC4 dll (Microsoft Foundation Classes 4.X), sin embargo el instalador de winetools no funciona, si se instala desde el menu aparecera un mensaje que diga que el archivo ya esta instalado pero no es asi por lo que se deben descargar e instalar manualmente los archivos <a href="http://www.dll-files.com/dllindex/dll-files.shtml?mfc40" target="_blank">mfc40.dll</a> y <a href="http://www.dll-files.com/dllindex/dll-files.shtml?mfc42" target="_blank">mfc42.dll</a>. Una vez descargados se deben copiar a .wine/drive_c/windows/system32/ pero en minusculas. Despues se vuelve a ejecutar winetools (wt) y se instala IE6</p>
<ul>
<li><em>Internet Explorer 6.0 SP1 Spanish</em></li>
</ul>
<p>Una vez hecho eso ya tenemos Wine totalmente configurado asi que ahora se actualiza a la ultima version de Wine. Se edita la configuracion de APT<br />
&nbsp;$ sudo vi /etc/apt/sources.list<br />
Y se añade el repositorio de Wine HQ:<br />
## repositories for Wine HQ<br />
deb http://wine.sourceforge.net/apt/ binary/<br />
deb-src http://wine.sourceforge.net/apt/ source/</p>
<p>Se actualiza el paquete con<br />
&nbsp;$ sudo apt-get update<br />
&nbsp;$ sudo apt-get upgrade</p>
<p><strong>Instalar MPLAB v7.31</strong></p>
<p>Teniendo Wine configurado la instalacion de MPLAB en linux resulta igual de sencilla que si se hiciera en windows. Se descarga el archivo MP731_Full.zip del servidor de Microchip y despues se descomprime<br />
&nbsp;$ mkdir mplab731; cd mplab731<br />
&nbsp;$ wget http://ww1.microchip.com/downloads/en/DeviceDoc/MP731_Full.zip<br />
&nbsp;$ unzip MP731_Full.zip</p>
<p>Y se instala utilizando Wine<br />
&nbsp;$ wine MP731_full_install.exe<br />
Se sigue el proceso de instalacion (el mismo que en windows) y al finalizar ya se tiene un MPLAB instalado y listo para usarse.</p>
<p>Para terminar simplemente se agrega un scrip de inicio en algun lugar del <em>path</em> de linux.  Se crea el archivo mplab<br />
&nbsp;$ sudo gedit /usr/local/bin/mplab</p>
<p>y se escribe en el<br />
#!/bin/bash<br />
. findwine<br />
$WINE &#8220;c:\\Program Files\\Microchip\\MPLAB IDE\\core\\MPLAB.exe&#8221; $@ &amp;&gt;/dev/null &amp;</p>
<p>Se hace ejecutable<br />
&nbsp;$ sudo chmod 755 /usr/local/bin/mplab</p>
<p>Y listo, para iniciar MPLAB simplemente se ejecuta el codigo <em>mplab</em>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/49/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/49/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=49&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/03/01/instalar-mplab-en-ubuntu-606/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f692212d8c3bca2ea0d6028582097e0e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">micropic</media:title>
		</media:content>
	</item>
	</channel>
</rss>