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

<channel>
	<title>veys.com &#187; pic16</title>
	<atom:link href="http://veys.com/tag/pic16/feed/" rel="self" type="application/rss+xml" />
	<link>http://veys.com</link>
	<description>if I only had a tagline.</description>
	<lastBuildDate>Tue, 27 Sep 2011 21:35:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Conditional Jumping in PIC16 Assembly</title>
		<link>http://veys.com/2003/02/27/conditional-jumping-in-pic16-asm/</link>
		<comments>http://veys.com/2003/02/27/conditional-jumping-in-pic16-asm/#comments</comments>
		<pubDate>Fri, 28 Feb 2003 03:51:09 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[howtos]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[pic16]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=237</guid>
		<description><![CDATA[PIC Microcontrollers have a funky way of handling conditionals. I&#8217;d like to present a set of macros I&#8217;ve made to make this easier to use, as well as explain the basics behind the technique in general. Most MCU&#8217;s I&#8217;ve worked with before PICs had nice simple conditional statements&#8230; The mnemonic was usually to the effect [...]]]></description>
			<content:encoded><![CDATA[<p>PIC Microcontrollers have a funky way of handling conditionals. I&#8217;d like to present a set of macros I&#8217;ve made to make this easier to use, as well as explain the basics behind the technique in general.</p>
<p>Most MCU&#8217;s I&#8217;ve worked with before PICs had nice simple conditional statements&#8230; The mnemonic was usually to the effect of &#8220;branch if x to destination&#8221;. Not so on the PICs.</p>
<p>On a PIC, we have to do an operation between the data to test, then either skip the next instruction or not, based on the results of this test.</p>
<p>Take the instruction &#8220;BTFSS&#8221; meaning &#8220;Bit-test F, Skip if Set&#8221;. This instruction takes a register and a bit number, and will jump over the next instruction if that bit number in the register is set. For example:</p>
<p>We have 2 registers, REG1 and REG2. We want to know if the value in REG1 equals the value in REG2. A quick, simple way to do this is first to load one into W, then subtract the other from it, with the result going in to W as not to destroy one of the variables. This sets the &#8220;ZERO&#8221; bit in the STATUS register to either 1 if the operation resulted in a 0, or 0 otherwise. We know if the operation resulted in 0 the two values are equal, so we can code like so:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">TESTIFZERO
  movf REG1<span style="color: #339933;">,</span> w
  subwf REG2<span style="color: #339933;">,</span> w
  btfss STATUS<span style="color: #339933;">,</span> Z
    <span style="color: #000000; font-weight: bold;">goto</span> NOTEQUAL
EQUAL
  <span style="color: #666666; font-style: italic;">; they were equal</span>
  <span style="color: #000000; font-weight: bold;">goto</span> DONETESTING
NOTEQUAL
  <span style="color: #666666; font-style: italic;">; they weren't equal</span></pre></div></div>

<p>So we can test for equality.</p>
<p>We can also macro-ize it for ease of use&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">BEQ <span style="color: #000000; font-weight: bold;">macro</span> REG1<span style="color: #339933;">,</span> REG2<span style="color: #339933;">,</span> DEST	<span style="color: #666666; font-style: italic;">; branch if REG1 == REG2</span>
  movf REG2<span style="color: #339933;">,</span> W			<span style="color: #666666; font-style: italic;">; W &amp;lt;- REG2</span>
  subwf REG1<span style="color: #339933;">,</span> W			<span style="color: #666666; font-style: italic;">; W &amp;lt;- REG1 - REG2</span>
  btfsc STATUS<span style="color: #339933;">,</span> Z		<span style="color: #666666; font-style: italic;">; if result was nonzero: skip out</span>
    <span style="color: #000000; font-weight: bold;">goto</span> DEST			<span style="color: #666666; font-style: italic;">; otherwise jump</span>
  <span style="color: #000000; font-weight: bold;">endm</span></pre></div></div>

<p>This gives us a macro we can call with 2 registers and a destination, and have it jump there if the condition ends up being true, and just pass on through if it&#8217;s not true. Much, much easier to use.</p>
<p>The other tests: inequality, less than, greater than, less than or equal to, greater than or equal to and so on follow a similar pattern. They are all covered in the &#8220;conditionals.inc&#8221; file I use quite often. I have both register-register comparisons and register-literal comparisons in there. Feel free to grab a copy and use it in your next project.</p>
<h3>Downloads</h3>
<ul>
<li><a href="http://www.veys.com/wp-content/uploads/2008/07/conditionals.zip">conditionals</a> (zip)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2003/02/27/conditional-jumping-in-pic16-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  veys.com/tag/pic16/feed/ ) in 0.50963 seconds, on May 19th, 2012 at 3:29 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 19th, 2012 at 3:31 pm UTC -->
