<?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>chibiegg研究ノート</title>
	<atom:link href="http://www.chibiegg.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.chibiegg.net</link>
	<description></description>
	<lastBuildDate>Sat, 14 Apr 2012 17:22:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>STM32の開発環境構築(on Mac OSX)</title>
		<link>http://www.chibiegg.net/elec/stm32-elec/stm32_start_mac.htm</link>
		<comments>http://www.chibiegg.net/elec/stm32-elec/stm32_start_mac.htm#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:40:58 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[STM32]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[FTDI]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[JTAG]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[OpenOCD]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=650</guid>
		<description><![CDATA[72MHzで動作可能なARMのCortex-M3プロセッサ、及び多彩な周辺機能を搭載したマイコンSTM32の開発環境をMacの上で構築してみようと思います。 基本的にこちらのマイコン徹底入門を参考に進めていき、Mac(と [...]]]></description>
			<content:encoded><![CDATA[<p>72MHzで動作可能なARMのCortex-M3プロセッサ、及び多彩な周辺機能を搭載したマイコンSTM32の開発環境をMacの上で構築してみようと思います。</p>
<p>基本的に<a title="マイコン徹底入門" href="http://miqn.net/" target="_blank">こちら</a>の<a title="マイコン徹底入門" href="http://miqn.net/" target="_blank">マイコン徹底入門</a>を参考に進めていき、Mac(というかUNIX)特有の変更点に重点を置いて解説していきます。</p>
<p><strong>これらのセットアップをする前にMac OSXのセットアップディスクからXCode(開発ツール)を事前にインストールしておいてください。</strong></p>
<p><strong>Mac OSXではDFU経由での書き込みはできません。JTAG経由のみの書き込みとなるのでJTAGデバッガが必要です。</strong></p>
<h3>セットアップする環境一覧</h3>
<ul>
<li>GCCによるARMのクロスコンパイル環境</li>
<li>Eclipseを用いた統合開発環境</li>
<li>OpenOCDとJTAGを用いたデバッグ</li>
</ul>
<h3>セットアップ手順</h3>
<h4>GCCによるARMのクロスコンパイル環境</h4>
<p>まずはコードをARMプロセッサで実行するためのバイナリにコンパイルするツールをインストールします。</p>
<p>本来はGCCを一からコンパイルしてセットアップするのですが、Mac上でARMのクロスコンパイルをするためのバイナリが用意されているのでそれをダウンロードしてきます。</p>
<ul>
<li><a href="http://sourceforge.net/projects/devkitpro/files/" target="_blank">http://sourceforge.net/projects/devkitpro/files/</a></li>
</ul>
<p>上記のサイトにアクセスし、リストの中から<strong>devkitARM</strong>のMac版の最新バージョンをダウンロードして下さい。執筆当時は<strong>devkitARM_r31-osx.tar.bz2</strong>でした。</p>
<p>ダウンロード後は解凍し、解凍してできたディレクトリを<strong>/usr/local/devkitARM</strong>にコピーしてください。</p>
<p>そして、PATHを通すために~/.bash_profileファイル(無ければ新規作成し)、次の一行を加えてください。</p>
<blockquote><p>export PATH=$PATH:/usr/local/devkitARM/bin</p></blockquote>
<p>これでgccのセットアップは完了です。ターミナルで、</p>
<blockquote><p>arm-eabi-gcc -v</p></blockquote>
<p>とコマンドを実行すると次のスクリーンショットのようにGCCのバージョンが表示されれば成功です。</p>
<div id="attachment_651" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/08/arm-eabi-gcc_-v.png"><img class="size-medium wp-image-651" src="http://www.chibiegg.net/files/2010/08/arm-eabi-gcc_-v-300x187.png" alt="arm-eabi-gcc -v" width="300" height="187" /></a><p class="wp-caption-text">arm-eabi-gcc -v</p></div>
<h4>Eclipseのセットアップ</h4>
<h5>Eclipse CDTのセットアップ</h5>
<p>実は以上でSTM32向けのコードをコンパイルすることはできるのですが、統合開発環境があると作業が進めやすいのでEclipse(CDT)を用いた統合開発環境を構築します。</p>
<p>まずはEclipse CDTをインストールします。</p>
<p><a title="Eclipse CDT Downloads" href="http://www.eclipse.org/cdt/downloads.php" target="_blank">Eclipse CDTのダウンロードページ</a>から<strong>CDT 7.0 for Eclipse Helios</strong>をダウンロードします。(執筆当時の最新バージョンです)</p>
<p><strong>Eclipse package</strong>のリンクをクリックすると、</p>
<div id="attachment_653" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.chibiegg.net/files/2010/08/Eclipse_CDT_Download1.png"><img class="size-full wp-image-653" src="http://www.chibiegg.net/files/2010/08/Eclipse_CDT_Download1.png" alt="Eclipse CDT ダウンロードページへのリンク" width="450" height="97" /></a><p class="wp-caption-text">Eclipse CDT ダウンロードページへのリンク</p></div>
<p>次のようにプラットフォームの選択画面が出ます。ここで、もし64bit対応のMac本体であれば<strong>Mac OSX(Cocoa 64bit)</strong>を、そうでなければ<strong>32bit</strong>を選んでダウンロードしてください。</p>
<div id="attachment_654" class="wp-caption aligncenter" style="width: 220px"><a href="http://www.chibiegg.net/files/2010/08/Eclipse_CDT_Download2.png"><img class="size-full wp-image-654" src="http://www.chibiegg.net/files/2010/08/Eclipse_CDT_Download2.png" alt="Eclipse CDT プラットフォームの選択" width="210" height="290" /></a><p class="wp-caption-text">Eclipse CDT プラットフォームの選択</p></div>
<p>ダウンロードし、解凍してできた<strong>eclipse</strong>ディレクトリを<strong>Application</strong>フォルダにコピーします。</p>
<p>そして、コピーした先の<strong>Eclipse.app</strong>を実行してください。</p>
<p>起動時にworkspaceの場所を聞かれますがデフォルトのままで構いません。ここで指定したディレクトリにソースコード等が保存・配置されることになります。</p>
<h5>Embedded CDTのインストール</h5>
<p>それでは次に組み込み開発向けのプラグインをインストールします。</p>
<p>EclipseのHelpメニューから&#8230;.となるのですが、あまりにも前述のマイコン徹底入門とかぶるので作業の必要なページを列挙しておきます。</p>
<p>ただ、どうやらEclipseからRxtxをインストールするとエラーでうまく行かないので、<a href="http://rxtx.qbang.org/wiki/index.php/Download" target="_blank">Rxtxの公式ダウンロードページ</a>から<a title="http://rxtx.qbang.org/pub/rxtx/rxtx-2.1-7r2.zip" rel="nofollow" href="http://rxtx.qbang.org/pub/rxtx/rxtx-2.1-7r2.zip">rxtx-2.1-7r2</a>のソースコードをダウンロードして、<strong>configure</strong> と <strong>make</strong> 、<strong>sudo make install</strong>を実行して手動でインストールしてください。</p>
<ul>
<li><a href="http://miqn.net/introduction/61.html" target="_blank">4.1.2.4. Embedded CDTのインストール</a></li>
<li><a href="http://miqn.net/introduction/62.html" target="_blank">4.1.2.5. ターミナルソフトウェアのインストール</a></li>
<li><a href="http://miqn.net/introduction/63.html" target="_blank">4.1.2.6. バイナリエディタのインストール</a></li>
<li><a href="http://miqn.net/introduction/64.html" target="_blank">4.1.2.7. ファイルタイプの追加</a></li>
</ul>
<h4>OpenOCDとJTAGを用いたデバッグ</h4>
<h5>FTDIのライブラリのインストール</h5>
<p>以下、鋭意執筆中&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/elec/stm32-elec/stm32_start_mac.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AVRの内蔵CRクロックを校正する</title>
		<link>http://www.chibiegg.net/elec/avr-elec/osccal.htm</link>
		<comments>http://www.chibiegg.net/elec/avr-elec/osccal.htm#comments</comments>
		<pubDate>Thu, 04 Mar 2010 12:33:27 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[OSCCAL]]></category>
		<category><![CDATA[カウンタ]]></category>
		<category><![CDATA[周波数]]></category>
		<category><![CDATA[校正]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=594</guid>
		<description><![CDATA[AVRには外部クロックがなくても動作するように、ICの内部にRC発振回路によるクロックを内蔵しています。 工場出荷時に規定の周波数(基本的に8MHz)になるように校正されていますが、データシートによると10%までの誤差が [...]]]></description>
			<content:encoded><![CDATA[<p>AVRには外部クロックがなくても動作するように、ICの内部にRC発振回路によるクロックを内蔵しています。</p>
<p>工場出荷時に規定の周波数(基本的に8MHz)になるように校正されていますが、データシートによると10%までの誤差がある可能性があり、シリアル通信では致命傷になります。</p>
<p>そこで、個別に調整できるようにOSCCAL(発振校正レジスタ)が存在します。このレジスタをプログラム実行時に書き換えることで発振周波数を変更できます。OSCCALが大きいほど高い周波数で、小さいほど低い周波数で動作します。</p>
<p>AVRはヒューズビットのCKOUTをプログラム(0)することにより、CLK0端子からシステムクロックが出力されます。これを測定機器で観測しながらOSCCALレジスタを操作することによりクロックを調整します。</p>
<p><span id="more-594"></span></p>
<h3>校正</h3>
<p>手元にあったATmega88を8Mhzに校正してみました。今回は周波数の測定には周波数カウンタを利用しました。もちろんオシロスコープで周波数を算出しても構いません。</p>
<p>工場出荷時の校正値はAVR ISP mkⅡを利用して読み出せます。この個体は0xbbになっていました。この状態での発振周波数はこのようになりました。</p>
<div id="attachment_605" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0xbb.jpg"><img class="size-medium wp-image-605" src="http://www.chibiegg.net/files/2010/03/osccal_0xbb-300x120.jpg" alt="工場出荷時(0xbb) 8.09MHz" width="300" height="120" /></a><p class="wp-caption-text">工場出荷時(0xbb) 8.09MHz</p></div>
<p>8.09MHzと少し高い周波数になっていました。誤差は+1.3%とデータシートの許容範囲10%に比べるとかなりよい精度です。が、少し高いので0xbaにしてみました。</p>
<div id="attachment_604" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0xba.jpg"><img class="size-medium wp-image-604" src="http://www.chibiegg.net/files/2010/03/osccal_0xba-300x120.jpg" alt="OSCCAL = 0xba 8.03MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0xba 8.03MHz</p></div>
<p>0xbaにしたところ8.03MHz。これでもまだ高いので、0xb9にしてみます。</p>
<div id="attachment_603" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0xb9.jpg"><img class="size-medium wp-image-603" src="http://www.chibiegg.net/files/2010/03/osccal_0xb9-300x120.jpg" alt="OSCCAL = 0xb9 7.99MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0xb9 7.99MHz</p></div>
<p>0xb9にすると7.99MHzと誤差は-0.13%とかなり高精度にできました。しかし、残念ながらCR発振は気温等に影響されるので常にこの精度を維持することはできません。あくまでも「今の環境」での周波数です。</p>
<h3>実験</h3>
<p>試しにどこまでいけるのか、CLK0端子を周波数カウンタに接続しながらいろいろとOSCCALを操作して動作周波数を見てみます。</p>
<p>OSCCALを0&#215;00にしてみると、3.92MHz。</p>
<div id="attachment_600" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0x00.jpg"><img class="size-medium wp-image-600" src="http://www.chibiegg.net/files/2010/03/osccal_0x00-300x120.jpg" alt="OSCCAL = 0x00 3.93MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0x00 3.93MHz</p></div>
<p>半分の0x7fでは、8.08MHz。あれ？0xb9の時より高い？</p>
<div id="attachment_601" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0x7f.jpg"><img class="size-medium wp-image-601" src="http://www.chibiegg.net/files/2010/03/osccal_0x7f-300x120.jpg" alt="OSCCAL = 0x7f 8.08MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0x7f 8.08MHz</p></div>
<p>そこで、0x8fにしてみると、6.53MHz。データシートを読んでみると、最上位ビットは高周波範囲(1)か低周波範囲(0)かの選択になっているようで、この２つの範囲は重なっており、0x7fの時の方が0&#215;80のときより高い周波数になっているようです。</p>
<div id="attachment_602" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0x8f.jpg"><img class="size-medium wp-image-602" src="http://www.chibiegg.net/files/2010/03/osccal_0x8f-300x120.jpg" alt="OSCCAL = 0x8f 6.53MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0x8f 6.53MHz</p></div>
<p>最後にもっとも大きい0xffにしてみると、12.97MHzとなりました。</p>
<div id="attachment_606" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/osccal_0xff.jpg"><img class="size-medium wp-image-606" src="http://www.chibiegg.net/files/2010/03/osccal_0xff-300x120.jpg" alt="OSCCAL = 0xff 12.97MHz" width="300" height="120" /></a><p class="wp-caption-text">OSCCAL = 0xff 12.97MHz</p></div>
<p>これほど範囲が広いのであれば無理矢理でよければ内蔵CRである程度の速度まで動かすことができそうです。</p>
<p>おまけ</p>
<p>周波数カウンタに接続したブローブをどこにもつながないと、商用電源のノイズを広うようで、60Hz近辺の周波数が表示されました。</p>
<div id="attachment_599" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/60hz.jpg"><img class="size-medium wp-image-599" src="http://www.chibiegg.net/files/2010/03/60hz-300x47.jpg" alt="商用電源のノイズ 60hz" width="300" height="47" /></a><p class="wp-caption-text">商用電源のノイズ 60hz</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/elec/avr-elec/osccal.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>74HC595をSPI機能をつかって操作する</title>
		<link>http://www.chibiegg.net/elec/avr-elec/74hc595_spi.htm</link>
		<comments>http://www.chibiegg.net/elec/avr-elec/74hc595_spi.htm#comments</comments>
		<pubDate>Thu, 04 Mar 2010 12:31:16 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[74HC595]]></category>
		<category><![CDATA[SPI]]></category>
		<category><![CDATA[カウンタ]]></category>
		<category><![CDATA[シフトレジスタ]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ロジックIC]]></category>
		<category><![CDATA[周波数]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=569</guid>
		<description><![CDATA[シフトレジスタ(74HC595)の使い方という以前の記事において、汎用IOポートをソフトウエアで制御してシフトレジスタ(74HC595)を操作するというのは実験しました。 ですが、この方法ではプログラムサイズも大きくなり [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/elec/avr-elec/74hc595_sample.htm">シフトレジスタ(74HC595)の使い方</a>という以前の記事において、汎用IOポートをソフトウエアで制御してシフトレジスタ(74HC595)を操作するというのは実験しました。<br />
ですが、この方法ではプログラムサイズも大きくなり、動作速度も遅くなってしまうという問題があります。<br />
そこで、今回はAVRに搭載されている周辺機能であるSPIを使い、ハードウエアでシリアルデータとクロックを送出するようにしてみたいと思います。<br />
どれぐらいの<strong>コードサイズの削減</strong>、<strong>動作速度の向上</strong>が出来るかを実験してみます。</p>
<p><span id="more-569"></span></p>
<h4>ソフトウエアの場合(関数呼び出し等のオーバーヘッドは考慮しない)</h4>
<p>データセット　クロックHi　クロックLo　がそれぞれ　8回<br />
ラッチクロックLo　ラッチクロックHi　がそれぞれ　1回<br />
なので、最低でも<strong><span style="text-decoration: underline">26クロック</span></strong>の動作時間が必要です、が、実際には関数呼び出しのオーバヘッドやif文、データのビット操作等でもっと時間がかかる(前回のプログラムの場合追加で17クロック程度)と思われます。</p>
<h4>ハードウエア処理の場合(初期化等は除く)</h4>
<p>SPDRレジスタへのデータセットをするだけで送信が開始されます。<br />
送信は最速で1bitの送信に2クロックかかるので8bitで16クロック分<br />
最後にラッチの操作で2クロック<br />
よって<span style="text-decoration: underline"><strong>20クロック</strong></span>で完了します。6クロックだけの差のようにみえますが、こちらはオーバーヘッド等の余分に必要な時間はないため実際にはソフトウエアよりももっと短時間でできると考えられます(実際には<strong>31クロック(約50%)の削減</strong>)。なによりコードサイズが大きくちがうはずです。</p>
<h3>回路図</h3>
<p>変更点はクロックとデータ線をUSCKとMOSIに移動させました。電源等は省略されています。以前利用したATtiny2313にはSPI機能が搭載されていないので手元にあったATmega88を利用しました。SPI機能を他のSPI接続のADコンバーター等と併用していても74HC595のラッチクロックがCSの代わりとして機能し、正しく個別に操作できます。</p>
<div id="attachment_588" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/74hc595_spi.png"><img class="size-medium wp-image-588" src="http://www.chibiegg.net/files/2010/03/74hc595_spi-300x163.png" alt="74HC595実験回路図(SPI利用)" width="300" height="163" /></a><p class="wp-caption-text">74HC595実験回路図(SPI利用)</p></div>
<h3>AVRのプログラム</h3>
<p><span style="color: #ff0000"><strong>2010年5月15日訂正</strong>：なんと大変なことにSPCRレジスタの設定を間違えていました。<br />
マスター動作に設定しないといけないのにスレーブになっていました。<br />
自分で動作確認したのにいつの間にそうなってしまったのか&#8230;</span></p>
<pre class="brush: c; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

#define SHIFT_PORT PORTB
#define SHIFT_RCK PB1

void delay_ms(uint16_t ms){
	while(ms--){
		_delay_ms(1);
	}
}

void _shift_rck(){	//ラッチクロックを一つ送信
	SHIFT_PORT &amp;= ~(1&lt;&lt;SHIFT_RCK);
	SHIFT_PORT |= (1&lt;&lt;SHIFT_RCK);
}

void shift_out(uint8_t data){
	int8_t i;
	SPDR = data;	 //データセットで送信開始
	while(!(SPSR &amp; (1&lt;&lt;SPIF)));	 //転送完了まで待機
	_shift_rck();	//ラッチを更新
}

void init_spi(){
	//SPIクロックは最速のfOSC/2
	SPCR = 0b01010000;
	SPSR = 0b00000001;
}

int main(){
	uint16_t i;
 	uint8_t t;
 	DDRB = 0b00101111;	//入出力設定(SSはSPIの動作時は出力にしておく)
 	init_spi(); 	//SPI初期設定
 	while(1){
 		//0から255までをカウントアップして出力
 		for(i=0;i&lt;=0xff;i++){
 			shift_out(i);
 			delay_ms(30);
 		}

 		//バーを延ばしたり縮めたり
 		for(t=0;t&lt;5;t++){
 			for(i=0;i&lt;9;i++){
 				shift_out((0xff&gt;&gt;(8-(i%9))));
 				delay_ms(70);
 			}
 			for(i=0;i&lt;9;i++){
 				shift_out((0xff&gt;&gt;(i%9)));
 				delay_ms(70);
 			}
 		}

 		//左右にスクロール
 		for(t=0;t&lt;5;t++){
 			for(i=0;i&lt;8;i++){
 				shift_out((1&lt;&lt;(i%8)));
 				delay_ms(70);
 			}
 			for(i=0;i&lt;8;i++){
 				shift_out((0x80&gt;&gt;(i%8)));
 				delay_ms(70);
 			}
 		}

 	}
 	return 0;
}
</pre>
<p>どうですか？ソフトウエアの場合と比較してみてください。プログラムの行数では少しの削減に見えるかもしれません。ですが、前回のfor構文等を展開すると莫大な削減になっているとわかると思います。</p>
<h3>動作実験</h3>
<p>それでは実際に動作している映像を&#8230;と行きたいところですが、前回の映像との違いはありませんので、写真だけ載せます。</p>
<div id="attachment_618" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/view.jpg"><img class="size-medium wp-image-618" src="http://www.chibiegg.net/files/2010/03/view-300x225.jpg" alt="74HC595 with SPI" width="300" height="225" /></a><p class="wp-caption-text">74HC595 with SPI</p></div>
<h3>比較実験</h3>
<h4>コードサイズ</h4>
<p>次のような延々とシフトレジスタにデータを送りつけるプログラムをIOポートを直接叩く方法とSPIで操作する方法のそれぞれの関数とともにコンパイルしたときのコードサイズを比較します。</p>
<pre class="brush: c; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
uint8_t tmp;
while(1){
 	shift_out(tmp++);
}
</pre>
<p>結果、IOポートを叩く場合 188bytes、SPIを利用する場合 148bytes となり、40bytesの削減になりました。</p>
<p>空のプログラムをコンパイルした時のコードサイズが80bytesだったので、シフトレジスタ操作部分だけを計算すると、<strong>108bytesから68bytesと37%の削減</strong>になりました。</p>
<h4>動作速度</h4>
<p>先程のプログラムをそれぞれ実行し、74HC595のRCK端子に出力されるパルスの周波数、パルスの間隔を測定することにより動作速度を検証します。</p>
<p>今回はRCKを周波数カウンタに入力し周波数を調べました。</p>
<div id="attachment_616" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/rck_io.jpg"><img class="size-medium wp-image-616" src="http://www.chibiegg.net/files/2010/03/rck_io-300x120.jpg" alt="IOポートを叩いた時のRCK周波数(334kHz)" width="300" height="120" /></a><p class="wp-caption-text">IOポートを叩いた時のRCK周波数(334kHz)</p></div>
<div id="attachment_617" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2010/03/rck_spi.jpg"><img class="size-medium wp-image-617" src="http://www.chibiegg.net/files/2010/03/rck_spi-300x120.jpg" alt="SPIを用いた時のRCK周波数(653kHz)" width="300" height="120" /></a><p class="wp-caption-text">SPIを用いた時のRCK周波数(653kHz)</p></div>
<p>結果、I/Oポートを叩いた場合334kHz、SPIを使った場合653kHzと、ほぼ試算通り約49%の削減となりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/elec/avr-elec/74hc595_spi.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>車両用デコーダの製作(設計中)</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/loco_decoder_ver1.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/loco_decoder_ver1.htm#comments</comments>
		<pubDate>Thu, 09 Jul 2009 13:12:09 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[デコーダ]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=541</guid>
		<description><![CDATA[後輩から基板を発注するからなにかないか？と言われたので車両用デコーダを制作することにします。 ATTinyで作りたかったんですが、赤外線送信機能もつけるためにタイマーとROMのサイズの関係でATmegaを利用することに。 [...]]]></description>
			<content:encoded><![CDATA[<p>後輩から基板を発注するからなにかないか？と言われたので車両用デコーダを制作することにします。</p>
<p>ATTinyで作りたかったんですが、赤外線送信機能もつけるためにタイマーとROMのサイズの関係でATmegaを利用することに。</p>
<p>2009年7月9日現在設計段階です</p>
<p><a href="http://www.chibiegg.net/files/2009/07/loco_decoder_ver1_brd.jpg"><img class="aligncenter size-full wp-image-544" src="http://www.chibiegg.net/files/2009/07/loco_decoder_ver1_brd.jpg" alt="loco_decoder_ver1_brd" width="458" height="193" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/loco_decoder_ver1.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2線式ポイント用デコーダ</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/point_decoder_1.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/point_decoder_1.htm#comments</comments>
		<pubDate>Sat, 20 Jun 2009 14:35:28 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[デコーダ]]></category>
		<category><![CDATA[ポイント]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=524</guid>
		<description><![CDATA[ポイントを制御するためのデコーダを開発しました。DigitraxのDS52を意識していますが、２つではなく４つのポイントを制御できます。 特徴としてはモーター制御と同じ回路を用いることにより大電流を必要とするポイント(T [...]]]></description>
			<content:encoded><![CDATA[<p>ポイントを制御するためのデコーダを開発しました。DigitraxのDS52を意識していますが、２つではなく４つのポイントを制御できます。</p>
<p>特徴としてはモーター制御と同じ回路を用いることにより大電流を必要とするポイント(TOMIXのポイント等)の駆動や、モーター式のポイントも制御できます。</p>
<p>電源はレールから取ることも可能ですし、外部のACアダプターも選択できます。</p>
<p>ちょっと設計をミスったのでジャンパで修正しています。量産するときには修正しないと&#8230;</p>
<div id="attachment_536" class="wp-caption aligncenter" style="width: 284px"><a href="http://www.chibiegg.net/files/2009/06/point_decoder_1.jpg"><img class="size-medium wp-image-536" src="http://www.chibiegg.net/files/2009/06/point_decoder_1-274x300.jpg" alt="2線式ポイントデコーダ" width="274" height="300" /></a><p class="wp-caption-text">2線式ポイントデコーダ</p></div>
<h4>仕様</h4>
<ul>
<li>コイル、モータータイプのポイントを４つ制御可能</li>
<li>CV値の設定により通電時間が選択可能</li>
<li>設定によってはc,tで方向ではなく出力のON,OFFも制御できるので車輪クリーナーのON,OFF等にも利用可能</li>
<li>電源はACアダプター、レールからのいずれかを選択可能</li>
</ul>
<h4>CV値</h4>
<p>動作モードは0,1:一定時間通電モード、255:電源制御モードの２つから選択</p>
<p>一定通電モードはThrownあるいはClosedで指定された方向に設定された動作時間だけ電流を流す。ポイントの制御はこちら。通電時間は次の通り。</p>
<ul>
<li>モード0のとき</li>
</ul>
<p>(動作時間CV値)*5ミリ秒　　　最大1275ミリ秒</p>
<ul>
<li>モード1のとき</li>
</ul>
<p>(動作時間CV値)*100ミリ秒　　最大25.5秒</p>
<p>電源制御モードはThrownなら電流ON、Closedなら電流OFF。車輪クリーナー等の電源のON,OFFに使います。</p>
<ul>
<li>CV1　　ポイント1のポイント番号の下位バイト</li>
<li>CV2　　ポイント1のポイント番号の上位バイト</li>
<li>CV3　　ポイント2のポイント番号の下位バイト</li>
<li>CV4　　ポイント2のポイント番号の上位バイト</li>
<li>CV5　　ポイント3のポイント番号の下位バイト</li>
<li>CV6　　ポイント3のポイント番号の上位バイト</li>
<li>CV7　　ポイント4のポイント番号の下位バイト</li>
<li>CV8　　ポイント4のポイント番号の上位バイト</li>
<li>CV9　　9を書き込みでオールリセット</li>
<li>CV20　 ポイント1の動作モード</li>
<li>CV21　 ポイント1の動作時間</li>
<li>CV22　 ポイント2の動作モード</li>
<li>CV23　 ポイント2の動作時間</li>
<li>CV24　 ポイント3の動作モード</li>
<li>CV25　 ポイント3の動作時間</li>
<li>CV26　 ポイント4の動作モード</li>
<li>CV27　 ポイント4の動作時間</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/point_decoder_1.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>サービスモード用パケットの解析</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/service_mode_packet.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/service_mode_packet.htm#comments</comments>
		<pubDate>Wed, 17 Jun 2009 12:28:25 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[デコーダ]]></category>
		<category><![CDATA[パケット]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=509</guid>
		<description><![CDATA[デコーダの設定を変更するためのモードであるサービスモードでのパケットについてまとめます。 DCCのサービスモードについての規格はNMRA DCC StandardsのRecommended Practice RP-9.2 [...]]]></description>
			<content:encoded><![CDATA[<p>デコーダの設定を変更するためのモードであるサービスモードでのパケットについてまとめます。</p>
<p>DCCのサービスモードについての規格はNMRA DCC Standardsの<a title="DCC Service Mode" href="http://www.nmra.org/standards/DCC/standards_rps/RP-923.pdf" target="_blank">Recommended Practice RP-9.2.3 </a><strong><em><a title="DCC Service Mode" href="http://www.nmra.org/standards/DCC/standards_rps/RP-923.pdf" target="_blank">&#8220;DCC Service Mode&#8221;</a></em><span style="font-weight: normal">に書かれているのでそちらも参照してください。また、誤解している可能性があるので利用する場合は十分検証してください。</span></strong></p>
<p><strong><span style="font-weight: normal"><span id="more-509"></span></span></strong></p>
<p>サービスモードとは、コマンドステーション等のプログラミング線路にデコーダを接続し、内部の設定(CV値)を書き換えるためのモードです。</p>
<p>とはいえ普通のパケットと通信規格に特別違いはないので(プリアンプル数がほんとは多い20個以上なのですが)既存のDCCパケット受信プログラムがそのまま使えます。</p>
<h3>サービスモードへ入るには</h3>
<p>デコーダはサービスモードパケットを電源投入後100ms以内に受信する事によってサービスモードに入ることができます。<br />
またサービスモードはサービスモードパケット(0xffから始まるアイドルパケット等)でないパケットを受信するか、最後の受信から20ms経過したときに抜けます。</p>
<p>アイドルパケットを受信したらサービスモードに入ってはいけません。これを忘れると車両番号124番の列車へのパケットがDirモードのプログラミングパケットと重なるので誤動作を起こします。</p>
<p>ちなみにリセットパケットは全てが0&#215;00の3バイトのパケットのことです。</p>
<p>またデコーダが応答する必要がある場合があります。そのときはデコーダは60mA以上の電流を6ms(+/-1ms)消費することによって応答とします。</p>
<h3>サービスモードパケット</h3>
<p>一般的なパケットは一バイト目にデコーダのアドレス情報がありますが、サービスパケットにはデコーダアドレスは存在しません。デコーダが受信したデータはすべてそのデコーダ向けのパケットとなります。</p>
<p>サービスパケットは１バイト目の上位４ビットが二進数で0111であるパケットです。</p>
<p>今回はいくつかプログラム方式のうちページモード(PAGE)とダイレクトモード(DIR)についてまとめます。</p>
<p>ページモードよりダイレクトモードのほうが簡単です。</p>
<p>その他には物理モード(PHYS)、アドレス設定専用モードとオペレーションモード(OPS)があります。が、物理モードは一部のCV値のみ、アドレス専用モードは名前の通りアドレスのみしかプログラミングできませんので普通は利用しないと思われます。またOPSモードはサービスモードではなく標準のパケットなのでとりあえず割愛します。</p>
<h4>ダイレクトモード(Direct Mode)</h4>
<p>ダイレクトモードはパケット一つだけで読み込みあるいは書き込みを行います。動作手順は次のようになります。</p>
<ol>
<li>電源投入</li>
<li>３回以上のリセットパケット</li>
<li>ダイレクトモードパケット(誤動作防止のため同じパケットを５回以上)</li>
<li>６回以上のリセットパケット(デコーダが処理するための時間稼ぎ)</li>
<li>電源切断</li>
</ol>
<p>となります。なので説明するのはプログラミングパケットだけです。ダイレクトモードパケットは次のような４バイト構成です。プリアンプルは通常よりも多く20個以上です。</p>
<p style="text-align: center">0 0111CCAA 0 AAAAAAAA 0 DDDDDDDD 0 EEEEEEEE 1</p>
<ul>
<li>C　動作モード指定　（01でベリファイ(読み込み)、11で書き込み、10ビット操作)</li>
<li>A　操作するCV値の番号</li>
<li>D　書き込んだりベリファイ(一致確認)するデータの中身,ビット操作の場合その内容</li>
<li>E　エラー検知用バイト</li>
</ul>
<p>ベリファイのときは送られて来たデータとCV値が一致したときにのみ応答します。それによりコマンドステーションはCV値を読み込んだことになります。</p>
<p>(ビット操作については執筆中&#8230;気が向いたら（笑）)</p>
<h4>ページモード(Paged CV Addressing)</h4>
<p>ページモードは少し複雑でダイレクトモードのように一回ののパケットでというわけにはいきません。</p>
<p>ちょっと説明が大変なので執筆中&#8230;.実装したコードサンプルが下にあります。</p>
<h3>実装</h3>
<p>実際にサービスパケット受信をC言語でAVRに実装した例です。ただ以下の例は基本のサンプルであって必要な処理をすべて満たしている訳ではありません。例えばサービスモードに入ってはいけないかどうかの確認をしていない、連続で同じパケットを受信せずに一回だけで実行してしまう点など&#8230;<br />
しかも実際に実装する時はswitchを使わずに書いた方がプログラムサイズを小さくできます。<br />
あくまでも参考資料という事で許してください。</p>
<h4>ダイレクトモード(Direct Mode)</h4>
<pre class="brush: c; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
		if(size==4)
		switch(packet[0]&amp;0xfc){
		  case 0x74: //Verify
			cv = packet[1] + ((packet[0]&amp;0x03)&lt;&lt;8); //CV値番号
			//ここでデコーダが保持しているCV値とpacket[2]の内容が一致したら電流を消費し応答
			//応答　60mA以上を5から7ミリ秒消費
			break;
		  case 0x7C: //Write
			cv = packet[1] + ((packet[0]&amp;0x03)&lt;&lt;8) + 1; //CV値番号」
			//ここでデコーダはpacket[2]の内容をCV値として保存処理
			//応答　60mA以上を5から7ミリ秒消費
			break;
		  case 0x78: //Bit操作
			//未対応
			break;
		}
</pre>
<h4>ページモード(Paged CV Addressing)</h4>
<p>page_r変数はグローバル</p>
<pre class="brush: c; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
		if(size==3)
		switch(packet[0]){
			//ベリファイあるいは書き込み動作
		  case 0b01111000:
		  case 0b01111001:
		  case 0b01111010:
		  case 0b01111011:
		  case 0b01110000:
		  case 0b01110001:
		  case 0b01110010:
		  case 0b01110011:
			data_r=packet[0]&amp;0x03; //データレジスタの内容
			rw = (packet[0]&amp;0b00001000)&gt;&gt;3; //1なら書き込み、0ならベリファイ
			cv = (page_r-1)*4 + data_r+1; //CV値

			//ここでベリファイあるいは書き込み動作を行う
			//ベリファイ時の動作は上と同じ
			break;
		  case 0b01111101:
		  case 0b01110101:
			page_r=packet[1]; //ページレジスタの内容を保管
			break;
		}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/service_mode_packet.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2/3/4灯式信号用デコーダ</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/signal_decoder_1.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/signal_decoder_1.htm#comments</comments>
		<pubDate>Tue, 16 Jun 2009 10:44:09 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[シフトレジスタ]]></category>
		<category><![CDATA[デコーダ]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[割り込み]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=486</guid>
		<description><![CDATA[信号を制御するためのデコーダを開発しました。DigitraxのSE8Cを意識しましたが、LocoNetを利用せずレール上のDCCパケットを受信するためメーカーによらず利用でき、レールに接続するだけで利用できるので配線も簡 [...]]]></description>
			<content:encoded><![CDATA[<p>信号を制御するためのデコーダを開発しました。DigitraxのSE8Cを意識しましたが、LocoNetを利用せずレール上のDCCパケットを受信するためメーカーによらず利用でき、レールに接続するだけで利用できるので配線も簡単です。</p>
<p>また、基板サイズも大分小さくできます。ただし、LEDの駆動回路を省略しているので思いっきり明るくは光らせられません。</p>
<p>接続端子がまだ一部ハンダ付けされてませんが、動作確認済み。初めてダイナミック点灯をやってみました。</p>
<p><a href="http://www.chibiegg.net/files/2009/06/signal_decoder.jpg"><img class="aligncenter size-medium wp-image-488" src="http://www.chibiegg.net/files/2009/06/signal_decoder-300x174.jpg" alt="シグナルデコーダ" width="300" height="174" /></a></p>
<h4><span id="more-486"></span></h4>
<h4>苦労した点</h4>
<ul>
<li>全ての動作とシリアル送信関数をいれるとメモリが足りないのでデバッグするのが大変だった</li>
<li>シフトレジスタの操作に大変時間がかかる(20マイクロ秒以上)のでDCCパケットを割り込みで受信しないといけない</li>
<li>根本的にFLASHメモりが少ないから無駄を省くのが大変</li>
<li>最終的にぴったり100%(笑)。おかげでPAGEモードが入らなかった。</li>
<li>構造体のビットフィールドはRAMは節約できるが、ROMは圧迫される</li>
<li>RAMは20byte以上残して置かないとスタック領域が不足しオーバーフローが起きる(一番わかりにくいバグ)</li>
</ul>
<h4>仕様</h4>
<ul>
<li>２から４灯式の信号機を16本制御</li>
<li>１ブロックの端子ごとに信号機の種類を選択可能(DIRモードのプログラム対応)</li>
<li>１本の信号機の点灯状態は2灯式なら1つ,3灯式なら2つ,4灯式なら3つの連続したアクセサリー番号で選択</li>
<li>電源はレールからあるいはACアダプターを選択可能</li>
</ul>
<h4>点灯パターン</h4>
<p>例：アクセサリ番号1~3が振り当てられた信号機の点灯パターン</p>
<div id="attachment_487" class="wp-caption alignnone" style="width: 179px"><a href="http://www.chibiegg.net/files/2009/06/signal_pattern.jpg"><img class="size-medium wp-image-487" src="http://www.chibiegg.net/files/2009/06/signal_pattern-169x300.jpg" alt="信号点灯パターン" width="169" height="300" /></a><p class="wp-caption-text">信号点灯パターン</p></div>
<h4>CV値</h4>
<p>動作モードは０が2灯式、1が3灯式、2が4灯式</p>
<ul>
<li>CV1 　アクセサリ番号下位８ビット</li>
<li>CV2 　アクセサリ番号上位８ビット</li>
<li>CV20　ブロックA1 &#8211; 1 動作モード</li>
<li>CV21　ブロックA1 &#8211; 2 動作モード</li>
<li>CV22　ブロックA2 &#8211; 1 動作モード</li>
<li>CV23　ブロックA2 &#8211; 2 動作モード</li>
<li>CV24　ブロックB1 &#8211; 1 動作モード</li>
<li>CV25　ブロックB1 &#8211; 2 動作モード</li>
<li>CV25　ブロックB2 &#8211; 1 動作モード</li>
<li>CV26　ブロックB2 &#8211; 2 動作モード</li>
<li>CV27　ブロックC1 &#8211; 1 動作モード</li>
<li>CV28　ブロックC1 &#8211; 2 動作モード</li>
<li>CV29　ブロックC2 &#8211; 1 動作モード</li>
<li>CV30　ブロックC2 &#8211; 2 動作モード</li>
<li>CV31　ブロックD1 &#8211; 1 動作モード</li>
<li>CV32　ブロックD1 &#8211; 2 動作モード</li>
<li>CV33　ブロックD2 &#8211; 1 動作モード</li>
<li>CV34　ブロックD2 &#8211; 2 動作モード</li>
</ul>
<h4>動作ビデオ</h4>
<p>鋭意制作中</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/signal_decoder_1.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVRのピン変化割り込みでDCCの受信</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/avr_dcc_interruptrcv.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/avr_dcc_interruptrcv.htm#comments</comments>
		<pubDate>Sun, 14 Jun 2009 15:25:29 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[タイマー]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[割り込み]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=485</guid>
		<description><![CDATA[今回はATtiny2313でDCCのパケットを受信する手順を公開します。 ついでにDCCのパケットはピン変化割り込みを利用して受信してみます。 タイマー１を時間(パケットのパルス幅)計測に使うためタイマー１を他の事に利用 [...]]]></description>
			<content:encoded><![CDATA[<p>今回はATtiny2313でDCCのパケットを受信する手順を公開します。<br />
ついでにDCCのパケットはピン変化割り込みを利用して受信してみます。</p>
<p>タイマー１を時間(パケットのパルス幅)計測に使うためタイマー１を他の事に利用する場合は修正が必要です。</p>
<h4>回路図</h4>
<p>電源周りのコンデンサ等は省略しています。別途確認用のLEDやシリアルを接続して動作確認してください。<br />
またレールとの接続はフォトカプラで電気的に絶縁することも可能です。</p>
<p><div id="attachment_495" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/avr_dcc.jpg"><img class="size-medium wp-image-495" src="http://www.chibiegg.net/files/2009/06/avr_dcc-300x188.jpg" alt="AVRでDCCパケットを受信" width="300" height="188" /></a><p class="wp-caption-text">AVRでDCCパケットを受信</p></div><br />
<span id="more-485"></span></p>
<h4>プログラム</h4>
<pre class="brush: c; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
//AVRのピン変化割り込みでDCCパケットの受信
//dcc_poll関数は割り込み専用ではないのでポーリング動作も可能
// Copyright chibiegg 2009 All rights reserved.
// http://www.chibiegg.net/
#include &lt;avr/io.h&gt;
#include &lt;avr/interrupt.h&gt;

//パケットを受信したときにコールされる関数
//割り込みの中でコールされることに注意！
//時間のかかる処理はここでフラグを立ててメインで実行することをおすすめします
void dcc_exec(uint8_t*,uint8_t){

	//ここで受信時の動作を行う

}

//ピン変化割り込み起動時の動作
ISR(PCINT_vect){
uint8_t sreg_tmp = SREG; //多重割り込みできるようにSREGの内容を退避
uint8_t bit1,bit2;
		bit1 = (PINB &amp; 0x01);
		bit2 = 1-((PINB &amp; 0x02)&gt;&gt;1);
		dcc_poll(bit1,bit2); //DCCパケット処理関数のコール
SREG = sreg_tmp; //SREGの内容を戻す
}

//メイン関数でやることは初期化だけ
//DCCパケットの受信については割り込みで全て処理される
//なので、その他の処理は時間がかかる物でもメインで自由にできます
int main(){
	//ピン変化割り込み
	PCMSK = 0x03; //レールに接続された端子のみ割り込み許可
	GIMSK = 0x20; //ピン変化割り込みの許可

	sei();//割り込み許可
	while(1){
		//何もしない
		//その他の処理が自由にできます
	}
}

//これより先DCCパケット受信用関数
//別ファイルにするほうがすっきりするかも
//その場合は
//				extern void dcc_exec(uint8_t*,uint8_t);
//と宣言しておく。

volatile uint16_t _dcc_timer=0;
uint8_t _dcc_portbefore[2]={0,0};
uint8_t _dcc_now=0,_dcc_before=0,_dcc_precount=0,_dcc_bitcount=0,_dcc_bytecount=0;
uint8_t _dcc_packet[12],_dcc_errbyte;

void _dcc_timer_start(){
	//カウンタをクリアし、計測を開始する
	TCCR1B = 0;
	TCNT1 = 0;
	TCCR1B = 0x02;
	//8分周
	//ワンカウント　0.4us@20MHz
}
uint16_t _dcc_timer_stop(){
	//タイマーを停止し計測したカウントを返す
	TCCR1B = 0;
	return TCNT1;
}

void dcc_poll(uint8_t bit1,uint8_t bit2){
	//入力変化検知
	//どちらも同じ変化の場合
	if(bit1!=_dcc_portbefore[0] &amp;&amp; bit1==bit2){
		_dcc_portbefore[0] = bit1;
		_dcc_portbefore[1] = bit2;
	}else{
		return; //変化なしあるいは片側だけの変化
	}

	if(!bit1){	//立ち上がりエッジ
		//ビット幅計測開始
		_dcc_timer_start();
	}else{		//立ち下がりエッジ
		//計測終了
		_dcc_timer = _dcc_timer_stop();
		//ワンカウント　0.4us
		if(_dcc_timer&gt;=110&amp;&amp;_dcc_timer&lt;=200){ //ビット1  55us - 61us
			_dcc_now=1;//今処理しているビットの種類「１」(以降の処理で利用するため)
			_dcc_precount++; //プリアンプル数計測用
			//現在受信しているバイトにデータを追加
			_dcc_packet[_dcc_bytecount]=(_dcc_packet[_dcc_bytecount]&lt;&lt;1)+1;
		}else if(_dcc_timer&gt;=225&amp;&amp;_dcc_timer&lt;=25000){ //ビット0 95us - 9900us
			_dcc_now=0;//今処理しているビットの種類「０」(以降の処理で利用するため)
			if(_dcc_precount&gt;=14){ //スタートビット(１４回以上の「１」の後の「０」)
				//変数たちを初期化
				_dcc_bitcount=1;
				_dcc_packet[0]=0;
				_dcc_bytecount=0;
				_dcc_errbyte=0;
				_dcc_precount=0;
				return;
			}
			_dcc_precount=0;//プリアンプル数計測リセット
			//現在受信しているバイトにデータを追加
			_dcc_packet[_dcc_bytecount]=(_dcc_packet[_dcc_bytecount]&lt;&lt;1);
		}else{return;} //規格外の長さ

		if(_dcc_bytecount&gt;=10){	return;}//今受信しているパケットを無視する場合
		_dcc_bitcount++;
		if(_dcc_bitcount==1){
			if(_dcc_now==1){//ストップビット
				if(_dcc_bytecount!=10){ //無視する予定のパケットで無い場合
					//ここでエラーバイトの確認し、実際の動作にうつる
					if(_dcc_errbyte==0){
						dcc_exec(_dcc_packet,_dcc_bytecount); //受信完了時の関数のコール
					}
					_dcc_bytecount=10; //エラーバイトが一致しないので今回のパケットは無視
				}
			}
		}
		if(_dcc_bitcount==9){//バイトの終わり
			//今受信が終わったバイトが一バイト目で0xffならアイドルパケットなので
			//今受信しているパケットは無視する(_dcc_bytecountを10にすることにより無視化)
			if(_dcc_bytecount==0&amp;&amp;_dcc_packet[0]==0xff){_dcc_bytecount=10;return;}
			_dcc_errbyte^=_dcc_packet[_dcc_bytecount]; //エラーバイト比較用の計算
			_dcc_bitcount=0;
			_dcc_bytecount++;
		}

	}
}
</pre>
<h4>説明</h4>
<p>ピン変化割り込みによってDCCパケット解析(dcc_poll)関数を呼び出します。<br />
この関数では立ち上がりエッジから立ち下がりエッジまでのパルス幅を計測し、立ち下がりエッジで計測が終わるごとに、プリアンプル部の検出、バイトの受信等の処理を行います。<br />
さらに、ストップビットを受信し、エラーバイトとの比較も一致すると、dcc_exec関数をパケットのバイト列へのポインタとパケットのバイト数を引数としてコールします。<br />
実際にDCCパケットについて処理したい内容はこのdcc_exec関数に記述することによって実現できます。<br />
ただし、dcc_exec関数は割り込みの動作中でコールされるので、長い時間のかかる処理などはできません。そのような処理が必要であればこの関数でフラグを立ててメインのスレッドで処理をするべきです。</p>
<p>ちなみに、dcc_poll関数さえ遅滞なくコールできるのであればピン変化割り込みを利用しなくてもポーリング動作させることができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/avr_dcc_interruptrcv.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>LocoUSB Ver.2</title>
		<link>http://www.chibiegg.net/loco/dcc/dcc_make/locousb_ver2.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/dcc_make/locousb_ver2.htm#comments</comments>
		<pubDate>Sat, 06 Jun 2009 14:19:39 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[DCC機器の自作]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[JMRI]]></category>
		<category><![CDATA[Loconet]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[鉄道模型]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=465</guid>
		<description><![CDATA[以前、PCをLocoNetに繋ぐためのアダプターLocoUSB Rev.1を紹介したのですが、MacとVistaでは使えないという問題がありました。 原因は以前の記事にも書きましたがMacおよびVistaはシリアルの通信 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chibiegg.net/loco/jmri/locousb_rev_1.htm">以前</a>、PCをLocoNetに繋ぐためのアダプター<a href="http://www.chibiegg.net/loco/jmri/locousb_rev_1.htm">LocoUSB Rev.1</a>を紹介したのですが、MacとVistaでは使えないという問題がありました。</p>
<p>原因は<a href="http://www.chibiegg.net/loco/jmri/locousb_rev_1.htm">以前の記事</a>にも書きましたがMacおよびVistaはシリアルの通信速度がLocoNetの16600bpsに対応していないというのが原因です。</p>
<p>そこで、USB（パソコン)側とLocoNetの間にマイコンを挟み、そいつで速度変換をさせることによってMacおよびVistaに対応させたLocoUSB Ver.2を開発しました。</p>
<div id="attachment_466" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/locousb2.jpg"><img class="size-medium wp-image-466" src="http://www.chibiegg.net/files/2009/06/locousb2-300x179.jpg" alt="LocoUSB Ver.2" width="300" height="179" /></a><p class="wp-caption-text">LocoUSB Ver.2</p></div>
<p><span id="more-465"></span></p>
<p>以前の予告ではRev.2を予告しましたがそのときは機能面の変化はないだろうと思っていたからです。が、機能的に大幅な追加がでたためVer.2としました。</p>
<p>思想はいたって簡単で、以前のLocoUSB Rev.1のFT232RLとLocoNetの間にAVRを挟んだだけです。</p>
<p>機能的にはたぶんLocoBufferと同じだろうと思われるのですが（実物を持っていないのでわかりません）、JMRIの設定ではLocoBufferを選択することで利用できます。LocoBufferと同じく19200bpsと57600bpsの両方に対応しています。</p>
<p>当方ではMacOSX LeopardとLocoNetを接続できました。</p>
<p>ソフトウエアの動作検証がしっかりできればこのサイトで頒布できればなぁ、と思っています。在庫も2つ余分にあるので&#8230;</p>
<p>追記：友人等とサークルを作ることになったのでそちらで運営する予定の通販サイトで頒布するよていです。開店時にはこのサイトで紹介します。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/dcc_make/locousb_ver2.htm/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Bトレインショーティー対応動力ユニット</title>
		<link>http://www.chibiegg.net/loco/dcc/train/kato_btrain.htm</link>
		<comments>http://www.chibiegg.net/loco/dcc/train/kato_btrain.htm#comments</comments>
		<pubDate>Thu, 04 Jun 2009 14:42:36 +0000</pubDate>
		<dc:creator>chibiegg</dc:creator>
				<category><![CDATA[車両へのデコーダ搭載]]></category>
		<category><![CDATA[Bトレイン]]></category>
		<category><![CDATA[DCC]]></category>
		<category><![CDATA[EM13]]></category>
		<category><![CDATA[デコーダ]]></category>
		<category><![CDATA[鉄道模型]]></category>

		<guid isPermaLink="false">http://www.chibiegg.net/?p=454</guid>
		<description><![CDATA[注意：現在この記事の内容は非推奨です。位置調整しているときにデコーダを焼いてしまいました。集電板とモーター出力部分が接触したためだと思われます。接触式による搭載をやめた改良方法を検討中です。 バンダイの車両を短くデフォル [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #ff0000">注意：現在この記事の内容は非推奨です。位置調整しているときにデコーダを焼いてしまいました。集電板とモーター出力部分が接触したためだと思われます。接触式による搭載をやめた改良方法を検討中です。</span></strong></p>
<p>バンダイの車両を短くデフォルメしたBトレインショーティーというシリーズがあるのですが、それをNゲージで走らせるための動力ユニットにデコーダを搭載しようとおもいます。</p>
<div id="attachment_456" class="wp-caption alignleft" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc.jpg"><img class="size-medium wp-image-456" src="http://www.chibiegg.net/files/2009/06/btrain_dcc-300x171.jpg" alt="急行電車1 DCC加工済" width="300" height="171" /></a><p class="wp-caption-text">急行電車1 DCC加工済</p></div>
<p>加工後の写真がこちらです、少し中の配線が見えています。デコーダがユニットの内部に収まるように努力しました。</p>
<p>インターネットでは、内部に収めている加工を見つけることができなかったので適当に試行錯誤しながらやってみました。</p>
<p><span id="more-454"></span></p>
<div id="attachment_457" class="wp-caption alignright" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc_1.jpg"><img class="size-medium wp-image-457" src="http://www.chibiegg.net/files/2009/06/btrain_dcc_1-300x109.jpg" alt="急行電車1 分解(1)" width="300" height="109" /></a><p class="wp-caption-text">随１　急行電車1 分解(1)</p></div>
<p>まず分解していきます。</p>
<p>白いカバーを外し、モーターを取り外した状態が図１です。</p>
<div id="attachment_458" class="wp-caption alignright" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc_2.jpg"><img class="size-medium wp-image-458" src="http://www.chibiegg.net/files/2009/06/btrain_dcc_2-300x110.jpg" alt="急行電車1 分解(2)" width="300" height="110" /></a><p class="wp-caption-text">図２　急行電車1 分解(2)</p></div>
<p>そして、真ん中のプリント基板および、集電板とモーターへの金属板も取り外したものが、図２です。</p>
<p>このプリント基板の代わりにDCCデコーダEM13を載せるイメージで進めます。</p>
<div id="attachment_459" class="wp-caption alignright" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc_4.jpg"><img class="size-medium wp-image-459" src="http://www.chibiegg.net/files/2009/06/btrain_dcc_4-300x179.jpg" alt="デコーダEM13の加工" width="300" height="179" /></a><p class="wp-caption-text">デコーダEM13の加工</p></div>
<p>次に、デコーダを加工していきます。今回はできるだけコンパクトにする必要があるため足は全てカットしました。</p>
<p>そして幅もできるだけ小さくなるようにヤスリで少しずつ削っていきます。</p>
<p>このときどんなにがんばっても動力ユニットのプリント基板より幅を小さくすることはできないため、デコーダのプリントパターンの配線を削り落としてしまわないぎりぎりまで丁寧に削ります。</p>
<p>このときレール側のプリントパターンは削ってもかまいません。</p>
<p>モーターへの配線は写真を参考にハンダ付けしてください。黒と紫のケーブルです。</p>
<div id="attachment_460" class="wp-caption alignright" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc_5.jpg"><img class="size-medium wp-image-460" src="http://www.chibiegg.net/files/2009/06/btrain_dcc_5-300x95.jpg" alt="デコーダを載せる" width="300" height="95" /></a><p class="wp-caption-text">デコーダを載せる</p></div>
<p>次に加工したデコーダを載せますが、その前に集電板を元に戻します。このときクッション付きの分厚めの両面テープを真ん中に貼り、集電板を浮き上がらせます。</p>
<p>そうすることによってデコーダのレール側電極と接触させます。</p>
<p>また、駆動輪側近くのプリント基板を固定するための出っ張りも削ります。</p>
<p>少しきついですがデコーダを写真のようにはめます。</p>
<div id="attachment_461" class="wp-caption alignright" style="width: 310px"><a href="http://www.chibiegg.net/files/2009/06/btrain_dcc_6.jpg"><img class="size-medium wp-image-461" src="http://www.chibiegg.net/files/2009/06/btrain_dcc_6-300x120.jpg" alt="モーターの取り付け" width="300" height="120" /></a><p class="wp-caption-text">モーターの取り付け</p></div>
<p>最後にモーターへ配線をハンダ付けし、元に戻していきます。</p>
<p>ただそのまま戻すと駆動軸がデコーダのICに接触するため少しクッションを挟みモーターを持ち上げることと、モーターの周りをビニールで囲み絶縁しました。</p>
<p>最後に、白いカバーを戻せば完成です。ただ、白いカバーの真ん中の爪をしっかりはめるように押し付けると軸と接触し回らないため両端だけで固定しています。</p>
<p>見た目を考えてこのままにするか、しっかり止めるために天井をくりぬくのもよいかもしれません。</p>
<p>ただすごく狭いので集電もしっかりできるように搭載するのは大変です。なんどか集電板の位置を微調整し、白いカバーの出っ張りを削ってみたり、細かな加工が必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chibiegg.net/loco/dcc/train/kato_btrain.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

