<?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; Rutinas</title>
	<atom:link href="http://micropic.wordpress.com/category/rutinas/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; Rutinas</title>
		<link>http://micropic.wordpress.com</link>
	</image>
			<item>
		<title>Multiplicación mediante el algoritmo de Booth</title>
		<link>http://micropic.wordpress.com/2008/02/02/multiplicacion-mediante-el-algoritmo-de-booth/</link>
		<comments>http://micropic.wordpress.com/2008/02/02/multiplicacion-mediante-el-algoritmo-de-booth/#comments</comments>
		<pubDate>Sat, 02 Feb 2008 18:27:32 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Rutinas]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/?p=96</guid>
		<description><![CDATA[El algoritmo de booth es un algoritmo que sirve para multiplicar (y dividir) números binarios con signo de manera rápida y sencilla en complemento a dos. Aqui explico de manera detallada el funcionamiento de ese algoritmo y muestro una implementacion del mismo para microcontroladores PIC.
La manera en que se representan los números binarios negativos es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=96&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El <em><strong>algoritmo de booth</strong></em> es un algoritmo que sirve para multiplicar (y dividir) números binarios con signo de manera rápida y sencilla <em>en complemento a dos</em>. Aqui explico de manera detallada el funcionamiento de ese algoritmo y muestro una implementacion del mismo para microcontroladores PIC.</p>
<p><span id="more-96"></span>La manera en que se representan los números binarios negativos es mediante su complemento a dos. El complemento a uno consiste en invertir el valor de cada bit, esto es que si se tiene el número 5 binario <em>b&#8217;00000101&#8242;</em> su complemento a uno sería <em>b&#8217;11111010&#8242;</em>. Una vez teniendo el complemento a 1 para obtener el complemento a dos simplemente se le debe sumar un 1, asi que se tiene <em>b&#8217;11111010 + 1&#8242;</em> de modo que <strong><em>el complemento a dos del número 5 binario es b&#8217;11111011&#8242;</em></strong>.</p>
<p>Ese es un dato muy importante ya que de ese modo se representan los números binarios negativos y el complemento a dos es parte del algoritmo de multiplicación de Booth. También es importante explicar que utilizando números de 8 bits el número mayor que se puede representar en complemento a dos es <strong><em>127</em></strong> y <strong><em>-127</em></strong> que en binario son <strong><em>b&#8217;01111111&#8242;</em></strong> y <strong><em>b&#8217;1000001&#8242;</em></strong> respectivamente.</p>
<p>En ensamblador <em>MPASM</em> la manera de obtener el complemento a dos de un número es:<em><br />
<code>comf    NUM,f<br />
incf    NUM,w<br />
movwf    NUMC2</code></em></p>
<p>donde <em>NUM</em> es el registro en el que se encuentra el número que se quiere pasar a complemento a dos y <em>NUMC2</em> es el registro donde se guarda el complemento a dos del número. Hasta ahí todo bien, ahora pasemos al algorítmo.</p>
<p>Supongamos que queremos multiplicar dos números de 8 bits, digamos que queremos multiplicar 5*(-6) donde 5 es el <em>multiplicando</em> y -6 es el <em>multiplicador</em>, con esos datos se forman 3 arreglos distintos de la siguiente manera:</p>
<p><em>A=0000 0101 0000 0000 0<br />
S=1111 1010 0000 0000 0<br />
P=0000 0000 1111 1010 0</em></p>
<p>El <strong><em>byte superior</em></strong> de <strong><em>A</em></strong> está formado por el <strong><em>multiplicando</em></strong>, el <strong><em>siguiente byte</em></strong> se forma con <strong><em>ceros</em></strong> y se agrega un <strong><em>bit extra</em></strong> que también es <strong><em>0</em></strong>.</p>
<p>El <strong><em>byte superior</em></strong> de <strong><em>S</em></strong> está formado por el <strong><em>complemento a dos del multiplicando</em></strong>, el <strong><em>siguiente byte</em></strong> al igual que el caso anterior se forma con <strong><em>ceros</em></strong> y al final se agrega un <strong><em>bit extra</em></strong> que es <strong><em>0</em></strong>.</p>
<p>El <strong><em>byte superior</em></strong> de <strong><em>P</em></strong> está formado por <strong><em>ceros</em></strong>, el <em><strong>siguiente byte</strong></em> es el valor del <strong><em>multiplicador</em></strong> y por ultimo se tiene el <strong><em>bit extra</em></strong>.</p>
<p>Se puede observar que los tres números formados son de 17 bits cuando los números que se van a multiplicar son de 8 de modo que los números formados siempre serán de <em>N+1 bits</em>, siendo <em>N</em> el <em>número de bits de los factores</em>.</p>
<p>Sigamos entonces. Este algorítmo consiste en <em><strong>comparar los últimos dos digitos del número P</strong></em> y dependiendo de el caso que sea <em><strong>realizar un suma o no realizar ninguna acción</strong></em>. Luego de evaluar cada caso se debe <strong><em>realizar un corrimiento a la derecha</em></strong>, <em>manteniendo el valor del bit más significativo y desechando el valor del bit menos significativo</em>. Los cuatro casos que se tienen se pueden ver en la siguiente tabla:</p>
<p><em>0 0 -&gt; No realizar ninguna acción<br />
0 1 -&gt; P = P + A<br />
1 0 -&gt; P = P + S<br />
1 1 -&gt; No realizar ninguna acción</em></p>
<p>Veamos el algoritmo paso a paso usando los numeros <em>A</em>, <em>S</em> y <em>P</em> de arriba. Primero tenemos el numero P original:</p>
<p><em>0000 0000 1111 101[0 0] <strong>P</strong></em></p>
<p>Se comparan los ultimos dos digitos [0 0] con los cuatro casos posibles y se ve que no se debe realizar ninguna accion por lo que en la primer iteracion simplemente se realiza un corrimiento a la derecha:</p>
<p><em>1.<br />
0000 0000 0111 110[1 0] <strong>-&gt;</strong></em></p>
<p>Ahora los ultimos dos digitos [1 0] indican que se debe realizar la suma P=P+S y despues el corrimiento a la derecha:</p>
<p><em>2.<br />
1111 1011 0111 110[1 0] <strong>P=P+S</strong></em><br />
<em>1111 1101 1011 111[0 1] <strong>-&gt;</strong></em></p>
<p>Despues del corrimiento los ultimos dos digitos son [0 1] por lo que se debe realizar la suma P=P+A y despues el corrimiento a la derecha:</p>
<p><em>3.<br />
0000 0010 1011 111[0 1] <strong>P=P+A</strong></em><em><br />
0000 0001 0101 111[1 0] <strong>-&gt;</strong></em></p>
<p>Ahora los ultimos dos digitos son [1 0], se realiza la suma P=P+S y despues el corrimiento a la derecha:<em><br />
</em></p>
<p><em>4.<br />
1111 1100 0101 111[1 0] <strong>P=P+S</strong><br />
1111 1110 0010 111[1 1] <strong>-&gt;</strong></em></p>
<p>Los ultimos dos digitos [1 1] al igual que cuando fueron [0 0] indican que solo se debe realizar el corrimiento a la derecha:</p>
<p><em>5.<br />
1111 1111 0001 011[1 1] <strong>-&gt;</strong></em></p>
<p>De nuevo se tiene [1 1] por lo que se realiza unicamente el corrimiento y en lo sucesivo se tendra siempre el mismo caso:</p>
<p><em>6. 1111 1111 1000 101[1 1] <strong>-&gt;</strong><br />
7. 1111 1111 1100 010[1 1] <strong>-&gt;</strong><br />
8. 1111 1111 1110 0010 [1] <strong>-&gt;</strong></em></p>
<p>Despues de <em>8 iteraciones</em> termina el algoritmo, se desecha el bit menos significativo (el bit extra) y se obtiene el producto de la multiplicacion:<br />
<em>5*(-6) = 1111 1111 1110 0010 = -30</em></p>
<p>Cabe mencionar que el numero de iteraciones que realiza el algoritmo es igual <strong><em>N</em></strong>, que es el <strong><em>numero de bits de los factores</em></strong> y el resultado final es igual a 2N, en este caso se multiplican factores de 8 bits por lo que el resultado final es de 16.</p>
<p>Esta es la manera en la que funciona el algoritmo. Solamente hay que tener en cuenta que al realizar los corrimientos a la derecha se debe mantener siempre el bit mas significativo, esto es que si se tiene &#8216;1101&#8242; y se realiza el corrimiento el resultado sera &#8216;1110&#8242; y no &#8216;0110&#8242;.</p>
<p><strong>Implementacion del algoritmo de Booth en MPASM</strong></p>
<p>Aplicando los pasos que acabo de explicar realice una implementacion del algoritmo de Booth para la multiplicacion en MPASM para realizar multiplicaciones de numeros signados de 8 bits en microcontroladores PIC 16F.</p>
<p>El algoritmo implementado sigue los mismos pasos descritos, compara  los ultimos dos digitos del factor P y realiza alguna de las acciones posibles para despues llevar acabo el corrimiento. Como mencione en un principio el algoritmo solo puede multiplicar numeros que van del <em>-127 al 127</em> y el resultado lo da a traves de los registros <em>RESULTADOH:RESULTADOL</em>.</p>
<p>Para poder utilizar esta rutina <em>(multibooth)</em> se deben declarar los registros <em>A1, A2, A3, S1, S2, S3, P1, P2, P3, MULTIPLICANDO, MULTIPLICADOR, RESULTADOH, RESULTADOL y CONT</em>.</p>
<p>En los registros <em>RESULTADOH:RESULTADOL</em> se muestra el valor positivo del resultado y <em>si este fuera negativo se activa la bandera SIGNO</em> (bit 0 del registro A3) para indicar que se trata de un numero negativo.</p>
<p>Una vez explicado el algoritmo creo que no hay necesidad de explicar la implementacion de la rutina aunque si asi fuera siempre estan los comentarios para exponer y aclarar las dudas.</p>
<p>Espero que esto les sirva.</p>
<p>Descargar codigo: <a title="multiplicacion-mediante-el-algoritmo-de-booth.pdf" href="http://micropic.files.wordpress.com/2008/02/multiplicacion-mediante-el-algoritmo-de-booth.pdf">Multiplicacion mediante el algoritmo de Booth</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/96/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/96/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/96/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=96&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2008/02/02/multiplicacion-mediante-el-algoritmo-de-booth/feed/</wfw:commentRss>
		<slash:comments>19</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>C&#243;mo multiplexar una matriz de leds</title>
		<link>http://micropic.wordpress.com/2008/01/05/cmo-multiplexar-una-matriz-de-leds/</link>
		<comments>http://micropic.wordpress.com/2008/01/05/cmo-multiplexar-una-matriz-de-leds/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 19:48:20 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Multiplexación]]></category>
		<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2008/01/05/cmo-multiplexar-una-matriz-de-leds/</guid>
		<description><![CDATA[Ya empezó un nuevo año así que vamos a empezar con un nuevo tutorial, esta vez con un cómo sobre multiplexación, cómo multiplexar una matriz de leds.

Si se quisiera controlar una sola columna de una matriz de 5&#215;7 leds se necesitaría un puerto completo de un pic, 7 pines para controlar las filas y 1 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=90&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ya empezó un nuevo año así que vamos a empezar con un nuevo tutorial, esta vez con un <i>cómo</i> sobre multiplexación, cómo multiplexar una matriz de leds.</p>
<p><span id="more-90"></span></p>
<p>Si se quisiera controlar una sola columna de una matriz de 5&#215;7 leds se necesitaría un puerto completo de un pic, 7 pines para controlar las filas y 1 para controlar la columna, eso significa que para controlar todos los leds de la matriz se necesitarían 4 puertos de 8 bits, demasiado para un microcontrolador, sobre todo para un 16F628a.</p>
<p>Para reducir el número de pines requeridos las cinco columnas de la matriz son multiplexadas, esto significa que solamente se necesitarán siete pines, uno por cada fila de la matriz, y cinco para habilitar cada una de las columnas.</p>
<p>Usando un pic 16F628a se puede utilizar el puerto B para controlar las filas y el puerto A para las columnas. La técnica de multiplexación consiste en mostrar una columna a la vez, mientras eso se haga lo suficientemente rápido parecerá que todas las columnas estan encendidas a la vez y no se verá ningún parpadeo, por esa misma razón la base de tiempo para la multiplexación es muy importante por lo que se utiliza la interrupción del timer 2 para esa tarea.</p>
<p>La multiplexación es muy sencilla y se ejecuta dentro de la rutina de interrupción del timer 2, se realiza más o menos de la siguiente manera:</p>
<ul>
<li>Espera interrupción</li>
<li>Se deshabilitan las columnas</li>
<li>Se escribe en el puerto B el valor de las filas</li>
<li>Se habilita la primer columna</li>
<li>Espera interrupción</li>
<li>Se deshabilitan las columnas</li>
<li>Se escribe en el puerto B el valor de las filas</li>
<li>Se habilita la siguiente columna</li>
<li>Espera interrupción</li>
<li>&#8230;</li>
</ul>
<p>Así se repite hasta llegar a la quinta columna, entonces la ejecución de la multiplexación vuelve al principio y se vuelve a repetir.</p>
<p>El programa de ejemplo muestra en conteo descendente los números del 9 al 0. La multiplexación se lleva a cabo en la rutina de interrupción del timer 2. El programa principal lo que hace es leer un número almacenado en una variable (un registro de memoria) y decodificarlo para ser desplegado en la matriz, como la matriz es de 5 columnas para decodificar el número se necesitan 5 registros donde se guardaran los valores de las filas de cada columna.</p>
<p>El diagrama del circuito de ejemplo es el siguiente:<br />
<a href="http://micropic.files.wordpress.com/2008/01/ledmultiplex.png" title="ledmultiplex.png"><img src="http://micropic.files.wordpress.com/2008/01/ledmultiplex.png?w=500&#038;h=300" alt="ledmultiplex.png" border="0" height="300" width="500" /></a></p>
<p>Pueden ver un video de este ejemplo en <a href="http://micropic.wordpress.com/2008/01/05/cmo-multiplexar-una-matriz-de-leds/93/" target="_blank" rel="attachment wp-att-93" title="led-multiplex.jpg"></a><a href="http://www.youtube.com/watch?v=VjinnOytc3o" target="_blank">YouTube</a><a href="http://www.youtube.com/watch?v=VjinnOytc3o" target="_blank"><img src="http://micropic.files.wordpress.com/2008/01/led-multiplex.jpg" alt="led-multiplex.jpg" align="absmiddle" border="0" /></a></p>
<p>Descargar código: <a href="http://micropic.files.wordpress.com/2008/01/como-multiplexar-una-matriz-de-leds.pdf">Multiplexar una matriz de 5&#215;8 leds</a></p>
<p>Este tutorial está basado en el tutorial  <a href="http://www.winpicprog.co.uk/pic_tutorial13.htm">How to multiplex a matrix of LED&#8217;s</a>.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/90/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/90/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=90&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2008/01/05/cmo-multiplexar-una-matriz-de-leds/feed/</wfw:commentRss>
		<slash:comments>27</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/2008/01/ledmultiplex.png" medium="image">
			<media:title type="html">ledmultiplex.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2008/01/led-multiplex.jpg" medium="image">
			<media:title type="html">led-multiplex.jpg</media:title>
		</media:content>
	</item>
		<item>
		<title>Teclado Matricial 4&#215;3</title>
		<link>http://micropic.wordpress.com/2007/09/11/teclado-matricial-4x3/</link>
		<comments>http://micropic.wordpress.com/2007/09/11/teclado-matricial-4x3/#comments</comments>
		<pubDate>Wed, 12 Sep 2007 02:26:50 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Rutinas]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/09/11/teclado-matricial-4x3/</guid>
		<description><![CDATA[Después de un tiempo desaparecido regreso con una rutina para controlar un teclado matricial 4&#215;3 con un pic 16F628A. Esta rutina es una adaptación de la rutina original del Teclado Matricial 4&#215;4 hecha por petición popular (ok, un solo comentario, pero alguien lo pidió). La lógica del manejo del teclado matricial 4&#215;3 es la misma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=82&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Después de un tiempo desaparecido regreso con una rutina para controlar un teclado matricial 4&#215;3 con un pic 16F628A. Esta rutina es una adaptación de la rutina original del <a href="http://micropic.wordpress.com/2007/06/13/teclado-matricial-4x4/" target="_blank">Teclado Matricial 4&#215;4</a> hecha por petición popular (ok, un solo comentario, pero alguien lo pidió). La lógica del manejo del teclado matricial 4&#215;3 es la misma que para el teclado 4&#215;4, el nibble bajo del puerto B se configura como salida y el nibble alto como entrada. Se recorre un cero por el nibble bajo y se va incrementando un puntero que es el que nos ayuda a saber exactamente que tecla se presionó.</p>
<p><span id="more-82"></span>Como este teclado cuenta con solo 12 teclas, el puntero llegará hasta 12 y si no se presionó ninguna tecla para entonces la rutina que explora el teclado volverá a empezar. En realidad la lógica es la misma que para el teclado matricial de 16 teclas, así que si desean leer la explicación completa lo pueden hacer en la página del teclado matricial 4&#215;4.</p>
<p>Este es el diagrama de conexión del teclado en un pic 16f628a.</p>
<p><img src="http://micropic.files.wordpress.com/2007/09/tecladomatricial4x3.png" alt="tecladomatricial4x3.png" /></p>
<p>Descargar el código: <a href="http://micropic.files.wordpress.com/2007/09/teclado-matricial-4x3.pdf" title="Teclado Matricial 4×3">Teclado Matricial 4×3</a>.</p>
<p>Con esto vuelvo después de unos meses, espero no tardarme tanto para volver a actualizar el blog. Como siempre sus comentarios son bien recibidos y se aceptan sugerencias para futuros tutoriales.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/82/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/82/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=82&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/09/11/teclado-matricial-4x3/feed/</wfw:commentRss>
		<slash:comments>7</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/09/tecladomatricial4x3.png" medium="image">
			<media:title type="html">tecladomatricial4x3.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Binario a BCD &#8211; Recorre y Suma+3</title>
		<link>http://micropic.wordpress.com/2007/06/21/binario-a-bcd-recorre-y-suma3/</link>
		<comments>http://micropic.wordpress.com/2007/06/21/binario-a-bcd-recorre-y-suma3/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 23:25:47 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/21/binario-a-bcd-recorre-y-suma3/</guid>
		<description><![CDATA[Numero Binario de 8 bits a BCD mediante el algoritmo Recorre y Suma+3
En la entrada anterior se encuentra una rutina para convertir un numero Binario de 8 bits a BCD empleando un metodo de division po restas sucesivas. En esta ocasion presento una rutina para lograr la misma conversion de Binario a BCD empleando el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=69&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Numero Binario de 8 bits a BCD mediante el algoritmo Recorre y Suma+3</strong></p>
<p>En la entrada anterior se encuentra una rutina para <a href="http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/" target="_blank">convertir un numero Binario de 8 bits a BCD</a> empleando un metodo de division po restas sucesivas. En esta ocasion presento una rutina para lograr la misma conversion de Binario a BCD empleando el algoritmo <a href="http://www.engr.udayton.edu/faculty/jloomis/ece314/notes/devices/binary_to_BCD/bin_to_BCD.html">Recorre y Suma+3</a>.</p>
<p><span id="more-69"></span></p>
<p>El algoritmo funciona de la siguiente manera:</p>
<ul>
<li>Recorre 1 bit a la izquierda el numero binario.</li>
<li>Si se han hecho 8 corrimientos, el numero BCD se encuentra en las columnas <em>CENTENAS, DECENAS y UNIDADES</em>.</li>
<li>Si el valor binario de cualquiera de las columnas BCD es <em>5 o mayor</em>, se suma 3 al valor en esta columna BCD.</li>
<li>Si se desea convertir un byte despues de haber efectuado 8 corrimientos la conversion ha finalizado, para 2 bytes se necesitarian 16 y asi sucesivamente.</li>
</ul>
<p>Es un metodo muy facil de entender y aplicar. Utilizando este algoritmo la rutina que permite convertir un numero binario de 8 bits a BCD es la siguiente:</p>
<pre><font color="#993366">BIN2BCD_RS3
        <font color="#000080">clrf     </font>BCDH
        <font color="#000080">clrf     </font>BCDL

        <font color="#000080">movlw    0x08</font>
        <font color="#000080">movwf    </font>CUENTA

CONVERSION1
        <font color="#000080">bcf      </font>STATUS,C
        <font color="#000080">rlf      </font>BIN,f
        <font color="#000080">rlf      </font>BCDL,f
        <font color="#000080">decfsz   </font>CUENTA,f
        <font color="#000080">goto     </font><font color="#808080">$+</font><font color="#000000">2</font>
        <font color="#000080">goto     </font>TERMINA_CONVERSION
        <font color="#000080">movlw    b'00001111'</font>
        <font color="#000080">andwf    </font>BCDL,w
        <font color="#000080">movwf    </font>BCD_TEMP
        <font color="#000080">movlw    0x05</font>
        <font color="#000080">subwf    </font>BCD_TEMP,w
        <font color="#000080">btfsc    </font>STATUS,C
        <font color="#000080">call     </font>SUMA0x03
        <font color="#000080">movlw    b'11110000'</font>
        <font color="#000080">andwf    </font>BCDL,w
        <font color="#000080">movwf    </font>BCD_TEMP
        <font color="#000080">movlw    0x50</font>
        <font color="#000080">subwf    </font>BCD_TEMP,w
        <font color="#000080">btfsc    </font>STATUS,C
        <font color="#000080">call     </font>SUMA0x30
        <font color="#000080">goto     </font>CONVERSION1

TERMINA_CONVERSION
        <font color="#000080">return </font></font></pre>
<p>Al igual que la rutina anterior, antes de llamar a esta rutina de conversion es necesario tener almacenado el numero que se desea convertir en la variable <strong><em>BIN</em></strong>. Al finalizar la rutina el numero BCD estara almacenado en las variables <strong><em>BCDH </em></strong>y <strong><em>BCDL. </em></strong>El nibble bajo de BCDH tendra almacenadas las <em>CENTENAS</em>, el nibble alto de BCDL las <em>DECENAS </em>y el nibble bajo de BCDL las <em>UNIDADES</em>.</p>
<p>De nuevo hay que tener en cuenta que al realizar la conversion el numero que se tenia en un principio en la variable BIN es destruido, asi que se debe tener un respaldo de su valor en otro registro si se desea seguir trabajando con el.</p>
<p>Las rutinas SUMA0&#215;03 Y SUMA0&#215;30 simplemente se encargan de sumar 3 a la columna BCD que lo necesite. Estas rutinas se encuentran en el codigo de la rutina.</p>
<p>Descargar codigo: <a href="http://micropic.files.wordpress.com/2007/06/conversion-numero-binario-de-8-bits-a-bcd-recorre-y-suma3.pdf" title="conversion-numero-binario-de-8-bits-a-bcd-recorre-y-suma3.pdf">Conversion numero Binario de 8 bits a BCD &#8211; Recorre y Suma+3</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/69/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/69/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=69&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/21/binario-a-bcd-recorre-y-suma3/feed/</wfw:commentRss>
		<slash:comments>36</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>Conversion Binario a BCD &#8211; Convertir un numero de 8 bits</title>
		<link>http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/</link>
		<comments>http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 16:41:33 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Ensamblador]]></category>
		<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/</guid>
		<description><![CDATA[Convertir un numero Binario de 8 bits a BCD
El Codigo binario decimal (BCD) es un codigo para numeros decimales en el que cada digito es representado por su propia secuencia binaria. Su principal ventaja es que permite una conversion facil a digitos decimales para su despliegue y permite tambien realizar calculos decimales mas rapidos.
Aqui se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=66&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Convertir un numero Binario de 8 bits a BCD</strong></p>
<p>El <em><strong>Codigo binario decimal</strong></em> (BCD) es un codigo para numeros decimales en el que cada digito es representado por su propia secuencia binaria. Su principal ventaja es que permite una conversion facil a digitos decimales para su despliegue y permite tambien realizar calculos decimales mas rapidos.</p>
<p>Aqui se presenta una rutina para convertir un numero binario a BCD, precisamente un numero de 8 bits (1 byte) a su equivalente BCD. El valor maximo de un byte es <em><strong>0xFF = 255</strong></em>, asi que al convertir un <em>numero binario de 8 bits</em> se obtienen <em>3 digitos BCD</em>.</p>
<p><span id="more-66"></span>Esta rutina convierte el numero binario a su equivalente BCD empaquetado.  El resultado de la conversion del numero binario a BCD ocupa un byte y medio y se representa en las variables de memoria <em><strong>BCDH </strong></em>y <strong><em>BCDL</em></strong>. El numero binario a convertir debe estar almacenado en la variable <em><strong>BIN</strong>.</em></p>
<pre>ej. 0xFF = 255
 BIN -&gt; BCDH:BCDL
  FF     02   55</pre>
<p>La conversion se hace realizando <strong><em>divisiones mediante restas sucesivas</em></strong>. Primero entre 100 para obtener el nibble bajo de BCDH y despues entre 10 para obtener el nibble alto de BCDL y el residuo pasa a formar el nibble bajo de BCDL.</p>
<p>El codigo de la rutina es el siguiente:</p>
<pre><font color="#993366">BIN8_BCD3
        <font color="#000080">clrf    </font>BCDH
        <font color="#000080">clrf    </font>BCDL</font><font color="#993366">
</font><font color="#993366">BCD_HIGH
        <font color="#000080">movlw   </font><font color="#008000">.100</font>
        <font color="#000080">subwf   </font>BIN,f
        <font color="#000080">btfss   </font>STATUS,C
        <font color="#000080">goto    </font>SUMA_100
        <font color="#000080">incf    </font>BCDH,f
        <font color="#000080">goto    </font>BCD_HIGH
SUMA_100
        <font color="#000080">movlw   </font><font color="#008000">.100</font>
        <font color="#000080">addwf   </font>BIN,f
        <font color="#000080">movlw   0x0F</font>
        <font color="#000080">movwf   </font>BCDL
BCD_LOW <font color="#000080">movlw   </font><font color="#008000">.10</font>
        <font color="#000080">subwf   </font>BIN,f
        <font color="#000080">btfss   </font>STATUS,C
        <font color="#000080">goto    </font>SUMA_10
        <font color="#000080">incf    </font>BCDL
        <font color="#000080">movlw   0x0F</font>
        <font color="#000080">iorwf   </font>BCDL
        <font color="#000080">goto    </font>BCD_LOW
SUMA_10 <font color="#000080">movlw   </font><font color="#008000">.10</font>
        <font color="#000080">addwf   </font>BIN,f
        <font color="#000080">movlw   0xF0</font>
        <font color="#000080">andwf   </font>BCDL,f
        <font color="#000080">movf    </font>BIN,w
        <font color="#000080">iorwf   </font>BCDL,f</font></pre>
<pre><font color="#993366">        <font color="#000080">return</font></font></pre>
<p>Antes de llamar a la rutina de conversion es necesario tener almacenado el numero que se desea convertir en la variable BIN. Al finalizar la rutina el numero BCD estara almacenado en las variables BCDH y BCDL. BCDH tendra el numero BCD mas significativo mientras que en BCDL se encontraran los dos numeros restantes, siendo el nibble alto de BCDL el mas significativo de los dos y el nibble bajo de BCDL el menos significativo.</p>
<p>De este modo se logra convertir un numero binario de 8 bits a su equivalente BCD. Solamente hay que tener en cuenta que al realizar la conversion el numero que se tenia en un principio en la variable BIN es destruido, asi que se debe tener un respaldo de su valor en otro registro si se desea seguir trabajando con el.</p>
<p>Descargar codigo: <a href="http://micropic.files.wordpress.com/2007/06/conversion-numero-binario-de-8-bits-a-bcd.pdf" title="conversion-numero-binario-de-8-bits-a-bcd.pdf">Conversion numero Binario de 8 bits a BCD</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/66/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/66/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=66&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/21/conversion-binaria-a-bcd-convertir-un-numero-de-8-bits/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>
	</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>Manejo de Interrupciones</title>
		<link>http://micropic.wordpress.com/2007/06/08/manejo-de-interrupciones/</link>
		<comments>http://micropic.wordpress.com/2007/06/08/manejo-de-interrupciones/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 23:47:46 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/08/manejo-de-interrupciones/</guid>
		<description><![CDATA[Una interrupción es un evento que hace que el microcontrolador deje de ejecutar la tarea que está realizando para atender dicho acontecimiento y luego regrese y continue la tarea que estaba realizando antes de que se presentara la interrupción. El pic 16F628 (y el 16F628A) tiene 10 fuentes de interrupción, si las interrupciones están habilitadas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=55&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Una <strong><em>interrupción</em></strong> es un evento que hace que el microcontrolador deje de ejecutar la tarea que está realizando para atender dicho acontecimiento y luego regrese y continue la tarea que estaba realizando antes de que se presentara la interrupción. <em>El pic 16F628 (y el 16F628A) tiene <strong>10 fuentes de interrupción</strong></em>, si las interrupciones están habilitadas cada vez que una de estos acontecimientos se presente el pic dejará de ejecutar el programa para ir a atender la interrupción y al termino de la misma continuará ejecutando el programa donde lo había dejado. Las fuentes de interrupción son:</p>
<ul>
<li>Interrupción externa RB0/INT</li>
<li>Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)</li>
<li>Interrupción por desborde del timer 0 (TMR0)</li>
<li>Interrupción por desborde del timer 1 (TMR1)</li>
<li>Interrupción por comparación exitosa exitosa en TMR2</li>
<li>Interrupción del comparador</li>
<li>Interrupción del transmisor del USART</li>
<li>Interrupción del receptor del USART</li>
<li>Interrupción del módulo CCP</li>
<li>Interrupción del EEPROM</li>
</ul>
<p><span id="more-55"></span>Aunque el pic cuenta con 10 fuentes distintas de interrupción solamentetiene un vector de interrupción por lo que si se habilitan varias interrupciones al momento de presentarse cualquiera de ellas el programa saltara a la misma rutina de interrupcion y es responsabilidad del programador crear una rutina que identifique la fuente de la interrupcion.</p>
<p>Los registros asociados con las interrupciones son el <em>registro de control de interrupcion</em> <strong>INTCON</strong>, el <em>registro habilitacion de interrupciones de perifericos</em> <strong>PIE1</strong> y el <em>registro de interrupciones de perifericos</em> <strong>PIR1</strong>. En el registro <strong>INTCON</strong> se encuentra el bit de <em>habilitacion global de interrupciones</em> <strong>GIE</strong>, el bit de <em>habilitacion de interrupcion por perifericos</em> <strong>PEIE</strong> y los bits de habilitacion de algunas interrupciones como la <em>interrupcion externa del pin RB0</em> (<strong>INTE</strong>), la <em>interrupcion por cambio de estado en los pines RB4 a RB7</em> (<strong>RBIE</strong>) y la <em>interrupcion por desborde del timer 0</em> (<strong>T0IE</strong>), asi como las banderas correspondientes a cada interrupcion (<strong>INTF</strong>, <strong>RBIF</strong> y <strong>T0IF</strong>). En el registro PIE1 se encuentran los bits de habilitacion de las demas interrupciones y en el registro PIR1 se encuentran las banderas asociadas con cada interrupcion.</p>
<p>Para habilitar las interrupciones se deben seguir los siguientes pasos:</p>
<ul>
<li>Habilitar el bit correspondiente a cada interrupcion.</li>
<li>Limpiar la bandera correspondiente a la interrupcion habilitada para evitar falsas interrupciones.</li>
<li>En caso de ser necesario habilitar el bit <em>PEIE</em> del registro <em>INTCON</em> (necesario para todas las interrupciones con excepcion de <em>INTE</em> y <em>RBIE</em>).</li>
<li>Habilitar el bit de habilitacion global de interrupciones <em>GIE</em> del registro <em>INTCON</em>.</li>
</ul>
<p>En el codigo tambien es necesario indicar hacia que rutina debe saltar el programa al presentarse la interrupción. Ya se dijo que el vector de interrupción está en la dirección 0&#215;04 por lo que es necesario agregar las lineas <em><strong>org 0&#215;04 </strong></em>y <strong><em>goto ISR</em></strong> al programa, donde <strong><em>ISR</em></strong> es la rutina de servicio de interrupción y puede, desde luego, tener cualquier otro nombre.</p>
<p>La ventaja de utilizar interrupciones es que mientras se espera a que se presente el evento que produce la interrupción el microcontrolador puede estar ejecutando cualquier otra tarea. De ese modo el micro no esta ciclado en una sola tarea sino que puede seguir trabajando en otras hasta que una interrupción haga que el programa salte y ejecute la tarea que se quiera y al terminarla el programa continuara su ejecución en el punto en el que se encontraba en el momento de presentarse la interrupción.</p>
<p>En el ejemplo pasado se vió <a href="http://micropic.wordpress.com/wp-admin/Leer%20botones%20e%20interruptores" target="_blank">como leer botones e interruptores</a>,  ahora se va a realizar el mismo programa pero haciendo uso de interrupciones y para que se aprecie que el microcontrolador puede realizar otra tarea mientras se espera la interrupción el programa hará que parpadee el puerto A cada medio segundo. Por lo demas el programa sera igual, tendra 4 botones conectados a los pines RB4 a RB7 y 4 leds conectados a la parte baja del puerto B. Se habilitarán las interrupciones y de ese modo los botones se leerán solamente al ser presionados.  Veamos entonces el codigo:</p>
<p><img src="http://micropic.files.wordpress.com/2007/06/int1.png" /></p>
<p>Ese es el código del programa principal. Se comienza declarando el vector de reset y el vector de interrupcion, después se configuran los puertos, el puerto A como salida, la parte baja del puerto B como salida y la parte alta del puerto B como entrada. Hasta ahí lo único nuevo es la declaración del vector de reset. Después se configuran las  interrupciones: Primero <em>se habilita el bit <strong>RBIE</strong> del registro <strong>INTCON</strong></em> que es el correspondiente a la interrupción por cambio de estado en los pines RB4 a RB7, después <em>se pone a cero el bit <strong>RBIF</strong></em> del mismo registro para poner la bandera de interrupción en cero y así evitar entrar a la rutina de servicio sin que exista una interrupción, y por último <em>se habilita el bit <strong>GIE</strong></em> para habilitar las interrupciones. De esta manera la interrupción queda configurada y habilitada. Es muy importante siempre limpiar las banderas de interrupción antes de habilitar el bit <em>GIE</em>.</p>
<p>Después de configurar las interrupciones se pasa al programa principal que lo único que hace es poner a 1 todos los pines del puerto A, esperar medio segundo, poner a 0 todos los pines del puerto A, volver a esperar medio segundo para iniciar de nuevo el ciclo y así el programa se repite una y otra vez. La tarea de encender los leds correspondientes a cada botón  queda en manos de la rutina de interupción:</p>
<p><img src="http://micropic.files.wordpress.com/2007/06/int2.png" /></p>
<p>La rutina es muy parecida a la del programa del ejemplo anterior con algunos cambios pequeños. Lo importante en la rutina es que al entrar a la misma <em>se deshabilitan las interrupciones al poner a 0 el bit <strong>GIE</strong></em>, con esto evitamos que se produzca otra interrupción mientras se está atendiendo  una. Después de hacer eso el programa simplemente identifica la tecla pulsada y enciende el led correspondiente. Ya que se encendió el led la rutina continua hacia la etiqueta <em><strong>SALIDA_ISR</strong></em> donde primero <em>se limpia la bandera de interrupción poniendo a 0 el bit <strong>RBIF</strong></em> y después se vuelve a <em>habilitar la interrupcion poniendo a 1 el bit <strong>GIE</strong></em><strong>,</strong> ambos del registro <strong><em>INTCON.</em></strong> Para terminar la rutina y regresar al programa principal se utiliza la instrucción <em><strong>retfie</strong></em> (<em><strong>RET</strong>urn <strong>F</strong>rom <strong>I</strong>nt<strong>E</strong>rruption</em>). La rutina de servicio de interrupción siempre debe terminar con esa instrucción.</p>
<p>Por último una imágen del diseño esquemático de este  ejemplo:</p>
<p><img src="http://micropic.files.wordpress.com/2007/06/int3.png" /></p>
<p>Descargar código: <a href="http://micropic.files.wordpress.com/2007/06/manejo-de-interrupciones.pdf">Manejo de interrupciones</a>.</p>
<p>Para mayor información  sobre el uso y configuración de interrupciones y los registros de configuración consulta las hojas de datos proporcionadas por Microchip: <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf" target="_blank">16f628a,</a> <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf" target="_blank">16f877a.</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/55/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/55/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=55&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/08/manejo-de-interrupciones/feed/</wfw:commentRss>
		<slash:comments>15</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/int1.png" medium="image" />

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

		<media:content url="http://micropic.files.wordpress.com/2007/06/int3.png" medium="image" />
	</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>Displays de 7 segmentos</title>
		<link>http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/</link>
		<comments>http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/#comments</comments>
		<pubDate>Tue, 27 Feb 2007 03:40:52 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[MPASM]]></category>
		<category><![CDATA[Rutinas]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/</guid>
		<description><![CDATA[Un display de 7 segmentos no es otra cosa que 7 leds conectados entre si con su ánodo o su cátodo en común. Dependiendo del tipo de display será la manera en que se enciendan sus segmentos, un display de cátodo común requiere un 1 logico para encender mientras que uno de cátodo común un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=41&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Un display de 7 segmentos no es otra cosa que 7 leds conectados entre si con su ánodo o su cátodo en común. Dependiendo del tipo de display será la manera en que se enciendan sus segmentos, un display de cátodo común requiere un 1 logico para encender mientras que uno de cátodo común un 0 así que dependiendo del display que se utilice cambiará la rutina encargada de controlarlo, pero en cualquier caso al momento de cambiar el tipo de display solo debemos cambiar los ceros por unos y viceversa.</p>
<p>Aqui supondremos que se usa un display de cátodo común así que los segmentos encenderán con un 1. El display estará conectado al puerto B, el segmento A estará conectado al bit RB0, el B al RB1, el C al RB2, el D al RB3 y así sucesivamente hasta llegar al G que estará conectado al bit RB6.</p>
<p><span id="more-41"></span></p>
<p>Encender y apagar los segmentos del display es igual que encender y apagar leds, podríamos hacerlo de la misma manera que en el tutorial 1, pero una manera mas eficaz de controlar un display es mdiante una tabla. Haremos que el display muestre los números 0 a 15 en hexadecimal (0 a F) con un retardo de medio segundo entre cada número. Para eso se declara el puerto B como salida. Una vez hecho eso se crea la rutina encargada de mandar llamar el numero correspondiente de una tabla y de desplegar el numero correspondiente por el puerto B. El programa principal es el siguiente:</p>
<p><img src="http://micropic.files.wordpress.com/2007/02/7seg1.png" alt="7seg1.png" /><br />
Y ese es basicamente el programa. Al principio se declaran 4 variables, una se utiliza para llevar la cuenta del numero a desplegar y las demas sirven para la rutina de retardo. Como ya se dijo se <em>configura el puerto B como salida</em> y despues se limpia la variable Numero (<strong><em>clrf NUMERO</em></strong>). Despues el programa entra en una subrutina que se encarga de leer la tabla y de desplegar el numero en el puerto. Primero se mueve el valor de la variable Numero al registro W (<strong><em>movf NUMERO,w</em></strong>) y despues se manda llamar la tabla (<strong><em>call DESPLIEGA</em></strong>), al volver el registro W tiene el valor del numero a desplegar y simplementa se mueve al puerto B (<strong><em>movwf PORTB</em></strong>). Se llama a la rutina de retardo (<strong><em>call RETARDO</em></strong>) y al volver de esta se incrementa el valor de la variable Numero (<strong><em>incf NUMERO,f</em></strong>) y despues se transfiere ese valor al registro W (<strong><em>movf NUMERO,w</em></strong>). Esto se hace para realizar una comparacion entre W y la <em>literal 0&#215;10</em> (16 en valor decimal) para saber si la variable Numero ya fue incrementada 16 veces, si es asi se salta la siguiente instruccion y el programa se repite desde la etiqueta <em>Principal</em>, si no es asi el programa regresa a la etiqueta <em>Ciclo</em>. De este modo el numero se incrementa de 0 a F y al llegar a F regresa a 0. La comparacion se realiza mediante la instruccion <strong><em>sublw 0&#215;10</em></strong> si el resultado es cero (en caso de que <em>NUMERO=16</em>) la bandera <em>ZERO</em> se pone en 1 y es esa la bandera que se revisa en <strong><em>btfss STATUS,Z</em></strong>.</p>
<p>Como ya se dijo antes de llamar la rutina que lee la tabla se carga el valor de la variable Numero en W, esto se hace asi ya que al entrar a la rutina se realiza una suma entre W y el <em>contador de programa PCL</em> para <em>montarlo en un offset</em>, asi el contador apuntara a la direccion que seguia mas el valor de la variable Numero. Asi la rutina de la table queda de la siguiente manera:</p>
<p><img src="http://micropic.files.wordpress.com/2007/02/7seg2.png" alt="7seg2.png" /><br />
Y asi, de este modo se decodifica un display de 7 segmentos. La rutina de retardo se omitio en la explicacion ya que los retardos se explicaron anteriormente, de cualquier forma se incluye en el codigo del programa. <a href="http://micropic.files.wordpress.com/2007/02/display-7-segmentos.pdf" title="display-7-segmentos.pdf">Descargar codigo</a>.</p>
<p>Como nota final: Las imagenes que contienen el codigo en esta ocasion se ven algo distintas que en los tutoriales pasados, ese descuadre se debe a que el codigo se escribio utilizando MPLAB bajo linux, pero en realidad se conservan los mismos espacios y tabulaciones que en ocasiones anteriores, eso se puede ver al descargar el codigo completo.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/41/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/41/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=41&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/02/26/displays-de-7-segmentos/feed/</wfw:commentRss>
		<slash:comments>22</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/02/7seg1.png" medium="image">
			<media:title type="html">7seg1.png</media:title>
		</media:content>

		<media:content url="http://micropic.files.wordpress.com/2007/02/7seg2.png" medium="image">
			<media:title type="html">7seg2.png</media:title>
		</media:content>
	</item>
	</channel>
</rss>