<?xml version="1.0"?><rss version="2.0">
<channel>
  <title>Alan&#039;s Ramblings - atmel tag</title>
  <link>http://bleaklow.com:80/tags/atmel/</link>
  <description>My opinions may be incorrect, but they are my own</description>
  <language>en</language>
  <copyright>Alan Burlison</copyright>
  <lastBuildDate>Wed, 29 Feb 2012 20:50:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  <image>
    <url>http://bleaklow.com/images/misc/logo.gif</url>
    <title>Alan&#039;s Ramblings</title>
    <link>http://bleaklow.com:80/</link>
  </image>
  <item>
    <title>Why I&#039;m ditching the Arduino software platform</title>
    <link>http://bleaklow.com:80/2012/02/29/why_im_ditching_the_arduino_software_platform.html</link>
    <description>
          &lt;p&gt;
I&#039;m getting set up for my &lt;a href=&#034;http://global-grooves.org/JUNKJAM.aspx&#034;&gt;next project&lt;/a&gt; and decided to update my development environment.  I&#039;ve finally decided to entirely ditch the &lt;a href=&#034;http://arduino.cc/&#034;&gt;Arduino&lt;/a&gt; software environment and just use the boards.  I stopped using the Arduino IDE &lt;a href=&#034;/2010/06/04/a_makefile_for_arduino_sketches.html&#034;&gt;some time ago&lt;/a&gt;, but now I&#039;m going whole hog and ditching the Arduino library as well.  Why?  Well, it&#039;s simple:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Significant parts of it are pile of junk.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
I know that&#039;s a pretty strong statement, so I better back it up with evidence.  OK, let&#039;s start with the hardware serial IO code.  Before version 1.0 of the Arduino platform, although reading from the serial ports was interrupt-driven, writing wasn&#039;t.  Rather, the code went into a spin loop, polling the transmit status bit until the USART was idle before sending the next character.  Why was that a problem?  Well if you wrote a 80-character string at 9600 baud it would take (8 bits + 1 start bit + 1 stop bit) * 80 / 9600 = 0.083, i.e. 83 milliseconds.  That&#039;s a &lt;strong&gt;huge&lt;/strong&gt; amount of time for the CPU to be spending just to do some output.  I found a number of posts where people were complaining that doing reasonable amounts of IO screwed up all the other bits of their sketches, and no wonder.  Admittedly the &lt;a href=&#034;http://arduino.cc/en/Main/ReleaseNotes&#034;&gt;Arduino 1.0 release notes&lt;/a&gt; say that&#039;s been changed so that output now uses interrupts as well, but that&#039;s not the end of the problems.
&lt;/p&gt;
&lt;p&gt;
Let&#039;s take a peek at the &lt;a href=&#034;https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/HardwareSerial.cpp&#034;&gt;HardwareSerial.cpp&lt;/a&gt; class.  First thing to note is that two 64-byte buffers are allocated for each USART, even if it isn&#039;t used.  That&#039;s 128 bytes on a Duemilanove and 512 bytes on a Mega, or 6% and 12% of the available SRAM respectively.  On the Duemilanove that&#039;s reasonable as there&#039;s only 1 UART, but on the Mega it represents a significant waste of precious memory when only 1 USART is normally going to be in use.
&lt;/p&gt;
&lt;p&gt;
OK, let&#039;s look at the new &lt;a href=&#034;https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/HardwareSerial.cpp#L383&#034;&gt;&lt;code&gt;write()&lt;/code&gt;&lt;/a&gt; function that does interrupt-driven output:
&lt;/p&gt;
&lt;pre&gt;
size_t HardwareSerial::write(uint8_t c)
{
  int i = (_tx_buffer-&amp;gt;head + 1) % SERIAL_BUFFER_SIZE;

  // If the output buffer is full, there&#039;s nothing for it other than to
  // wait for the interrupt handler to empty it a bit
  // ???: return 0 here instead?
  while (i == _tx_buffer-&amp;gt;tail)
    ;

  _tx_buffer-&amp;gt;buffer[_tx_buffer-&amp;gt;head] = c;
  _tx_buffer-&amp;gt;head = i;

  sbi(*_ucsrb, _udrie);
  
  return 1;
}
&lt;/pre&gt;
&lt;p&gt;
Is there a problem?  Let&#039;s look at the definition of &lt;code&gt;_tx_buffer&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;
struct ring_buffer
{
  unsigned char buffer[SERIAL_BUFFER_SIZE];
  volatile unsigned int head;
  volatile unsigned int tail;
};
&lt;/pre&gt;
&lt;p&gt;
Oh dear.  &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; are declared as &lt;code&gt;int&lt;/code&gt;, i.e. 16 bits, 2 bytes.  They are accessed by both the &lt;code&gt;write&lt;/code&gt; routine and the interrupt service routine that actually transmits the data yet there&#039;s no locking in the &lt;code&gt;write&lt;/code&gt; routine so the accesses aren&#039;t atomic.  Why is that an issue?  Well, the &lt;a href=&#034;http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html&#034;&gt;avr-libc documentation&lt;/a&gt; makes it clear:
&lt;/p&gt;
&lt;blockquote&gt;
A typical example that requires atomic access is a 16 (or more) bit variable that is shared between the main execution path and an ISR. While declaring such a variable as volatile ensures that the compiler will not optimize accesses to it away, it does not guarantee atomic access to it.
&lt;/blockquote&gt;
&lt;p&gt;
The documentation goes on to explain the sorts of symptoms you&#039;ll see if you ignore this, follow the link above if you want the full details.  This is inexcusably shoddy code - the constraints on accessing variables that are shared between ISR and non-ISR code are well-known.  What really concerns me is that people will use the Arduino code as an example of &#039;good&#039; AVR code and it isn&#039;t, in many places it&#039;s frankly awful.
&lt;/p&gt;
&lt;p&gt;
&#034;So what?&#034; you say, &#034;That&#039;s only one chunk of code that&#039;s a bit naff.&#034;  Unfortunately it&#039;s not an isolated instance.  Let&#039;s move on now to look at one of the newer features that has been added to the Arduino platform, the re-implemented &lt;a href=&#034;http://arduino.cc/en/Reference/StringObject&#034;&gt;String class&lt;/a&gt;.  Ok, let&#039;s build a minimal program that uses it:
&lt;/p&gt;
&lt;pre&gt;
#include &#034;WString.h&#034;
int main(void) {
    String bloat = &#034;hello world&#034;;
    return 0;
}
&lt;/pre&gt;
&lt;p&gt;
And let&#039;s build it:
&lt;/p&gt;
&lt;pre&gt;
WString.cpp: In member function ‘int String::lastIndexOf(char, unsigned int) const’:
WString.cpp:503:38: error: comparison of unsigned expression &lt; 0 is always false [-Werror=type-limits]
WString.cpp: In member function ‘int String::lastIndexOf(const String&amp;, unsigned int) const’:
WString.cpp:519:63: error: comparison of unsigned expression &lt; 0 is always false [-Werror=type-limits]
&lt;/pre&gt;
&lt;p&gt;
Sigh.  One would think that the Arduino developers would at least turn on warnings when they are compiling their code, but they don&#039;t.  And in this case, the consequence is a bug.  So, temporarily comment out the offending lines so we get a successful build, and:
&lt;/p&gt;
&lt;pre&gt;
/opt/avr-gcc/bin/avr-size build/test.elf
   text    data     bss     dec     hex filename
  10194      20       5   10219    27eb build/test.elf
&lt;/pre&gt;
&lt;p&gt;
Can that &lt;strong&gt;really&lt;/strong&gt; be right?  10K for a one-line program?  Unfortunately it is.  Any mention of &lt;code&gt;String&lt;/code&gt; pulls in the entirety of the class, as well as all the other avr-libc routines it references.  So on a Duemilanove that only has 32k to start with, a third of the available memory is gone before you start.  At the time the class was being rewritten I expressed my opinion that it was probably a bad idea and that the Arduino developers really needed to target the platform they actually had and not the one they wished they had.  And that&#039;s not the end of the issues with the &lt;code&gt;String&lt;/code&gt; class - on a constrained-memory platform such as the AVR, providing a class like &lt;code&gt;String&lt;/code&gt; that relies on &lt;code&gt;malloc&lt;/code&gt;, creates lots of temporaries, fragments the (tiny) heap and has no real ability to deal with out-of-memory conditions is a recipe for problems, problems that will manifest themselves as random, mysterious and un-diagnosable run-time errors.  And sure enough, a quick google shows that&#039;s exactly what tends to happen - just about the worst possible outcome for a platform that&#039;s targeted at neophytes.
&lt;/p&gt;
&lt;p&gt;
That&#039;s just two examples - there are others as well, such as the well-known performance problems with pin access, which may be up to &lt;a href=&#034;http://jeelabs.org/2010/01/06/pin-io-performance/&#034;&gt;50x slower that direct pin access&lt;/a&gt;.  In fact the only two remaining parts of the Arduino libraries that I still use are the millisecond clock and the serial IO, and they are easy enough to replace, so that&#039;s what I&#039;m doing.
&lt;/p&gt;
&lt;p&gt;
While I applaud the aims of the Arduino project, the realities of the restricted hardware platform &lt;strong&gt;have&lt;/strong&gt; to be taken into consideration.  In addition, one of the &lt;a href=&#034;http://code.google.com/p/arduino/wiki/DevelopmentPolicy&#034;&gt;aims of the project&lt;/a&gt; is to:
&lt;/p&gt;
&lt;blockquote&gt;
provide a well-designed, maintainable, and stable platform for the future
&lt;/blockquote&gt;
and despite its unquestionable success on many other fronts, on that one I feel the Arduino platform is less than entirely successful.  I for one won&#039;t be using any of the software any more, it&#039;s just not what I consider to be acceptable quality.
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2012/02/29/why_im_ditching_the_arduino_software_platform.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2012/02/29/why_im_ditching_the_arduino_software_platform.html</guid>
    <pubDate>Wed, 29 Feb 2012 20:50:00 GMT</pubDate>
  </item>
  <item>
    <title>A mention on the Pragmatic Programmer</title>
    <link>http://bleaklow.com:80/2011/05/08/a_mention_on_the_pragmatic_programmer.html</link>
    <description>
          &lt;p&gt;
I was looking at my &lt;a href=&#034;http://www.google.com/analytics/&#034;&gt;Google Analytics&lt;/a&gt; and noticed I was getting referrals from the &lt;a href=&#034;http://www.pragprog.com&#034;&gt;Pragmatic Programmer&lt;/a&gt; site, specifically from an article in the April magazine issue entitled &lt;a href=&#034;http://www.pragprog.com/magazines/2011-04/advanced-arduino-hacking&#034;&gt;Advanced Arduino Hacking&lt;/a&gt;.  Turns out they were using my &lt;a href=&#034;/files/2010/Makefile.master&#034;&gt;Makefile.master&lt;/a&gt; as the basis of their article, which describes how to use the Arduino platform without having to use the not-very-good Arduino IDE.  OK, I suppose that&#039;s a little unfair - the IDE is clearly meant for beginners but if you are an experienced developer or are working on more complex projects it becomes very limiting very quickly, as noted in the article.
&lt;/p&gt;
&lt;p&gt;
There are a &lt;a href=&#034;http://users.jyu.fi/~mweber/software/arduino/Makefile.master&#034;&gt;number&lt;/a&gt; &lt;a href=&#034;http://code.google.com/p/arduino/issues/attachmentText?id=344&amp;aid=7568997944726479287&amp;name=Makefile.master&amp;token=aabb0d45600455086e9b95b1f977f91a&#034;&gt;of&lt;/a&gt; copies of my Makefile.master floating around, but I&#039;m updating it fairly regularly, so I recommend you grab the &lt;a href=&#034;/files/2010/Makefile.master&#034;&gt;original version&lt;/a&gt;.  Compared to the version on the PragProg site, the current version (at time of writing) has the following improvements: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The only really platform-specific parts of the Makefile are those that deal with running the serial monitor used to connect to the Arduino.  On Solaris I use &lt;a href=&#034;http://download.oracle.com/docs/cd/E19253-01/816-5165/6mbb0m9tt/index.html&#034;&gt;tip&lt;/a&gt; whereas on Linux you&#039;d probably want to use something such as &lt;a href=&#034;http://www.gnu.org/software/screen/&#034;&gt;screen&lt;/a&gt;.  I&#039;ve therefore added platform-specific sections to configure the serial monitor commands to the Makefile.master.  I don&#039;t currently have settings for MacOS, if someone wants to provide some suggestions, I&#039;ll add them in.&lt;/li&gt;
&lt;br/&gt;
&lt;li&gt;I hit a linker bug when using the &lt;a href=&#034;http://www.nongnu.org/avr-libc/user-manual/index.html&#034;&gt;avr-libc&lt;/a&gt; floating-point library, the workaround being to specify &lt;code&gt;-lm&lt;/code&gt; both first and last in the linker command-line arguments.&lt;/li&gt;
&lt;br/&gt;
&lt;li&gt;An optional &lt;code&gt;EXTRA_FLAGS&lt;/code&gt; macro that can be used to specify any additional flags that you want passed to gcc/g++.  I use this for enabling/disabling debugging, e.g. &lt;code&gt;EXTRA_FLAGS=-DDEBUG&lt;/code&gt; in my project Makefile.&lt;/li&gt;
&lt;br/&gt;
&lt;li&gt;The automatic tracking of &lt;code&gt;#include&lt;/code&gt; dependencies was being done via a separate invocation of the compiler, this has been collapsed into the main compilation step, thus halving the number of times the compiler is invoked.  If you don&#039;t know what automatic dependency checking is, there&#039;s a good explanation &lt;a href=&#034;http://mad-scientist.net/make/autodep.html&#034;&gt;here&lt;/a&gt; and also in the &lt;a href=&#034;http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites&#034;&gt;GNU make&lt;/a&gt; documentation.&lt;/li&gt;
&lt;br/&gt;
&lt;li&gt;The generated dependency files are stored in the &lt;code&gt;build&lt;/code&gt; subdirectory of the project, but they do tend to clutter things up.  I&#039;ve therefore  moved them all into hidden (dot) files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
One final note, the PragProg Makefile.master uses &lt;code&gt;stty -f $(PORT) hupcl&lt;/code&gt; to trigger a reset on the arduino before uploading the hex image to it.  Not only is that platform-specific, it&#039;s also unnecessary if you are using a recent-ish version of &lt;a href=&#034;http://www.nongnu.org/avrdude/&#034;&gt;avrdude&lt;/a&gt; which will do the reset for you if you specify a programmer type of &lt;code&gt;arduino&lt;/code&gt; rather than &lt;code&gt;stk500&lt;/code&gt;.
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/05/08/a_mention_on_the_pragmatic_programmer.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/05/08/a_mention_on_the_pragmatic_programmer.html</guid>
    <pubDate>Sun, 08 May 2011 14:01:41 GMT</pubDate>
  </item>
  <item>
    <title>ATMega registers and memory ranges</title>
    <link>http://bleaklow.com:80/2011/04/10/atmega_registers_and_memory_ranges.html</link>
    <description>
          &lt;p&gt;
The AVR family has a reasonably complex register and memory architecture, with:
&lt;ul&gt;
&lt;li&gt;Multiple address spaces&lt;/li&gt;
&lt;li&gt;Registers that can be accessed directly and via the memory address space&lt;/li&gt;
&lt;li&gt;Register pairs that are used as memory indexes&lt;/li&gt;
&lt;li&gt;Restrictions on which registers can be loaded directly with constant values&lt;/li&gt;
&lt;li&gt;Some IO ports that appear in both the memory and IO address spaces, but with different addresses in each&lt;/li&gt;
&lt;li&gt;Some IO ports that are only accessible via the memory address space&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
In addition, the gcc compiler has conventions governing which registers it uses for what purpose, for example:
&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Which registers it uses for purposes such as storing temporary values and zero&lt;/li&gt;
&lt;li&gt;Which registers it uses for passing and returning arguments&lt;/li&gt; 
&lt;li&gt;Which registers it uses as a stack frame pointer&lt;/li&gt;
&lt;li&gt;Which registers are saved by the caller on entry to a subroutine and which ones have to be saved by the callee&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
When I&#039;m reading the assembler output of gcc I find it helpful to have a table to remind me which registers are being used for what, and why.  The information is not exactly well-explained in the AVR documentation and I&#039;ve not been able to find all the information in once place on the Internet, so I&#039;ve drawn up the following quick-reference table to remind me of what goes where:
&lt;p&gt;
&lt;a href=&#034;/files/2011/ATmegaRegMem.pdf&#034;&gt;&lt;img src=&#034;/images/2011/ATmegaRegMem.png&#034; alt=&#034;ATMega registers and address ranges&#034;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Click on the image for a PDF copy of the table.  I hope you find this useful, corrections and suggestions welcome - please leave a comment below!
&lt;/p&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#034;http://www.atmel.com/dyn/resources/prod_documents/doc8271.pdf&#034;&gt;ATmega328P datasheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://www.atmel.com/dyn/resources/prod_documents/doc2549.pdf&#034;&gt;ATmega1289 datasheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf&#034;&gt;8-bit AVR instruction set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#034;http://www.nongnu.org/avr-libc/user-manual/index.html&#034;&gt;avr-libc documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/04/10/atmega_registers_and_memory_ranges.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/04/10/atmega_registers_and_memory_ranges.html</guid>
    <pubDate>Sun, 10 Apr 2011 16:28:50 GMT</pubDate>
  </item>
  <item>
    <title>EletroAxé with Carlinhos Brown</title>
    <link>http://bleaklow.com:80/2011/04/01/eletroax_with_carlinhos_brown.html</link>
    <description>
          &lt;p&gt;
&lt;a href=&#034;http://www.carlinhosbrown.com.br/en/music/&#034;&gt;Carlinhos Brown&lt;/a&gt; is a colossus in Brazilian music, known not only for his solo musical career but also for the founding of &lt;a href=&#034;http://www.timbalada.com/&#034;&gt;Timbalada&lt;/a&gt; and for reviving the use of the Timbau, one of the instruments I (try to!) play.  As part of this year&#039;s carnival in Salvador, &lt;a href=&#034;http://kylemcdonald.net&#034;&gt;Kyle McDonald&lt;/a&gt; and &lt;a href=&#034;http://www.lucaswerthein.com&#034;&gt;Lucas Werthein&lt;/a&gt; built him a drum suit, with a series of drum triggers linked up to an Arduino and then via wireless to a PC to allow Carlinhos to trigger drum samples by tapping on the pads on the suits.  It&#039;s a cool project, see the video below and the &lt;a href=&#034;http://www.lucaswerthein.com/?p=187&#034;&gt;project page&lt;/a&gt; on Lucas&#039;s site for the full details.
&lt;/p&gt;
&lt;p&gt;
&lt;iframe src=&#034;http://player.vimeo.com/video/21531156&#034; width=&#034;480&#034; height=&#034;270&#034; frameborder=&#034;0&#034;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
The very first version of my &lt;a href=&#034;/2011/03/11/as_it_says_beautiful_light_performance.html&#034;&gt;wireless-controlled LED system&lt;/a&gt; was intended to be used on drums, so the EletroAxé project is based on a similar concept.  In my case I built a prototype using a &lt;a href=&#034;http://www.sparkfun.com/products/9199&#034;&gt;vibration sensor&lt;/a&gt; mounted on one of the &lt;a href=&#034;http://www.kalango.com/lshop,showrub,2004g,e,,percussion_instruments.alfaia,,,,.htm&#034;&gt;Alfaias&lt;/a&gt; that we play in &lt;a href=&#034;http://www.jubadoleao.com/&#034;&gt;Juba do Leão&lt;/a&gt;, the &lt;a href=&#034;http://www.jubadoleao.com/geek.php&#034;&gt;Maracatu&lt;/a&gt; group I&#039;m a member of.  It worked fine, but then the folks from the &lt;a href=&#034;http://travellinglightcircus.com&#034;&gt;Travelling Light Circus&lt;/a&gt; came along with their proposal, and the idea of mounting the strips on drums got shelved.  However it would be pretty cool to link up something like that suit to the LED system. and as both are arduino-based, it wouldn&#039;t be particularly hard either.  I have mad visions of this bunch playing at night, all lit up with radio-synchronised LED strips :-)
&lt;/p&gt;
&lt;p&gt;
&lt;iframe title=&#034;YouTube video player&#034; width=&#034;480&#034; height=&#034;390&#034; src=&#034;http://www.youtube.com/embed/IVtYG3tYg0M?rel=0&#034; frameborder=&#034;0&#034; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;</description>
      <category>Drumming</category>
    <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/04/01/eletroax_with_carlinhos_brown.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/04/01/eletroax_with_carlinhos_brown.html</guid>
    <pubDate>Fri, 01 Apr 2011 17:17:00 GMT</pubDate>
  </item>
  <item>
    <title>As it says, &#034;Beautiful light performance&#034;</title>
    <link>http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html</link>
    <description>
          &lt;p&gt;
Well, we did our first performance with the LED strips on Wednesday at &lt;a href=&#034;http://www.islingtonmill.com/&#034;&gt;Islington Mill&lt;/a&gt; in Manchester,and I&#039;m relieved to say they worked flawlessly, even after one of the wheels was dropped just before the performance started!  The lighting in the venue was a bit too bright to make a good video, so Andy made a video of the strips in action at Thursday&#039;s &lt;a href=&#034;http://travellinglightcircus.com/&#034;&gt;Travelling Light Circus&lt;/a&gt; rehearsal which he&#039;s put up on YouTube.  Even though I say it myself, I think it&#039;s rather good :-)
&lt;/p&gt;
&lt;p&gt;
Seeing the strips in use by the talented TLC performers just gives them an entirely different dimension, and I think the video is really well done as well. For me, one of the best bits of the project has been the opportunity to work with people who have an artistic clue :-)
&lt;/p&gt;
&lt;p&gt;
&lt;iframe title=&#034;YouTube video player&#034; width=&#034;640&#034; height=&#034;390&#034; src=&#034;http://www.youtube.com/embed/p2Q76JXH06U&#034; frameborder=&#034;0&#034; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;</description>
      <category>Arduino</category>
    <category>Tech</category>
    <comments>http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html#comments</comments>
    <guid isPermaLink="true">http://bleaklow.com:80/2011/03/11/as_it_says_beautiful_light_performance.html</guid>
    <pubDate>Fri, 11 Mar 2011 23:01:00 GMT</pubDate>
  </item>
  </channel>
</rss>

