<?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>橋本商会 &#187; UART</title>
	<atom:link href="http://shokai.org/blog/archives/tag/uart/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:32:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>PSoC &#8211; CY8C29466の14ビットADコンバータを内蔵マルチプレクサで切り替えて複数ピンで使う</title>
		<link>http://shokai.org/blog/archives/5272</link>
		<comments>http://shokai.org/blog/archives/5272#comments</comments>
		<pubDate>Wed, 28 Jul 2010 08:59:54 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AD変換]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[マルチプレクサ]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5272</guid>
		<description><![CDATA[14ビットのADコンバータ1つと、AMUX4（4チャンネルアナログマルチプレクサ）を組み合わせると複数のピンからAD変換が使える。 というかPSoC Designer4.xでADCINC12を使っていた頃は、ADCINC [...]]]></description>
			<content:encoded><![CDATA[<p>
14ビットのADコンバータ1つと、AMUX4（4チャンネルアナログマルチプレクサ）を組み合わせると複数のピンからAD変換が使える。<br />
というかPSoC Designer4.xでADCINC12を使っていた頃は、ADCINC12を複数置くことができたのにPSoC Designer5.0では1つしか配置できなくて困った。<br />
でもよく考えたらマルチプレクサ使う方が自然だな。<br />
<br />
<br />
アナログブロックの接続<br />
マルチプレクサを切り替えるとPort0の0,2,4,6番ピンに接続できる<br />
<a href="http://www.flickr.com/photos/shokai/4836580419/" title="cfab931ebc6fd7a15179e8377e1a847c by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4131/4836580419_bd54c7567e.jpg" width="500" height="304" alt="cfab931ebc6fd7a15179e8377e1a847c" /></a><br />
<br />
<br />
ピン配置<br />
右上のADC以外は関係ない<br />
<a href="http://www.flickr.com/photos/shokai/4837186870/" title="e9c55cbf49c94421f1ef6f24400f6531 by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4154/4837186870_88508c9306.jpg" width="438" height="500" alt="e9c55cbf49c94421f1ef6f24400f6531" /></a><br />
<br />
<br />
PGAの設定<br />
1.0倍で、AMUXがあるアナログマルチプレクサ1に接続する。<br />
<a href="http://www.flickr.com/photos/shokai/4837157512/" title="e838b8bcea333aaa21f7249301632629 by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4110/4837157512_6f3b389252.jpg" width="441" height="142" alt="e838b8bcea333aaa21f7249301632629" /></a><br />
<br />
<br />
ADCINCの設定<br />
Negative Inputのソースは一応指定するが、GainをDisconnectedにすると使わないようにできる。<br />
<a href="http://www.flickr.com/photos/shokai/4837160624/" title="5f959013ed6c5d34154921a08c1cf097 by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4151/4837160624_2a17d92549.jpg" width="441" height="203" alt="5f959013ed6c5d34154921a08c1cf097" /></a><br />
<br />
<br />
AMUX4の設定<br />
Interconnect Viewには表示されないけど、配置はされてる。アナログマルチプレクサ1として設定する。<br />
<a href="http://www.flickr.com/photos/shokai/4837155526/" title="ff18fb9db0458d481244adfc38113cfb by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4132/4837155526_c77be299d4.jpg" width="439" height="86" alt="ff18fb9db0458d481244adfc38113cfb" /></a><br />
<br />
<br />
AMUX4の他にも8もあるので、まあたくさん増やせる。<br />
<br />
<br />
UARTのTX8で、14bitADCINCの値を送る。<br />
TX8だけを使う設定は<a href="http://shokai.org/blog/archives/4519">橋本商会 ≫ PSoC &#8211; TX8モジュール</a>に書いた<br />
<pre class="prettyprint">
void&nbsp;wait(int&nbsp;n){<br />
&nbsp;&nbsp;&nbsp;&nbsp;while(n--);<br />
}<br />
<br />
//&nbsp;AMUX4_PORT0_0&nbsp;=&gt;&nbsp;0x00<br />
//&nbsp;AMUX4_PORT0_2&nbsp;=&gt;&nbsp;0x01<br />
//&nbsp;AMUX4_PORT0_4&nbsp;=&gt;&nbsp;0x02<br />
//&nbsp;AMUX4_PORT0_6&nbsp;=&gt;&nbsp;0x03<br />
int&nbsp;get_adc(BYTE&nbsp;amux_channel){<br />
&nbsp;&nbsp;&nbsp;&nbsp;AMUX4_InputSelect(amux_channel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;wait(10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ADCINC_GetSamples(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;while(!ADCINC_fIsDataAvailable());<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ADCINC_iClearFlagGetData();<br />
}<br />
<br />
int&nbsp;ad;<br />
BYTE&nbsp;ad_pin;<br />
char&nbsp;buf[6];<br />
<br />
void&nbsp;main(void){<br />
&nbsp;&nbsp;&nbsp;&nbsp;M8C_EnableGInt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;AMUX4_Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;PGA_1_Start(PGA_1_HIGHPOWER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;ADCINC_Start(ADCINC_HIGHPOWER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;TX8_Start(TX8_PARITY_NONE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ad_pin&nbsp;=&nbsp;0;&nbsp;ad_pin&nbsp;&lt;&nbsp;4;&nbsp;ad_pin++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ad&nbsp;=&nbsp;get_adc(ad_pin);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX8_PutChar(ad_pin+'0');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX8_CPutString(":");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX8_PutString(intToStr(ad,buf));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX8_PutCRLF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</pre>
AMUX4を切り替えた直後にAD変換を開始するのがなんとなく嫌だった（物理的に回路が切り替わっているわけだし）ので、一瞬waitを入れてからAD変換するようにした。<br />
<br />
<br />
<br />
string.hのitoa関数がおかしいので代わりを作った<br />
<pre class="prettyprint">
//&nbsp;intの桁数を返す<br />
char&nbsp;getDigit(int&nbsp;n){<br />
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while(n&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;/=&nbsp;10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i;<br />
}<br />
<br />
//&nbsp;int-&gt;String変換<br />
//&nbsp;char&nbsp;buf[6]<br />
char&nbsp;*intToStr(int&nbsp;n,&nbsp;char&nbsp;*buf){&nbsp;//&nbsp;変換する数、作業領域<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;digit;<br />
&nbsp;&nbsp;&nbsp;&nbsp;digit&nbsp;=&nbsp;getDigit(n);&nbsp;//&nbsp;桁数<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;digit-1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;i--){&nbsp;//&nbsp;intは最大5桁<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i]&nbsp;=&nbsp;n%10+'0';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;/=&nbsp;10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;buf[digit]&nbsp;=&nbsp;'\0';&nbsp;//&nbsp;行末<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;buf;<br />
}<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5272/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC CY8C29466のI2CHWモジュールで通信</title>
		<link>http://shokai.org/blog/archives/5230</link>
		<comments>http://shokai.org/blog/archives/5230#comments</comments>
		<pubDate>Tue, 20 Jul 2010 16:40:27 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[I2C]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5230</guid>
		<description><![CDATA[PSoC CY8C29466のI2Cモジュールを試した。 I2Cは2本の信号線の上にmaster/slaveの2種類のノードを合計100個以上載せて相互に通信できるプロトコル。動作速度が違う部品同士をより少ない結線数で相 [...]]]></description>
			<content:encoded><![CDATA[<p>
PSoC CY8C29466のI2Cモジュールを試した。<br />
I2Cは2本の信号線の上にmaster/slaveの2種類のノードを合計100個以上載せて相互に通信できるプロトコル。動作速度が違う部品同士をより少ない結線数で相互接続させる事を目的として、1992年にPhilipsが作って2004年に特許が切れている。今ではほとんどのマイコンにI2C通信をするモジュールがついているし、外部メモリやセンサーなどもI2Cで値を返す物がある。linuxのkernelにも入っていて(/usr/include/linux/i2c.hとか)マザーボード上の温度センサとかに使われているらしい。<br />
<br />
このへんに詳しく書いてある。<br />
<ul>
  <li><a href="http://www.picfun.com/c15.html">I2C通信の使い方</a></li>
  <li><a href="http://ja.wikipedia.org/wiki/I%C2%B2C">IC &#8211; Wikipedia</a></li>
  <li><a href="http://www.nxp.com/acrobat_download/literature/9398/39340011_jp.pdf">I2Cバス仕様書日本語版(pdf)</a></li>
  <li><a href="http://www.eleki-jack.com/2007/04/1231.html">新連載　1、2、3線シリアル・インターフェース　（連載　第1回） (エレキジャック)</a></li>
  <li><a href="http://www.eleki-jack.com/2007/04/1232.html">1、2、3線シリアル・インターフェース　（連載　第2回） (エレキジャック)</a></li>
  <li><a href="http://www.cypress.com/?rID=3030">User Module Datasheet: I2C Hardware Block Data Sheet, I2CHW &#8211; Cypress Semiconductor</a></li>
</ul>
特に仕様書pdfはちゃんと読んでみたらかなり勉強になったのでオススメ。<br />
プログラムはCypress公式のUser Module Datasheetのp.39,40ものを参考にした。<br />
<br />
<br />
■作った物<br />
PSoC Designer 5.0+SP6で作ったプロジェクトまるごと<a href="http://github.com/shokai/i2c-uart-cy8c29466">githubに置いた</a>。<br />
<pre>
git clone git://github.com/shokai/i2c-uart-cy8c29466.git<br />
</pre>
で取得できる。<br />
<br />
<br />
3つ並んでいるPSoCマイコンのうち一番下がmasterで、上2つがslaveデバイス。デバイスが接続されている2つの線は2kΩの抵抗(1kΩ2つ)を介してVCCと接続されpull upされている。<a href="http://www.picfun.com/midi2c02.html">I2Cの接続構成とプルアップ抵抗</a>に適切なプルアップ抵抗の計算方法が書かれている。電源5Vで100kbpsか400kbpsなら2kΩ〜5kΩが最適値とのこと。<br />
<a href="http://www.flickr.com/photos/shokai/4811466957/" title="R0015277.JPG by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4080/4811466957_6841a296f6.jpg" width="375" height="500" alt="R0015277.JPG" /></a><br />
<br />
<br />
masterに付いているボタンを押すと、2つのslaveにLED点灯命令を送る。ボタンを離すと消灯する。<br />
<a href="http://www.flickr.com/photos/shokai/4811464283/" title="R0015274.JPG by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4081/4811464283_2b7ac459f5.jpg" width="500" height="375" alt="R0015274.JPG" /></a><br />
<br />
<br />
slave側のボタンは、それぞれmasterの2つのLEDの点灯/消灯に対応している。<br />
<a href="http://www.flickr.com/photos/shokai/4811464667/" title="R0015275.JPG by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4123/4811464667_70a5a3b556.jpg" width="500" height="375" alt="R0015275.JPG" /></a><br />
<a href="http://www.flickr.com/photos/shokai/4811465129/" title="R0015276.JPG by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4142/4811465129_521f689914.jpg" width="500" height="375" alt="R0015276.JPG" /></a><br />
<br />
<br />
masterはslaveをコントロールするだけでなく、I2Cとシリアル通信のブリッジになっている。<br />
slaveからのデータをslaveのアドレス名と共にUARTでパソコンに中継する。また、パソコンからmasterマイコンに&#8217;U'か&#8217;D'の文字を送る事と、masterは全slaveにLED点灯/消灯を送る。<br />
UARTとRS232Cのレベル変換にはADM3202を使った。<br />
<br />
<br />
だいたいそういう内容のビデオ<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/K_mrn7w_NNA&amp;hl=ja_JP&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/K_mrn7w_NNA&amp;hl=ja_JP&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
<br />
<br />
<br />
■デバイス設定<br />
master側。<br />
<a href="http://www.flickr.com/photos/shokai/4811481571/" title="I2C master device setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4116/4811481571_ff11dfb5cf.jpg" width="440" height="329" alt="I2C master device setting" /></a><br />
パソコンとのシリアル通信で9600bpsを作るためにVC1,VC3を設定している。動作電圧やCPUクロックなどはデフォルト値。<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4811485087/" title="I2C master I2CHW module setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4099/4811485087_b62e15f123.jpg" width="441" height="142" alt="I2C master I2CHW module setting" /></a><br />
single masterモードでモジュールを置いた。<br />
100kbpsでPORT1の5番と7番ピンをI2Cに使う。bufferはプログラム中で自分で用意したBYTE配列を使ってもらうように設定。<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812110308/" title="I2C master UART module setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4117/4812110308_cebc318de5.jpg" width="437" height="298" alt="I2C master UART module setting" /></a><br />
シリアル通信で9600bpsが出るようにUARTモジュールを設定。<br />
<a href="http://shokai.org/blog/archives/1503">橋本商会  PSoC – CY8C29466でUART受信割り込み</a>でくわしく書いた。<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4811487481/" title="I2C master Pinout setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4141/4811487481_76868554b1.jpg" width="442" height="390" alt="I2C master Pinout setting" /></a><br />
3つのLEDに使うピンは出力をStrongにして3V出るようにした。<br />
タクトスイッチにつなぐPort2の2番ピンは両エッジ入力割り込みを設定しつつ内部でプルアップして、ブレッドボード上でも100Ωの抵抗でプルダウンする。こうするとチャタリングが起きない。<br />
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812113076/" title="I2C master Pin layout by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4138/4812113076_80ba2fbd73.jpg" width="453" height="500" alt="I2C master Pin layout" /></a><br />
ピン配置図<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812116700/" title="I2C master modules connection by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4102/4812116700_2cdced2f1b.jpg" width="500" height="265" alt="I2C master modules connection" /></a><br />
アナログブロックは使っていないので上の方だけ。<br />
UARTがPort2の4,5番ピンから出るように引き出した。<br />
<br />
<br />
<br />
slave側。<br />
<a href="http://www.flickr.com/photos/shokai/4812118072/" title="I2C slave device setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4118/4812118072_ee46cb4931.jpg" width="438" height="326" alt="I2C slave device setting" /></a><br />
Global Resourceは初期値のまま<br />
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812119504/" title="I2C slave I2CHW module setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4136/4812119504_f2b9e42c8c.jpg" width="439" height="176" alt="I2C slave I2CHW module setting" /></a><br />
I2CHWモジュールををslaveで置いた。速度はmasterに合わせる。<br />
slaveデバイスのアドレスは7bitだが、0&#215;00~0&#215;10までの16個のアドレスはプロトコルに予約されているので、0&#215;11からの112個が使える。<br />
今回はmasterのプログラムで0&#215;11~0&#215;20のデバイスがいるか確認しながら動作するようにしているので、アドレス17~32のどれかを使えばいい。<br />
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812121088/" title="I2C slave Pinout setting by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4102/4812121088_153c38dd35.jpg" width="462" height="386" alt="I2C slave Pinout setting" /></a><br />
masterと同じ様にLEDとタクトスイッチ用のピンを設定。LEDは1つだけ。<br />
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4811498703/" title="I2C slave Pin layout by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4134/4811498703_426cfa5ecc.jpg" width="448" height="500" alt="I2C slave Pin layout" /></a><br />
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4812124826/" title="I2C slave modules connection by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4094/4812124826_25c41c07df.jpg" width="500" height="256" alt="I2C slave modules connection" /></a><br />
なにも結線していない<br />
<br />
<br />
■プログラム<br />
master側<br />
slaveアドレス0&#215;11から0&#215;20までのデバイスに、順にTXバッファを書き込み、RXバッファに読み込む。送受信を待っている間、timeout_countをカウントアップし続けて、閾値以上になるとタイムアウトするようにしている。これで存在するかわからないslaveとやりとりできるし、動作中にslaveデバイスが増えても問題なくネットワークに参加させられる。<br />
<br />
UARTの受信やピン入力の検出は割り込みで処理している(<a href="http://shokai.org/blog/archives/1503">橋本商会  PSoC – CY8C29466でUART受信割り込み</a>で書いた)のだが、I2Cはメインループの中で処理している。I/OからのイベントでUARTぐらいなら使ってもいいけど、16個のslaveとのやりとりを割り込みの中でやると多重割り込みが起こりやすいので、各ルーチンからbufferを読み書きしてそれを定期的にslaveと共有するという方式にした。<br />
本番ではdigital blockを1つ消費するだけで使える8bit Timerモジュールで定期的に回すようにすると良いと思う。<br />
<br />
<a href="http://github.com/shokai/i2c-uart-cy8c29466/blob/54a8031710cbe524da57a3e7689e707e99d20cb9/i2c_master/i2c_master/i2c_master/main.c">main.c</a><br />
<pre class="prettyprint">
//&nbsp;I2C-UART&nbsp;master<br />
//&nbsp;CY8C29466-24PXI(DIP&nbsp;Package)<br />
//&nbsp;PSoC&nbsp;Designer&nbsp;5.0&nbsp;+&nbsp;SP6<br />
//&nbsp;IMAGECRAFT&nbsp;C&nbsp;Compiler<br />
#include&nbsp;&lt;m8c.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;part&nbsp;specific&nbsp;constants&nbsp;and&nbsp;macros<br />
#include&nbsp;&lt;I2CHW_1Common.h&gt;<br />
#include&nbsp;&lt;I2CHW_1Mstr.h&gt;<br />
#include&nbsp;"PSoCAPI.h"&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;PSoC&nbsp;API&nbsp;definitions&nbsp;for&nbsp;all&nbsp;User&nbsp;Modules<br />
#define&nbsp;_BV(BIT)&nbsp;(1&lt;&lt;BIT)<br />
#define&nbsp;sbi(BYTE,BIT)&nbsp;(BYTE&nbsp;|=&nbsp;_BV(BIT))<br />
#define&nbsp;cbi(BYTE,BIT)&nbsp;(BYTE&nbsp;&amp;=&nbsp;~_BV(BIT))<br />
<br />
#define&nbsp;LED_ON()&nbsp;sbi(PRT2DR,&nbsp;0)&nbsp;//&nbsp;LED<br />
#define&nbsp;LED_OFF()&nbsp;cbi(PRT2DR,&nbsp;0)<br />
#define&nbsp;LED2_ON()&nbsp;sbi(PRT1DR,&nbsp;6)<br />
#define&nbsp;LED2_OFF()&nbsp;cbi(PRT1DR,&nbsp;6)<br />
#define&nbsp;LED3_ON()&nbsp;sbi(PRT1DR,&nbsp;4)<br />
#define&nbsp;LED3_OFF()&nbsp;cbi(PRT1DR,&nbsp;4)<br />
<br />
#define&nbsp;BTN_PORT&nbsp;PRT2DR&nbsp;//&nbsp;push&nbsp;button<br />
#define&nbsp;BTN_BIT&nbsp;_BV(2)<br />
<br />
#define&nbsp;BUF_SIZE&nbsp;8<br />
BYTE&nbsp;buf_tx[BUF_SIZE];&nbsp;//&nbsp;I2C&nbsp;buffer<br />
BYTE&nbsp;buf_rx[BUF_SIZE];<br />
BYTE&nbsp;status;&nbsp;//&nbsp;I2C&nbsp;status<br />
BYTE&nbsp;slave;&nbsp;//&nbsp;slave&nbsp;address<br />
#define&nbsp;I2C_TIMEOUT&nbsp;128&nbsp;//&nbsp;長時間応答が返ってこないslaveデバイスを無視する<br />
BYTE&nbsp;timeout_count,&nbsp;i;<br />
<br />
void&nbsp;main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;M8C_EnableGInt;&nbsp;//&nbsp;enable&nbsp;global&nbsp;interrupt<br />
&nbsp;&nbsp;&nbsp;&nbsp;M8C_EnableIntMask(INT_MSK0,&nbsp;INT_MSK0_GPIO);<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CmdReset();&nbsp;//&nbsp;uart&nbsp;init<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_IntCntl(UART_1_ENABLE_RX_INT);&nbsp;//&nbsp;enable&nbsp;receive&nbsp;interrupt<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_Start(UART_1_PARITY_NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("start");<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_EnableMstr();<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_EnableInt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(slave&nbsp;=&nbsp;0x11;&nbsp;slave&nbsp;&lt;&nbsp;0x21;&nbsp;slave++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_bWriteBytes(slave,&nbsp;buf_tx,&nbsp;BUF_SIZE,&nbsp;I2CHW_1_CompleteXfer);&nbsp;//&nbsp;master-&gt;slave<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout_count&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(I2CHW_1_bReadI2CStatus()&nbsp;&amp;&nbsp;I2CHW_WR_COMPLETE&nbsp;||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout_count++&nbsp;&gt;&nbsp;I2C_TIMEOUT)&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_ClrWrStatus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_fReadBytes(slave,&nbsp;buf_rx,&nbsp;BUF_SIZE,&nbsp;I2CHW_1_CompleteXfer);&nbsp;//&nbsp;slave-&gt;master<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout_count&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(I2CHW_1_bReadI2CStatus()&nbsp;&amp;&nbsp;I2CHW_RD_COMPLETE&nbsp;||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout_count++&nbsp;&gt;&nbsp;I2C_TIMEOUT)&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_ClrRdStatus();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(slave){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x11:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'u')&nbsp;LED2_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'d')&nbsp;LED2_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x12:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'u')&nbsp;LED3_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'d')&nbsp;LED3_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!(UART_1_bReadTxStatus()&nbsp;&amp;&nbsp;UART_1_TX_BUFFER_EMPTY));&nbsp;//&nbsp;slaveからの受信データをシリアル通信出力<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("I2C:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_PutSHexByte(slave);&nbsp;//&nbsp;slaveアドレス<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString(",");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_PutString(buf_rx);&nbsp;//&nbsp;slaveからの受信データ<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_PutCRLF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;BUF_SIZE-1;&nbsp;i++)&nbsp;buf_rx[i]&nbsp;=&nbsp;'\0';&nbsp;//&nbsp;受信バッファを初期化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
//&nbsp;UART受信割り込み<br />
#pragma&nbsp;interrupt_handler&nbsp;INT_UART_RX<br />
void&nbsp;INT_UART_RX(void){<br />
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;recv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;recv_data&nbsp;=&nbsp;UART_1_cGetChar();&nbsp;//&nbsp;read&nbsp;UART<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_PutChar(recv_data);&nbsp;//&nbsp;echo<br />
&nbsp;&nbsp;&nbsp;&nbsp;switch(recv_data){<br />
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'U':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'A';&nbsp;//&nbsp;slaveにLED点灯を指示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("LED:ON\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'D':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'B';&nbsp;//&nbsp;slaveにLED消灯を指示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("LED:OFF\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
//&nbsp;I/Oピン状態変化割り込み<br />
#pragma&nbsp;interrupt_handler&nbsp;INT_GPIO<br />
void&nbsp;INT_GPIO(void){<br />
&nbsp;&nbsp;if(BTN_PORT&nbsp;&amp;&nbsp;BTN_BIT){&nbsp;//&nbsp;ボタンが押されている時<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'A';&nbsp;//&nbsp;slaveにLED点灯を指示<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("LED:ON\r\n");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'B';&nbsp;//&nbsp;slaveにLED消灯を指示<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("LED:OFF\r\n");<br />
&nbsp;&nbsp;}<br />
}<br />
</pre>
<br />
<br />
<br />
<br />
slave側<br />
slaveもmasterと同じ様にglobalにバッファを用意して、そこに適当に現在の状態を読み書きし、定期的にメインループ内でmasterと通信し共有している。この方が素直に書きやすい。<br />
LEDとボタンの状態を結びつける情報を1byte目に置いているが、それ以外の情報をやりとりする場合もシリアライズとかして通信するのではなく2byte目以降を使う方がいい。あくまで必要な変数を定期的に同期させられる、分散オブジェクト風に書いた方がすっきりする（PSoCのstring.hがおかしいという理由もあるけど）<br />
<br />
<br />
あと、ややこしいのがslaveなのでI2CHW_1_InitWrite関数を呼ぶとmasterからslaveへの書き込みが起こる。受信する。送信ではない。また、I2CHW_1_bReadI2CStatus() での状態チェックも、dataに使っている信号線1本の状態のチェックのためなので呼び出すタイミングがmasterと逆になる。このへんややこしいのであまり触りたくないから、通信は隔離された別ループでやってglobalに置いた共用bufferを同期させるという方法にした。<br />
<br />
<a href="http://github.com/shokai/i2c-uart-cy8c29466/blob/54a8031710cbe524da57a3e7689e707e99d20cb9/i2c_slave/i2c_slave/i2c_slave/main.c">main.c</a><br />
<pre class="prettyprint">
//&nbsp;I2C-UART&nbsp;slave<br />
//&nbsp;CY8C29466-24PXI(DIP&nbsp;Package)<br />
//&nbsp;PSoC&nbsp;Designer&nbsp;5.0&nbsp;+&nbsp;SP6<br />
//&nbsp;IMAGECRAFT&nbsp;C&nbsp;Compiler<br />
<br />
#include&nbsp;&lt;m8c.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;part&nbsp;specific&nbsp;constants&nbsp;and&nbsp;macros<br />
#include&nbsp;&lt;I2CHW_1Common.h&gt;<br />
#include&nbsp;"PSoCAPI.h"&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;PSoC&nbsp;API&nbsp;definitions&nbsp;for&nbsp;all&nbsp;User&nbsp;Modules<br />
#define&nbsp;_BV(BIT)&nbsp;(1&lt;&lt;BIT)<br />
#define&nbsp;sbi(BYTE,BIT)&nbsp;(BYTE&nbsp;|=&nbsp;_BV(BIT))<br />
#define&nbsp;cbi(BYTE,BIT)&nbsp;(BYTE&nbsp;&amp;=&nbsp;~_BV(BIT))<br />
<br />
#define&nbsp;LED_ON()&nbsp;sbi(PRT2DR,&nbsp;0)&nbsp;//&nbsp;LED<br />
#define&nbsp;LED_OFF()&nbsp;cbi(PRT2DR,&nbsp;0)<br />
#define&nbsp;BTN_PORT&nbsp;PRT2DR&nbsp;//&nbsp;push&nbsp;button<br />
#define&nbsp;BTN_BIT&nbsp;_BV(2)<br />
<br />
#define&nbsp;BUF_SIZE&nbsp;8<br />
BYTE&nbsp;buf_rx[BUF_SIZE];&nbsp;//&nbsp;I2C&nbsp;buffer<br />
BYTE&nbsp;buf_tx[BUF_SIZE]&nbsp;=&nbsp;{'x'};<br />
BYTE&nbsp;status;&nbsp;//&nbsp;I2C&nbsp;status<br />
<br />
void&nbsp;main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;M8C_EnableGInt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;M8C_EnableIntMask(INT_MSK0,&nbsp;INT_MSK0_GPIO);<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_EnableSlave();<br />
&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_EnableInt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(;;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;I2CHW_1_bReadI2CStatus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(status&nbsp;&amp;&nbsp;I2CHW_WR_COMPLETE){&nbsp;//&nbsp;master-&gt;slave<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_ClrWrStatus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_InitWrite(buf_rx,&nbsp;BUF_SIZE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(status&nbsp;&amp;&nbsp;I2CHW_RD_COMPLETE){&nbsp;//&nbsp;slave-&gt;master<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_ClrRdStatus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CHW_1_InitRamRead(buf_tx,&nbsp;BUF_SIZE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'A')&nbsp;LED_ON();&nbsp;//&nbsp;masterからの指示でLEDの点灯/消灯を切り替え<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(buf_rx[0]&nbsp;==&nbsp;'B')&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
#pragma&nbsp;interrupt_handler&nbsp;INT_GPIO<br />
void&nbsp;INT_GPIO(void){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(BTN_PORT&nbsp;&amp;&nbsp;BTN_BIT){&nbsp;//&nbsp;ボタンを押している時<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'d';&nbsp;//&nbsp;押下をmasterに通知<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf_tx[0]&nbsp;=&nbsp;'u';<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5230/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC &#8211; TX8モジュール</title>
		<link>http://shokai.org/blog/archives/4519</link>
		<comments>http://shokai.org/blog/archives/4519#comments</comments>
		<pubDate>Tue, 28 Apr 2009 23:53:52 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C21334]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4519</guid>
		<description><![CDATA[UARTモジュールとまるきり同じだけど、TXだけ使うとデジタルブロック1つで済むので節約したい時に使える。 とくにCY8C21334でCapSense (CSD)使うと、digital/analogともに残り1ブロックに [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://shokai.org/blog/archives/1503">UARTモジュール</a>とまるきり同じだけど、TXだけ使うとデジタルブロック1つで済むので節約したい時に使える。<br />
とくにCY8C21334でCapSense (CSD)使うと、digital/analogともに残り1ブロックになるので、このTX8を使うかI2Cでもう1つ別のマイコンとやりとりしてそっちにシリアル通信してもらうかしないとパソコンとやりとりできない。<br />
<br />
<br />
9600bps出すためのCPU設定。<br />
内蔵24MHz → System Clock → VC1 → VC3と流れて分周していってTX8_1のクロックソースにする<br />
<a href="http://www.flickr.com/photos/shokai/3483978757/" title="TX8モジュール by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3359/3483978757_f478d056e0.jpg" width="406" height="427" alt="TX8モジュール" /></a><br />
<br />
<br />
Port_0_1まで結線する<br />
<a href="http://www.flickr.com/photos/shokai/3484011941/" title="TX8モジュール by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3373/3484011941_ff6e585517.jpg" width="500" height="300" alt="TX8モジュール" /></a><br />
<br />
<br />
main.c<br />
<pre class="prettyprint">
#include&nbsp;&lt;m8c.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;part&nbsp;specific&nbsp;constants&nbsp;and&nbsp;macros<br />
#include&nbsp;&quot;PSoCAPI.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;PSoC&nbsp;API&nbsp;definitions&nbsp;for&nbsp;all&nbsp;User&nbsp;Modules<br />
void&nbsp;main()<br />
{<br />
&nbsp;&nbsp;TX8_1_Start(TX8_1_PARITY_NONE);<br />
&nbsp;&nbsp;while(1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;TX8_1_CPutString(&quot;this&nbsp;is&nbsp;test&yen;r&yen;n&quot;);<br />
&nbsp;&nbsp;}<br />
}<br />
</pre>これだけで8bit パリティ無し ストップビット1で送信できる。<br />
<br />
<br />
あとは秋月のFT232RL基盤のRXDピンに流せばいい<br />
→ <a href="http://shokai.org/blog/archives/1506">橋本商会  秋月FT232RL基盤をPSoC CY8C29466で使ってみる</a><br />
<br />
<br />
受信できた<br />
<a href="http://www.flickr.com/photos/shokai/3483980031/" title="TX8モジュール by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3367/3483980031_bab0bc8a02.jpg" width="500" height="185" alt="TX8モジュール" /></a><br />
<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4519/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>秋月FT232RL基盤をPSoC CY8C29466で使ってみる</title>
		<link>http://shokai.org/blog/archives/1506</link>
		<comments>http://shokai.org/blog/archives/1506#comments</comments>
		<pubDate>Sun, 16 Mar 2008 12:37:22 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1506</guid>
		<description><![CDATA[秋月のFT232RL基板(AE-UM232R)を使ってみた。 FT232シリーズは、FTDI社製のUSB-UART変換基板。 USBデバイスとしてパソコンからは認識されるが、Win/Mac両対応のVirutal COM  [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://akizukidenshi.com/catalog/items2.php?p=1&#038;q=%22K-01977%22">秋月のFT232RL基板(AE-UM232R)</a>を使ってみた。</p>
<p>FT232シリーズは、FTDI社製のUSB-UART変換基板。<br /><br />
USBデバイスとしてパソコンからは認識されるが、Win/Mac両対応の<a href="http://www.ftdichip.com/Drivers/VCP.htm">Virutal COM Port Driver</a>をインストールすると、シリアルポートとして認識する事ができるようになるので、ArduinoやGainerの部品としても使われている。</p>
<p>写真の通り、周辺回路が全て基板上に実装されているので簡単に使えた。<br /><br />
プログラムは<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2008/03/psoc-cy8c2946-uart-recv-int.html">PSoC &#8211; CY8C29466でUART受信割り込み</a>と同じものを使用した。<br /><br />
PC側からUSBを通して基盤側に5Vを給電するのもできた。<br /><br />
配線したのはRXD, TXD, VCC, GNDだけで終わりなのでとても楽。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2333889238/" title="秋月FT232RL基盤+PSoCでUART by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3149/2333889238_1b06773329.jpg" width="500" height="375" alt="秋月FT232RL基盤+PSoCでUART" /></a></p>
<p><span id="more-1506"></span><br /><br />
ジャンパピンが2つある。設定する項目はそれぞれ<br /><br />
１．USBから基盤に給電する電圧は5Vか、3.3Vか<br /><br />
２．PC側のUSBか、基盤側かどちらの電源を使うか<br /><br />
になっている。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2333060757/" title="秋月FT232RL基盤 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3164/2333060757_c4906c18a7.jpg" width="500" height="375" alt="秋月FT232RL基盤" /></a></p>
<p>ピンはいっぱいあるけど実際使うのはRXD, TXD, VCC, GNDだけ。<br /><br />
ただし、基盤側からの電源で動かす場合はリセットのためのピンがいくつかある<br /><br />
<a href="http://www.flickr.com/photos/shokai/2333057929/" title="秋月FT232RL基盤 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3013/2333057929_9b4160d60d.jpg" width="500" height="375" alt="秋月FT232RL基盤" /></a></p>
<p>少し気に入らないのは、ジャンパピンのおかげで背が高くなってしまっているところ。切っちまうか</p>
<p><a href="http://www.flickr.com/photos/shokai/2333886888/" title="秋月FT232RL基盤+PSoCでUART by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2208/2333886888_0627a3a7c8.jpg" width="500" height="375" alt="秋月FT232RL基盤+PSoCでUART" /></a></p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1506/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC &#8211; CY8C29466でUART受信割り込み</title>
		<link>http://shokai.org/blog/archives/1503</link>
		<comments>http://shokai.org/blog/archives/1503#comments</comments>
		<pubDate>Sat, 15 Mar 2008 13:16:42 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1503</guid>
		<description><![CDATA[ひさしぶりにPSoC Designer4.4をいじって、UARTの受信割り込みを覚えたのでメモ。 1年ぐらい前にUART送信と、受信バッファに溜まったデータの読み込み方はやったんだけど → s.h.log: PSoC &#038; [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>ひさしぶりにPSoC Designer4.4をいじって、UARTの受信割り込みを覚えたのでメモ。</p>
<p>1年ぐらい前にUART送信と、受信バッファに溜まったデータの読み込み方はやったんだけど<br /><br />
→ <a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/psoc-cy8c29466-uart-tx.html">s.h.log: PSoC &#8211; CY8C29466でUART送信</a><br /><br />
受信した瞬間にイベントを発生させて、あらかじめ登録しておいた関数にジャンプさせる「受信割り込み」の方法がわからなかった。<br /><br />
んで最近植木さんが「uart_1int.asmの_UART_1_RX_ISR:からljmp」と言っていたので、その通りやったらできた。</p>
<p>■回路<br /><br />
ADM3202のRXとTXに、PSoCのPort2_4とPort2_5を突っ込む。<br /><br />
Port_2_2にタクトスイッチ、Port_2_0にLED。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2333881454/" title="PSoC UART by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2213/2333881454_9406c211a9.jpg" width="500" height="375" alt="PSoC UART" /></a><a href="http://www.flickr.com/photos/shokai/2333883290/" title="PSoC UART by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3032/2333883290_f5af827bda.jpg" width="500" height="375" alt="PSoC UART" /></a><br /><br />
<a href="http://www.flickr.com/photos/shokai/2332949654/" title="PSoC UART Receive Int by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3207/2332949654_c3031a20c1_o.png" width="428" height="502" alt="PSoC UART Receive Int" /></a></p>
<p>■今回の動作<br /><br />
スイッチを押すとLEDが付き、離すと消える。これはGPIOの両エッジ割り込みでやってる。<br /><br />
さらに、UARTでパソコン側から送られた文字はそのまま送り返す（エコーする）<br /><br />
送られてきた文字の中にUがあればLEDを点灯させ、 !Up!を送り返す。Dがあれば消灯して!Down!を送り返す。</p>
<p>Acknowrichでシリアル通信をやりとりしているところ<br /><br />
<a href="http://www.flickr.com/photos/shokai/2332961574/" title="PSoC UART Receive Int by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3182/2332961574_bb319764f2_o.png" width="360" height="134" alt="PSoC UART Receive Int" /></a></p>
<br />
<br />
<p><a href="http://shokai.org/archive/psoc/cy8c29466/designer/0803_uart-recv/080314_uart-recv.zip">Source Code (PSoC Designer 4.4 + C Compiler)</a><br /><br />
<pre class="prettyprint">
/***<br />
&nbsp;&nbsp;Port2_2のスイッチでLEDをON/OFFする<br />
&nbsp;&nbsp;UARTを受信してそのままエコー。DでLEDをOFF、UでLEDをONする<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;CPU:&nbsp;CY8C29466&nbsp;24MHz(Internal)<br />
&nbsp;&nbsp;Board:&nbsp;Bread-board<br />
&nbsp;&nbsp;Compiler:&nbsp;PSoC&nbsp;Designer4.4&nbsp;+&nbsp;C&nbsp;Compiler<br />
&nbsp;&nbsp;Date:&nbsp;2008/3/14<br />
&nbsp;&nbsp;Author:&nbsp;Sho&nbsp;Hashimoto<br />
&nbsp;&nbsp;WebSite:&nbsp;http://shokai.org<br />
&nbsp;&nbsp;***/<br />
#include&nbsp;&lt;m8c.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;part&nbsp;specific&nbsp;constants&nbsp;and&nbsp;macros<br />
#include&nbsp;"PSoCAPI.h"&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;PSoC&nbsp;API&nbsp;definitions&nbsp;for&nbsp;all&nbsp;User&nbsp;Modules<br />
#define&nbsp;_BV(BIT)&nbsp;(1&lt;&lt;BIT)<br />
#define&nbsp;sbi(BYTE,BIT)&nbsp;(BYTE&nbsp;|=&nbsp;_BV(BIT))<br />
#define&nbsp;cbi(BYTE,BIT)&nbsp;(BYTE&nbsp;&amp;=&nbsp;~_BV(BIT))<br />
#define&nbsp;LED_ON()&nbsp;sbi(PRT2DR,&nbsp;0);<br />
#define&nbsp;LED_OFF()&nbsp;cbi(PRT2DR,&nbsp;0);<br />
void&nbsp;main(){<br />
&nbsp;&nbsp;M8C_EnableGInt;&nbsp;//&nbsp;enable&nbsp;global&nbsp;interrupt<br />
&nbsp;&nbsp;M8C_EnableIntMask(INT_MSK0,&nbsp;INT_MSK0_GPIO);<br />
&nbsp;&nbsp;UART_1_CmdReset();&nbsp;//&nbsp;uart&nbsp;init<br />
&nbsp;&nbsp;UART_1_IntCntl(UART_1_ENABLE_RX_INT);&nbsp;//&nbsp;enable&nbsp;receive&nbsp;interrupt<br />
&nbsp;&nbsp;UART_1_Start(UART_1_PARITY_NONE);<br />
&nbsp;&nbsp;LED_ON();<br />
}<br />
#pragma&nbsp;interrupt_handler&nbsp;INT_GPIO<br />
void&nbsp;INT_GPIO(void){<br />
&nbsp;&nbsp;if(PRT2DR&nbsp;&amp;&nbsp;_BV(2)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("ON¥r¥n");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("OFF¥r¥n");<br />
&nbsp;&nbsp;}<br />
}<br />
#pragma&nbsp;interrupt_handler&nbsp;INT_UART_RX<br />
void&nbsp;INT_UART_RX(void){<br />
&nbsp;&nbsp;char&nbsp;recv_data;<br />
&nbsp;&nbsp;recv_data&nbsp;=&nbsp;UART_1_cGetChar();&nbsp;//&nbsp;read&nbsp;UART<br />
&nbsp;&nbsp;UART_1_PutChar(recv_data);&nbsp;//&nbsp;echo<br />
&nbsp;&nbsp;switch(recv_data){<br />
&nbsp;&nbsp;case&nbsp;'U':<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("!Up!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;case&nbsp;'D':<br />
&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;UART_1_CPutString("!Down!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;}<br />
}<br />
</pre>
<br />
<br />
uart_1int.asmに受信割り込みをljmpで書いておく<br />
<pre class="prettyprint">
_UART_1_RX_ISR:<br />
&nbsp;&nbsp;&nbsp;;@PSoC_UserCode_BODY_2@&nbsp;(Do&nbsp;not&nbsp;change&nbsp;this&nbsp;line.)<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;&nbsp;Insert&nbsp;your&nbsp;custom&nbsp;code&nbsp;below&nbsp;this&nbsp;banner<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;NOTE:&nbsp;interrupt&nbsp;service&nbsp;routines&nbsp;must&nbsp;preserve<br />
&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;the&nbsp;values&nbsp;of&nbsp;the&nbsp;A&nbsp;and&nbsp;X&nbsp;CPU&nbsp;registers.<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;ljmp&nbsp;_INT_UART_RX<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;&nbsp;Insert&nbsp;your&nbsp;custom&nbsp;code&nbsp;above&nbsp;this&nbsp;banner<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;@PSoC_UserCode_END@&nbsp;(Do&nbsp;not&nbsp;change&nbsp;this&nbsp;line.)<br />
</pre>
<br />
<br />
psocgpioint.asmにも、GPIOの割り込みをljmpで書いておく<br />
<pre class="prettyprint">
PSoC_GPIO_ISR:<br />
&nbsp;&nbsp;&nbsp;;@PSoC_UserCode_BODY@&nbsp;(Do&nbsp;not&nbsp;change&nbsp;this&nbsp;line.)<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;&nbsp;Insert&nbsp;your&nbsp;custom&nbsp;code&nbsp;below&nbsp;this&nbsp;banner<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ljmp&nbsp;_INT_GPIO<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;&nbsp;Insert&nbsp;your&nbsp;custom&nbsp;code&nbsp;above&nbsp;this&nbsp;banner<br />
&nbsp;&nbsp;&nbsp;;---------------------------------------------------<br />
&nbsp;&nbsp;&nbsp;;@PSoC_UserCode_END@&nbsp;(Do&nbsp;not&nbsp;change&nbsp;this&nbsp;line.)<br />
&nbsp;&nbsp;&nbsp;reti<br />
</pre>
<p>UARTまわりの関数はuart_1.asmとuart_1.hに自動生成されてる。<br /><br />
cGetChar()とiGetChar()があるが、cGetChar()の方だとchar型として読み出せた。iGetCharの方はおそらく数値としてかな？<br /><br />
RXのバッファが残っているかどうかを確かめる方法がわからない。</p>
<p><span id="more-1503"></span><br /><br />
■PSoC デバイス設定<br /><br />
まずUser ModulesからUARTをドラッグアンドドロップ。名前はUART_1にする<br /><br />
<a href="http://www.flickr.com/photos/shokai/455294159/" title="UART of PSoC CY8C29466 by shokai, on Flickr"><img src="http://farm1.static.flickr.com/240/455294159_537d079a79.jpg" width="500" height="277" alt="UART of PSoC CY8C29466" /></a></p>
<p>次にGlobal ResourcecsでVC3をUART_1モジュールのクロックソースに指定して、VC3が9600bpsを出せるようにする<br /><br />
<a href="http://www.flickr.com/photos/shokai/455295017/" title="UART of PSoC CY8C29466 by shokai, on Flickr"><img src="http://farm1.static.flickr.com/246/455295017_6060ba87ab_o.png" width="300" height="423" alt="UART of PSoC CY8C29466" /></a><a href="http://www.flickr.com/photos/shokai/455281316/" title="UART of PSoC CY8C29466 by shokai, on Flickr"><img src="http://farm1.static.flickr.com/181/455281316_669e253de1_o.png" width="299" height="355" alt="UART of PSoC CY8C29466" /></a></p>
<p>RXとTXのモジュールを結線していく。Port_2_4とPort_2_5につなぐ<br /><br />
<a href="http://www.flickr.com/photos/shokai/2332948388/" title="PSoC UART Receive Int by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2066/2332948388_7e92c4c06d.jpg" width="500" height="252" alt="PSoC UART Receive Int" /></a></p>
<p>IOの設定。RXはGlobalInに、TXはGlobalOutに。スイッチはPull upしてChangeFromRead（両エッジ割り込み）にしないとGPIO割り込みを発生させるようにする。LEDは普通に3Vぐらいを出力したいので、Strongで丁度良い。<br /><br />
<a href="http://www.flickr.com/photos/shokai/2332946512/" title="PSoC UART Receive Int by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2042/2332946512_547ed17630_o.png" width="373" height="190" alt="PSoC UART Receive Int" /></a></p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1503/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC CY8C29466 + Digital Compass</title>
		<link>http://shokai.org/blog/archives/1345</link>
		<comments>http://shokai.org/blog/archives/1345#comments</comments>
		<pubDate>Sun, 13 May 2007 14:59:24 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[Pileus]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[RDCM-802]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[コンパス]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1345</guid>
		<description><![CDATA[前はArduinoでやったけど → s.h.log: Arduinoで方位センサ RDCM-802 を試す 今日はRDCM-802というデジタルコンパス（方位センサー）をPileusに取り付けた。 これ でもはんだづける [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>前はArduinoでやったけど<br /><br />
→ <a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/02/arduino-rdcm-802.html">s.h.log: Arduinoで方位センサ RDCM-802 を試す</a></p>
<p>今日はRDCM-802というデジタルコンパス（方位センサー）を<a href="http://www.pileus.net/">Pileus</a>に取り付けた。</p>
<p>これ<br /><br />
<a href="http://www.flickr.com/photos/shokai/495939348/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/222/495939348_6cc384d936_o.jpg" width="240" height="320" alt="方位センサー" /></a></p>
<p>でもはんだづける場所が無かったので<br /><br />
<a href="http://www.flickr.com/photos/shokai/496209198/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/208/496209198_ccb1d64e09_m.jpg" width="240" height="180" alt="Digital Compass on Pileus" /></a><a href="http://www.flickr.com/photos/shokai/496242813/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/224/496242813_4f52e513f2_m.jpg" width="240" height="180" alt="Digital Compass on Pileus" /></a><br /><br />
こうやって</p>
<p><span id="more-1345"></span><br /><br />
んで電源は3端子レギュレータから直接取った。<br /><br />
<a href="http://www.flickr.com/photos/shokai/496244511/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/231/496244511_b79a877865.jpg" width="500" height="375" alt="Digital Compass on Pileus" /></a></p>
<p>なんか普通に計測できた。0-7で出力するので、45倍するとそのまま360度方位として使える。<br /><br />
<a href="http://www.flickr.com/photos/shokai/496209804/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/207/496209804_cccdb072c5.jpg" width="500" height="375" alt="Digital Compass on Pileus" /></a></p>
<p>最終的には値が変わったときだけ出力するようにしてみた。<br /><br />
</p>
<blockquote><p>#define_BV(BIT)(1<<BIT)<br /><br />
#defineCOMPASS_D0_BV(4)//DigitalCompassD0PORT_0_4<br /><br />
#defineCOMPASS_D1_BV(2)//DigitalCompassD1PORT_0_2<br /><br />
#defineCOMPASS_D2_BV(0)//DigitalCompassD2PORT_0_0</p>
<p>/*getAzimuthfromDigitalCompassonPORT_0*/<br /><br />
charget_azimuth(void){<br /><br />
chard0,d1,d2;<br /><br />
d0=PRT0DR&#038;COMPASS_D0;<br /><br />
d1=PRT0DR&#038;COMPASS_D1;<br /><br />
d2=PRT0DR&#038;COMPASS_D2;<br /><br />
<br /><br />
if(d0&#038;&#038;d1&#038;&#038;!d2)return0;//N<br /><br />
elseif(!d0&#038;&#038;d1&#038;&#038;!d2)return1;//NE<br /><br />
elseif(!d0&#038;&#038;d1&#038;&#038;d2)return2;//E<br /><br />
elseif(!d0&#038;&#038;!d1&#038;&#038;d2)return3;//SE<br /><br />
elseif(!d0&#038;&#038;!d1&#038;&#038;!d2)return4;//S<br /><br />
elseif(d0&#038;&#038;!d1&#038;&#038;!d2)return5;//SW<br /><br />
elseif(d0&#038;&#038;!d1&#038;&#038;d2)return6;//W<br /><br />
elseif(d0&#038;&#038;d1&#038;&#038;d2)return7;//NW<br /><br />
return8;//error<br /><br />
}</p>
<p>voidmain(){<br /><br />
charazimuth,azimuth_p;<br /><br />
//UARTinit<br /><br />
UART_1_CmdReset();//uartinit<br /><br />
UART_1_IntCntl(UART_1_ENABLE_RX_INT);//enablereceiveinterrupt<br /><br />
UART_1_Start(UART_1_PARITY_NONE);</p>
<p>for(;;){<br /><br />
//checkcompass<br /><br />
azimuth=get_azimuth();//digitalcompass<br /><br />
if(azimuth!=azimuth_p){<br /><br />
UART_1_PutChar(azimuth+&#8217;0&#8242;);<br /><br />
UART_1_CPutString(&#8220;¥r¥n&#8221;);<br /><br />
}<br /><br />
azimuth_p=azimuth;<br /><br />
}<br /><br />
}</p>
</p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1345/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC &#8211; CY8C29466でUART送信</title>
		<link>http://shokai.org/blog/archives/1323</link>
		<comments>http://shokai.org/blog/archives/1323#comments</comments>
		<pubDate>Tue, 17 Apr 2007 22:10:35 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1323</guid>
		<description><![CDATA[9600bpsがやっと出せたのでメモ。あとで受信割り込みもやらなきゃ。 今回使うのはこのUARTモジュール。TXだけとかRXだけのモジュールもあるけど。 Device Editor上でPlaceして、Port_2_4とP [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>9600bpsがやっと出せたのでメモ。あとで受信割り込みもやらなきゃ。</p>
<p>今回使うのはこのUARTモジュール。TXだけとかRXだけのモジュールもあるけど。<br /><br />
<a href="http://www.flickr.com/photos/shokai/455294159/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/240/455294159_30e2e3ce27_o.png" width="584" height="324" alt="UART of PSoC CY8C29466" /></a></p>
<p>Device Editor上でPlaceして、Port_2_4とPort_2_5に接続します。これがブレッドボードみたいで楽しい。<br /><br />
<a href="http://www.flickr.com/photos/shokai/455292971/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/174/455292971_ffc6ac5498.jpg" width="500" height="244" alt="UART of PSoC CY8C29466" /></a></p>
<p><span id="more-1323"></span><br /><br />
すると、GPIOの設定がこうなっているはず。<br /><br />
Port_2_4がRX（受信）、Port_2_5がTX（送信）<br /><br />
<a href="http://www.flickr.com/photos/shokai/455285272/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/179/455285272_b007593fc5_o.png" width="347" height="226" alt="UART of PSoC CY8C29466" /></a></p>
<p>UARTとGlobal Resourceの設定。VC3を9600bpsを作るためのクロックソースとして使っている。<br /><br />
<a href="http://www.flickr.com/photos/shokai/455295017/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/246/455295017_6060ba87ab_o.png" width="300" height="423" alt="UART of PSoC CY8C29466" /></a><a href="http://www.flickr.com/photos/shokai/455281316/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/181/455281316_669e253de1_o.png" width="299" height="355" alt="UART of PSoC CY8C29466" /></a><br /><br />
そのVC3の分周率を作る計算がよくわからなかったので、適当にやっていたら57600bpsで動いていたので9600bpsにするには6分の1にすればいいかな…とやったらできた。今は安定して動いてるのでおｋ</p>
<p>で、Application Editorのコード。<br /><br />
初期設定して<br /><br />
</p>
<blockquote><p>//uartinit<br /><br />
UART_1_CmdReset();<br /><br />
UART_1_Start(UART_1_PARITY_NONE);</p></p></blockquote>
<p>
<p>送信、と。<br /><br />
</p>
<blockquote><p>UART_1_CPutString(&#8220;zanmaizanmai¥r¥n&#8221;);</p></p></blockquote>
<p>
<p>あと一応Port_2_4とPort_2_5の実体配置も。<br /><br />
<a href="http://www.flickr.com/photos/shokai/455290933/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/196/455290933_de3d934586_o.png" width="381" height="417" alt="UART of PSoC CY8C29466" /></a></p>
<p>秋月で買ってきたADM3202（UART-RS232Cのレベル変換IC）にAVRの時と同じノリでつっこんだら、普通にシリアル通信できた。<br /><br />
<a href="http://www.flickr.com/photos/shokai/463341112/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/199/463341112_c6104ec69a.jpg" width="500" height="375" alt="DSC02020" /></a><br /><br />
これで<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/fncc.html">Flashともやりとりできる</a>。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1323/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CY8C29466のADCINC12</title>
		<link>http://shokai.org/blog/archives/1319</link>
		<comments>http://shokai.org/blog/archives/1319#comments</comments>
		<pubDate>Sat, 14 Apr 2007 10:48:05 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AD変換]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1319</guid>
		<description><![CDATA[PSoCの12ビットAD変換器を使う。 関連、PGAについても：s.h.log: PSoC Designer &#8211; CY8C29466の6bit ADコンバータ ■Device Editor ADCINC12と [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>PSoCの12ビットAD変換器を使う。</p>
<p>関連、PGAについても：<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/psoc-cy8c29466-adc.html">s.h.log: PSoC Designer &#8211; CY8C29466の6bit ADコンバータ</a></p>
<p>■Device Editor<br /><br />
ADCINC12とPGA(Programmable AMP)の設定<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/458583808/"><img src="http://farm1.static.flickr.com/212/458583808_b88b6ccc43_o.png" alt="CY8C29466 ADCINC12" width="281" height="171" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/458583504/"><img src="http://farm1.static.flickr.com/200/458583504_8ac39972eb_o.png" alt="CY8C29466 ADCINC12" width="281" height="173" /></a></p>
<p>ADCINC12をPGAを通してPort_0_7に結線する<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/458598705/"><img src="http://farm1.static.flickr.com/190/458598705_194d11e2e0_o.png" alt="CY8C29466 ADCINC12" width="640" height="340" /></a></p>
<p><span id="more-1319"></span><br /><br />
■Application Editor<br /><br />
プログラムを書く。まずADCINCを動かす</p>
<pre class="prettyprint">
//&nbsp;ADC&nbsp;init<br />
PGA_1_Start(3);<br />
ADCINC12_1_Start(3);<br />
ADCINC12_1_GetSamples(0);<br />
M8C_EnableGInt;<br />
</pre>
<p>アナログ値を読み取る。<br /><br />
iGetDataは12ビットの正負（2048～-2048）を返してくるので、正の値に直す。</p>
<pre class="prettyprint">
int&nbsp;ad<br />
while(!ADCINC12_1_fIsDataAvailable());<br />
ADCINC12_1_ClearFlag();<br />
ad&nbsp;=&nbsp;ADCINC12_1_iGetData()+2048;<br />
</pre>
<p>ついでにAD値をString化してPCにシリアル通信で送るには</p>
<pre class="prettyprint">
//&nbsp;UART&nbsp;init<br />
UART_1_CmdReset();<br />
UART_1_IntCntl(UART_1_ENABLE_RX_INT);&nbsp;//&nbsp;enable&nbsp;receive&nbsp;interrupt<br />
UART_1_Start(UART_1_PARITY_NONE);<br />
char&nbsp;buf[6];<br />
UART_1_CPutString("ad=");<br />
UART_1_PutString(itoa(buf,&nbsp;ad,&nbsp;6));<br />
UART_1_PutCRLF();<br />
</pre>
<p>intは6桁まで。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1319/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>トランジスタでUARTを分岐させる</title>
		<link>http://shokai.org/blog/archives/1214</link>
		<comments>http://shokai.org/blog/archives/1214#comments</comments>
		<pubDate>Tue, 09 Jan 2007 11:52:02 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[トランジスタ]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1214</guid>
		<description><![CDATA[普段使う20ピンや28ピンのAVRには、UARTピンが1組しかない。64ピンとかになれば2組とか付いているけど。 んで昨日からDontronicsのUARTかUSBで制御できる小型LCDをいじっているんだけど、いつもシリ [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>普段使う20ピンや28ピンのAVRには、UARTピンが1組しかない。64ピンとかになれば2組とか付いているけど。</p>
<p>んで昨日からDontronicsのUARTかUSBで制御できる小型LCDを<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/01/dontronics-ulcd-color-sb.html">いじっている</a>んだけど、いつもシリアル通信でデバッグしているのに、UARTがLCDに占有されているせいでデバッグができない。</p>
<p>仕方ないので、信号用のトランジスタ<a href="http://akizukidenshi.com/catalog/items2.php?q=%22I-00359%22">2SC1815</a>と10kΩの抵抗を使って、UARTセレクタ（分岐させる回路）を作った。</p>
<p><a href="http://www.flickr.com/photos/shokai/351576814/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/162/351576814_1001d66fda_m.jpg" width="240" height="180" alt="usart selector" /></a><a href="http://www.flickr.com/photos/shokai/351577698/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/146/351577698_3e36c8179d_m.jpg" width="240" height="180" alt="usart selector" /></a></p>
<p><span id="more-1214"></span><br /><br />
■トランジスタで信号を分岐させる<br /><br />
<a href="http://www.flickr.com/photos/shokai/351589743/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/140/351589743_8e4aed70c8_o.gif" width="120" height="75" alt="transistor 2SC1815" /></a><a href="http://www.flickr.com/photos/shokai/351589770/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/70/351589770_c8a5d7c65d_o.gif" width="120" height="75" alt="transistor 2SC1815" /></a><br /><br />
ベースに電圧がかかっている間、コレクタからエミッタに電流が抜ける。<br /><br />
なので、マイコンのUARTのTXDを2つのトランジスタのコレクタ接続。エミッタをPCのシリアルポートに接続。マイコンのPD2,3はそれぞれのトランジスタのベースに接続する。<br /><br />
PD2,3のそれぞれ、電圧のかかっている方にシリアル通信が送られる。</p>
<p>■avr-gccでプログラム<br /><br />
main()の中でこうすると<br /><br />
<pre class="prettyprint">
for(;;){<br />
usart_selTxd(0);//出力ピン選択<br />
usart_sendStr(&qute;marutaka¥r¥n&qute;);<br />
usart_selTxd(1);<br />
usart_sendStr(&qute;zanmai¥r¥n&qute;);<br />
}<br />
</pre>
<p>こういう風に、別々のCOMポートに出力される。<br /><br />
<a href="http://www.flickr.com/photos/shokai/351550654/" title="Photo Sharing"><img src="http://farm1.static.flickr.com/154/351550654_49f69d05a1_o.png" width="225" height="210" alt="usart selector" /></a></p>
<p>mainより先に宣言しておく関数。<br /><br />
<pre class="prettyprint">
/*TXDピンの出力先を選択する*/<br />
voidusart_selTxd(charn){<br />
loop_until_bit_is_set(UCSR0A,UDRE0);//送信データレジスタ空きまで待機<br />
switch(n){<br />
case0:<br />
cbi(PORTD,PD3);<br />
sbi(PORTD,PD2);<br />
break;<br />
case1:<br />
cbi(PORTD,PD2);<br />
sbi(PORTD,PD3);<br />
break;<br />
}<br />
}<br />
/*UARTで文字列送信*/<br />
voidusart_sendStr(char*str){<br />
while(*str!=NULL){<br />
loop_until_bit_is_set(UCSR0A,UDRE0);//送信データレジスタ空きまで待機<br />
UDR0=*str++;//1文字送信、1文字進む<br />
}<br />
}<br />
</pre>
<p>PD2,3のHIになっている方のCOMポートに出力される。<br /><br />
AVRのUARTは、UDRレジスタに書き込んだ後しばらくしてからTXDから送信される。UART専用のハードウェアで、物理的に別スレッドになっている。だからUDRに書き込む前にUCSRAのUDREビットをチェックして、UDRが空いているか確認しなければならない。</p>
<p>ところでATMega48からUDRやUCSRAが、UDR0やUCSR0Aとかに変わったんだけど、28ピンAVRでも2系統のUSARTが付くのだろうか？<br /><br />
今は名前があるだけで、UDR1やUCSR1Aはまだ無いな。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1214/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dontronics uLCD128のカラーコード変換</title>
		<link>http://shokai.org/blog/archives/1211</link>
		<comments>http://shokai.org/blog/archives/1211#comments</comments>
		<pubDate>Mon, 08 Jan 2007 13:20:24 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[UART]]></category>
		<category><![CDATA[uLCD128]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1211</guid>
		<description><![CDATA[・Micro-LCD 届いたので使ってみた。 (hatayanlog) ・Dontronics :: 4d-Micro-LCD Old 畑山さんにもらったDontronicsの小型LCDを動かしてみた。シリアル通信で液晶 [...]]]></description>
			<content:encoded><![CDATA[<p>
・<a href="http://www.hatayan.org/weblog/archives/2006/01/07/111945.php">Micro-LCD 届いたので使ってみた。 (hatayanlog)</a><br />
・<a href="http://www.dontronics-shop.com/pages.php?pageid=56">Dontronics :: 4d-Micro-LCD Old</a><br />
畑山さんにもらったDontronicsの小型LCDを<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/01/lcd.html">動かしてみた</a>。シリアル通信で液晶画面を制御できる。<br />
uLCDの仕様では、色をrrrrrggggggbbbbbの計16bit(2byte)で赤緑青を表すようになっているので、2byteをmsb,lsbというそれぞれ1byteのデータに分け、シリアル通信で別々に送らなければならない。<br />
緑が丁度真ん中で割られてしまう。しかもなぜか緑だけ6byte。<br />
んでカラーコードの扱いが面倒臭かったので変換するコードを書いた（まだ試してない）<br />
→<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/01/dontronics-ulcd128-rgb.html">試した。やっぱりちょっと間違っていた。</a><br />
変換用関数(avr-gcc)<br />
<pre class="prettyprint">
char*colorToSb(char*color){<br />
charsb[2];<br />
//msb<br />
sb[0]=(color[0]&amp;0b11111)&lt;&lt;3//RED<br />
+(color[1]&amp;0b111000)&gt;&gt;3;//GREEN-A<br />
//lsb<br />
sb[1]=(color[1]&amp;0b111)&lt;&lt;3//GREEN-B<br />
+(color[2]&amp;0b11111);//BLUE;<br />
returnsb;<br />
}<br />
</pre>
mainからはこう呼ぶ<br />
<pre class="prettyprint">
charcolor[3]={0xFF,0xFF,0xFF};//RGB<br />
char*sb;<br />
sb=colorToSb(color);//msb,lsb取得<br />
//msb=sb[0],lsb=sb[1]<br />
</pre>
RGBで分けて書けて良い感じ。（明日実機で試す）<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1211/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

