<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ihsan Kehribar</title>
    <description>/* Some comments and facts. */</description>
    <link>http://yourdomain.com/</link>
    <atom:link href="http://yourdomain.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 12 Apr 2020 16:14:44 +0000</pubDate>
    <lastBuildDate>Sun, 12 Apr 2020 16:14:44 +0000</lastBuildDate>
    <generator>Jekyll v3.8.5</generator>
    
      <item>
        <title>OSX Based Minimal Verilog Simulation Toolchain</title>
        <description>&lt;p&gt;Hi All,&lt;/p&gt;

&lt;p&gt;I recently tried to make myself more comfortable to Verilog world with minimum &lt;strong&gt;big&lt;/strong&gt; software tools. Then, I created a small solution for myself and put it on to GitHub. Below, you can find the Readme file that I prepared for the codebase.&lt;/p&gt;

&lt;p&gt;You can check the repository from &lt;a href=&quot;https://github.com/kehribar/verilog-osx&quot;&gt;https://github.com/kehribar/verilog-osx&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;about&quot;&gt;About&lt;/h3&gt;

&lt;p&gt;One can say VHDL is second class citizen in open source software / hardware world. For example, &lt;a href=&quot;http://www.clifford.at/icestorm&quot;&gt;IceStrom&lt;/a&gt; project only supports Verilog. Furthermore, easy to use and FOSS simulators like &lt;a href=&quot;http://iverilog.icarus.com/&quot;&gt;Icarus Verilog&lt;/a&gt; and &lt;a href=&quot;http://www.veripool.org/wiki/verilator&quot;&gt;Verilator&lt;/a&gt; also (in stable sense) only support Verilog.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/kehribar/verilog-osx&quot;&gt;Here&lt;/a&gt; you can find a bare-bones, OSX based Verilog simulation toolchain that I created using several different tools. Everything should be working under Linux as well (expect &lt;a href=&quot;http://www.logicpoet.com/scansion&quot;&gt;Scansion&lt;/a&gt;) though I haven’t tested yet.&lt;/p&gt;

&lt;h3 id=&quot;description&quot;&gt;Description&lt;/h3&gt;

&lt;p&gt;There are four different Verilog source files:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;up_counter.v&lt;/code&gt;: 8bit unsigned up counter with clock, reset and enable inputs.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clken_gen.v&lt;/code&gt;: Clock enable pulse generator module with clock and reset inputs. Division ratio is parameterised.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;top.v&lt;/code&gt;: Main top module that instantiates an up_counter and clken_gen module.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;top_tb.v&lt;/code&gt;: Testbench module that instantiates the top module and feeds the neccessary test signals to the module.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to change the example structure, see the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Makefile&lt;/code&gt; then:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Change &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SRCS&lt;/code&gt; variable with new source file names …&lt;/li&gt;
  &lt;li&gt;Change &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TESTBENCH&lt;/code&gt; variable for another test bench file name …&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, if you want to change the resulting waveform file:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Modify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$dumpfile(&quot;top_tb.vcd&quot;);&lt;/code&gt; line in the testbench code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;commands&quot;&gt;Commands&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make simulate&lt;/code&gt; to simulate the codebase and run the testbench using Icarus Verilog.
    &lt;ul&gt;
      &lt;li&gt;Testbench’s output stream ($display, $monitor function outputs and also any error/log messages) directed to $TESTBENCHNAME_log.txt file to make later analysis more convenient.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make lint&lt;/code&gt; to trigger linting using Verilator.&lt;/li&gt;
  &lt;li&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make scansion&lt;/code&gt; to open up the Scansion application with recently created signal file. Only works under OSX.&lt;/li&gt;
  &lt;li&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make gtkwave&lt;/code&gt; to open up the GTKWave application with recently created signal file. Not suggested for OSX.&lt;/li&gt;
  &lt;li&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make clean&lt;/code&gt; to delete any generated files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Icarus Verilog&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew install icarus-verilog&lt;/code&gt; to install on OSX system.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Verilator&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Even though verilator itself also supports simulation, I’m only using it to ‘lint’ the codebase for any syntax / logical errors.&lt;/li&gt;
      &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew install verilator&lt;/code&gt; to install on OSX system.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;GTKWave&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;This application can be used to investigate .vcd waveform files. It was not very stable under OSX, so I moved on to other tool. Under Linux, this probably runs better.&lt;/li&gt;
      &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew install gtkwave&lt;/code&gt; to install on OSX system.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scansion&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;This application is used to investigate .vcd waveform files. It is OSX only. It works much better (more stable) than gtkwave under OSX.&lt;/li&gt;
      &lt;li&gt;Visit &lt;a href=&quot;http://www.logicpoet.com/scansion/&quot;&gt;http://www.logicpoet.com/scansion/&lt;/a&gt; webpage to download the application. Makefile assumes that you put the OSX executable under &lt;strong&gt;/Applications/&lt;/strong&gt; folder. You can change it if you want.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sublime Text&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Sublime Text doesn’t support Verilog language as valid syntax extension. You should install &lt;a href=&quot;https://packagecontrol.io/packages/Verilog&quot;&gt;https://packagecontrol.io/packages/Verilog&lt;/a&gt; package from package manager to have basic syntax coloring and couple of extra features for Verilog inside Sublime Text.&lt;/li&gt;
      &lt;li&gt;You can, of course, use any other text editor as well. :)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;tips-for-analog-waveform-inspection&quot;&gt;Tips for analog waveform inspection&lt;/h3&gt;

&lt;p&gt;Scansion and GTKWave support visualising ports as analog waveforms. This feature is &lt;strong&gt;very useful&lt;/strong&gt; in signal processing applications. Below you can see an example screenshot from &lt;em&gt;Scansion&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/analog_waveform.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;⌘ + 2&lt;/code&gt; to open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Trace Inspector&lt;/code&gt; menu and select the desired signal. First, change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Style&lt;/code&gt; to &lt;strong&gt;Analog&lt;/strong&gt; then adjust &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Height Scaling&lt;/code&gt; parameter to some high value to have bigger headroom in the display.&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;p&gt;You should check these short but dense documents about Verilog:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“Summary of Synthesisable Verilog 2001”
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.cl.cam.ac.uk/teaching/0910/ECAD+Arch/files/verilogcheatsheet.pdf&quot;&gt;https://www.cl.cam.ac.uk/teaching/0910/ECAD+Arch/files/verilogcheatsheet.pdf&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;“Verilog Tips, Pitfalls to Avoid”
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://retroactive.be/verilog_tips.pdf&quot;&gt;http://retroactive.be/verilog_tips.pdf&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 14 Sep 2016 00:00:00 +0000</pubDate>
        <link>http://yourdomain.com/2016/09/14/verilog-osx.html</link>
        <guid isPermaLink="true">http://yourdomain.com/2016/09/14/verilog-osx.html</guid>
        
        
      </item>
    
      <item>
        <title>Color image to 1bit dithered image</title>
        <description>&lt;p&gt;Hi all,&lt;/p&gt;

&lt;p&gt;I’m trying to make myself more comfortable with blogging often. To do so, I wanted to publish a quick post about small project that I’ve done ~6 months ago. I’m basically revisiting the blog workflow while publishing this post :)&lt;/p&gt;

&lt;p&gt;This is ‘Floyd-Steinberg’ dithering algorithm implementation in C++. Source code can be found at &lt;a href=&quot;https://github.com/kehribar/Dithering-OpenCV&quot;&gt;https://github.com/kehribar/Dithering-OpenCV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The algorithm is very useful if you have a black/white output capable only device (like thermal printers or monochrome displays) but want to have &lt;em&gt;some sort of&lt;/em&gt; detailed image.&lt;/p&gt;

&lt;h3 id=&quot;results&quot;&gt;Results&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/dith_raw_image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/dith_dithered_image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;p&gt;See &lt;a href=&quot;https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering&quot;&gt;https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering&lt;/a&gt; for additional details.&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Sep 2016 00:00:00 +0000</pubDate>
        <link>http://yourdomain.com/2016/09/05/color-image-to-bw-dithered-image.html</link>
        <guid isPermaLink="true">http://yourdomain.com/2016/09/05/color-image-to-bw-dithered-image.html</guid>
        
        
      </item>
    
      <item>
        <title>Polyphonic FM Synthesizer with STM32F031</title>
        <description>&lt;p&gt;Hi All,&lt;/p&gt;

&lt;p&gt;I’ve built a &lt;em&gt;playable&lt;/em&gt;, MIDI capable, polyphonic FM synthesizer using an 32bit ARM Cortex M0 microcontroller and an audio codec. This was a learning experience for me. You can find the finished form of the system in following two images.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_img2.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_img3.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sound samples for the system can be found from the following two links.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://soundcloud.com/ihsankehribar/wandering&quot;&gt;https://soundcloud.com/ihsankehribar/wandering&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://soundcloud.com/ihsankehribar/daft-synth-stereo&quot;&gt;https://soundcloud.com/ihsankehribar/daft-synth-stereo&lt;/a&gt; &lt;em&gt;(Midi notes are coming from computer)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please note that, there is no &lt;em&gt;single tone&lt;/em&gt; for this device. Almost every parameter is tunable on the fly. In the future I may build a user interaface with buttons and knobs for this device but at the moment I’m just following &lt;em&gt;change software - recompile - burn&lt;/em&gt; path for creating different sounds. Not much effective but works at the moment. :)&lt;/p&gt;

&lt;h3 id=&quot;earlier-work&quot;&gt;Earlier Work&lt;/h3&gt;

&lt;p&gt;Couple of months ago, I started this idea of creating a synthesizer with Atmel’s Xmega32E5 8bit microcontroller. You can find the code base for this project from here: &lt;a href=&quot;https://github.com/kehribar/xmega_fm-synth&quot;&gt;https://github.com/kehribar/xmega_fm-synth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_old0.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I hit some limitations with the Xmega system and wanted to go with an 32bit microcontroller. I ordered / designed couple of breakout boards and before moving on the final PCB form I prototyped the system.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_old1.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_old2.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;schematic&quot;&gt;Schematic&lt;/h3&gt;

&lt;p&gt;Final schematic is below. I’m going to explain the system part by part.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/img/i2s_codec_sch.png&quot;&gt;&lt;img src=&quot;/img/i2s_codec_sch.png&quot; alt=&quot;image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;microcontroller&quot;&gt;Microcontroller&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_mcu.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I used an ARM Cortex M0 core STM32F031 for the project. Cortex M0 cores don’t have anything really extra than having a 32x32 hardware multiplier for DSP purposes. Cortex M3 and M4/M4F have specific DSP instructions and they would have been much more helpful for such a computational intensive task, but I just wanted to try what can be done with a low cost, entry level ARM chip. That specific microcontroller also have I2S and DMA module which is essential for this project.&lt;/p&gt;

&lt;p&gt;For the system clock, I’m using the internal PLL to generate 48 MHz clock but I left optional XTAL footprint for future possible use.&lt;/p&gt;

&lt;p&gt;R1,R2,R3 and R4 is used to &lt;em&gt;slow down&lt;/em&gt; the edges of I2S signals to lower the high frequency noise a little bit. I put 49.9 ohms in the real circuit.&lt;/p&gt;

&lt;h4 id=&quot;audio-codec&quot;&gt;Audio Codec&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_codec.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is 2channel, 24bits, 192kHz sampling frequency capable audio DAC from Cirrus Logic (previously Wolfson).&lt;/p&gt;

&lt;p&gt;Best thing about this codec is, there is no need for DC blocking caps on the output. That means first of all no need for big bulky capacitors and secondly low frequency response of the output is much better since there will be no need for a high-pass filter to remove the DC level.&lt;/p&gt;

&lt;p&gt;Also, this codec generates a negative bias voltage via internal charge pump and I’m tapping that voltage from the codec to power the opamp’s negative supply.&lt;/p&gt;

&lt;h4 id=&quot;output-filter&quot;&gt;Output filter&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_filter.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Opamp that I used is MCP6002. It is not a low noise or audio grade opamp but it is rail to rail input/output and have enough bandwith and noise level for a just voltage follower.&lt;/p&gt;

&lt;p&gt;This is a second order Sallen Key low pass filter followed by a single order passive low pass filter. Component values should have been properly selected for the best rejection curve, but I used 4.7 k for resistors and 4.7nF for the capacitors which gives roughly 7.3 kHz -3db point.&lt;/p&gt;

&lt;h4 id=&quot;power-supply&quot;&gt;Power supply&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_ldo.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;LDO footprint is compatible with generic 5 pin SOT23 LDOs. Specifically I used Micrel MIC5317. There are two seperate regulators, one for the microcontroller, other for the codec + output filter. There are also ferrite beads at the input stage of the LDOs to filter out some high frequency noise as much as they can.&lt;/p&gt;

&lt;h4 id=&quot;midi-interface&quot;&gt;Midi interface&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_midi.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Optocoupler decouples the instrument ground with the controller board ground and eliminates possible ground loop issues. Also, optocoupler acts as a voltage level conversion between whatever MIDI keyboard sends and 3V3 microcontroller level.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_midifix.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the v0.1 hardware, I mixed pin#4 and pin#5 of the connector. I patched it with knife + patch wires on the PCB. Easy mistake! :) Schematic is corrected.&lt;/p&gt;

&lt;h3 id=&quot;layout&quot;&gt;Layout&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/img/i2s_codec_layout1.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I tried to follow Henry Ott’s advice for this layout. You should read his excellent article on the topic. &lt;a href=&quot;http://www.hottconsultants.com/techtips/split-gnd-plane.html&quot;&gt;http://www.hottconsultants.com/techtips/split-gnd-plane.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I partioned the analog and digital portion of the layout seperate and connected two portions over a small bridge and passed every neccessary signal between two portions only on top of that bridge.&lt;/p&gt;

&lt;p&gt;Sizewise, I just sticked to 5x5 cm rule of the low cost PCB fab houses though it could have been smaller if needed.&lt;/p&gt;

&lt;p&gt;I used &lt;a href=&quot;http://dirtypcbs.com/&quot;&gt;http://dirtypcbs.com/&lt;/a&gt; for the PCB manufacturing.&lt;/p&gt;

&lt;h3 id=&quot;firmware&quot;&gt;Firmware&lt;/h3&gt;

&lt;h4 id=&quot;toolchain&quot;&gt;Toolchain&lt;/h4&gt;

&lt;p&gt;GitHub repository for the firmware is this: &lt;a href=&quot;https://github.com/kehribar/stm32f031_template/tree/master/_synth&quot;&gt;https://github.com/kehribar/stm32f031_template/tree/master/_synth&lt;/a&gt; This particular firmware is a part of my trial on creating a generic framework for STM32F031 microcontroller. You can check the &lt;a href=&quot;https://github.com/kehribar/stm32f031_template/&quot;&gt;base repository&lt;/a&gt; for other examples.&lt;/p&gt;

&lt;p&gt;I used GCC compiler that I downloaded from &lt;a href=&quot;http://launchpad.net/gcc-arm-embedded&quot;&gt;http://launchpad.net/gcc-arm-embedded&lt;/a&gt;. Telling the Makefile where you unzipped the toolchain is enough. For the programmer, I used an STM32F4 Discovery board. After removing two jumper headers, that board acts like a generic ST Link v2 programmer. Calling &lt;em&gt;make iterate&lt;/em&gt; on the command line just recompiles everything and flashes the board via OpenOCD under 10 seconds.&lt;/p&gt;

&lt;h4 id=&quot;sound-synthesis&quot;&gt;Sound synthesis&lt;/h4&gt;

&lt;p&gt;For a proper background on the topic, you can read about FM synthesis from the following links. I won’t be able to explain better :)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://ccrma.stanford.edu/courses/220a-fall-2015/homework/3/Chowning_FM.pdf&quot;&gt;Original academic paper on the subject&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Frequency_modulation_synthesis&quot;&gt;Wikipedia!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is my quick notes on the sound synthesis details of the system. You can also read the firmware to get more idea.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sampling rate for the system is ~48 kHz.&lt;/li&gt;
  &lt;li&gt;All calculations are done with 16bit operations and all of the sounds are summed up to 24bit at the final stage with no loss of resolution.&lt;/li&gt;
  &lt;li&gt;System has 8 note polyphony at the moment. System can work with even more than that, but I limited it with 8 for the time being.&lt;/li&gt;
  &lt;li&gt;System has an LFO that modulates the amplitude of the sound at the final stage to create a &lt;em&gt;tremolo&lt;/em&gt; like effect.&lt;/li&gt;
  &lt;li&gt;That amplitude changing LFO has also &lt;em&gt;stereoPanning_offset&lt;/em&gt; variable that controls the automatic stereo panning effect between left and right channels.&lt;/li&gt;
  &lt;li&gt;There is one additional LFO to modulate the signal phase at a constant frequency with its own separate envelope to enrich to sound.&lt;/li&gt;
  &lt;li&gt;In total, there are three diffent envelopes, for output amplitude, fm modulation amount and lfo modulation amount for each sound with adjustable attack, decay, sustain and release parameters.&lt;/li&gt;
  &lt;li&gt;System is touch sensitive, meaning that maximum sound level and FM modulation amount changes with the velocity of the MIDI note.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;dma&quot;&gt;DMA&lt;/h4&gt;

&lt;p&gt;DMA is used to transfer data from the microcontroller to codec. DMA on the STM32F031 isn’t &lt;em&gt;double buffering&lt;/em&gt; capable so I had to trick the system to emulate a double buffering.&lt;/p&gt;

&lt;p&gt;DMA itself has &lt;em&gt;Transfer Complete&lt;/em&gt; and &lt;em&gt;Half Complete&lt;/em&gt; interrupts. In the &lt;em&gt;while(1)&lt;/em&gt; loop, I poll for these two interrupt flags and fill the first half or second half of a fixed lineer buffer based on which flag is set. As far as DMA concerns, it wraps to the begining of the array after it goes to end but in the mean time I change the content of the buffer without any data corruption problems thanks to the indication flags.&lt;/p&gt;

&lt;h3 id=&quot;i2s&quot;&gt;I2S&lt;/h3&gt;

&lt;p&gt;I2S peripheral of the SMT32F031 supports 24 bits transfers but it doesn’t play well with the DMA. For each sample, first you need to shift the data 8bits to left align it to 32bits. Second, you need to swap the higher 16bits and the lower 16bits in that variable. It is most probably due to how the DMA reads the memory. I learned that by &lt;em&gt;some amount&lt;/em&gt; of debugging session.&lt;/p&gt;

&lt;p&gt;The following code sample &lt;em&gt;fixes&lt;/em&gt; a 24bit right aligned signed data to proper format such that when DMA reads it, actual outcome is what you expect. So much for a low cost microcontroller. :)&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;  
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;inline&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int32_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;convertDataForDma_24b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;      
  &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shiftedData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;shiftedData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shiftedData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xFFFF0000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shiftedData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x0000FFFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int32_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;downloads&quot;&gt;Downloads&lt;/h3&gt;

&lt;p&gt;You can download the Eagle files for this project from the following links.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/files/stm32f0_i2s.sch&quot;&gt;Schematic&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/files/stm32f0_i2s.brd&quot;&gt;Layout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;licence&quot;&gt;Licence&lt;/h3&gt;

&lt;p&gt;This project is published under the terms of the GNU General Public License, version 3 licence.&lt;/p&gt;

&lt;h3 id=&quot;acknowledgement&quot;&gt;Acknowledgement&lt;/h3&gt;

&lt;p&gt;Mutable Instruments community was really helpful to me during the development of this project.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://mutable-instruments.net/forum/discussion/7247/custom-xmegae5-fm-synth&quot;&gt;http://mutable-instruments.net/forum/discussion/7247/custom-xmegae5-fm-synth&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://mutable-instruments.net/forum/discussion/7472/custom-fm-synth-with-stm32f031&quot;&gt;http://mutable-instruments.net/forum/discussion/7472/custom-fm-synth-with-stm32f031&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best,&lt;br /&gt;
ihsan.&lt;/p&gt;
</description>
        <pubDate>Sun, 06 Dec 2015 14:00:00 +0000</pubDate>
        <link>http://yourdomain.com/build/2015/12/06/polyphonic-fm-synthesizer-with-stm32f031.html</link>
        <guid isPermaLink="true">http://yourdomain.com/build/2015/12/06/polyphonic-fm-synthesizer-with-stm32f031.html</guid>
        
        
        <category>build</category>
        
      </item>
    
      <item>
        <title>Sensitive 'Loudness Detector'</title>
        <description>&lt;p&gt;Hi all,&lt;/p&gt;

&lt;p&gt;I recently needed to build a sensitive ‘loudness detector’ for environment sound level sensing based project. I had the microphone part covered with my previous project [&lt;a href=&quot;http://kehribar.me/hardware/electretAmplifier/&quot;&gt;http://kehribar.me/hardware/electretAmplifier/&lt;/a&gt;] but level sensing part is left to do. I could use microcontroller to do the work in software but I wanted to have a relatively low power solution. Eventually, I had to build a single supply envelope detector.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/loudness_detector_1.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Actually, that electret amplifier board itself have onboard diode + RC filter based passive envelope detector which can be used for level sensing purposes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/passive_envelope.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, it doesn’t work good with low sound levels since the diode has ~0.6V drop. Standard solution is to use an op-amp as a &lt;em&gt;super diode&lt;/em&gt; which all the examples on the web works quite OK if you have bipolar power supply rail. I wanted to have a single supply &lt;em&gt;precision rectifier&lt;/em&gt; but couldn’t find too much information on the web, therefore I’m sharing the solution that I’ve come up with.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/loudness_detector_4.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Output of the electret amplifier board sit around ~1V generated from [mic bias voltage / 2]. Initially I set the DC level of the input signal to VREF via R1 and C1. The two basically creates a high pass filter. Values are R1: 47k, C1: 0.1uF After the signal properly biased to the half supply, it is applied to the &lt;em&gt;precision rectifier&lt;/em&gt;. I used regular 1N4148 for D1. Only difference from the existing solution is that R2 and C2 is going to VREF line instead of GND. R2 and C2 decides the &lt;em&gt;responsiveness&lt;/em&gt; of the level detection. I used C2: 47uF and R2: ~100k to get a slow and steady response. One can play with the values of R2 and C2 to get much faster attack time.&lt;/p&gt;

&lt;p&gt;I used half of MCP6002 to do the rectification and other half for generating VREF = VCC/2 voltage. I used R3,R4: 47k and C3: 10uF.&lt;/p&gt;

&lt;p&gt;Overall circuit consumes around ~0.8 mA of current with the electret amplifier board as well. It can be considered as low power for a particular application. You can see the board in action from the video below.&lt;/p&gt;

&lt;iframe src=&quot;https://player.vimeo.com/video/136641666&quot; width=&quot;740&quot; height=&quot;420&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;video&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I build the board on a perfboard which you can see the details below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/loudness_detector_3.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ihsan.&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Aug 2015 21:33:00 +0000</pubDate>
        <link>http://yourdomain.com/2015/08/18/sensitive-loudness-detector.html</link>
        <guid isPermaLink="true">http://yourdomain.com/2015/08/18/sensitive-loudness-detector.html</guid>
        
        
      </item>
    
      <item>
        <title>Adjustable DC voltage/current source</title>
        <description>&lt;p&gt;Hi all,&lt;/p&gt;

&lt;p&gt;I’ve recently built an adjustable voltage and current source to test various hardware I build. Normally I was using a potentiometer to generate an adjustable voltage when I need but having a dedicated tool for the job seemed better.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/dc_source3.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I build this device by utilising a microcontroller, D/A converter, an op-amp + NPN transistor for constant current source and finally two optocouplers for serial communication.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/ltc1448.jpg&quot; alt=&quot;image&quot; /&gt;
&lt;em&gt;R3: 1k&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For the D/A converter, I used LTC1448 12bit DAC. It is relatively expensive for such a build but I had this IC as a sample for couple of years; therefore price wasn’t an issue. Moreover, since the battery voltage will vary with the milage and you can’t know the voltage value precisely I used an LM4040 zener reference to generate 2048 mV to the DAC. Therefore 1 LSB of the DAC output will correspond to 0.5 mV.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/constantCurrent.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;DAC has two channels and I used the second channel as &lt;em&gt;constant current source&lt;/em&gt;. R1 is just there to limit the base current of the NPN transistor. Constant current is calculated as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set_voltage/R2&lt;/code&gt;. I used 100 ohms for R1, and (10kohm fixed // 100kohm trimpot) as an R2. Trimpot is used to fine tune the output current. For op-amp I used a LTC1152 which can work down to 2.7 volts but it is not the greatest low-power op-amp with 3mA supply current. However, the op-amp is choper stabilised therefore it has very little &lt;em&gt;low frequency noise&lt;/em&gt; which is useful for such application.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/dc_source1.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I used Attiny85 for microcontroller. Nothing specific about it, you can find the &lt;a href=&quot;https://github.com/kehribar/adjustable-dc-reference&quot;&gt;firmware here&lt;/a&gt;. I used Elm-Chan’s software serial library for basic I/O functionallity. I can set the voltage values over opto-isolated 9600 baud serial link and store them inside the microcontroller’s EEPROM.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/optoisolator.jpg&quot; alt=&quot;image&quot; /&gt;
&lt;em&gt;R1: 4.7kohm  R2: 470ohm   R3: 470ohm   R4: 4.7kohm&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When power-up, microcontroller sets initial values to DAC, therefore I don’t need to configure the system each time I use. Also since I used optocouplers for isolation, I needed to invert TX &amp;amp; RX signals inside the firmware.&lt;/p&gt;

&lt;p&gt;In conclusion,&lt;/p&gt;

&lt;p&gt;System is not &lt;em&gt;that&lt;/em&gt; accurate due to various reasons &lt;em&gt;(small inaccuracy of the voltage reference, DC offset of the DAC and etc.)&lt;/em&gt; but it is highly stable. When I want to set the voltage channel to 250mV, I get around 250.45 mV of stable voltage out of it, which is enough for my needs.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/dc_source2.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Also for a &lt;strong&gt;much better&lt;/strong&gt; adjustable voltage reference build, you can check &lt;a href=&quot;http://cds.linear.com/docs/en/application-note/an86f.pdf&quot;&gt;Linear Technology App note 86&lt;/a&gt; called &lt;a href=&quot;http://cds.linear.com/docs/en/application-note/an86f.pdf&quot;&gt;&lt;em&gt;A Standards Lab Grade 20-Bit DAC with 0.1ppm/°C Drift&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ihsan.&lt;/p&gt;
</description>
        <pubDate>Thu, 21 May 2015 21:31:00 +0000</pubDate>
        <link>http://yourdomain.com/build/2015/05/21/adjustable-dc-voltagecurrent-source.html</link>
        <guid isPermaLink="true">http://yourdomain.com/build/2015/05/21/adjustable-dc-voltagecurrent-source.html</guid>
        
        
        <category>build</category>
        
      </item>
    
      <item>
        <title>ESP8266 + xmega32e5 - Wireless Temperature Sensor</title>
        <description>&lt;p&gt;Hi all,&lt;/p&gt;

&lt;p&gt;Couple of months ago I built a wireless temperature sensor using my &lt;a href=&quot;http://kehribar.me/hardware/breakout_xmegaE5/&quot;&gt;xmegaE5 breakout board&lt;/a&gt; and an ESP8266 wireless module.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/wifimodule3.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Normally this type of task could be handled inside the ESP8266 chip entirely; but at the time I couldn’t create a decent toolchain setup and I went with using the module over AT commands via stock firmware.&lt;/p&gt;

&lt;p&gt;It measures the ambient temperature using MCP9700 sensor and sends the data to Sparkfun’s &lt;a href=&quot;http://phant.io&quot;&gt;phant.io&lt;/a&gt; server. I’m using &lt;a href=&quot;http://imp.guru&quot;&gt;imp.guru&lt;/a&gt; to visualize the data. You can find my data stream from &lt;a href=&quot;http://imp.guru/f3o&quot;&gt;this link&lt;/a&gt;. Also, you can find the latest complete xmegaE5 firmware for this project from &lt;a href=&quot;https://github.com/kehribar/xmegaE5/tree/master/wi07&quot;&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When the microcontroller powers up, firmware checks the state of external push button. If the button is pushed, it goes to &lt;strong&gt;server&lt;/strong&gt; mode; otherwise it continues with the &lt;strong&gt;client&lt;/strong&gt; mode.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;  
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;digitalRead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LOW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;server_mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;client_mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;For &lt;strong&gt;server&lt;/strong&gt; mode, device creates a predefined wifi network that others can join in. In this mode, client mode SSID settings and phant.io public/private key informations can be loaded into microcontroller’s EEPROM without any firmware modifications and without any external hardware required. For interactivity, xmegaE5 acts like a very basic web server that responds back to TCP messages coming from port 80. Let’s say the wifi module has 192.168.10.100 IP address in the server mode. Trying to browse to the following link …&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http:\\192.168.10.100\s,fancy_ssid_name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;… from a web browser, sets microcontroller to store the &lt;em&gt;fancy_ssid_name&lt;/em&gt; as its SSID name for the client mode. SSID password, public/private keys for the data server also configured similarly.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;client&lt;/strong&gt; mode, device tries to join the SSID with the information stored inside the EEPROM. Then, periodically reads the ADC, applies filter on the result and tries to send to Phant.io server with a particular private/public key stored inside EEPROM. If anything goes wrong in the process, like wifi being down or HTTP request taking so long, system makes a full reset to recover from it.&lt;/p&gt;

&lt;p&gt;You can check the &lt;a href=&quot;https://github.com/kehribar/xmegaE5/tree/master/wi07&quot;&gt;firmware&lt;/a&gt; for other details. I’m running this system on and off for about 5 months, and works OK without any major problems.&lt;/p&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;There is an LM1117 LDO underneath the perfboard that generates a separate 3V3 rail only for the ESP8266 module from the 5V USB voltage. Onboard LDO of the xmega breakout board is not enough to power the wireless module properly.&lt;/li&gt;
  &lt;li&gt;There is an RGB led for status indication and I’m driving it with a timer driven software PWM since I didn’t use the proper dedicated compare output pins.&lt;/li&gt;
  &lt;li&gt;I also put a specific header for SPI flash IC and wrote a basic driver for it. Reason was to enable over-the-air programming support for the xmegaE5 chip. Since earlier I wrote a &lt;a href=&quot;https://github.com/kehribar/tealoader&quot;&gt;custom bootloader&lt;/a&gt; for xmegaE5 chip, firmware part wouldn’t be that hard but I couldn’t motivate myself enough to deal with proper &lt;em&gt;cloud backend&lt;/em&gt; solution that can scale without any major issues.&lt;/li&gt;
  &lt;li&gt;Firmware uses a lot buffers at its current state and could be reduced significantly with proper tweaks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here you can find couple more shots of the prototype:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/wifimodule1.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/wifimodule2.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 10 May 2015 20:35:00 +0000</pubDate>
        <link>http://yourdomain.com/build/2015/05/10/esp8266-xmega32e5-wireless-temperature-sensor.html</link>
        <guid isPermaLink="true">http://yourdomain.com/build/2015/05/10/esp8266-xmega32e5-wireless-temperature-sensor.html</guid>
        
        
        <category>build</category>
        
      </item>
    
      <item>
        <title>Hello World!</title>
        <description>&lt;p&gt;Hi all!&lt;/p&gt;

&lt;p&gt;I started to use &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll&lt;/a&gt; based blogging system. Nothing fancy here yet. I normally use &lt;a href=&quot;http://kehribar.me&quot;&gt;my other website&lt;/a&gt; for releasing finished projects but I’ll use this blog to release some unpolished prototypes.&lt;/p&gt;

&lt;p&gt;Theme definitely needs a change, but done is better than perfect. I’ll probably tweak with the look of this site soon.&lt;/p&gt;

&lt;p&gt;I’m using &lt;a href=&quot;https://github.com&quot;&gt;Github&lt;/a&gt; for hosting, and &lt;a href=&quot;https://atom.io/&quot;&gt;Atom&lt;/a&gt; editor for entries. I would normally used &lt;a href=&quot;http://www.sublimetext.com/3&quot;&gt;Sublime Text&lt;/a&gt;, but &lt;a href=&quot;https://atom.io/packages/markdown-writer&quot;&gt;Jekyll plugin&lt;/a&gt; of the Atom worked better.&lt;/p&gt;

&lt;p&gt;I’ll also leave this post with an image of Jim Williams’ “Living room thermometer”. Because, why not.&lt;/p&gt;

&lt;p&gt;ihsan.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/img/jimW_thermometer.jpg&quot;&gt;&lt;img src=&quot;/img/jimW_thermometer.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#####&lt;em&gt;Image is taken from: &lt;a href=&quot;http://www.edn.com/design/analog/4411017/3/Jim-Williams--The-light-side-and-classic-electronics-art-sculptures&quot;&gt;http://www.edn.com/design/analog/4411017/3/Jim-Williams--The-light-side-and-classic-electronics-art-sculptures&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 09 May 2015 12:18:00 +0000</pubDate>
        <link>http://yourdomain.com/post/2015/05/09/hello-world.html</link>
        <guid isPermaLink="true">http://yourdomain.com/post/2015/05/09/hello-world.html</guid>
        
        
        <category>post</category>
        
      </item>
    
  </channel>
</rss>
