<?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; Tutorial</title>
	<atom:link href="http://micropic.wordpress.com/category/tutorial/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; Tutorial</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>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>Temporizador Timer 2</title>
		<link>http://micropic.wordpress.com/2007/06/24/temporizador-timer-2/</link>
		<comments>http://micropic.wordpress.com/2007/06/24/temporizador-timer-2/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 06:45:38 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/24/temporizador-timer-2/</guid>
		<description><![CDATA[El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un preescalador y un post-escalador. Además este módulo cuenta con un registro de periodo PR2 que marca el valor máximo que puede alcanzar la cuenta del registro TMR2. A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=78&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El <strong>Timer 2</strong> es un <em>temporizador de 8 bits</em> que tiene la particularidad de tener un <strong><em>preescalador</em></strong> y un <strong><em>post-escalador</em></strong>. Además este módulo cuenta con un registro de periodo <strong><em>PR2</em></strong> que marca el valor máximo que puede alcanzar la cuenta del registro <strong><em>TMR2.</em></strong> A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa su cuenta hasta llegar a 0xFF y después al desborde sino que <em>incrementa su cuenta desde 0&#215;00 con cada ciclo de instrucción hasta que el valor del registro TMR2 coincide con el del registro PR2</em> y después, en el siguiente ciclo reinicia la cuenta desde <em>0&#215;00.</em></p>
<p><span id="more-78"></span>Este módulo cuenta con un <strong><em>preescalador</em></strong> y un <strong><em>post-escalador</em></strong>. El preescalador tiene la misma función que en los otros dos timers y sirve<br />
como divisor de frecuencia antes de cada incremento. El post-escalador funciona como un divisor de frecuencia después de cada coincidencia<br />
entre los registros <strong><em>TMR2</em></strong> y <strong><em>PR2.</em></strong> <em>Si el post-escalador es 1:1 la bandera de interrupción TMR2IF se habilitará en cada coincidencia entre TMR2 y PR2, en cambio si por ejemplo el post-escalador es 1:16, la interrupción se presentará cada 16 coincidencias.</em></p>
<p>Este temporizador, al igual que el Timer 1, <em>puede habilitarse y deshabilitarse mediante el bit <strong>TMR2ON</strong></em><strong>.</strong></p>
<p>El <em>preescalador</em> se selecciona con los bits <strong><em>T2CKPS1:T2CKPS0</em></strong> y el <em>post-escalador</em> con los bits <strong><em>T0UTPS3:TOUTPS0</em></strong> de la siguiente manera:</p>
<pre>Preescalador        Post-escalador
 00 = 1:1            0000 = 1:1
 01 = 1:4            0001 = 1:2
 1x = 1:16           0010 = 1:3
			  .
			  .
			  .
		     1111 = 1:16</pre>
<p><strong>Carga y Temporización</strong></p>
<p>La <strong><em>temporización</em></strong> del Timer 2 está dada por la siguiente expresión:</p>
<p>TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr</p>
<p>Donde<br />
<strong><em>Preescaler</em></strong> = Valor del preescalador<br />
<strong><em>PR2</em></strong> = Valor cargado al registro PR2<br />
<strong><em>Postscaler</em></strong> = Valor del post-escalador<br />
<strong><em>Tinstr</em></strong> = 4/frecuencia de oscilación<br />
<strong><em>TempTMR2</em></strong> = Temporización dada en segundos</p>
<p>La <strong><em>temporización máxima</em></strong> que puede alcanzar el Timer 2 es <em>la misma que alcanza el Timer 0</em>. Utilizando el oscilador interno del pic 16f628 la temporización máxima sería de <strong><em>65536uS.</em></strong> Si se desea otra temporización se puede lograr cargando el valor necesario al registro <strong><em>PR2.</em></strong></p>
<p>PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1</p>
<p>Veamos el mismo ejemplo de los temporizadores anteriores, ahora aplicado al Timer 2: Se desea complementar el valor del puerto B cada<br />
50ms. Se estará revisando que se haya cumplido el tiempo de la temporizacion checando la bandera TMR2IF. Utilizando la expresión de la<br />
precarga y utilizando el preescalador y el post-escalador  más grande (16) obtenemos el valor quer que necesitamos cargar al registro PR2 para obtener una temporizacion de 50mS.</p>
<p>PR2 = [([50mS/(4/4Mhz)])/(16*16)]-1 = 194.31</p>
<p>Ya que no podemos cargar numeros fraccionarios el valor del registro PR2 necesario es 194. El código del  programa sería el siguiente:</p>
<pre><font color="#993366">INICIO
	<font color="#000080">bsf</font>     STATUS,RP0
	<font color="#000080">clrf</font>    TRISB
	<font color="#000080">bcf</font>     STATUS,RP0
<font color="#000080">	movlw   b'01111010'</font>
	<font color="#000080">movwf</font>   T2CON
	<font color="#000080">clrf</font>    PORTB
	<font color="#000080">bcf</font>     PIR1,TMR2IF</font></pre>
<pre><font color="#993366">PRECARGA
	<font color="#000080">bcf</font>     T2CON,TMR2ON</font>
<font><font color="#993366">	<font color="#000080">bsf </font>    <font color="#993366">STATUS,RP0</font></font></font><font><font color="#993366">
	<font color="#000080">movlw</font>   <font color="#008000">.194</font></font></font><font color="#993366">
</font><font><font color="#993366">	<font color="#000080">movwf</font>   <font color="#993366">PR2</font></font></font><font><font color="#993366">
	<font color="#000080">bcf  </font>   <font color="#993366">STATUS,RP0</font></font></font><font><font color="#993366">
	<font color="#000080">bsf  </font>   <font color="#993366">T</font></font></font><font color="#993366">2CON,TMR2ON</font></pre>
<pre><font color="#993366">ESPERA
	<font color="#000080">btfss</font>   PIR1,TMR2IF
	<font color="#000080">goto</font>    ESPERA
	<font color="#000080">bcf</font>     PIR1,TMR2IF
	<font color="#000080">comf</font>    PORTB,f
	<font color="#000080">goto</font>    PRECARGA</font></pre>
<p>Descargar código: <a href="http://micropic.files.wordpress.com/2007/06/ejemplo-del-temporizador-timer-2.pdf" title="ejemplo-del-temporizador-timer-2.pdf">Ejemplo del temporizador Timer 2</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/78/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/78/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/78/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/78/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/78/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=78&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/24/temporizador-timer-2/feed/</wfw:commentRss>
		<slash:comments>8</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>Temporizador Timer 1</title>
		<link>http://micropic.wordpress.com/2007/06/24/temporizador-timer-1/</link>
		<comments>http://micropic.wordpress.com/2007/06/24/temporizador-timer-1/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 03:17:27 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/24/temporizador-timer-1/</guid>
		<description><![CDATA[El Timer 1 es un módulo temporizador/contador de 16 bits, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este módulo incrementa su cuenta desde 0&#215;000 hasta 0xFFFF y al desbordarse vuelve a 0&#215;0000. Al presentarse el desborde la bandera de interrupción TMR1IF se pone a 1 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=76&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El <strong>Timer 1</strong> es un módulo <em>temporizador/contador</em> de <strong><em>16 bits</em></strong>, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este módulo incrementa su cuenta desde <em>0&#215;000</em> hasta <em>0xFFFF</em> y al desbordarse vuelve a <em>0&#215;0000.</em> Al presentarse el desborde la bandera de interrupción <strong><em>TMR1IF</em></strong> se pone a 1 y, si está habilitada, la interrupción se presenta.</p>
<p><span id="more-76"></span>Este módulo al igual que el <a href="http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/" target="_blank">Timer 0</a> puede funcionar en modo temporizador y en modo contador. En <strong><em>modo temporizador</em></strong> el <em>par de registros TMR1</em> <em>se incrementa en cada ciclo de instrucción</em>, este modo se <em>selecciona poniendo a 0 el bit <strong>TMR1CS</strong> del registro <strong>T1CON</strong></em><strong>.</strong> En <em><strong>modo contador</strong></em> el <em>par de registros TMR1</em> <em>se incrementa en cada flanco ascendente</em> de una señal de reloj externa, este modo se <em>selecciona poniendo a 1 el bit <strong>TMR1CS</strong> del registro <strong>T1CON</strong></em><strong>.</strong></p>
<p>El <strong><em>preescalador</em></strong> del Timer 1 tiene un valor máximo de 8 y se selecciona con los bits <strong><em>T1CKPS1:T1CKPS0</em></strong> de la siguiente manera:</p>
<pre> 00 = 1:1
 01 = 1:2
 10 = 1:4
 11 = 1:8</pre>
<p>A diferencia del Timer 0, <em>el Timer 1 tiene la posibilidad de activar o detener</em> la cuenta mediante el bit <strong><em>TMR1ON</em></strong> del registro <strong><em>T1CON.</em></strong></p>
<p><strong>Carga y Temporización</strong></p>
<p>En modo temporizador el Timer 1 incrementa su cuenta en cada ciclo de instrucción. La <strong><em>temporización</em></strong> que se puede obtener con este módulo se obtiene de la siguiente relación:</p>
<p>TempTMR1 = [(65536 - precarga)*PS]*Tinstr</p>
<p>Donde:<br />
<strong><em>precarga</em></strong> = Valor que se le asigna al par de registros TMR1 al comenzar la temporización<br />
<strong><em>PS</em></strong> = Valor del preescalador<br />
<strong><em>Tinstr</em></strong> = 4/frecuencia de oscilación<br />
<strong><em>TempTMR1</em></strong> = Temporización dada en segundos</p>
<p>La <strong><em>temporización máxima</em></strong> utilizando el oscilador interno del pic 16f628 y el valor más grande de preescalador es:</p>
<p>TempTMR1.Max = [(65536 - 0)*8]*1uS = 524288uS</p>
<p>De modo que la <strong><em>temporización máxima</em></strong> que se puede tener con este temporizador, <em>utilizando el oscilador interno de 4Mhz del pic 16f628</em>,<br />
es de <strong><em>524.288mS</em></strong>. Con la misma frecuencia de oscilación el Timer 0 solamente podia lograr una temporización de 65.538mS así que con el<br />
Timer 1 se logran temporizaciones de mayor duración. Si se desea obtener una temporización distinta solo se debe escribir en el par de registros TMR1 el valor de la <em><strong>precarga</strong> necesaria para la temporización deseada</em>.</p>
<p>precarga = -[([Temporizacion/(4/fosc)])/PS]+65536</p>
<p>Veamos el mismo ejemplo que el del temporizador Timer 0 ahora aplicado al Timer 1: Se desea complementar el valor del puerto B cada 50mS. Se estará revisando que se haya cumplido el tiempo de la temporización checando la bandera TMR1IF. Utilizando la expresión de la precarga y utilizando el preescalador más grande (8) obtenemos el valor que necesitamos cargar al par de registros TMR1 para obtener una temporización de 50mS.</p>
<p>precarga = -[([50mS/(4/fosc)])/8]+65536 = 59286 = 0xE796</p>
<p>Así que <em>para obtener una temporización de 50mS mediante el Timer 1</em> se debe cargar <strong><em>0xE7</em></strong> al registro <strong><em>TMR1h</em></strong> y <strong><em>0&#215;96</em></strong> al registro <strong><em>TMR1L.</em></strong> El código del programa sería el siguiente:</p>
<pre><font color="#800080"><font color="#993366">INICIO</font>
    <font color="#000080">bsf</font>     <font color="#993366">STATUS,RP0</font>
    <font color="#000080">clrf</font>    <font color="#993366">TRISB</font>
    <font color="#000080">bcf</font>     <font color="#993366">STATUS,RP0</font>
<font color="#000080">    movlw   b'00110000'</font>
    <font color="#000080">movwf</font>   <font color="#993366">T1CON</font>
    <font color="#000080">clrf</font>    <font color="#993366">PORTB</font>
    <font color="#000080">bcf</font>     <font color="#993366">PIR1,TMR1IF</font></font></pre>
<pre><font color="#800080"><font color="#993366">PRECARGA</font>
    <font color="#000080">bcf</font>     <font color="#993366">T1CON,TMR1ON</font>
    <font color="#000080">movlw</font>   <font color="#000080">0xE7</font>
    <font color="#000080">movwf</font>   <font color="#993366">TMR1H</font>
    <font color="#000080">movlw</font>   <font color="#000080">0x96</font>
    <font color="#000080">movwf</font>   <font color="#993366">TMR1L</font>
    <font color="#000080">bsf</font>     <font color="#993366">T1CON,TMR1ON</font></font></pre>
<pre><font color="#800080"><font color="#993366">ESPERA</font>
    <font color="#000080">btfss</font>   <font color="#993366">PIR1,TMR1IF</font>
    <font color="#000080">goto</font>    <font color="#993366">ESPERA</font>
    <font color="#000080">bcf</font>     <font color="#993366">PIR1,TMR1IF</font>
    <font color="#000080">comf</font>    <font color="#993366">PORTB,f</font>
    <font color="#000080">goto</font>    <font color="#993366">PRECARGA</font></font></pre>
<p>La configuración del Timer 1 se realiza mediante las líneas “<strong><em>movlw    b’01100000′</em></strong>” y “<strong><em>movwf    T1CON</em></strong>“.  Mediante estas lineas se <em>configura el timer en modo temporizador</em> (<strong><em>TMR1CS = 0</em></strong>) y <em>se selecciona el preescalador máximo</em> (<strong><em>T1CKPS1:T1CKPS0 = 11</em></strong>). Una vez configurado el timer 1 se limpia el puerto B y la bandera <strong><em>TMR1IF</em></strong> del registro <strong><em>PIR1.</em></strong> Posteriormente <em>se realiza la precarga cargando un <strong>0xE7</strong> al registro <strong>TMR1H</strong></em> y un <strong><em>0&#215;96</em></strong> al registro <strong><em>TMR1L.</em></strong> Nótese que <em>antes de realizar la carga</em> <strong><em>se detuvo el timer</em></strong> poniendo a 0 el bit <strong><em>TMR1ON,</em></strong> esto se hace para evitar errores al momento de cargar el valor a los registros <em>TMR1,</em> <em>después de realizar la carga</em> <strong><em>se enciende el timer</em></strong> poniendo a 1 el bit <strong><em>TMR1ON</em></strong> y en ese momento la temporización comienza.</p>
<p>Para saber si la temporización terminó se está revisando continuamente la bandera <strong><em>TMR1IF</em></strong>. Mientras esta sea 0 la temporización aún no habrá terminado, cuando la bandera es 1 entonces la temporización finalizó, entonces se borra la bandera TMR1IF, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa está complementado el puerto B cada 50mS.</p>
<p>Descargar código:  <a href="http://micropic.files.wordpress.com/2007/06/ejemplo-del-temporizador-timer-1.pdf" title="ejemplo-del-temporizador-timer-1.pdf">Ejemplo del temporizador Timer 1</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/76/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/76/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=76&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/24/temporizador-timer-1/feed/</wfw:commentRss>
		<slash:comments>8</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>Temporizador Timer 0</title>
		<link>http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/</link>
		<comments>http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/#comments</comments>
		<pubDate>Sun, 24 Jun 2007 19:33:38 +0000</pubDate>
		<dc:creator>micropic</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/</guid>
		<description><![CDATA[El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador programable también de 8 bits. Puede funcionar como temporizador o como contador. En modo temporizador el valor del registro TMR0 se incrementa con cada ciclo de instrucción (o cada X ciclos dependiendo del preescalador). En modo contador el valor del [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=74&subd=micropic&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El <strong>Timer 0</strong> es un modulo <em>temporizador/contador</em> de 8 bits que cuenta con un preescalador programable también de 8 bits. Puede funcionar como temporizador o como contador. En <strong><em>modo </em><em>temporizador</em></strong> el valor del registro <em><strong>TMR0</strong></em> <em>se incrementa con cada ciclo de instrucción</em> (o cada X ciclos dependiendo del preescalador). En <em><strong>modo contador</strong></em> el valor del registro <strong><em>TMR0</em></strong> <em>se incrementa en cada flanco</em> (ascendente o descendente) <em>del pin RA4/T0CKI</em>. En ambos casos al desbordarse (pasar de 0xFF a 0&#215;0) el registro TMR0 la bandera de interrupción del timer 0 (bit T0IF del registro INTCON) se pone a 1.</p>
<p><span id="more-74"></span></p>
<p>El <em>modo temporizador</em> se selecciona poniendo a cero el bit <strong><em>T0CS</em></strong> del registro <strong><em>OPTION.</em></strong> Poniendo a uno ese bit el modulo trabaja en <em>modo<br />
contador</em>, en este modo de operación además se debe seleccionar si el incremento se producirá en cada <em>filo ascendente o descendente</em>, al poner a cero el bit <strong><em>T0SE</em></strong> del registro <strong><em>OPTION</em></strong> se selecciona el filo ascendente.</p>
<p>El <strong><em>preescalador</em></strong> es compartido por el <strong><em>Timer 0</em></strong> y por el <strong><em>Watchdog.</em></strong> Se asigna a un módulo o a otro mediante el bit <strong><em>PSA</em></strong> del registro <strong>OPTION.</strong> Poniendo el bit a 1 el preescalador se asigna al <em>Watchdog</em> y poniendolo a 0 el preescalador se asigna al <em>Timer 0</em>. El valor del preescalador se selecciona con los bits <em><strong>PS2:PS0</strong></em> de la siguiente manera:</p>
<pre>PS2:P20    TMR0    WDT
  000      1:2     1:1
  001      1:4     1:2
  010      1:8     1:4
  011      1:16    1:8
  100      1:32    1:16
  101      1:64    1:32
  110      1:128   1:64
  111      1:256   1:128</pre>
<p><strong>Carga y temporización</strong></p>
<p>En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instrucción. Este modo sirve para generar temporizaciones y bases de tiempo de la misma forma que los <a href="http://micropic.wordpress.com/2007/02/09/retardos-por-software/" target="_blank">retardos por software</a>, sin embargo las temporizaciones con el Timer 0 pueden ser más exactas y además se cuenta con la ventaja de que el módulo puede trabajar mediante <em>interrupciones</em> así que el programa puede ejecutar otras isntrucciones mientras se realiza la <strong><em>temporización.</em></strong></p>
<p>La <strong><em>temporización</em></strong> que se puede obtener con este módulo se obtiene de la siguiente relación:</p>
<p>Temporización = [(256 - precarga)*PS+2]*Tinstruccion</p>
<p>Donde:<br />
<strong><em>precarga</em></strong> = Valor que se le asigna al registro TMR0 al comenzar la temporización<br />
<strong><em>PS</em></strong> = Preescalador. Si esta asignado al watchdog tomará el valor de 1<br />
<strong><em>Tinstrucción</em></strong> = 4/frecuencia de oscilación<br />
y la <strong><em>temporización</em></strong> está dada en segundos.</p>
<p>La <strong><em>temporización máxima</em></strong> utilizando el oscilador interno del pic 16f628 es:</p>
<p>Temp.max. = [(256 - 0)*256+2]*1uS = 65528uS</p>
<p>De modo que la <strong><em>temporizacion máxima</em></strong> que se puede tener con el es solamente de <strong><em>65.538mS</em></strong>. Si se desea obtener una temporizacion distinta solo se debe escribir en el registro <strong><em>TMR0</em></strong> el valor de la <strong><em>precarga</em></strong> necesaria.</p>
<p>precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256</p>
<p>Donde, de nuevo, la temporización está dada en segundos.</p>
<p>Veamos un ejemplo de aplicación: Se desea complementar el valor del puerto B cada 50mS. Se estará revisando que se haya cumplido el tiempo de la temporización checando la bandera T0IF. Utilizando la expresión de la precarga y utilizando el preescalador más grande (256) obtenemos el valor que necesitamos cargar al registro TMR0 para obtener una temporización de 50mS.</p>
<p>precarga = -[([50mS/(4/4Mhz)]-2)/256]+256 = 60.69 ≈ 60</p>
<p>Ya que no podemos cargar numeros fraccionarios el valor de precarga necesario es 60. Teniendo entonces el valor de la precarga el código del programa sería el siguiente:</p>
<pre><font color="#993366">INICIO
    <font color="#000080">bsf </font>    STATUS,RP0
    <font color="#000080">clrf</font>    TRISB
    <font color="#000080">movlw   b'00000111'</font>
    <font color="#000080">movwf</font>   OPTION_REG
    <font color="#000080">bcf</font>     STATUS,RP0
    <font color="#000080">clrf </font>   PORTB</font><font><font color="#993366">
    <font color="#000080">bcf	 </font>   INTCON,T0IF</font></font></pre>
<pre><font color="#993366">PRECARGA
    <font color="#000080">movlw </font>  <font color="#339966">.60</font>
    <font color="#000080">movwf</font>   TMR0</font></pre>
<pre><font color="#993366">ESPERA
    <font color="#000080">btfss </font>  INTCON,T0IF
    <font color="#000080">goto</font>    ESPERA
    <font color="#000080">bcf</font>     INTCON,T0IF
    <font color="#000080">comf </font>   PORTB,f
    <font color="#000080">goto</font>    PRECARGA</font></pre>
<p>La configuración del Timer 0 se realiza mediante las líneas &#8220;<strong><em>movlw    b&#8217;00000111&#8242;</em></strong>&#8221; y &#8220;<strong><em>movwf    OPTION_REG</em></strong>&#8220;.  Mediante estas lineas se <em>configura el timer en modo temporizador</em> (<strong><em>T0CS = 0</em></strong>), <em>el preescalador se asigna al timer 0</em> (<em>PSA = 0</em>) y <em>se selecciona el preescalador máximo</em> (<strong><em>PS2:PS0 = 111</em></strong>). Una vez configurado el timer 0 se limpia el puerto B y la bandera <strong><em>T0IF</em></strong>. Posteriormente <em>se realiza la precarga cargando un <strong>60</strong> al registro <strong>TMR0</strong></em> y en ese momento la temporización comienza.</p>
<p>Para saber si la temporización terminó se está revisando la bandera <strong><em>T0IF</em></strong>. Mientras esta sea 0 la temporización aún no habrá terminado, cuando la bandera es 1 entonces la temporización finalizó, se borra la bandera, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa está complementado el puerto B cada 50mS.</p>
<p>Descargar código: <a href="http://micropic.files.wordpress.com/2007/06/ejemplo-del-temporizador-timer-0.pdf" title="ejemplo-del-temporizador-timer-0.pdf">Ejemplo del temporizador Timer 0</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/micropic.wordpress.com/74/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/micropic.wordpress.com/74/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/micropic.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/micropic.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/micropic.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/micropic.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/micropic.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/micropic.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/micropic.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/micropic.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/micropic.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/micropic.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=micropic.wordpress.com&blog=672997&post=74&subd=micropic&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://micropic.wordpress.com/2007/06/24/temporizador-timer-0/feed/</wfw:commentRss>
		<slash:comments>8</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>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>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>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>