<?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; PSoC</title>
	<atom:link href="http://shokai.org/blog/archives/tag/psoc/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>PSoC CapSenseで静電容量タッチセンサ 4つ動かした</title>
		<link>http://shokai.org/blog/archives/4404</link>
		<comments>http://shokai.org/blog/archives/4404#comments</comments>
		<pubDate>Fri, 03 Apr 2009 00:56:46 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CapSense]]></category>
		<category><![CDATA[CY8C21334]]></category>
		<category><![CDATA[PhysicalComputing]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4404</guid>
		<description><![CDATA[前の記事の回路などが思いきり間違っていたので修正しつつ、CapSenseとLED4つずつに増やした。 多分、マイコンの足の数だ増やせる。 例によってコードはBitbucketにアップした CapSense CSDウィザー [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://shokai.org/blog/archives/4386">前の記事</a>の回路などが思いきり間違っていたので修正しつつ、CapSenseとLED4つずつに増やした。<br />
多分、マイコンの足の数だ増やせる。<br />
<br />
例によってコードは<a href="http://bitbucket.org/shokai/capsense-led/src/e16efcaebf38/">Bitbucketにアップした</a><br />
<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/Fy-QWm1miEQ&#038;hl=ja&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Fy-QWm1miEQ&#038;hl=ja&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
<br />
<br />
CapSense CSDウィザードで4つスイッチを置いて<br />
<a href="http://www.flickr.com/photos/shokai/3408356980/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3640/3408356980_6f860378e2.jpg" width="408" height="365" alt="capsenseたくさん" /></a><br />
<br />
<br />
AnalogMUXBusに接続されている事を確認<br />
<a href="http://www.flickr.com/photos/shokai/3408358000/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3360/3408358000_e43bf30d1e_o.png" width="526" height="494" alt="capsenseたくさん" /></a><br />
<br />
<br />
CSDの設定。しきい値などをかなり何度も直した。適当にやってたので理論をわかってないんだけど、どうやらセンサ部分の形状や配置に応じて微調整しなければ使い物にならないっぽい。<br />
<a href="http://www.flickr.com/photos/shokai/3407550261/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3305/3407550261_bca3a6aeb8.jpg" width="400" height="365" alt="capsenseたくさん" /></a><br />
<br />
<br />
ピンの設定。LEDが4つにした。<br />
使ってないピンをPull Upにしておくとノイズが来ないので安定する事に気づいた。<br />
<a href="http://www.flickr.com/photos/shokai/3407550877/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3340/3407550877_233a257804.jpg" width="399" height="351" alt="capsenseたくさん" /></a><br />
<br />
<br />
実体配置図<br />
<a href="http://www.flickr.com/photos/shokai/3407425117/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3597/3407425117_2bcd238cec.jpg" width="494" height="430" alt="capsenseたくさん" /></a><br />
<br />
<br />
前の記事の回路が間違っていて、あのままではうまく動かなかったが、1kΩの抵抗と0.1μFのキャパシタを足したら複数認識できるようになった。<br />
<br />
CapSense CSDのデータシートにあった図。抵抗とキャパシタが必要らしい<br />
<a href="http://www.flickr.com/photos/shokai/3407401745/" title="capsenseたくさん by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3581/3407401745_3ea56ca197.jpg" width="269" height="196" alt="capsenseたくさん" /></a><br />
<br />
P1[5]とP0[3]の間に1kΩを入れて、P0[3]からキャパシタを通して銅箔テープに延ばす。<br />
<a href="http://www.flickr.com/photos/shokai/3407601745/" title="R0011375 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3655/3407601745_f120a2c5d3.jpg" width="375" height="500" alt="R0011375" /></a><br />
前の記事はP1[5]とP0[3]で静電容量取ろうとしてたので、思いっきり間違ってた。<br />
<br />
<br />
<br />
プログラム。<br />
前のやつのif(CSD_1_bIsSensorActive(センサ番号))を増やしただけ。<br />
<a href="http://bitbucket.org/shokai/capsense-led/src/e16efcaebf38/main.c">shokai / CapSense LED / source — bitbucket.org</a><br />
main.c<br />
</p>
<blockquote><p>
#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 />
#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_0_ON()&nbsp;sbi(PRT1DR,&nbsp;7);<br />
#define&nbsp;LED_0_OFF()&nbsp;cbi(PRT1DR,&nbsp;7);<br />
#define&nbsp;LED_1_ON()&nbsp;sbi(PRT0DR,&nbsp;1);<br />
#define&nbsp;LED_1_OFF()&nbsp;cbi(PRT0DR,&nbsp;1);<br />
#define&nbsp;LED_2_ON()&nbsp;sbi(PRT0DR,&nbsp;5);<br />
#define&nbsp;LED_2_OFF()&nbsp;cbi(PRT0DR,&nbsp;5);<br />
#define&nbsp;LED_3_ON()&nbsp;sbi(PRT0DR,&nbsp;7);<br />
#define&nbsp;LED_3_OFF()&nbsp;cbi(PRT0DR,&nbsp;7);<br />
<br />
<br />
void&nbsp;main()<br />
{<br />
&nbsp;&nbsp;M8C_EnableGInt;<br />
&nbsp;&nbsp;CSD_1_Start();<br />
&nbsp;&nbsp;CSD_1_InitializeBaselines();<br />
&nbsp;&nbsp;CSD_1_SetDefaultFingerThresholds();<br />
&nbsp;&nbsp;while(1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;CSD_1_ScanAllSensors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;CSD_1_UpdateAllBaselines();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CSD_1_bIsSensorActive(0)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_0_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_0_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CSD_1_bIsSensorActive(1)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_1_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_1_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CSD_1_bIsSensorActive(2)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_2_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_2_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CSD_1_bIsSensorActive(3)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_3_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_3_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
</p></blockquote>
<p>
<br />
<br />
<br />
電源を5VのACアダプタにしたらすっきりしたので、大学院棟の俺の机に置いておきます<br />
さわると光ります<br />
<a href="http://www.flickr.com/photos/shokai/3408353138/" title="R0011369 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3327/3408353138_9bfb04efaa.jpg" width="500" height="375" alt="R0011369" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4404/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC CapSenseで静電容量タッチセンサを自作した</title>
		<link>http://shokai.org/blog/archives/4386</link>
		<comments>http://shokai.org/blog/archives/4386#comments</comments>
		<pubDate>Thu, 02 Apr 2009 19:24:36 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CapSense]]></category>
		<category><![CDATA[CY8C21334]]></category>
		<category><![CDATA[PhysicalComputing]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[電子工作]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4386</guid>
		<description><![CDATA[回路などが間違っている事に気がつきました 正しい実装は次の記事へ。 使った部品の説明などはこのまま下へ。 ********************************************* できたっぽい。ひさしぶ [...]]]></description>
			<content:encoded><![CDATA[<p>
回路などが間違っている事に気がつきました<br />
正しい実装は<a href="http://shokai.org/blog/archives/4404">次の記事</a>へ。<br />
使った部品の説明などはこのまま下へ。<br />
*********************************************<br />
<br />
<br />
できたっぽい。ひさしぶりにマイコンいじった。<br />
銅箔テープの部分に指が近づけると電気容量の乱れるので、それをPSoC CY8C21334のCapSense機能で検出してLEDを光らせている。<br />
コードも<a href="http://bitbucket.org/shokai/capsense-led/changeset/803cad7671cd/">bitbucketにアップしました</a><br />
<br />
<br />
（音小さい）<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/NHo9ahK27zA&#038;hl=ja&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NHo9ahK27zA&#038;hl=ja&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
LEDは点滅させたくてさせているんじゃないんだけど、してしまっている。<br />
もう少し抵抗値などの調整が必要らしい。<br />
<br />
静電容量タッチセンサはメカニカルな部品が無いので、ビデオの最後にやっている様に、何の変哲もない壁に埋め込んでその上に人の手が乗っているかを検出したりできる。<br />
防水加工も容易だし、銅箔等を使えば曲面に埋め込む事も出来る。<br />
実際ヨーロッパの寒いところに行くと信号機やエレベータのボタンが凍結防止のために静電容量センサで実装されていたりする。<br />
<br />
PSoCのCapSenseはワンチップで静電容量センサを簡単に実装できるパッケージで、商業的にはSONYのオーディオコンポやAppleのiPodのホイールなんかにも使われていてずいぶん潤っているらしく、セミナーも無料だし<a href="http://shokai.org/blog/archives/1274">基盤は配るし</a>タダメシも出てくる。<br />
<br />
<br />
次は複数のcapsenseを使えるようにしてみる予定。<br />
<a href="http://www.flickr.com/photos/shokai/3406823383/" title="静電容量タッチセンサ(capsense) by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3632/3406823383_7d0a9ec8fb.jpg" width="500" height="375" alt="静電容量タッチセンサ(capsense)" /></a><br />
<br />
<br />
■必要な部品<br />
リンク先は買ったお店の商品ページ。<br />
<ul>
<li><a href="https://www.chip1stop.com/UE027_M10.cfm?PID=CYPR-0009072">PSoCマイコン CY8C21334-24PVXI(20pin)</a><br />capsenseがついているマイコン。<a href="http://shokai.org/blog/archives/4338">いろいろ探した</a>結果、これをchip1stopで買うのがコストパフォーマンスが一番良いという結論になった</li>
<li><a href="http://akizukidenshi.com/catalog/g/gP-02614/">秋月のSSOP変換基板</a><br />CY8C21334がSSOPという超小さいパッケージしか無いので、ブレッドボードに刺せるように足幅を広げる基盤。28ピンなので8ピン余るけど安いからこれを使う。</li>
<li>銅箔テープ たしか千石で買ったと思う。薄くて平べったい電極ならなんでも良さそう</li>
</ul>
<br />
<br />
あとは、秋月で買ったPSoC MiniProgというUSB接続の書き込み機と、ブレッドボードとLEDとクリップとベニヤ板と変換基板のピンヘッダ（オス）。<br />
<br />
<br />
<br />
■センサー部分の制作<br />
銅箔テープを千石で買ってきて適当な木の板に平行に貼る。裏に糊がついていたので楽だった。<br />
<a href="http://www.flickr.com/photos/shokai/3406820981/" title="銅箔テープ by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3311/3406820981_2d6ce30071_m.jpg" width="240" height="180" alt="銅箔テープ" /></a><a href="http://www.flickr.com/photos/shokai/3406821345/" title="銅箔テープ by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3361/3406821345_0f395a47c2_m.jpg" width="240" height="180" alt="銅箔テープ" /></a><br />
<br />
<a href="http://doggie.blog.so-net.ne.jp/2006-12-21">CY3235 CapSense-ProxDet</a>では2.2kΩの抵抗と0.1μFのキャパシタがついているらしいが、手持ちの<a href="http://shokai.org/blog/archives/1274">PSoC Expressセミナーの時にもらったCY3121</a>では何もなくCY8C21434に直結しているように見えるので、これでいいのかも。<br />
<br />
<br />
■マイコンのはんだづけ<br />
今回はんだづけはここだけ。<br />
フラックスをたっぷり塗って、足に沿ってさっさっと撫でる。<br />
<a href="http://www.flickr.com/photos/shokai/3406816793/" title="変換基板にはんだづけ by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3620/3406816793_fcaa4ae496.jpg" width="500" height="375" alt="変換基板にはんだづけ" /></a><a href="http://www.flickr.com/photos/shokai/3407625186/" title="変換基板にはんだづけ by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3553/3407625186_229c00fe84.jpg" width="500" height="375" alt="変換基板にはんだづけ" /></a><br />
<br />
<br />
<br />
■PSoC Designerでのデバイス設定<br />
新規プロジェクトをCY8C21334 24PVXI(20pin)で開始して、<br />
Device EditorでUser ModulesからCap Sense(CSD)を配置。<br />
<a href="http://www.flickr.com/photos/shokai/3407691648/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3587/3407691648_0a92605124.jpg" width="314" height="300" alt="capsense" /></a><br />
<br />
「Select CSD with clock prescaler」を選択した。<br />
<a href="http://merl.ec.t.kanazawa-u.ac.jp/micon-bu/index.php?PSoC%C6%FE%CC%E7%A1%A7PSoC%20First%20Touch%CA%D4#tbb76fdf">PSoC入門：PSoC First Touch編 &#8211; MeRLマイコンブ</a>の記事ではwithout clock prescalerを選んでいるが、digital/analog block消費量も変わらないのでclock prescalerにしてみた。<br />
<br />
<br />
Interconnect Viewで、CSD_1をplaceしてから右クリックすると「CSDウィザード」というのがあるのでそれを使う。<br />
センサの数を1、スライダーを0にしてPORT0_1を左上にドラッグアンドドロップして「OK」<br />
<a href="http://www.flickr.com/photos/shokai/3406665197/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3403/3406665197_d7891467ca_o.png" width="618" height="386" alt="capsense" /></a><br />
<br />
<br />
すると、CSD_1に接続されている。<br />
いままでUARTやADCモジュールではInterconnect Viewで自分で接続していたが、その必要が無くなっている。<br />
<a href="http://www.flickr.com/photos/shokai/3407708938/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3397/3407708938_2f64cf758d_o.png" width="422" height="415" alt="capsense" /></a><br />
<br />
<br />
CSD_1の設定を確認。Pinの設定をしておく。<br />
<a href="http://www.flickr.com/photos/shokai/3406672963/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3301/3406672963_28bfc1224d.jpg" width="311" height="234" alt="capsense" /></a><br />
<br />
<br />
<br />
最後に、PORT0_0でLEDを光らせるためにDriveをStrongに変更<br />
<a href="http://www.flickr.com/photos/shokai/3407716654/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3604/3407716654_a8ac8dc8fd.jpg" width="307" height="175" alt="capsense" /></a><br />
<br />
<br />
ピン割り当て<br />
<a href="http://www.flickr.com/photos/shokai/3407720204/" title="capsense by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3633/3407720204_61ca12d2e1.jpg" width="383" height="345" alt="capsense" /></a><br />
<br />
<br />
<br />
<br />
Generate Applicationして、Cでプログラムを書く。<br />
<br />
<br />
■PSoC Designerでのプログラミング<br />
<a href="http://bitbucket.org/shokai/capsense-led/src/803cad7671cd/main.c">shokai / CapSense LED / source — bitbucket.org</a><br />
main.c<br />
</p>
<blockquote><p>
#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 />
#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(PRT0DR,&nbsp;0);<br />
#define&nbsp;LED_OFF()&nbsp;cbi(PRT0DR,&nbsp;0);<br />
<br />
<br />
void&nbsp;main()<br />
{<br />
&nbsp;&nbsp;M8C_EnableGInt;<br />
&nbsp;&nbsp;CSD_1_Start();<br />
&nbsp;&nbsp;CSD_1_InitializeBaselines();<br />
&nbsp;&nbsp;CSD_1_SetDefaultFingerThresholds();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;while(1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;CSD_1_ScanAllSensors();<br />
&nbsp;&nbsp;&nbsp;&nbsp;CSD_1_UpdateAllBaselines();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CSD_1_bIsSensorActive(0)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_ON();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_OFF();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
</p></blockquote>
<p>
<br />
<br />
<br />
■マイコンの回路を作る<br />
データシートを見て、PSoC MiniProgから接続が必要なSCLK、SDATA、XRES、VDD(VCC)、VSS(GND)の位置を確認<br />
<a href="http://www.flickr.com/photos/shokai/3406818217/" title="ピン配置 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3568/3406818217_74aaa888fa.jpg" width="500" height="375" alt="ピン配置" /></a><br />
<br />
<br />
その通りに配線。電源はUSBのPSoC MiniProgから給電できる。<br />
この時点でLEDを点灯させるだけのプログラムを書いて、マイコン単体で動くか確認した。<br />
<a href="http://www.flickr.com/photos/shokai/3406819253/" title="R0011336 by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3618/3406819253_fc91ca0a53.jpg" width="500" height="375" alt="R0011336" /></a><br />
<br />
<br />
<br />
さきほどのプログラムを書き込んで、<br />
PORT0_1とPORT1_5からクリップで銅箔テープに接続して完成。<br />
さわると光る。<br />
<a href="http://www.flickr.com/photos/shokai/3407630672/" title="静電容量タッチセンサ(capsense) by shokai, on Flickr"><img src="http://farm4.static.flickr.com/3322/3407630672_b278c41530.jpg" width="500" height="375" alt="静電容量タッチセンサ(capsense)" /></a><br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC関係 買う物リスト</title>
		<link>http://shokai.org/blog/archives/4338</link>
		<comments>http://shokai.org/blog/archives/4338#comments</comments>
		<pubDate>Mon, 23 Mar 2009 18:14:06 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4338</guid>
		<description><![CDATA[CapSense ・CY8C21534-24PVXI(28pin) ・CY8C21334-24PVXI(20pin) chip1で買うのが良さそう。21334の方が少量から値引率が高い。 digikeyでは少量から注文で [...]]]></description>
			<content:encoded><![CDATA[<p>
CapSense<br />
・<a href="https://www.chip1stop.com/UE027_M10.cfm?PID=CYPR-0009074">CY8C21534-24PVXI(28pin)</a><br />
・<a href="https://www.chip1stop.com/UE027_M10.cfm?PID=CYPR-0009072">CY8C21334-24PVXI(20pin)</a><br />
<br />
chip1で買うのが良さそう。21334の方が少量から値引率が高い。<br />
digikeyでは少量から注文できるのはCY8C21434だけで、QFNパッケージしかない。<br />
<br />
<br />
USB<br />
・<a href="https://www.chip1stop.com/UE027_M10.cfm?PID=CYPR-0009973">CY8C24794-24LFXI(56pin)</a><br />
・<a href="https://www.chip1stop.com/UE027_M10.cfm?PID=CYPR-0014267">CY8C24894-24LFXI(56pin)</a><br />
HID準拠のUSBデバイスが作れて、キーボード・ジョイスティック・マウスなどとして認識させれる。USBシリアルチップとしても動作可能。MLFパッケージしかない。<br />
24794はchip1では在庫が少ないのか、一度に1個しか買えない。24894はデータシート見る限り上位互換なのでこっちにしよう。<br />
<br />
<br />
今PSoC Designer開いてみたら、24894でCapSense(CSD/CSRともに)使えるみたいだ<br />
<br />
<br />
MLFは裏返してイソギンチャク配線できなくもないが、基盤を設計して発注した方が良さそうだ</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4338/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>
	</channel>
</rss>

