<?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; howtos</title>
	<atom:link href="http://veys.com/category/howtos/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.1</generator>
		<item>
		<title>Migrating multi-project Subversion repositories to Git</title>
		<link>http://veys.com/2010/07/24/migrating-multi-project-subversion-repositories-to-git/</link>
		<comments>http://veys.com/2010/07/24/migrating-multi-project-subversion-repositories-to-git/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 00:11:04 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[howtos]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn2git]]></category>
		<category><![CDATA[svnadmin]]></category>
		<category><![CDATA[svndumpfilter]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://veys.com/?p=375</guid>
		<description><![CDATA[So I finally gave in and submitted to the version control Gods, Git is the way to go.  Of course it would happen that Git repositories are typically a single-project-per-repo situation, and I have a couple globbed together Subversion repositories with many projects in them.  How do I separate out my histories from the individual [...]]]></description>
			<content:encoded><![CDATA[<p>So I finally gave in and submitted to the version control Gods, Git is the way to go.  Of course it would happen that Git repositories are typically a single-project-per-repo situation, and I have a couple globbed together Subversion repositories with many projects in them.  How do I separate out my histories from the individual projects, maintain tags and branches, and not lose that precious history that nobody really ever looks at anyway?</p>
<p>Well, luckily there is a nifty script called <a title="svn2git" href="http://github.com/nirvdrum/svn2git">svn2git</a> that gets us the bulk work of migrating history of a single Subversion repo to a new Git repo.  Coupled with a few admin tools that come with Subversion, we got it covered.</p>
<h2>The current situation</h2>
<p>I have a couple repositories, looking like the following:</p>
<pre>/var/lib/svn/repo1
  /project1
    /trunk
    /tags
    /branches
  /project2
    /trunk
    /tags
    /branches
/var/lib/svn/repo2
  /project3
    /trunk
    /tags
    /branches
  /project4
    /trunk
    /tags
    /branches</pre>
<h2>The desired situation</h2>
<p>I&#8217;d like them all separated, with all history!!!  Resulting in the following structure:</p>
<pre>/var/lib/git/project1.git
/var/lib/git/project2.git
/var/lib/git/project3.git
/var/lib/git/project4.git</pre>
<h2>Step 1 &#8211; Dump your projects from the Subversion repository</h2>
<p>Subversion ships with a tool, svnadmin, that will help dump a repository.  It must operate on the local filesystem of the Subversion repository, not a working copy.  As a result, it only dumps full repositories, hence the problem in general.</p>
<p>Be not afraid though!  Subversion also ships with svndumpfilter, the key to our salvation.</p>
<p>For my example above, to dump project1, project2, project3 and project4 into separated Subversion repositories, I would:</p>
<pre>mkdir svn-convert &amp;&amp; cd svn-convert
svnadmin create project1.svn
svnadmin create project2.svn
svnadmin create project3.svn
svnadmin create project4.svn
svnadmin dump /var/lib/svn/repo1 | svndumpfilter include project1 | svnadmin load project1.svn
svnadmin dump /var/lib/svn/repo1 | svndumpfilter include project2 | svnadmin load project2.svn
svnadmin dump /var/lib/svn/repo2 | svndumpfilter include project3 | svnadmin load project3.svn
svnadmin dump /var/lib/svn/repo2 | svndumpfilter include project4 | svnadmin load project4.svn</pre>
<p>And viola, separated Subversion repositories.</p>
<h2>Step 2 &#8211; Convert via svn2git</h2>
<p>First, download and install <a href="http://github.com/nirvdrum/svn2git">svn2git</a>, it&#8217;s a Ruby script, the instructions are good, it&#8217;ll work for you.</p>
<p>Next, create a text file, &#8216;authors.txt&#8217; with contents like the following:</p>
<pre>name1 = Full Name &lt;email@example.com&gt;
name2 = Another Name &lt;email2@example.com&gt;</pre>
<p>Substituting the names of users who have committed to the Subversion repositories of course.  This will map the Subversion users to Git authors.</p>
<p>Next, we make a place for the new repository and run the conversion utility.  It will init the Git repository and create the necessary history.</p>
<pre>mkdir project1.git &amp;&amp; cd project1.git
svn2git file:///home/nick/svn-convert/project1.svn \
    --trunk project1/trunk --branches project1/branches \
    --tags project1/tags --authors ../authors.txt</pre>
<p>Repeated for each repository with appropriate substitutions, and you&#8217;ve got yourself some Git repositories.</p>
<p>Quick verification should show you you&#8217;re in business:</p>
<pre>$ git tag
v1.0
v1.0.1
v1.0.2
v1.0.3</pre>
<pre>$ git branch
* master
  ticket102
  ticket87</pre>
<p>All that is left is to put them in a safe place and start cloning!</p>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2010/07/24/migrating-multi-project-subversion-repositories-to-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restoring from a Samba-based Time Machine backup (kinda)</title>
		<link>http://veys.com/2009/08/16/restoring-from-a-samba-based-time-machine-backup-kinda/</link>
		<comments>http://veys.com/2009/08/16/restoring-from-a-samba-based-time-machine-backup-kinda/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 23:36:31 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[howtos]]></category>
		<category><![CDATA[afp]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[restore]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[smbfs]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[time machine]]></category>

		<guid isPermaLink="false">http://veys.com/?p=354</guid>
		<description><![CDATA[Panicking about not being about to find or mount your Samba share you&#8217;ve been blissfully backing up to over your network?  Trying to restore to a new hard drive using the Leopard boot DVD? I recently had the pleasure of a hard disk crash on my MacBook, and only a month earlier had started backing [...]]]></description>
			<content:encoded><![CDATA[<p>Panicking about not being about to find or mount your Samba share you&#8217;ve been blissfully backing up to over your network?  Trying to restore to a new hard drive using the Leopard boot DVD?</p>
<p>I recently had the pleasure of a hard disk crash on my MacBook, and only a month earlier had started backing up to a Samba-share via Time Machine.  I had the &#8220;how to restore&#8221; question nagging in the back of my head when I set it all up but I figured someone had it figured out, otherwise why would <a href="http://www.oak-tree.us/blog/index.php/2009/06/09/backup-part4">so</a> <a href="http://hupio.wordpress.com/2008/04/27/osx-timemachine-and-sambawindows-share/">many</a> <a href="http://freakymousemats.com/blog/posts/2007/11/01/time-machine-over-smb/">articles</a> exist to show you how to set it up?</p>
<p>I&#8217;ve been trying to find out how people using the <tt>TMShowUnsupportedNetworkVolumes</tt> hack to use Time Machine on smbfs shares have been restoring and it would seem that the answer is &#8220;they aren&#8217;t&#8221;.  That, or they&#8217;re simply using it as an &#8220;oops&#8221; fixer, restoring a file here and there.</p>
<p>When booting from the Leopard DVD, firing up the terminal and attempting to mount the share, the following delightful message shows up:</p>
<p><code> mount_smbfs --&gt; mount_smbfs: failed to load the smb library: Unknown error: 1102<br />
</code></p>
<p>Searching for that was even more disappointing.  Other people running into the issue, no solutions.  It seems smb support is just not available on the boot DVD.</p>
<p>I ran into a possible solution, copy the Time Machine sparse bundle onto a removable hard disk, and hook it up to the laptop.  Unfortunately all my external storage is formatted ReisferFS or ext3, neither are supported filesystems, and I didn&#8217;t feel like changing one just to fix this.</p>
<p>So in comes the hack.  Luckily the Samba share is on an Ubuntu 9.04 (Jaunty) server, so adding support for something Apple <em>does </em>support on the boot DVD is tragically easy.  This is a fairly specific solution, but variations on it will work for many different servers.</p>
<h3>Enter AFP</h3>
<p>Looking through the other available mount applications, we also have <tt>mount_afp</tt> available.  This mounts <a href="http://en.wikipedia.org/wiki/Apple_Filing_Protocol">Apple Filing Protocol</a>-based shares, and it works too, bonus!</p>
<p>So it boils down to enabling AFP on the server and sharing the same volume via AFP.  AFP on Linux (BSD, etc) is supplied by <a href="http://netatalk.sourceforge.net/">netatalk</a>, and here&#8217;s a step-by-step of how I wrapped it all up.</p>
<p>On the server:</p>
<ul>
<li><tt>sudo aptitude install netatalk</tt></li>
<li>Edit <tt>/etc/netatalk/AppleVolumes.default</tt></li>
<li>Add entry for the volume, such as:
<ul>
<li><tt>/mnt/time_machine "tmachine"</tt></li>
</ul>
</li>
<li>Save the file</li>
<li><tt>sudo /etc/init.d/netatalk restart</tt></li>
</ul>
<p>On the Mac:</p>
<ul>
<li>Boot from the Leopard install DVD</li>
<li>Enable Airport (if on WiFi), join your network</li>
<li>From the menu bar, select <strong>Utilities -&gt; Terminal</strong></li>
<li>Navigate to <tt>/Volumes</tt></li>
<li>Create a new mount point for the Time Machine volume
<ul>
<li><tt>mkdir /Volumes/tmachine</tt></li>
</ul>
</li>
<li>Mount the AFP share on the new point (<a href="http://www.macosxhints.com/article.php?story=2001120201020569">details</a>)
<ul>
<li><tt>mount -t afp afp://username:password@server.hostname/tmachine /Volumes/tmachine</tt></li>
</ul>
</li>
<li>Quit Terminal</li>
<li>Back at the main menu bar, select <strong>Utilities -&gt; Restore System From Backup&#8230;</strong></li>
<li>You should see your Time Machine backup volume listed</li>
<li>Select it, and select the date from which you wish to restore</li>
<li>Wait a <em>considerable</em> amount of time for it to determine the space needed</li>
<li>Enjoy the hours and hours of restore time!</li>
</ul>
<h3>Aftermath</h3>
<p>The basic AFP installation added to the server is likely pretty insecure, I purged it as soon as the restore completed.  <a href="http://www.kremalicious.com/2008/06/ubuntu-as-mac-file-server-and-time-machine-volume/">Read this for a more formal treatment on setting up an AFP server on Linux</a>.  It is likely that the real solution is to stop suggesting people use Samba as a file server for Time Machine backups, instead switching to AFP altogether.</p>
<h3>Update</h3>
<p>Just recently came back to this for a Snow Leopard restore, the directions are unchanged.  The nice bonus is there have apparently been some optimizations during the restore, and an initial space calculation was practically instant.  Nice.</p>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2009/08/16/restoring-from-a-samba-based-time-machine-backup-kinda/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<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>
		<item>
		<title>PIC buttons (interrupt-based)</title>
		<link>http://veys.com/2002/08/23/pic-buttons-interrupt-based/</link>
		<comments>http://veys.com/2002/08/23/pic-buttons-interrupt-based/#comments</comments>
		<pubDate>Sat, 24 Aug 2002 05:08:56 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[howtos]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[interrupts]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=124</guid>
		<description><![CDATA[Previously, in PIC buttons (polling) we saw how to poll for the state of a line connect to a button, that is all fine and good but really that is not the best way to do them. The &#8220;real&#8221; way to interface with external components like that is through interrupts, a slick feature. Interrupts provide [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_250" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/interrupt_schematic.gif" rel="lightbox[124]"><img class="size-thumbnail wp-image-250" title="Schematic" src="http://www.veys.com/wp-content/uploads/2008/07/interrupt_schematic-150x150.gif" alt="Schematic" width="150" height="150" /></a><p class="wp-caption-text">Schematic</p></div>
<p>Previously, in <a href="http://veys.com/2002/08/22/pic-buttons-polling/" title="PIC buttons (polling)">PIC buttons (polling)</a> we saw how to poll for the state of a line connect to a button, that is all fine and good but really that is not the best way to do them. The &#8220;real&#8221; way to interface with external components like that is through interrupts, a slick feature.</p>
<p>Interrupts provide you with lots of freedom in your code. They allow you to sit back, relax, and be told when an event occurs, and not be forced to sit and wait for it to happen.</p>
<p>For this program, the schematic and circuit are practically the same, the only thing that changed location is the button.</p>
<p>Instead of looping over and over again, we simply wait, using a goto $ we are essentially goto&#8217;ing the same address over and over, &#8220;goto here, goto here, goto here&#8230;&#8221; ad nauseum. A common technique is also to use a SLEEP command, which puts the PIC in a low power mode and halts the program counter. Same effect to the user though. You of course could do &#8216;real&#8217; work too instead of just burn cycles.</p>
<p>Once the button is pressed and released, the PIC will generate an interrupt, forcing the program to goto memory location 4. This is labeled in the code as ISR (Interrupt Service Routine).</p>
<p>For this program we are using the RB0/INT Interrupt. This interrupt occurs when there is a low-high change in PORTB,0. It can also be configured for high-low as well.</p>
<p>To enable this, we set INTCON,INTE. This bit says we want to know if a change occurs. To enable interrupts in general, we must then set INTCON,GIE. This lets all enabled interrupts occur.</p>
<p>We then wait for the interrupt. Once it occurs, GIE is automatically cleared so we can&#8217;t have them inside each other, and blink the LED a couple times. We then clear the interrupt flag, saying we&#8217;ve handled the interrupt (INTCON,INTF). We then re-enable interrupts and return from the interrupt: retfie.</p>
<p>It should be noted that if we were using more than one interrupt type, we would have needed to check the flag bits to find out which one interrupted us. We then handle it, and clear its flag. The PIC is somewhat crippled in this manner. Any and all interrupts generated and thrown into address 4 and &#8220;we&#8221; have to figure out which one occured. Many higher end MCU&#8217;s will have a table of addresses to jump to for each particular interrupt type, we then code in each location the correct routine and the processor knows which to call based on what happens.</p>
<h3>Downloads</h3>
<ul>
<li><a href="http://www.veys.com/wp-content/uploads/2008/07/interrupts.zip">Source Code</a> (zip)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/23/pic-buttons-interrupt-based/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PIC buttons (polling)</title>
		<link>http://veys.com/2002/08/22/pic-buttons-polling/</link>
		<comments>http://veys.com/2002/08/22/pic-buttons-polling/#comments</comments>
		<pubDate>Fri, 23 Aug 2002 05:07:52 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[howtos]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=122</guid>
		<description><![CDATA[Polling for button input, how useful! This is pretty brief and gives a good idea how to let buttons control your programs execution. In this tutorial I&#8217;ve switched from using an oscillator to using a crystal. This changes the design a bit. Using the 2 OSC pins, OSC1/OSC2 (CLKOUT/CLKIN) they hook to the crystal in [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_243" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/polling_schematic.gif" rel="lightbox[122]"><img class="size-thumbnail wp-image-243" title="Schematic" src="http://www.veys.com/wp-content/uploads/2008/07/polling_schematic-150x150.gif" alt="" width="150" height="150" /></a><p class="wp-caption-text">Schematic</p></div>
<p>Polling for button input, how useful! This is pretty brief and gives a good idea how to let buttons control your programs execution.</p>
<p>In this tutorial I&#8217;ve switched from using an oscillator to using a crystal. This changes the design a bit. Using the 2 OSC pins, OSC1/OSC2 (CLKOUT/CLKIN) they hook to the crystal in parallel. Then the two sides of the crystal are connected to ground via two capacitors, in this case 18pF. The speed and capacitance needed varies, and can be seen in most any PIC MCU datasheet as to how to lay it out. It will also be in my schematic.</p>
<p>Please note this is essentially NO DIFFERENT than the oscillator. It is simply a different means of providing a clock signal. You can swap in the oscillator to the normal CLKIN pin and it will work just fine.</p>
<p>For this program, we&#8217;ll start the processor, and wait for a button to be pressed. After it has been pressed we&#8217;ll essentially execute the LED blinker from before.</p>
<p>Polling is extremely simple. Polling is the act of checking something for a certain state to occur. In our case, we poll PORTB,4 waiting for it to go low. Once it does, we continue on and start blinking.</p>
<div id="attachment_242" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/polling_circuit.jpg" rel="lightbox[122]"><img class="size-thumbnail wp-image-242" title="Circuit Image" src="http://www.veys.com/wp-content/uploads/2008/07/polling_circuit-150x150.jpg" alt="Circuit Image" width="150" height="150" /></a><p class="wp-caption-text">Circuit Image</p></div>
<p>Another topic that needs to be covered is that of Pull-Up resistors. In order for a button to be able to change from 0 to 1 (Ground to 5V) we need a way to protect everything from a short circuit. We do this with a Pull-Up (or Pull-Down in some cases) resistor. For our case, we connect PORTB,4 to +5V via a 10k resistor. So when we fire up the program, the PIC sees PORTB,4 as HIGH. We then connect our button to PORTB,4 on one side, and Ground on the other. Now, when we press the button, PORTB,4 is connected to ground and is now LOW. A short circuit between +5 and Ground would occur if not for the resistor, which being 10k limits the current to a measly 500uA, nothing to worry about. Once the button is released, Ground is disconnected and the pin returns to a HIGH state.</p>
<p>Reading the code, you may also notice the _BANK macro has changed a bit. I&#8217;ve simply modified it to encompass all possible BANK configs instead of using 4 different macros for each. Reading through it can give you a little insight as to how the conditional assembler works. It&#8217;s a bit like C/C++ and a bit like BASIC. Quite nice and handy.</p>
<p>A final new bit is the _MCLRE_OFF in the __CONFIG line at the beginning. This frees us from having to pull _MCLR high to keep from a RESET condition. Just keeps our parts count down. <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Now for the new section of code.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">  btfsc PORTB<span style="color: #339933;">,</span><span style="color: #0000ff;">4</span>
    <span style="color: #000000; font-weight: bold;">goto</span> $<span style="color: #339933;">-</span><span style="color: #0000ff;">1</span></pre></div></div>

<p>That&#8217;s polling, yup, that&#8217;s it. All it is doing is a bit test on PORTB,4, waiting for it to become clear (Ground). The goto line is telling it to go 1 instruction back ($ means the address of the current instruction, $-1 means one before, the btfsc). Once that pin becomes 0 it skips the loop forcing it to check, and lets it continue on down to the blinker!</p>
<h3>Downloads</h3>
<ul>
<li><a href="http://www.veys.com/wp-content/uploads/2008/07/poll.zip">Source Code</a> (zip)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/22/pic-buttons-polling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PIC LED blinker (busy-wait)</title>
		<link>http://veys.com/2002/08/21/pic-led-blinker-busy-wait/</link>
		<comments>http://veys.com/2002/08/21/pic-led-blinker-busy-wait/#comments</comments>
		<pubDate>Thu, 22 Aug 2002 04:18:18 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[howtos]]></category>
		<category><![CDATA[blinker]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[led]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=120</guid>
		<description><![CDATA[Beyond all doubt, the #1 beginning program in microcontrollers is the LED blinker. It&#8217;s super simple, and teaches the concept of pin voltages and busy-waits. Here is a busy-wait LED blinker program, and a walkthrough building it in MPLab. First, the delay. This is a busy-wait delay program, busy-wait means you just burn instruction cycles [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_226" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/pic16_blinker_schem.jpg" rel="lightbox[120]"><img class="size-thumbnail wp-image-226  " title="LED blinker #1 circuit schematic" src="http://www.veys.com/wp-content/uploads/2008/07/pic16_blinker_schem-150x150.jpg" alt="LED blinker #1 circuit schematic" width="150" height="150" /></a><br />
<p class="wp-caption-text">Schematic</p></div>
<p>Beyond all doubt, the #1 beginning program in microcontrollers is the LED blinker. It&#8217;s super simple, and teaches the concept of pin voltages and busy-waits.  Here is a busy-wait LED blinker program, and a walkthrough building it in MPLab.</p>
<p>First, the delay. This is a busy-wait delay program, busy-wait means you just burn instruction cycles for the delay, keeping the MCU &#8220;busy&#8221;. There&#8217;s a tiny bit of math behind them. First, the clock speed is 20MHz, the instruction frequency is (clock/4) so our instructions are executing at 5MHz. This gives us a period of 200ns per cycle.</p>
<p>I created two delay functions, for versatility, and for LCD stuff which will come later but it&#8217;s handy here. One is a &#8220;DELAY_US&#8221; which will delay a specified amount of microseconds. This is done by wasting 5 cycles (5*200ns = 1us) a specified amount of times (less than or equal to 255us, since I only made an 8-bit &#8220;delay&#8221; variable). We can learn the cycle times from the data sheet, and make it work from there.</p>
<p>Next, I created a &#8220;DELAY_MS&#8221; which delays a specified amount of milliseconds. Same 8-bit limitation of max 255ms, but that&#8217;s enough to have fun with&#8230; It simply calls DELAY_US a few times with specified amounts of delay, adding up to 1000us (=1ms) and repeats as many times as we tell it to.</p>
<p>These delays are used to make the LED blinking visible, otherwise it would blink faster than we could see (if at all, it takes a cycle or two for the pin to change state so it might not even change if we just toggle it every other cycle).</p>
<p>Here&#8217;s a little more PIC architecture information. The PIC&#8217;s data registers are broken into &#8220;banks&#8221; (bank 0, 1, 2, 3). Meaning you cannot get at them all at the same time, although some are mapped to all banks so you CAN get at them, important ones. We usually hang out in bank 0&#8230; This usually isn&#8217;t a problem, just something you need to remember. The data sheet illustrates it pretty well. When it comes up I&#8217;ll clarify things about it.</p>
<p>Also, for the I/O pins. Since they&#8217;re bi-directional, you need to choose which direction to set them to. Input or output. This is done by setting the tri-state register for the given port, for example PORTA&#8217;s tris register is called TRISA (not tough!). You set the direction of a specific bit, by setting the bit of the TRIS register to either 0 or 1, 0 meaning OUTPUT and 1 meaning INPUT. Not tough to remember: 0 = Out and 1 = In.</p>
<h3>Source Code</h3>
<p>Ok, first you need to make sure you have MPLab from Microchip.com</p>
<p>Once you have MPLab, download the LED Blinker (busy-wait) source code.</p>
<p>MPLab is a nice IDE, you&#8217;ll need to create a &#8220;project&#8221; and then pick your chip, and add the asm file to it (called a &#8220;node&#8221;). All code is going to be indented 2 spaces, labels will not be indented at all, assembler directives are either 1 or 2 spaces in&#8230;</p>
<p>First few lines are kinda simple, the title directive just sets a title for your project&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">title</span>  <span style="color: #7f007f;">&quot;LED Blinker Tutorial 1&quot;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">LIST</span> R=<span style="color: #00007f; font-weight: bold;">DEC</span>
  <span style="color: #000000; font-weight: bold;">INCLUDE</span> <span style="color: #7f007f;">&quot;p16f628.inc&quot;</span>
 __CONFIG _CP_OFF &amp; _WDT_OFF &amp; _HS_OSC &amp; _PWRTE_ON &amp; _LVP_OFF &amp; _MCLRE_ON</pre></div></div>

<p>LIST R = DEC sets the default &#8220;radix&#8221; for the program, meaning the number base. So if I put 100 in a line somewhere, it means 100 DECIMAL. If I changed it to LIST R = HEX, then if I put 100 in somewhere, it means 0&#215;100, TOTALLY different. I find DEC easier to work with, and you can still use 0x whatever and it means HEX so you get the best of both worlds.</p>
<p>Next we INCLUDE the &#8220;p16f628.inc&#8221; which will give us nice little names for our registers so we don&#8217;t need to remember their addresses, how nice of Microchip.</p>
<p>Then the __CONFIG line, arguably the ugliest line of code while still being fairly simple. You can see the list of __CONFIG&#8217;s in the &#8220;p16f628.inc&#8221; file, they&#8217;re simply setting the configuration of certain chip features, the ones I have listed do this: _CP_OFF copyprotect OFF, you can set the copyprotect bits to make your chip unreadable, this is only good for a production product, don&#8217;t use it. _WDT_OFF, watchdog timer off, watchdog timer is there for mission-critical applications, it&#8217;s constantly running and needs to be reset constantly, if it isn&#8217;t reset it will reset the chip (assuming your program has locked up), we don&#8217;t need it here. _HS_OSC specifies a high speed oscillator, it&#8217;s in the data sheet. _PWRTE_ON turns on the power up timer delay, it&#8217;ll make the MCU wait a bit before executing to make sure voltage is stable, oscillator is stable, etc&#8230; _LVP_OFF &#8211; low voltage programming, dun&#8217;need it&#8230; _MCLRE_ON makes us hold MCLR high, instead of letting the chip do it&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Variable declarations</span>
<span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
 CBLOCK <span style="color: #0000ff;">0x20</span>
DELAY<span style="color: #339933;">,</span>DELAYTMP			<span style="color: #666666; font-style: italic;">; delay function variables...</span>
 ENDC</pre></div></div>

<p>Now to the variable declarations, the CBLOCK directive lets us just list out our variable names, and the assembler will assign addresses for us, this is handy. The 0&#215;20 is the starting address of general-purpose registers in BANK 0. We list em out, then end it with ENDC.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Macro declarations</span>
<span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
BANK0 <span style="color: #000000; font-weight: bold;">macro</span>           		<span style="color: #666666; font-style: italic;">; Switch to BANK0</span>
  bcf STATUS<span style="color: #339933;">,</span>RP1
  bcf STATUS<span style="color: #339933;">,</span>RP0
  <span style="color: #000000; font-weight: bold;">endm</span>
&nbsp;
BANK1 <span style="color: #000000; font-weight: bold;">macro</span>           		<span style="color: #666666; font-style: italic;">; Switch to BANK1</span>
  bcf STATUS<span style="color: #339933;">,</span>RP1
  <span style="color: #00007f; font-weight: bold;">bsf</span> STATUS<span style="color: #339933;">,</span>RP0
  <span style="color: #000000; font-weight: bold;">endm</span>
&nbsp;
DELAY_MILLI <span style="color: #000000; font-weight: bold;">macro</span> TIME
  movlw TIME
  movwf DELAY
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_MS
  <span style="color: #000000; font-weight: bold;">endm</span>
&nbsp;
DELAY_MICRO <span style="color: #000000; font-weight: bold;">macro</span> TIME
  movlw TIME
  movwf DELAY
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_US
  <span style="color: #000000; font-weight: bold;">endm</span></pre></div></div>

<p>Next the Macro&#8217;s&#8230; Macro&#8217;s are one of the coolest features of MPLab, it&#8217;s kinda like an inline C function, and kinda like a #define. When called, the code is dumped into where it was called from, but you can use variables in it, and even arguments to customize it&#8217;s compiling, stuff I&#8217;ll show in later programs.</p>
<p>Anyways, you make one by saying: NAME macro in the first column, then code. End it w/a endm. The ones I have are fairly simple and re-usable. BANK0 sets the bank bits to get us into BANK 0, go figure. BANK1 sets them to get us into BANK1, crazy!</p>
<p>DELAY_MILLI takes the TIME argument and loads it into W, next it moves W to the register labeled DELAY. Then it calls our illustrious DELAY_MS function which will be explained in detail down below&#8230; DELAY_MICRO does the same damn thing with DELAY_US!</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Program code</span>
<span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
  <span style="color: #000000; font-weight: bold;">PAGE</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">org</span> <span style="color: #0000ff;">0</span>
  <span style="color: #000000; font-weight: bold;">goto</span> MAIN
&nbsp;
 <span style="color: #000000; font-weight: bold;">org</span> <span style="color: #0000ff;">4</span>
ISR
  <span style="color: #666666; font-style: italic;">; interrupt handler</span>
  retfie</pre></div></div>

<p>PAGE is a pagebreak for printing, though it doesn&#8217;t work for me. <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>org 0 tells the assembler to start assembly at address 0, our first instruction is to jump (goto) the label MAIN.</p>
<p>org 4 starts us in the Interrupt address of PIC&#8217;s&#8230; This is kind of strange and will be explained later on, for now just accept it as fact&#8230;</p>
<p>And if you&#8217;re wondering if we lost space for 3 instructions between 0 and 4, you&#8217;re right. <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Subroutines</span>
<span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
DELAY_US			<span style="color: #666666; font-style: italic;">; busy wait of DELAY us</span>
				<span style="color: #666666; font-style: italic;">; 200ns instruction period assumed</span>
  <span style="color: #00007f; font-weight: bold;">nop</span>				<span style="color: #666666; font-style: italic;">; (1)</span>
  <span style="color: #00007f; font-weight: bold;">nop</span>				<span style="color: #666666; font-style: italic;">; (2)</span>
  decfsz DELAY<span style="color: #339933;">,</span>f		<span style="color: #666666; font-style: italic;">; test DELAY count (3)</span>
    <span style="color: #000000; font-weight: bold;">goto</span> DELAY_US		<span style="color: #666666; font-style: italic;">; loop if not done (4,5)</span>
  return			<span style="color: #666666; font-style: italic;">; gtfo (4,5)</span>
&nbsp;
DELAY_MS			<span style="color: #666666; font-style: italic;">; busy wait of DELAY ms</span>
				<span style="color: #666666; font-style: italic;">; dependant upon DELAY_US being accurate</span>
  movf DELAY<span style="color: #339933;">,</span>w
  movwf DELAYTMP		<span style="color: #666666; font-style: italic;">; save DELAY time</span>
DELAY_MS_LOOP			<span style="color: #666666; font-style: italic;">; inner loop</span>
  movlw <span style="color: #0000ff;">245</span>			<span style="color: #666666; font-style: italic;">; load 245 (1)</span>
  movwf DELAY			<span style="color: #666666; font-style: italic;">; into DELAY (2)</span>
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_US			<span style="color: #666666; font-style: italic;">; wait 245us (3-249)</span>
  movlw <span style="color: #0000ff;">245</span>			<span style="color: #666666; font-style: italic;">; load 245 (250)</span>
  movwf DELAY			<span style="color: #666666; font-style: italic;">; into DELAY (251)</span>
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_US			<span style="color: #666666; font-style: italic;">; wait 245us (252-498)</span>
  movlw <span style="color: #0000ff;">245</span>			<span style="color: #666666; font-style: italic;">; load 245 (499)</span>
  movwf DELAY			<span style="color: #666666; font-style: italic;">; into DELAY (500)</span>
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_US			<span style="color: #666666; font-style: italic;">; wait 245us (501-747)</span>
  movlw <span style="color: #0000ff;">246</span>			<span style="color: #666666; font-style: italic;">; load 246 (748)</span>
  movwf DELAY			<span style="color: #666666; font-style: italic;">; into DELAY (749)</span>
  <span style="color: #00007f; font-weight: bold;">call</span> DELAY_US			<span style="color: #666666; font-style: italic;">; wait 246us (750-997)</span>
  decfsz DELAYTMP<span style="color: #339933;">,</span>f		<span style="color: #666666; font-style: italic;">; test DELAYTMP count (998)</span>
    <span style="color: #000000; font-weight: bold;">goto</span> DELAY_MS_LOOP		<span style="color: #666666; font-style: italic;">; loop if not done (999,1000)</span>
  return			<span style="color: #666666; font-style: italic;">; gtfo (999,1000)</span></pre></div></div>

<p>Next we have our subroutines, the delays, I have these before the main lines of code just out of habit, it&#8217;s not required.</p>
<p>DELAY_US&#8230; Pretty simple really, we start out by burning 2 cycles, so we&#8217;ve waited 400ns so far, next we decrement our counter, and test if it&#8217;s zero, if it isn&#8217;t, we goto DELAY_US, looping again, if not, we return. The test itself takes one cycle (600ns so far) and either the goto or return take 2 cycles (1000ns = 1us) so we have our microsecond delay!</p>
<p>DELAY_MS works on the same principle, it&#8217;s accurate enough for this! <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Mainline of code</span>
<span style="color: #666666; font-style: italic;">;----------------------------------------------------------------------------------------</span>
MAIN
  BANK1
  bcf TRISA<span style="color: #339933;">,</span><span style="color: #0000ff;">2</span>			<span style="color: #666666; font-style: italic;">; PORT A, bit 2 is our output pin.</span>
  BANK0
&nbsp;
LOOP_BEGIN
  <span style="color: #00007f; font-weight: bold;">bsf</span> PORTA<span style="color: #339933;">,</span><span style="color: #0000ff;">2</span>  			<span style="color: #666666; font-style: italic;">; set her.</span>
  DELAY_MILLI <span style="color: #0000ff;">250</span>		<span style="color: #666666; font-style: italic;">; wait 1/4 sec</span>
  bcf PORTA<span style="color: #339933;">,</span><span style="color: #0000ff;">2</span>			<span style="color: #666666; font-style: italic;">; clear her!</span>
  DELAY_MILLI <span style="color: #0000ff;">250</span>		<span style="color: #666666; font-style: italic;">; wait 1/4 sec!!!!</span>
  <span style="color: #000000; font-weight: bold;">goto</span> LOOP_BEGIN		<span style="color: #666666; font-style: italic;">; forever... :o</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">end</span></pre></div></div>

<p>MAIN is our label for the beginning of the code, jumped to by the first line up @ org 0. BANK1 gets us into BANK 1 so we can set our bit direction, we clear bit 2 of TRISA making bit 2 of PORTA our output pin, then we hop back to BANK 0&#8230;</p>
<p>Then our introductory programming teachers worst nightmare, a purposely created infinite loop. We label the beginning, then set our pin high, shutting off the LED (as you&#8217;ll see in the wiring diagram). We wait 250ms via our handy delay function, then clear the bit, turning the LED on, we wait again and loop ad nauseum.</p>
<p>&#8216;end&#8217; tells the assembler to give up&#8230;</p>
<h3>Building</h3>
<p>Alright, so we have our program, we run the assembler by clicking the weird funnel icon or by going to Project -&gt; Build Node (or All). It&#8217;ll crunch and come up with no errors (of course).  Then just toss it into the programmer and feed the chip your tasty code.</p>
<h3>Schematic</h3>
<div id="attachment_225" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/pic16_blinker.jpg" rel="lightbox[120]"><img class="size-thumbnail wp-image-225" title="The assembled circuit" src="http://www.veys.com/wp-content/uploads/2008/07/pic16_blinker-150x150.jpg" alt="The assembled circuit" width="150" height="150" /></a><p class="wp-caption-text">The assembled circuit</p></div>
<p>Wire up the circuit as in the schematic at the top of the page.  Hopefully it illustrates to you why the LED is on when the bit is off, and off when the bit is on&#8230; The LED is a typical ~2V yellow LED&#8230;  Wired up it should look something like the image.</p>
<h3>Running</h3>
<p>Hook up +5V and Gnd, and fire it up! If everything is set up correctly you&#8217;ll get a steady blinking LED!</p>
<h3>Something to try</h3>
<p>Connect a momentary switch to the _MCLR line, wired to Ground on the other side. Pushing the button will reset the chip, releasing it will start it over from the beginning of the program, of course it will do the same stuff, but this demonstrates how the reset buttons work. I also highly recommend changing the code to add a more interesting blink pattern, longer/shorter delays, and other stuff to get used to modifying code&#8230;</p>
<h3>Downloads</h3>
<ul>
<li><a href="http://www.veys.com/wp-content/uploads/2008/07/busyblinker.zip">Source Code</a> (zip)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/21/pic-led-blinker-busy-wait/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Basic PIC16 hardware setup</title>
		<link>http://veys.com/2002/08/19/basic-pic1-hardware-setup/</link>
		<comments>http://veys.com/2002/08/19/basic-pic1-hardware-setup/#comments</comments>
		<pubDate>Tue, 20 Aug 2002 04:16:21 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[howtos]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[pic]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=116</guid>
		<description><![CDATA[Your basic PIC16 microcontroller can&#8217;t hold down the fort by itself, it needs a little help from a few components. I use a prototyping breadboard, the white kind you can just plug &#38; unplug stuff to all day long. It makes life prototyping a whole lot easier. Ok, now on to the PIC stuff. First [...]]]></description>
			<content:encoded><![CDATA[<p>Your basic PIC16 microcontroller can&#8217;t hold down the fort by itself, it needs a little help from a few components.</p>
<div id="attachment_134" class="wp-caption alignright" style="width: 110px"><a href="http://www.veys.com/wp-content/uploads/2008/07/breadboard.jpg" rel="lightbox[116]"><img class="size-thumbnail wp-image-134" title="Solderless Breadboard" src="http://www.veys.com/wp-content/uploads/2008/07/breadboard-100x150.jpg" alt="Breadboard" width="100" height="150" /></a><p class="wp-caption-text">Breadboard</p></div>
<p>I use a prototyping breadboard, the white kind you can just plug &amp; unplug stuff to all day long. It makes life prototyping a whole lot easier.</p>
<p>Ok, now on to the PIC stuff. First and foremost, you need an oscillator, the oscillator is what keeps the PIC moving, it provides the clock signal for the chip. For our 16F628, I used a 20MHz oscillator in a &#8220;half-can&#8221; package. Many people like to use crystals and capacitors, etc, I use them on simpler designs, but they&#8217;re a bit harder to understand at first.</p>
<p>These oscillators are powered by +5V, and the output goes into the pin labeled OSC1/CLKIN on the 16F628. You can get these oscillators at Digi-Key (part#: CTX169-ND).</p>
<p>The other key part is the reset line. We need to hold this line HIGH (+5V) and drop to it 0V to reset the chip, which we won&#8217;t need for a while. To tie it high you use a &#8220;pull-up&#8221; resistor (10k is good for this) to the +5V line, connected to the _MCLR pin of the chip (reset pin). I like to use the outside rails for Ground, and inside rails for +5V as you&#8217;ll see in the pictures&#8230; This isn&#8217;t *required* as our chip is smart enough to pull up it&#8217;s own _MCLR pin, but for the first few projects we&#8217;ll explicitly do it so you get used to it. <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="attachment_135" class="wp-caption alignright" style="width: 110px"><a href="http://www.veys.com/wp-content/uploads/2008/07/halfcanoscillator.jpg" rel="lightbox[116]"><img class="size-thumbnail wp-image-135" title="Half can oscillator" src="http://www.veys.com/wp-content/uploads/2008/07/halfcanoscillator.jpg" alt="Oscillator" width="100" height="113" /></a><p class="wp-caption-text">Oscillator</p></div>
<p>Also connect Vss and Vdd to Gnd and +5 respectively to power the PIC.</p>
<p>After wiring these parts up, your breadboard should look something like this:</p>
<div id="attachment_133" class="wp-caption aligncenter" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/basicsetup.jpg" rel="lightbox[116]"><img class="size-thumbnail wp-image-133" title="Basic Setup" src="http://www.veys.com/wp-content/uploads/2008/07/basicsetup-150x150.jpg" alt="Basic PIC16 wired up" width="150" height="150" /></a><p class="wp-caption-text">Basic PIC16 wired up</p></div>
<p>We also need a power supply. I use an old AT power supply, taking the red and black lines for +5 and Gnd respectively. You can use a 5V bench supply, batteries, wall-wart, anything 5V (but make sure it&#8217;s regulated).</p>
<p>Another smart part to use is a bypass capacitor, this lets the PIC draw power from the cap instead of the power supply during an increased power draw time, these are usually brief, but the power is needed quickly and a voltage drop would be bad, so you place a small, fast capacitor nearby the IC to provide the instant power and keep everyone happy. Typical values are a .1uF Tantalum capacitor.</p>
<p>Also handy are a pair of IC chip pullers, available in most little toolkits, they&#8217;ll help you avoid damaging the chip as you pull it out of the breadboard&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/19/basic-pic1-hardware-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The PIC16 instruction set</title>
		<link>http://veys.com/2002/08/18/the-pic16-instruction-set/</link>
		<comments>http://veys.com/2002/08/18/the-pic16-instruction-set/#comments</comments>
		<pubDate>Mon, 19 Aug 2002 04:15:32 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[howtos]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=114</guid>
		<description><![CDATA[The instruction set is your window into controlling these chips to do your bidding. Knowing what the chips understand helps you come up with a plan of attack to solve your particular problem. We need to get some basic info out of the way. The way variables are handled are through registers, these are 8-bit [...]]]></description>
			<content:encoded><![CDATA[<p>The instruction set is your window into controlling these chips to do your bidding. Knowing what the chips understand helps you come up with a plan of attack to solve your particular problem.</p>
<p>We need to get some basic info out of the way. The way variables are handled are through registers, these are 8-bit data buckets in the MCU. Also, the PIC&#8217;s used here are loosely an <a href='http://en.wikipedia.org/wiki/Accumulator_(computing)' target='_blank'>Accumulator</a> based architecture, meaning most all operations have one destination, the accumulator known as the W register in PIC land, although you can usually redirect the result to a register&#8230;  Your other registers are in the &#8220;register file&#8221; which is your data RAM.</p>
<p>Alright, now we&#8217;re getting to the interesting stuff. The instruction set is the list of all commands that the MCU understands. I&#8217;ll list them out and briefly describe what they do and what they are used for.</p>
<p>There is also a STATUS register in this chip, various bits of it respond to various operations. Consult the datasheet for more information on this.</p>
<ul>
<li>f = name/address of register</li>
<li>b = bit # (0 &#8211; 7)</li>
<li>d = destination (0 for W, 1 for the register specified in f)</li>
<li>k = literal value, an immediate, a number or address</li>
</ul>
<h3>Byte-oriented file register operations</h3>
<table border="0">
<tbody>
<tr>
<th>Instruction</th>
<th>Description</th>
</tr>
<tr>
<td>ADDWF f,d</td>
<td>adds W and f together</td>
</tr>
<tr>
<td>ANDWF f,d</td>
<td>bitwise AND: W &amp; f</td>
</tr>
<tr>
<td>CLRF</td>
<td>clears f (sets it to 0 = 0&#215;00 = 0000 0000)</td>
</tr>
<tr>
<td>CLRW</td>
<td>clears W (sets it to 0 = 0&#215;00 = 0000 0000)</td>
</tr>
<tr>
<td>COMF f,d</td>
<td>compliment f (inverts. COMF of 0010 0101 = 1101 1010)</td>
</tr>
<tr>
<td>DECF f,d</td>
<td>decrement f (f = f &#8211; 1)</td>
</tr>
<tr>
<td>DECFSZ f,d</td>
<td>decrement f, skip next instruction if result is zero</td>
</tr>
<tr>
<td>INCF f,d</td>
<td>increment f (f = f + 1)</td>
</tr>
<tr>
<td>INCFSZ f,d</td>
<td>increment f, skip next instruction if result is zero</td>
</tr>
<tr>
<td>IORWF f,d</td>
<td>bitwise OR: W | f</td>
</tr>
<tr>
<td>MOVF f,d</td>
<td>move f (used to load a register into W: MOVF temp1,w)</td>
</tr>
<tr>
<td>MOVWF f</td>
<td>move W into f</td>
</tr>
<tr>
<td>NOP</td>
<td>no-op. no operation occurs this cycle, useful in delays or waits</td>
</tr>
<tr>
<td>RLF f,d</td>
<td>bitwise rotate left through the carry bit</td>
</tr>
<tr>
<td>RRF f,d</td>
<td>bitwise rotate right through the carry bit</td>
</tr>
<tr>
<td>SUBWF f,d</td>
<td>subtracts W from f</td>
</tr>
<tr>
<td>SWAPF f,d</td>
<td>swap nibbles in f (nibble = 4bits, half-byte)</td>
</tr>
<tr>
<td>XORWF f,d</td>
<td>bitwise XOR: W ^ f</td>
</tr>
</tbody>
</table>
<h3>Bit-oriented file register operations</h3>
<table border="0">
<tbody>
<tr>
<th>Instruction</th>
<th>Description</th>
</tr>
<tr>
<td>BCF f,b</td>
<td>clears bit &#8216;b&#8217; in register f</td>
</tr>
<tr>
<td>BSF f,b</td>
<td>sets bit &#8216;b&#8217; in register f</td>
</tr>
<tr>
<td>BTFSC f,b</td>
<td>test bit &#8216;b&#8217; in register f, if it is clear -&gt; skip the next instruction</td>
</tr>
<tr>
<td>BTFSS f,b</td>
<td>test bit &#8216;b&#8217; in register f, if it is set -&gt; skip the next instruction</td>
</tr>
</tbody>
</table>
<h3>Literal and control operations</h3>
<table border="0">
<tbody>
<tr>
<th>Instruction</th>
<th>Description</th>
</tr>
<tr>
<td>ADDLW k</td>
<td>add k to W</td>
</tr>
<tr>
<td>ANDLW k</td>
<td>bitwise AND: W &amp; k -&gt; W</td>
</tr>
<tr>
<td>CALL k</td>
<td>call a subroutine at address k</td>
</tr>
<tr>
<td>CLRWDT</td>
<td>clear the &#8216;watchdog timer&#8217;</td>
</tr>
<tr>
<td>GOTO k</td>
<td>goto or jump to address k</td>
</tr>
<tr>
<td>IORLW k</td>
<td>bitwise OR: W | k -&gt; W</td>
</tr>
<tr>
<td>MOVLW k</td>
<td>move literal (immediate) k into W</td>
</tr>
<tr>
<td>RETFIE</td>
<td>return from interrupt</td>
</tr>
<tr>
<td>RETLW k</td>
<td>return from subroutine with literal k in W</td>
</tr>
<tr>
<td>RETURN</td>
<td>return from subroutine</td>
</tr>
<tr>
<td>SLEEP</td>
<td>go to sleep mode (low-power standby)</td>
</tr>
<tr>
<td>SUBLW k</td>
<td>subtract W from literal (immediate) k</td>
</tr>
<tr>
<td>XORLW k</td>
<td>bitwise XOR: W ^ k -&gt; W</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/18/the-pic16-instruction-set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PIC programming tools</title>
		<link>http://veys.com/2002/08/17/pic-programming-tools/</link>
		<comments>http://veys.com/2002/08/17/pic-programming-tools/#comments</comments>
		<pubDate>Sun, 18 Aug 2002 04:02:49 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[howtos]]></category>
		<category><![CDATA[kit96]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[microcontroller]]></category>
		<category><![CDATA[mplab]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=112</guid>
		<description><![CDATA[There are several tools needed to get started in programming the PICs. I&#8217;ll briefly cover some software to develop in and hardware to load the chip. Software I use the MPLab package by Microchip. It&#8217;s an excellent IDE and is available free for download at their site. As I go through examples I will introduce [...]]]></description>
			<content:encoded><![CDATA[<p>There are several tools needed to get started in programming the PICs. I&#8217;ll briefly cover some software to develop in and hardware to load the chip.</p>
<h3>Software</h3>
<p>I use the MPLab package by Microchip. It&#8217;s an excellent IDE and is available free for download at their site.</p>
<p>As I go through examples I will introduce specific features of MPLab, I find this the easiest way to do it, rather than listing them out and assuming you&#8217;ll get em right away&#8230;</p>
<h3>Hardware</h3>
<div id="attachment_155" class="wp-caption alignright" style="width: 160px"><a href="http://www.veys.com/wp-content/uploads/2008/07/kit96.jpg" rel="lightbox[112]"><img class="size-thumbnail wp-image-155" title="KIT96" src="http://www.veys.com/wp-content/uploads/2008/07/kit96-150x150.jpg" alt="KIT96 Programmer" width="150" height="150" /></a><p class="wp-caption-text">KIT96 Programmer</p></div>
<p>On the hardware end is the actual device to send the data to the chip! For this I use kit 96 from <a href="http://www.kitsrus.com">www.kitsrus.com</a>. It is a P16PRO compatible programmer, is quite easy to build, and looks pretty nice once it&#8217;s put together, a quality product. There is software available for it at <a href="http://www.picallw.com">www.picallw.com</a>, and costs a mild registration fee to fully program anything beyond a 16F84(a).</p>
<p>There are other programmers but I must say this is by far the nicest programmer you&#8217;ll find short of the professional versions. And even some pro versions leave quite a bit to be desired.</p>
<p>The programmer operates on a wall-wart power adapter and a PC parallel port (yet programs the chips serially). I have added a 40-pin wide ZIF socket on mine to facilitate bigger PICs, and make it WAY easier to put chips in and take them out&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/17/pic-programming-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Number bases and logic</title>
		<link>http://veys.com/2002/08/16/number-bases-and-logic/</link>
		<comments>http://veys.com/2002/08/16/number-bases-and-logic/#comments</comments>
		<pubDate>Sat, 17 Aug 2002 03:57:29 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[howtos]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[hexidecimal]]></category>
		<category><![CDATA[legacy articles]]></category>
		<category><![CDATA[logic]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.veys.com/blog/?p=103</guid>
		<description><![CDATA[Embedded programming requires at the very minimum a casual understanding of binary, hexadecimal, and logical operations. Here is a brief overview of these operations and a few sample uses. Binary Binary is all computers understand. It is a numbering system quite different than our &#8220;base-10&#8243; system. In &#8220;base-10&#8243; or decimal numbers, every digit has 10 [...]]]></description>
			<content:encoded><![CDATA[<p>Embedded programming requires at the very minimum a casual understanding of binary, hexadecimal, and logical operations.  Here is a brief overview of these operations and a few sample uses.</p>
<h3>Binary</h3>
<p>Binary is all computers understand. It is a numbering system quite different than our &#8220;base-10&#8243; system. In &#8220;base-10&#8243; or decimal numbers, every digit has 10 possible values, 1,2,3,4&#8230; (hopefully you know this!). In binary, there are 2, only 2. These are typically represented by 1 and 0, but it can be a bird and a dog, up/down, left/right, front/back, black/white, ANYTHING, as long as it&#8217;s only two.</p>
<p>Quick Info on Binary:</p>
<ul>
<li>a binary digit is known as a &#8216;bit&#8217;</li>
<li>4-bits are called a nibble (or nybble)</li>
<li>8-bits are called a byte</li>
<li>binary numbers are typically grouped into nybbles for readability and ease of conversion to HEX</li>
</ul>
<p>So here&#8217;s a binary number: 0110 1000. An 8-bit number. Now what IS the number? Well it&#8217;s 104 obviously!</p>
<p>Here&#8217;s how we translate binary to decimal. First we need to disect our 8-bit number:</p>
<table border="1" align="center">
<tbody>
<tr>
<td bgcolor="#99FF99">bit #</td>
<td bgcolor="#CCFFCC">
<div>7</div>
</td>
<td bgcolor="#CCFFCC">
<div>6</div>
</td>
<td bgcolor="#CCFFCC">
<div>5</div>
</td>
<td bgcolor="#CCFFCC">
<div>4</div>
</td>
<td bgcolor="#CCFFCC">
<div>3</div>
</td>
<td bgcolor="#CCFFCC">
<div>2</div>
</td>
<td bgcolor="#CCFFCC">
<div>1</div>
</td>
<td bgcolor="#CCFFCC">
<div>0</div>
</td>
</tr>
<tr>
<td bgcolor="#99FF99">104</td>
<td bgcolor="#00CC33">
<div>0</div>
</td>
<td bgcolor="#00CC33">
<div>1</div>
</td>
<td bgcolor="#00CC33">
<div>1</div>
</td>
<td bgcolor="#00CC33">
<div>0</div>
</td>
<td bgcolor="#00CC33">
<div>1</div>
</td>
<td bgcolor="#00CC33">
<div>0</div>
</td>
<td bgcolor="#00CC33">
<div>0</div>
</td>
<td bgcolor="#00CC33">
<div>0</div>
</td>
</tr>
</tbody>
</table>
<p>Bit 0 is known as the LEAST SIGNIFICANT BIT, and bit 7, the MOST SIGNIFICANT BIT. Bit numbers are increasing LSB to MSB. You get the value 104 by adding 2^(bit #) of all bits that are 1. So for this number it&#8217;s: (2^6 + 2^5 + 2^3) = 64+32+8 = 104.</p>
<p>The maximum value of an X-bit number is (2^X)-1. And the maximum number of different values that can be represented by an X-bit number is 2^X. So an 8-bit number can have 256 different values, and a max value of 255 (ranging 0-255 gives us 256 nums).</p>
<p>I guarantee you there are better tutorials on binary out on the net, search around, I&#8217;m going for quick-n-dirty here! <img src='http://veys.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Hexadecimal</h3>
<p>Hex is binary&#8217;s big brother in a way&#8230; It&#8217;s on the other side of the spectrum from binary to decimal, in hex, each digit can be 16 different values (0,1..8,9,A,B..E,F). So our 104 from before becomes: 0&#215;68. The notation &#8220;0x&#8221; is typical to denote a hex number.</p>
<p>Lets try another number in more detail; 190. In binary that is: 1011 1110. So in hex we have 0xBE.</p>
<p>An easy way to do bin-&gt;hex is when the binary number is broken into nybbles, you can picture each nybble as 1 hex digit. The max value of a 4-bit number is 15, F in hex, so the conversion is pretty easy!</p>
<p>0110 1010 1101 1111 0010 1011 -&gt; 0x6ADF2B</p>
<h3>Logic</h3>
<table border="0" width="100%">
<tbody>
<tr align="center" valign="top">
<td width="50%" height="125">AND</p>
<table border="0" width="60">
<tbody>
<tr align="center" valign="middle">
<td> </td>
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#0066FF">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
</tr>
</tbody>
</table>
<p> </td>
<td width="50%" height="125">OR</p>
<table border="0" width="60">
<tbody>
<tr align="center" valign="middle">
<td> </td>
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#0066FF">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
</tr>
</tbody>
</table>
<p> </td>
</tr>
<tr align="center" valign="top">
<td width="50%">NOT</p>
<table border="0" width="46">
<tbody>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
</tr>
</tbody>
</table>
</td>
<td width="50%">XOR</p>
<table border="0" width="60">
<tbody>
<tr align="center" valign="middle">
<td> </td>
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#0066FF">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
</tr>
<tr align="center" valign="middle">
<td bgcolor="#0066FF">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>1</div>
</td>
<td bgcolor="#33FF66">
<div>0</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>With blue being the input, or numbers being operated on, and green being the result.</p>
<ul>
<li>AND &#8211; The AND (&amp;) op. results in a 1 if and only if both inputs are 1.</li>
<li>OR &#8211; The OR (|) op. results in a 1 if either input is 1. (inclusive or)</li>
<li>XOR &#8211; The XOR (^) op. results in a 1 if strictly ONE input is 1, and the other is 0.</li>
<li>NOT &#8211; The NOT (!) op. flips the bit, if the input is 1, the result is 0. (a.k.a. compliment)</li>
</ul>
<p>This is BARELY scratching the surface of logic, but it&#8217;s enough to get us by. Here are typical uses for these operations:</p>
<h3>AND (&amp;)</h3>
<p>AND is good for &#8220;masking out&#8221; bits. If you wanted to get rid of a few bits in a number, while leaving the others unchanged, AND is what you&#8217;d use. Example: I have a 8-bit number, but I only want the upper 4-bits. My number is 0101 1010 = 0x9A. To mask these out, I create the &#8220;bitmask&#8221; 1111 0000 = 0xF0. The 1&#8242;s are the bits I want to keep, the 0&#8242;s what I want to get rid of.</p>
<pre>0x9A &amp; 0xF0 = 0x90 = 0101 0000 (lower bits have been removed)</pre>
<h3>OR (|)</h3>
<p>OR is just the opposite. It is used for &#8220;setting&#8221; bits, while leaving the rest unchanged. If you have a byte, and need to set a couple bits in that byte, you &#8220;OR them in&#8221;. Example: I have a byte, and I want to set bits 0,3,6. My number is 1011 0110 = 0xB6. To OR them in, I make a &#8220;bitmask&#8221; of 0100 1001 = 0&#215;49. The 1&#8242;s are the bits I want to SET, the 0&#8242;s the bits I want to leave alone.</p>
<pre>0xB6 | 0x49 = 0xFF = 1111 1111 (the bits have been set)</pre>
<h3>XOR (^)</h3>
<p>Exclusive or is a toggler, it&#8217;s used to flip bits based on their current value. Example: I have a byte, and I need to toggle the upper 4-bits of it. The number is 1100 0101 = 0xC5. To toggle them I make a &#8220;bitmask&#8221; of 1111 0000 = 0xF0, the 1&#8242;s being the bits I want to toggle, the 0&#8242;s being the bits I want to keep the same.</p>
<pre>0xC5 ^ 0xF0 = 0011 0101 = 0x35</pre>
<h3>NOT (!)</h3>
<p>Not simply flips the bits, inverts them, toggles, compliments, whatever you want to call it.</p>
<pre>!0x0F = 0xF0</pre>
]]></content:encoded>
			<wfw:commentRss>http://veys.com/2002/08/16/number-bases-and-logic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  veys.com/category/howtos/feed/ ) in 2.06729 seconds, on Feb 6th, 2012 at 8:56 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 6th, 2012 at 8:58 am UTC -->
