<?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; CY8C29466</title>
	<atom:link href="http://shokai.org/blog/archives/tag/cy8c29466/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>秋月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>PSoC Designer &#8211; CY8C29466の16bit Timer</title>
		<link>http://shokai.org/blog/archives/1311</link>
		<comments>http://shokai.org/blog/archives/1311#comments</comments>
		<pubDate>Sun, 01 Apr 2007 15:13:19 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Timer]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1311</guid>
		<description><![CDATA[CY3210-MiniEval基盤にCY8C29466マイコンを置いて、16ビットタイマーを4つ置いて動かした。 1秒毎？ぐらいで動かしてみたが、動いたは動いたけどまだ正確な仕組みがわからない。特にクロックの分周まわり。 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://www.cypress.com/design/DK10033">CY3210-MiniEval</a>基盤に<a href="http://www.cypress.com/portal/server.pt?space=CommunityPage&#038;control=SetCommunity&#038;CommunityID=209&#038;PageID=259&#038;fid=24&#038;rpn=CY8C29466">CY8C29466</a>マイコンを置いて、16ビットタイマーを4つ置いて動かした。<br /><br />
1秒毎？ぐらいで動かしてみたが、動いたは動いたけどまだ正確な仕組みがわからない。特にクロックの分周まわり。</p>
<p>ちなみに16bitタイマーはデジタルブロックを2つ消費するので、29466では同時に8個まで使える。</p>
<p>今回は<a href="http://plaza.rakuten.co.jp/edevice/diary/200611130000/">PSoC CPU 基板 （ストロベリーリナックス社） &#8211; 趣味の電子工作研究工房 &#8211; 楽天ブログ（Blog）</a>がとても参考になった。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/HSL71dpTjxE" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/HSL71dpTjxE" wmode="transparent"></embed></object></p>
<p>■今回のコード<br /><br />
<a href="http://shokai.org/archive/psoc/cy8c29466/designer/0704_timer/">Source Code (PSoC Designer4.3 + C Compiler)</a></p>
<p>■タイマーの配置とクロック設定<br /><br />
Device EditorのUser Module Selection Viewから選択してくる。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442061759/"><img src="http://farm1.static.flickr.com/201/442061759_9b9faa5390_o.png" alt="PSoC 16bit Timer" width="132" height="190" /></a></p>
<p><span id="more-1311"></span><br /><br />
Device EditorのInterconnect Viewで全部「place」する。<br /><br />
そしてクロックまわりの設定。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442058414/"><img src="http://farm1.static.flickr.com/181/442058414_bcd3380eb8_o.png" alt="PSoC 16bit Timer" width="573" height="424" /></a><br /><br />
クロックは色々接続しながら速度を調整できる。<br /><br />
今回は<br /><br />
SystemClock(24MHz)→(10分周)VC1→(100分周)VC3→Timer1&#038;2(24KHz)<br /><br />
になってると思ったけどどうも違うみたいだ。</p>
<p>タイマーは<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-designer-cy8c29466-pwm.html">PWM</a>とハードウェアは同じしくみを使っているらしい。Periodの値から1クロック毎にカウントダウンしていって、0になるとタイマー割り込みが起こる。<br /><br />
また、TimerCountOutを外のピンに結び付けておけば、0になった時にHが出力される様だ。<br /><br />
カウント0ではなくCompare値を指定して、その値より小さいかどうかで割り込みを起こすこともできるらしい。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442075681/"><img src="http://farm1.static.flickr.com/192/442075681_22c9215b5f_o.png" alt="PSoC 16bit Timer" width="203" height="275" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442076065/"><img src="http://farm1.static.flickr.com/205/442076065_4cf010ea11_o.png" alt="PSoC 16bit Timer" width="204" height="274" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442076100/"><img src="http://farm1.static.flickr.com/179/442076100_56cdc8dfea_o.png" alt="PSoC 16bit Timer" width="204" height="275" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442077137/"><img src="http://farm1.static.flickr.com/168/442077137_f72715173f_o.png" alt="PSoC 16bit Timer" width="204" height="274" /></a><br /><br />
Timer3と4は内部の32.768KHzのクロックを利用してみた。<br /><br />
Periodを32768にしておくと、ちょうど1秒に1回割り込みが起こる。<br /><br />
システムクロックの方から引っ張ってくるのは計算がよくわからないので、ちょっとしたウェイト処理には内蔵32KHzでいいかもしれない。</p>
<p>■I/Oの設定<br /><br />
CY3210-MiniEvalの4つのLEDにつながっているPORT2-0~3をStrongに設定した。<br /><br />
これでLEDが光る。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/442074821/"><img src="http://farm1.static.flickr.com/182/442074821_398fad1f29_o.png" alt="PSoC 16bit Timer" width="263" height="99" /></a><br /><br />
詳しくは下記参照：<br /><br />
<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/cy8c29466-gpio-led-blink.html">s.h.log: CY8C29466のGPIOでLEDピコピコさせた</a></p>
<p>■プログラム−Timer割り込み設定<br /><br />
boot.asmを見ると<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/04/psoc-designer-interrupt-c-lang.html">外部入力割込みの時</a>と同じようにljmp命令が書かれていて、_Timer16_1_ISRを呼び出している。</p>
</p>
<blockquote><p><p>org24h;PSoCBlockDBB01InterruptVector<br /><br />
ljmp_Timer16_1_ISR<br /><br />
reti</p></p></blockquote>
<p>
<p>Library Source/timer16_1int.asm の中の _Timer16_1_ISR からさらに _INT_Timer16_1 に飛ぶように設定する。<br /><br />
（boot.asmに直接書くとDevice Editorいじった時に書き換えられてしまう為）</p>
</p>
<blockquote><p><p>_Timer16_1_ISR:</p>
<p>;@PSoC_UserCode_BODY@(Donotchangethisline.)<br /><br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br /><br />
;Insertyourcustomcodebelowthisbanner<br /><br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br /><br />
;NOTE:interruptserviceroutinesmustpreserve<br /><br />
;thevaluesoftheAandXCPUregisters.</p>
<p>ljmp_INT_Timer16_1</p>
<p>;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br /><br />
;Insertyourcustomcodeabovethisbanner<br /><br />
;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br /><br />
;@PSoC_UserCode_END@(Donotchangethisline.)</p>
<p>reti</p></p></blockquote>
<p>
<p>main.c にpragmaとINT_Timer16_1関数を書くと、割り込み時に実行される。</p>
</p>
<blockquote><p><p>#pragmainterrupt_handlerINT_Timer16_1<br /><br />
voidINT_Timer16_1(void){<br /><br />
//code<br /><br />
}</p></p></blockquote>
<p>
<p>■プログラム−main.c<br /><br />
<a href="http://shokai.org/archive/psoc/cy8c29466/designer/0704_timer/">Source Code (PSoC Designer4.3 + C Compiler)</a></p>
<p>ここからはC言語で。<br /><br />
前述の割り込みを4つのタイマー全てに設定して、LEDが点いていたら消灯、消えていたら点灯するコードを書いた。<br /><br />
M8C_EnableGInt は全割り込みの許可。<br /><br />
Timer16_1_EnableInt() と Timer16_1_Start()はLibrary Headers/timer16_1.hに書かれている。<br /><br />
AVRと違ってタイマーはStart()したら回り続ける。<br /><br />
止めるのはTimer16_1_Stop(void)。Period値は動作中に書き換えられるらしい。</p>
</p>
<blockquote><p><p>/***<br /><br />
Blink4LEDsby416bit-Timers</p>
<p>CPU:CY8C2946624MHz(Internal)<br /><br />
Compiler:PSoCDesigner4.3+CCompiler<br /><br />
Date:2007/4/2<br /><br />
Author:ShoHashimoto<br /><br />
WebSite:http://shokai.org<br /><br />
***/</p>
<p>#include<m8c.h>//partspecificconstantsandmacros<br /><br />
#include&#8221;PSoCAPI.h&#8221;//PSoCAPIdefinitionsforallUserModules</p>
<p>#define_BV(BIT)(1<<BIT)<br /><br />
#definesbi(BYTE,BIT)(BYTE|=_BV(BIT))<br /><br />
#definecbi(BYTE,BIT)(BYTE&#038;=~_BV(BIT))</p>
<p>#defineLED0_ON()sbi(PRT2DR,0);//LED0on<br /><br />
#defineLED0_OFF()cbi(PRT2DR,0);//LED0off<br /><br />
#defineLED1_ON()sbi(PRT2DR,1);<br /><br />
#defineLED1_OFF()cbi(PRT2DR,1);<br /><br />
#defineLED2_ON()sbi(PRT2DR,2);<br /><br />
#defineLED2_OFF()cbi(PRT2DR,2);<br /><br />
#defineLED3_ON()sbi(PRT2DR,3);<br /><br />
#defineLED3_OFF()cbi(PRT2DR,3);</p>
<p>volatilecharledStat[4];//stateof4LEDs</p>
<p>voidmain()<br /><br />
{<br /><br />
M8C_EnableGInt;//EnableGlobalInterrupt<br /><br />
Timer16_1_EnableInt();//EnableTimer1<br /><br />
Timer16_1_Start();//StartTimer1<br /><br />
Timer16_2_EnableInt();<br /><br />
Timer16_2_Start();<br /><br />
Timer16_3_EnableInt();<br /><br />
Timer16_3_Start();<br /><br />
Timer16_4_EnableInt();<br /><br />
Timer16_4_Start();<br /><br />
}</p>
<p>#pragmainterrupt_handlerINT_Timer16_1<br /><br />
voidINT_Timer16_1(void){<br /><br />
if(ledStat[0]){<br /><br />
LED0_ON();//on<br /><br />
ledStat[0]=0;//nextisoff<br /><br />
}<br /><br />
else{<br /><br />
LED0_OFF();//off<br /><br />
ledStat[0]=1;//nextison<br /><br />
}<br /><br />
}</p>
<p>#pragmainterrupt_handlerINT_Timer16_2<br /><br />
voidINT_Timer16_2(void){<br /><br />
if(ledStat[1]){<br /><br />
LED1_ON();<br /><br />
ledStat[1]=0;<br /><br />
}<br /><br />
else{<br /><br />
LED1_OFF();<br /><br />
ledStat[1]=1;<br /><br />
}<br /><br />
}</p>
<p>#pragmainterrupt_handlerINT_Timer16_3<br /><br />
voidINT_Timer16_3(void){<br /><br />
if(ledStat[2]){<br /><br />
LED2_ON();<br /><br />
ledStat[2]=0;<br /><br />
}<br /><br />
else{<br /><br />
LED2_OFF();<br /><br />
ledStat[2]=1;<br /><br />
}<br /><br />
}</p>
<p>#pragmainterrupt_handlerINT_Timer16_4<br /><br />
voidINT_Timer16_4(void){<br /><br />
if(ledStat[3]){<br /><br />
LED3_ON();<br /><br />
ledStat[3]=0;<br /><br />
}<br /><br />
else{<br /><br />
LED3_OFF();<br /><br />
ledStat[3]=1;<br /><br />
}<br /><br />
}</p></p></blockquote>
<p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1311/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC Designer &#8211; CY8C29466で外部入力割り込み(C言語で)</title>
		<link>http://shokai.org/blog/archives/1309</link>
		<comments>http://shokai.org/blog/archives/1309#comments</comments>
		<pubDate>Sat, 31 Mar 2007 16:29:10 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[外部入力割り込み]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1309</guid>
		<description><![CDATA[前の記事s.h.log: PSoC Designer &#8211; CY8C29466でスイッチ入力と同じ動作を、割り込みでやってみた。 基盤も同じくCY3210-MiniEvalを使った。 動き方もまったく同じのを作 [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>前の記事<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-designer-switch-led-bin.html">s.h.log: PSoC Designer &#8211; CY8C29466でスイッチ入力</a>と同じ動作を、割り込みでやってみた。<br /><br />
基盤も同じくCY3210-MiniEvalを使った。</p>
<p>動き方もまったく同じのを作っちゃったのでビデオは省略。ただスイッチの扱い方が違うだけ。</p>
<p><a href="http://shokai.org/archive/psoc/cy8c29466/designer/0703_switch-interrupt/">SourceCode (PSoC Designer 4.3 + C Compiler)</a></p>
<p>■動作設定<br /><br />
Device EditorのInterconnect Viewで<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/440873686/"><img src="http://farm1.static.flickr.com/179/440873686_4aef3678e8_o.png" alt="PSoC GPIO Interrupt" width="318" height="209" /></a><br /><br />
基本的に<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-designer-switch-led-bin.html">s.h.log: PSoC Designer &#8211; CY8C29466でスイッチ入力</a>と同じだが、<br /><br />
タクトスイッチの接続されているPORT2-4のInterruptをFailingEdgeにする。<br /><br />
割り込みの仕方は3種類あり、<br /><br />
・FailingEdge → 立下り割り込み<br /><br />
・RisingEdge → 立ち上がり割り込み<br /><br />
・ChangeFromRead → 両エッジ変化割り込み<br /><br />
から選ぶ。</p>
<p><a href="http://web.sfc.keio.ac.jp/~shokai/archives/2005/07/avr_mega8.html">AVRのSIG_INTERRUPT0</a>、SIG_INTERRUPT1はそれぞれINT0, INT1ピンの状態が変化を監視する外部入力割り込みだが、<br /><br />
PSoCの外部入力割込みは<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2006/12/atmega168-sig-pinchange0.html">AVRのSIG_PIN_CHANGE</a>の方と同じく、どのピンに変化があっても割り込みが発生してしまう。<br /><br />
だから、複数のピンの割り込みを有効にする場合は実際にどのピンの変化が割り込みを発生させたのか？をいちいち確認しなければならない。今回はマスクレジスタで1つのピン（PORT2-4）だけをenableにしているので必要ないけど。</p>
<p>軽くまとめると、PSoCの割り込みの設定は<br /><br />
・マスクレジスタで「どのピンの変化を監視するか」を指定<br /><br />
・ピン毎に「立ち上がり/下がり/両方の、どの条件で割り込むか」を指定<br /><br />
できる。でもこれはPSoC Designerが自動生成してくれるので下手に触る必要は無い。<br /><br />
マスクで複数enableに指定した場合は、実際にどのピンが反応したか？はプログラミングでなんとかする。（1回前のPRTnDRの状態をglobal変数に保存しておいて比較するとか）</p>
<p>この辺は<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22">はじめてのPSoCマイコン</a>の「入出力&#038;割り込みのしくみとスイッチ&#038;LEDを使った実験」p.67に詳しく書かれている。</p>
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/511WME7499L._SL160_.jpg" alt="はじめてのPSoCマイコン—周辺アナログ&#038;ディジタル回路を自由自在にプログラミング!! (マイコン活用シリーズ)" style="border: none;" /></a><br />
<p><span id="more-1309"></span><br /><br />
<br />
■割り込みの記述<br />
Generate Applicationしても、割り込みをアセンブラではなくC言語で書くにはまだ足りない。<br />
Source Files/boot.asmを見てみると、PSOC_GPIO_ISRというサブルーチンが呼ばれている<br />
<br />
boot.asm<br />
<pre class="prettyprint">
org1Ch;GPIOInterruptVector<br />
ljmpPSoC_GPIO_ISR<br />
reti<br />
</pre>
このPSOC_GPIO_ISRはLibrary Source/psocgpioint.asmの中に記述されている。<br />
で、boot.asmを書き直してmain.c内のC言語の関数を呼び出しても良いんだけど、boot.asmはDeviceEditorでGenerate Applicationする毎に書き換えられてしまうので、psocgpioint.asmの中からさらにljmpで関数を呼び出す方が良い。<br />
boot.asm→psocgpioint.asm→main.c という流れ。<br />
psocgpioint.asm<br />
<pre class="prettyprint">
PSoC_GPIO_ISR:<br />
;@PSoC_UserCode_BODY@(Donotchangethisline.)<br />
;---------------------------------------------------<br />
;Insertyourcustomcodebelowthisbanner<br />
;---------------------------------------------------<br />
ljmp_INT_GPIO<br />
;---------------------------------------------------<br />
;Insertyourcustomcodeabovethisbanner<br />
;---------------------------------------------------<br />
;@PSoC_UserCode_END@(Donotchangethisline.)<br />
reti<br />
</pre>
_INT_GPIOという関数を呼び出す様にした。<br />
■mainプログラム<br />
ようやく今回のコード。アセンブラから_INT_GPIOを登録したので、INT_GPIO()という関数で外部入力割り込みが受け取れる。<br />
main.c<br />
<pre class="prettyprint">
#include&lt;m8c.h&gt;//partspecificconstantsandmacros<br />
#include&qute;PSoCAPI.h&qute;//PSoCAPIdefinitionsforallUserModules<br />
#define_BV(BIT)(1&lt;&lt;BIT)<br />
#definesbi(BYTE,BIT)(BYTE|=_BV(BIT))<br />
#definecbi(BYTE,BIT)(BYTE&amp;=~_BV(BIT))<br />
volatilecharled;<br />
voidmain()<br />
{<br />
  M8C_EnableGInt;<br />
  M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO);<br />
  for(;;){<br />
    PRT2DR=led;<br />
  }<br />
}<br />
#pragmainterrupt_handlerINT_GPIO<br />
voidINT_GPIO(void){<br />
  led++;<br />
}<br />
</pre>
■main.cの解説<br />
まず割り込みを許可し、GPIOの割り込みも許可する。External Headers/m8c.incに定義されている。<br />
<pre class="prettyprint">
M8C_EnableGInt;<br />
M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO);<br />
</pre>
INT_GPIO()関数を登録。これが無いと割り込みから呼ばれない。<br />
<pre class="prettyprint">
#pragmainterrupt_handlerINT_GPIO<br />
</pre>
avr-gccではグローバル変数を割り込み/mainの両側から読み書きする時はvolatileつけないとおかしくなってたので、volatile付けてCPU最適化を防ぐ。<br />
<pre class="prettyprint">
volatilecharled;<br />
</pre>
でもさっき無しで試しても動いた。まあとりあえず付けよう。<br />
割り込み。グローバル変数の値を増やすだけ。<br />
<pre class="prettyprint">
voidINT_GPIO(void){<br />
  led++;<br />
}<br />
</pre>
「涙のfor」って萩野先生が言ってた。while(1)って書くより文字数が少ない。<br />
<pre class="prettyprint">
for(;;){<br />
  PRT2DR=led;<br />
}<br />
</pre>
PRT2DRに直接8bit変数を代入すると、<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-designer-switch-led-bin.html">こんな風に</a>バイナリでLEDが点くわけですよ。<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/8SvwcjUpU-4" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/8SvwcjUpU-4" wmode="transparent"></embed></object><br />
■参考サイト<br />
・<a href="http://www.ikko-lab.k.hosei.ac.jp/joomla1011/content/view/19/27/">法政大学工学部システム制御小林研究室 &#8211; CY3210 MiniEval によるスイッチの利用(2005.11.29)</a><br />
boot.asmにljmp _関数名を加えるとC言語でも割り込みが書ける<br />
・<a href="http://bluefish.orz.hm/sdoc/psoc3.html#I/O%A4%CE%B3%E4%A4%EA%B9%FE%A4%DF%A4%C7%C6%B0%A4%AB%A4%B9">PSoCをはじめよう I/Oの割り込みで動かす</a><br />
・<a href="http://dr.matrix.jp/psoc2.html">PSOC関連② I/Oポート割り込みについて</a><br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1309/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC Designer &#8211; CY8C29466でスイッチ入力</title>
		<link>http://shokai.org/blog/archives/1308</link>
		<comments>http://shokai.org/blog/archives/1308#comments</comments>
		<pubDate>Sat, 31 Mar 2007 13:40:41 +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>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1308</guid>
		<description><![CDATA[LEDへの出力に続いて、GPIO（汎用入出力ピン）でスイッチからの入力を取ってみた。 あとはUART、入力割り込み、ADコンバータ、タイマーを確認すれば、AVRからすっかり移住できると思う。 Source Code (P [...]]]></description>
			<content:encoded><![CDATA[<p>
<p><a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/cy8c29466-gpio-led-blink.html">LEDへの出力</a>に続いて、GPIO（汎用入出力ピン）でスイッチからの入力を取ってみた。<br /><br />
あとはUART、入力割り込み、ADコンバータ、タイマーを確認すれば、AVRからすっかり移住できると思う。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/8SvwcjUpU-4" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/8SvwcjUpU-4" wmode="transparent"></embed></object></p>
<p><a href="http://shokai.org/archive/psoc/cy8c29466/designer/0703_switch/">Source Code (PSoC Designer 4.3 + C Compiler)</a></p>
<p>今回もCY3210-MiniEval（PSoCライタに付いてた評価ボード）を使った。<br /><br />
下記に書いてある回路などの話は、<a href="http://www.cypress.com/design/DK10033">データシート</a>見ながらの方がわかりやすいと思う。</p>
<p><span id="more-1308"></span><br /><br />
■PSoC Designerでのデバイス設定<br /><br />
PORT2の0～3がLEDなので、<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/cy8c29466-gpio-led-blink.html">LEDへの出力</a>の時と同じように「strong」に設定する<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/440712317/"><img src="http://farm1.static.flickr.com/177/440712317_3f562f85f3_o.png" alt="PSoC switch input &#038; leds" width="286" height="184" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/440726939/"><img src="http://farm1.static.flickr.com/175/440726939_16312b6e3a_o.png" alt="PSoC switch input &#038; leds" width="283" height="334" /></a><br /><br />
PORT1の4はスイッチに直接つながっているので、「Pull Up」に設定。</p>
<p>■スイッチのプルアップ<br /><br />
普通の入力ピンとして使うならハイインピーダンス（High Z）が良いが、PORT1-4とスイッチは直接つながっているだけなので、抵抗を使って「プルアップ」しておく必要がある。<br /><br />
今回はPSoCの内部プルアップ抵抗を使った。</p>
<p>プルアップについて詳しくはこの辺参照<br /><br />
・<a href="http://www.netdecheck.com/coffee_break/dojyo/004/index.html">センサ道場 第４回 「プルアップ・プルダウン抵抗」</a><br /><br />
・<a href="http://edycube.blog2.fc2.com/blog-entry-329.html">Pull Up / はまりどころ::PSoC</a><br /><br />
・<a href="http://www.ohshe.bs.teu.ac.jp/armrobot/pullupdown.html">Pull up/down</a></p>
<p>■プログラム<br /><br />
デバイス設定終わったら「Generate Application」して「ApplicationEditor」に行く。</p>
<p>今回のコードはこれ</p>
</p>
<blockquote><p><p>#include<m8c.h>//partspecificconstantsandmacros<br /><br />
#include&#8221;PSoCAPI.h&#8221;//PSoCAPIdefinitionsforallUserModules</p>
<p>#define_BV(BIT)(1<<BIT)<br /><br />
#definesbi(BYTE,BIT)(BYTE|=_BV(BIT))<br /><br />
#definecbi(BYTE,BIT)(BYTE&#038;=~_BV(BIT))</p>
<p>voidmain()<br /><br />
{<br /><br />
charled;<br /><br />
led=0;<br /><br />
for(;;){<br /><br />
if(PRT1DR&#038;_BV(4)){//ifswitchON<br /><br />
while(PRT1DR&#038;_BV(4));//waituntilswitchOFF<br /><br />
led++;//next<br /><br />
}<br /><br />
PRT2DR=led;//displaybinarybyLED<br /><br />
}<br /><br />
}</p></p></blockquote>
<p>
<p>スイッチがonになってから再びoffになるまで待機して、8bitの変数ledを一つ増やす。<br /><br />
そして変数ledをそのままPRT2DRに代入すると、ledの0~3ビット目が基盤上のLED4つに2進数として表示される。</p>
<p>PSoCのGPIOは</p>
</p>
<blockquote><p><p>charn;<br /><br />
n=PRT1DR;//入力<br /><br />
PRT1DR=0xFF;//出力</p></p></blockquote>
<p>
<p>と、読み出せば入力状態、書き込めば出力、となる。</p>
<p>PRT1DR自体はAVR等と同じ8bitのレジスタで、1bit毎にピンが割り当てられている。<br /><br />
つまりPRT1DRの0ビット目はPORT1-0ピン、1ビット目はPORT1-1ピン…となるので、</p>
</p>
<blockquote><p><p>if(PRT1DR&#038;_BV(4))</p></p></blockquote>
<p>
<p>とすると、&#038;のビット演算でスイッチの接続されている4ビット目だけが取り出されて、on/offが判断できる。</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1308/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

