<?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; C言語</title>
	<atom:link href="http://shokai.org/blog/archives/tag/c-language/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>画像のだいたいの色を求める</title>
		<link>http://shokai.org/blog/archives/4961</link>
		<comments>http://shokai.org/blog/archives/4961#comments</comments>
		<pubDate>Thu, 24 Dec 2009 10:49:10 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4961</guid>
		<description><![CDATA[カメラの入力画像から平均的な色を求めてRGBで出力する。 頻出色じゃなくて、全体的に赤っぽかったらr:200,g:50,b:50みたいなかんじで出す。赤っぽいとか青っぽいとかを求めたい。 数えて平均出そうかと思ったけどO [...]]]></description>
			<content:encoded><![CDATA[<p>
カメラの入力画像から平均的な色を求めてRGBで出力する。<br />
頻出色じゃなくて、全体的に赤っぽかったらr:200,g:50,b:50みたいなかんじで出す。赤っぽいとか青っぽいとかを求めたい。<br />
<br />
<br />
数えて平均出そうかと思ったけどOpenCVで1&#215;1ピクセルの画像にリサイズしてしまうのが速い＆早いことに気づいた。<br />
一応カメラのプレビューと、その色で塗りつぶしたウィンドウを出してみている。1ピクセルの画像はcvShowImageできないので、表示のために2ピクセルの画像を作っている<br />
<a href="http://shokai.org/projects/opencv-study-mac/index.cgi/file/70069b919f4a/image1px/image1px.cpp">image1px.cpp</a><br />
<pre class="prettyprint">
#include&nbsp;&lt;stdio.h&gt;<br />
#include&nbsp;&lt;cv.h&gt;<br />
#include&nbsp;&lt;highgui.h&gt;<br />
<br />
int&nbsp;main(int&nbsp;argc,&nbsp;char**&nbsp;argv)&nbsp;{<br />
&nbsp;&nbsp;CvCapture&nbsp;*capture;<br />
&nbsp;&nbsp;IplImage&nbsp;*img,&nbsp;*img1px,&nbsp;*imgR,&nbsp;*imgG,&nbsp;*imgB,&nbsp;*img2px;<br />
&nbsp;&nbsp;img1px&nbsp;=&nbsp;cvCreateImage(cvSize(1,1),&nbsp;IPL_DEPTH_8U,&nbsp;3);<br />
&nbsp;&nbsp;imgR&nbsp;=&nbsp;cvCreateImage(cvSize(1,1),&nbsp;IPL_DEPTH_8U,&nbsp;1);<br />
&nbsp;&nbsp;imgG&nbsp;=&nbsp;cvCreateImage(cvSize(1,1),&nbsp;IPL_DEPTH_8U,&nbsp;1);<br />
&nbsp;&nbsp;imgB&nbsp;=&nbsp;cvCreateImage(cvSize(1,1),&nbsp;IPL_DEPTH_8U,&nbsp;1);<br />
&nbsp;&nbsp;img2px&nbsp;=&nbsp;cvCreateImage(cvSize(2,2),&nbsp;IPL_DEPTH_8U,&nbsp;3);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;char&nbsp;*winNameCapture&nbsp;=&nbsp;"Capture";<br />
&nbsp;&nbsp;char&nbsp;*winName1px&nbsp;=&nbsp;"Image1px";<br />
&nbsp;&nbsp;cvNamedWindow(winNameCapture,&nbsp;CV_WINDOW_AUTOSIZE);<br />
&nbsp;&nbsp;cvNamedWindow(winName1px,&nbsp;CV_WINDOW_AUTOSIZE);<br />
&nbsp;&nbsp;capture&nbsp;=&nbsp;cvCreateCameraCapture(0);<br />
<br />
&nbsp;&nbsp;while&nbsp;(1)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;cvQueryFrame(capture);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cvShowImage(winNameCapture,&nbsp;img);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cvResize(img,&nbsp;img1px,&nbsp;CV_INTER_CUBIC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cvSplit(img1px,&nbsp;imgB,&nbsp;imgG,&nbsp;imgR,&nbsp;NULL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("r:%d,&nbsp;g:%d,&nbsp;b:%d\n",&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char)imgR-&gt;imageDataOrigin[0],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char)imgG-&gt;imageDataOrigin[0],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;char)imgB-&gt;imageDataOrigin[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cvResize(img1px,&nbsp;img2px,&nbsp;CV_INTER_CUBIC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cvShowImage(winName1px,&nbsp;img2px);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cvWaitKey(33)&nbsp;==&nbsp;'q')&nbsp;break;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;cvReleaseCapture(&amp;capture);<br />
&nbsp;&nbsp;cvDestroyWindow(winNameCapture);<br />
&nbsp;&nbsp;cvDestroyWindow(winName1px);<br />
&nbsp;&nbsp;return&nbsp;0;<br />
}<br />
</pre>
<br />
<br />
<a href="http://shokai.org/projects/opencv-study-mac/index.cgi/file/70069b919f4a/image1px/Makefile">Makefile</a><br />
<pre class="prettyprint">
SRC&nbsp;=&nbsp;image1px.cpp<br />
DST&nbsp;=&nbsp;image1px<br />
<br />
prefix=/opt/local<br />
CV_INCPATH=$(prefix)/include/opencv<br />
CV_LIBPATH=$(prefix)/lib&nbsp;<br />
<br />
CV_LIBS=&nbsp;-lcv&nbsp;-lcvaux&nbsp;-lcxcore&nbsp;-lhighgui&nbsp;<br />
<br />
all:<br />
	g++&nbsp;-O&nbsp;$(SRC)&nbsp;-o&nbsp;$(DST)&nbsp;-I$(CV_INCPATH)&nbsp;-L.&nbsp;-L$(CV_LIBPATH)&nbsp;$(CV_LIBS)<br />
</pre>
<br />
<br />
赤いポストイットをカメラの前に<br />
<a href="http://www.flickr.com/photos/shokai/4210139761/" title="平均的な色を取得 by shokai, on Flickr"><img src="http://farm5.static.flickr.com/4023/4210139761_5492098a54_o.png" width="898" height="374" alt="平均的な色を取得" /></a><br />
出力<br />
赤いことがわかる<br />
<pre>
r:186, g:61, b:61<br />
r:186, g:61, b:61<br />
r:191, g:63, b:61<br />
r:198, g:67, b:63<br />
r:200, g:69, b:63<br />
</pre>
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4210904830/" title="平均的な色を取得 by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2746/4210904830_8d152a2ded_o.png" width="898" height="374" alt="平均的な色を取得" /></a><br />
白い。<br />
<pre>
r:149, g:146, b:147<br />
r:159, g:155, b:156<br />
r:169, g:156, b:159<br />
r:169, g:160, b:161<br />
r:169, g:159, b:161<br />
r:169, g:159, b:161<br />
</pre>
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4210139725/" title="平均的な色を取得 by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2523/4210139725_2a1816ba9d_o.png" width="900" height="375" alt="平均的な色を取得" /></a><br />
赤黒いのかな？<br />
<pre>
r:126, g:92, b:124<br />
r:126, g:92, b:124<br />
r:126, g:92, b:124<br />
r:126, g:92, b:124<br />
r:126, g:92, b:124<br />
r:126, g:92, b:124<br />
r:125, g:92, b:124<br />
</pre>
<br />
<br />
<a href="http://www.flickr.com/photos/shokai/4210139803/" title="平均的な色を取得 by shokai, on Flickr"><img src="http://farm3.static.flickr.com/2734/4210139803_7880761165_o.png" width="900" height="373" alt="平均的な色を取得" /></a><br />
白い<br />
<pre>
r:126, g:119, b:126<br />
r:126, g:119, b:126<br />
r:126, g:119, b:125<br />
r:125, g:118, b:125<br />
r:125, g:118, b:125<br />
r:125, g:118, b:125<br />
r:125, g:118, b:125<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4961/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cでgearman workerを書いてRubyのclientから呼び出す</title>
		<link>http://shokai.org/blog/archives/4919</link>
		<comments>http://shokai.org/blog/archives/4919#comments</comments>
		<pubDate>Mon, 14 Dec 2009 19:18:32 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=4919</guid>
		<description><![CDATA[gearmandをソースからインストールして、Cライブラリのlibgearmanが使えるようになった。 これでC言語でworkerを作ってRubyのclientから呼び出せる。環境はUbuntu9.04とgearmand [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://d.hatena.ne.jp/shokai/20091214/1260740507">gearmandをソースからインストール</a>して、Cライブラリのlibgearmanが使えるようになった。<br />
<br />
これでC言語でworkerを作ってRubyのclientから呼び出せる。環境はUbuntu9.04とgearmand0.11<br />
<br />
<br />
■Cでworkerを書く<br />
str_reverseというアビリティを持つworkerを作る。<br />
ほぼ<a href="http://gearman.org/docs/api/">APIドキュメント</a>のままだが、jobの引数を受け取るのと、値を返せるようにがんばった。ジョブ失敗した時とかのエラー処理全然書いてない。たぶん<a href="http://gearman.org/docs/api/group__gearman__constants.html#g200f3d324fd4c4bfee16143c8f7b672a">enum gearman_return_t</a>を返せばいいんだろうけど<br />
<br />
strreverse-worker.c<br />
<pre class="prettyprint">
//&nbsp;文字列をreverseして返すworker<br />
#include&nbsp;&lt;stdio.h&gt;<br />
#include&nbsp;&lt;stdlib.h&gt;<br />
#include&nbsp;&lt;string.h&gt;<br />
#include&nbsp;&lt;unistd.h&gt;<br />
#include&nbsp;&lt;libgearman/gearman.h&gt;<br />
<br />
void&nbsp;*job_str_reverse(gearman_job_st&nbsp;*job,&nbsp;void&nbsp;*cb_arg,&nbsp;size_t&nbsp;*result_size,<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gearman_return_t&nbsp;*ret_ptr)<br />
{<br />
&nbsp;&nbsp;char&nbsp;*str&nbsp;=&nbsp;(char&nbsp;*)gearman_job_workload(job);<br />
&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;strlen(str);<br />
&nbsp;&nbsp;printf("str:%s&nbsp;&nbsp;length:%d\n",&nbsp;str,&nbsp;len);<br />
<br />
&nbsp;&nbsp;char&nbsp;reverse[len];<br />
&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse[i]&nbsp;=&nbsp;str[len-i-1];&nbsp;//&nbsp;文字列を逆にする<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;char&nbsp;*result&nbsp;=&nbsp;strdup(reverse);&nbsp;//&nbsp;結果の文字列はコピーしてポインタで返す<br />
&nbsp;&nbsp;*result_size=&nbsp;gearman_job_workload_size(job);<br />
&nbsp;&nbsp;*ret_ptr=&nbsp;GEARMAN_SUCCESS;<br />
&nbsp;&nbsp;return&nbsp;result;<br />
}<br />
<br />
<br />
int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />
{<br />
&nbsp;&nbsp;gearman_return_t&nbsp;ret;<br />
&nbsp;&nbsp;gearman_worker_st&nbsp;worker;<br />
<br />
&nbsp;&nbsp;gearman_worker_create(&amp;worker);<br />
&nbsp;&nbsp;gearman_worker_add_server(&amp;worker,&nbsp;"127.0.0.1",&nbsp;7003);<br />
&nbsp;&nbsp;gearman_worker_add_function(&amp;worker,&nbsp;"str_reverse",&nbsp;0,&nbsp;job_str_reverse,&nbsp;NULL);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;while(1)&nbsp;gearman_worker_work(&amp;worker);&nbsp;//&nbsp;ジョブ登録したらループで待つ<br />
<br />
&nbsp;&nbsp;gearman_worker_free(&amp;worker);<br />
&nbsp;&nbsp;return&nbsp;0;<br />
}<br />
</pre>
<br />
<br />
Makefile<br />
<pre class="prettyprint">
# Linux用Makefile<br />
SRC = strreverse-worker.c<br />
DST = strreverse-worker<br />
<br />
prefix=/usr/local<br />
INCPATH=$(prefix)/include<br />
LIBPATH=$(prefix)/lib<br />
<br />
GEAR_LIBS=$(LIBPATH)/libgearman.a<br />
<br />
all:<br />
	g++ -O $(SRC) -o $(DST) -I$(INCPATH)/libgearman -L. -L$(LIBPATH) $(GEAR_LIBS)<br />
</pre>
makeするとstrreverse-workerができる。<br />
<br />
<br />
■Rubyでclientを書く<br />
xing-gearman-serverを使うといい<br />
<ul>
  <li><a href="http://d.hatena.ne.jp/shokai/20091126/1259242737">Gearmanインストール、Rubyから使う &#8211; 橋本詳解</a></li>
  <li><a href="http://d.hatena.ne.jp/shokai/20091128/1259398270">shellのコマンドをtask登録してworkerに実行させる &#8211; 橋本詳解</a></li>
</ul>
<br />
client書く。実行時引数を一つずつstr_reverseに登録するclient。<br />
strreverse-client.rb<br />
<pre class="prettyprint">
#!/usr/bin/env&nbsp;ruby<br />
require&nbsp;'rubygems'<br />
require&nbsp;'gearman'<br />
<br />
c&nbsp;=&nbsp;Gearman::Client.new(['localhost:7003'])<br />
taskset&nbsp;=&nbsp;Gearman::TaskSet.new(c)<br />
<br />
ARGV.each{|str|<br />
&nbsp;&nbsp;puts&nbsp;"add&nbsp;task&nbsp;#{str}"<br />
&nbsp;&nbsp;task&nbsp;=&nbsp;Gearman::Task.new('str_reverse',&nbsp;str)<br />
&nbsp;&nbsp;task.on_complete{|result|<br />
&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;"return:&nbsp;#{str}&nbsp;=&gt;&nbsp;#{result}"&nbsp;#&nbsp;文字列が逆になって返ってくる<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;taskset.add_task(task)<br />
}<br />
taskset.wait(100)&nbsp;#&nbsp;wait&nbsp;100(sec)<br />
</pre>
<br />
<br />
■動かしてみる<br />
worker動かす<br />
<pre class="prettyprint">
./strreverse-worker<br />
</pre>
<br />
clientから3つ文字列登録<br />
<pre class="prettyprint">
ruby strreverse-client.rb hello konitiwa asdfhujiko<br />
</pre>
<br />
すると文字列返ってくる<br />
<pre class="prettyprint">
add task hello<br />
add task konitiwa<br />
return: hello => olleh<br />
add task asdfhujiko<br />
return: konitiwa => awitinok<br />
return: asdfhujiko => okijuhfdsa<br />
</pre>
<br />
worker側の標準出力はこうなってた<br />
<pre class="prettyprint">
str:hello  length:5<br />
str:konitiwa  length:8<br />
str:asdfhujiko  length:10<br />
</pre>
<br />
<br />
workerを3つバックグラウンドで起動しておく<br />
<pre>
./strreverse-worker&#038;<br />
./strreverse-worker&#038;<br />
./strreverse-worker&#038;<br />
</pre>
<br />
<br />
凄い勢いで処理されてるので非同期になってるのかよくわからない<br />
<pre class="prettyprint">
ruby strreverse-client.rb hello konitiwa asdfhujiko aaiiaaiiaaii hogehogehogehoge mmmasdffajkl23rwdfv ahsdga9sd8uf9p8u nbjkasdoif98pu<br />
</pre>
<pre class="prettyprint">
add task hello<br />
add task konitiwa<br />
return: hello => olleh<br />
add task asdfhujiko<br />
return: konitiwa => awitinok<br />
add task aaiiaaiiaaii<br />
return: asdfhujiko => okijuhfdsa<br />
add task hogehogehogehoge<br />
return: aaiiaaiiaaii => iiaaiiaaiiaa<br />
add task mmmasdffajkl23rwdfv<br />
return: hogehogehogehoge => egohegohegohegoh<br />
add task ahsdga9sd8uf9p8u<br />
return: mmmasdffajkl23rwdfv => vfdwr32lkjaffdsammm<br />
add task nbjkasdoif98pu<br />
return: ahsdga9sd8uf9p8u => vfdu8p9fu8ds9agd<br />
return: nbjkasdoif98pu => vfdu8up89fiods<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/4919/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>CY8C29466のGPIOでLEDピコピコさせた</title>
		<link>http://shokai.org/blog/archives/1289</link>
		<comments>http://shokai.org/blog/archives/1289#comments</comments>
		<pubDate>Sat, 17 Mar 2007 13:09:26 +0000</pubDate>
		<dc:creator>moblog</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>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1289</guid>
		<description><![CDATA[「LEDをピコピコさせる」というのは横一列に並べたLEDをマイコンのピンから順番に電流を出したり出さなかったりして順番に点灯させる事を指す。 GPIOの開閉、代入、wait処理、for文if文、インクリメントなどのマイコ [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>「LEDをピコピコさせる」というのは横一列に並べたLEDをマイコンのピンから順番に電流を出したり出さなかったりして順番に点灯させる事を指す。<br /><br />
GPIOの開閉、代入、wait処理、for文if文、インクリメントなどのマイコンプログラミングでよく使う要素が入っているので、新しいマイコンを使う時はこれをやってみる事にしている。<br /><br />
ちなみにGPIOへの入力は、チャタリングやプルアップなど色々あるので別にやる。<br /><br />
→<a href="http://web.sfc.keio.ac.jp/~shokai/cgi-bin/mt/mt-search.cgi?IncludeBlogs=2&#038;search=LED+%E3%83%94%E3%82%B3%E3%83%94%E3%82%B3">LED ピコピコ 検索結果</a></p>
<p>あと最近知ったけど GPIO はGeneral-Purpose I/Oの略で、つまり汎用ピンの事なんだね。</p>
<p>PSoC MiniProg付属のPSoCMiniEvalにCY8C29466を載せてやってみた。<br /><br />
<a href="http://shokai.org/archive/psoc/cy8c29466/designer/070317_ledBlink/">Source Code(PSoC Designer 4.3 + C Compiler)</a></p>
<p>動かした。<br /><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/9yz4bpgGgjs" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/9yz4bpgGgjs" wmode="transparent"></embed></object></p>
<p>今回も<a href="http://www.pastelmagic.com/">桑野さん</a>の<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22">はじめてのPSoCマイコン</a>のp.63-72「入出力＆割り込みのしくみとスイッチ＆LEDを使った実験」を参考にした。</p>
<p><span id="more-1289"></span><br /><br />
■デバイス設定<br /><br />
今回もPSoC Designerでやる。でもDevice EditorのUserModulesは使わずに、Interconncect ViewでGPIOのDrive設定だけを行なって、Generate Applicationする。<br /><br />
PSoC Designerの基本的な使い方は<br /><br />
<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-designer-cy8c29466-pwm.html">s.h.log: PSoC DesignerでCY8C29466の16bitPWMを動かす</a><br /><br />
を見て欲しい。</p>
<p>まずInterconnect Viewの左側のPortの設定と、右側のPortの実体配置に注目する<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/424018730/"><img src="http://farm1.static.flickr.com/168/424018730_aeb2ec0c25.jpg" alt="CY8C29466 LED-Blink" width="500" height="362" /></a></p>
<p>どのPortのピンが基盤上のLEDに接続されているか？は、マイコンを外して回路を辿ってみればわかる。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417651006/"><img src="http://farm1.static.flickr.com/128/417651006_e53f33b896.jpg" alt="CY8C29466 PWM" width="500" height="375" /></a></p>
<p>この4つに接続されていて、その名前はPort2の0～3番ピンだった<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/423994639/"><img src="http://farm1.static.flickr.com/150/423994639_37d0febf0b_o.png" alt="CY8C29466 LED-Blink" width="260" height="310" /></a></p>
<p>そのPort2_0~3のDriveを「Strong」に設定する<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/423993342/"><img src="http://farm1.static.flickr.com/179/423993342_6350109e2b_o.png" alt="CY8C29466 LED-Blink" width="297" height="250" /></a><br /><br />
ここまで設定したら、「Generate Application」する</p>
<p>「Strong」は普通の出力ピンとして使う時の設定。「Strong Slow」は立ち上がり/立ち下がりを遅くして安定させたStrongらしい。<br /><br />
他の設定でも、とりあえず「Pull Up」「Pull Down」ならLEDを光らせる事ができる。「Pull Up」は光が弱かった。<br /><br />
この辺は<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22">はじめてのPSoCマイコン</a>のp.64に詳しく書いてある</p>
<p>■プログラムを書く<br /><br />
Application Editorで書く。<br /><br />
PSoCのPORTもAVRと同じく、1byte(8bit)のレジスタの各bitが開閉のフラグになっている。<br /><br />
それをC言語で扱う時にビット演算をしなければならないが、16進数が苦手なので、_BVとsbiとcbiをPSoCでも使ってみた。<br /><br />
→ <a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/avrgcc16.html">s.h.log: avr-gccのレジスタ操作で16進数とか使わない方法</a></p>
<p>main.c</p>
<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 />
voidnop(intn){<br />
  inti;<br />
  for(i=0;i&lt;n;i++){<br />
  }<br />
}<br />
<br />
voidmain(){<br />
  charled;<br />
  led=0;<br />
  for(;;){<br />
    sbi(PRT2DR,led);//LEDon<br />
    nop(5000);//wait<br />
    cbi(PRT2DR,led);//LEDoff<br />
    led++;//nextLED<br />
    if(led&gt;3)led=0;<br />
  }<br />
}<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PSoC DesignerでCY8C29466の16bitPWMを動かす</title>
		<link>http://shokai.org/blog/archives/1283</link>
		<comments>http://shokai.org/blog/archives/1283#comments</comments>
		<pubDate>Sun, 11 Mar 2007 16:41:20 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[CY8C29466]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[PSoC]]></category>
		<category><![CDATA[PSoCDesigner]]></category>
		<category><![CDATA[PWM]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1283</guid>
		<description><![CDATA[昨日は夕方にスタバに行って、PSoCいじってきました。 真ん中のLEDがPWMで0.3秒間隔ぐらいで点滅する。PWM(Pulse Width Modulation)はON/OFFの振幅幅を指定して自動的に波形を作るしくみ [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>昨日は夕方にスタバに行って、<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/pwm.html">PSoCいじってきました</a>。</p>
<p>真ん中のLEDがPWMで0.3秒間隔ぐらいで点滅する。PWM(Pulse Width Modulation)はON/OFFの振幅幅を指定して自動的に波形を作るしくみの事で、カウントアップするタイマカウンタに対してduty値を指定してそれより大きい時は出力をHI、小さければLOWにする。<br /><br />
つまり波形を操作するにはduty値、カウントアップの間隔（システムクロックを分周したりして調節できる）、カウントアップの初期値、最大値、1クロックあたりのカウントアップ値、などのレジスタ（たいてい普通の変数として代入できる）を設定しなおす事で動的に波形を変える事が出来る。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417651006/"><img src="http://farm1.static.flickr.com/128/417651006_e53f33b896.jpg" alt="CY8C29466 PWM" width="500" height="375" /></a></p>
<p><a href="http://www.pastelmagic.com/tips/psoctutor/psoctutor.html">PastelMagicの桑野さん</a>が書かれた「はじめてのPSoCマイコン」の第1章 PSoCチュートリアル (p.25-53)を、<a href="http://akizukidenshi.com/catalog/items2.php?q=psoc&#038;s=score&#038;p=1&#038;r=1&#038;page=#M-01574">PSoC MiniProg</a>を買った時に付いてきたミニ評価ボード(CY3210-MiniEval1)にCY8C29466乗っけた版としてやってみた。<br /><br />
（この本ではCY8C27443を使っているが、ピンコンパチで上位版なので俺は29466をメインに使っていく予定）</p>
<div class="amazlet-box" style="margin-bottom:0px;">
<div class="amazlet-image" style="float:left;"><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22/ref=nosim/" target="_blank"><img style="border: none;" src="http://images-jp.amazon.com/images/P/4789834433.09.MZZZZZZZ.jpg" alt="はじめてのPSoCマイコン—周辺アナログ&#038;ディジタル回路を自由自在にプログラミング!!" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22/ref=nosim/" target="_blank">はじめてのPSoCマイコン—周辺アナログ&#038;ディジタル回路を自由自在にプログラミング!!</a></p>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a title="はじめてのPSoCマイコン—周辺アナログ&#038;ディジタル回路を自由自在にプログラミング!!" href="http://www.amazlet.com/browse/ASIN/4789834433/shokai-22" target="_blank">amazlet</a> on 07.03.12</div>
</div>
<div class="amazlet-detail">桑野 雅彦<br /><br />
CQ出版 (2004/11)<br /><br />
売り上げランキング: 137445</div>
<div class="amazlet-review" style="margin-top:10px; margin-bottom:10px">
<div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-4-0.gif" alt="4.0" /></div>
<p><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> PSoCをはじめる一冊<br /><br />
<img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-4-0.gif" alt="4" /> $10マイコンがバージョンアップ!<br /><br />
<img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-3-0.gif" alt="3" /> PSoCの基本が解ります</div>
<div class="amazlet-link" style="margin-top: 5px"><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/4789834433/shokai-22/ref=nosim/" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<p>ちなみに29466は<a href="http://gainer.cc/">Gainer</a>でも使われている。</p>
<p>■用意するもの<br /><br />
・プログラムを書くIDE → <a href="http://www.cypress.com/psocdesigner">PSoC Designer（Cypressダウンロードページ）</a><br /><br />
・ISPライター制御プログラム → <a href="http://www.cypress.com/psocprogrammer">PSoC Programmer（Cypressダウンロードページ）</a><br /><br />
・PSoC C言語コンパイラ → <a href="http://akizukidenshi.com/catalog/items2.php?q=psoc&#038;s=score&#038;p=1&#038;r=1&#038;page=#S-01575">秋月電子通販</a><br /><br />
・PSoC MiniProg → <a href="http://akizukidenshi.com/catalog/items2.php?q=psoc&#038;s=score&#038;p=1&#038;r=1&#038;page=#M-01574">秋月電子通販</a><br /><br />
・CY8C29466 → <a href="http://akizukidenshi.com/catalog/items2.php?q=psoc&#038;s=score&#038;p=1&#038;r=1&#038;page=#I-01441">秋月電子通販</a></p>
<p><span id="more-1283"></span><br /><br />
■PSoC Designer<br /><br />
PSoC ExpressではなくDesignerを使って、C言語で直接プログラミングします。<br /><br />
参照：<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2007/03/psoc-express-seminar.html">s.h.log: PSoC Expressセミナーに行ってきた</a><br /><br />
Expressとどのように使い分けるかを探ってみたいので。</p>
<p>こいつにはエディタとビューが沢山あります。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417688889/"><img src="http://farm1.static.flickr.com/153/417688889_ea9ab9f13d_o.png" alt="PSoC Designer" width="138" height="30" /></a><br /><br />
右上のツールバーのボタンで切り替えます。今回は、<br /><br />
１．「Device Editor」の「User Module Selction View」でPWMモジュールを選択し、<br /><br />
２．「Device Editor」の「Interconnect View」でモジュールの動作設定と、出力先のピンを結線し、<br /><br />
３．「Application Editor」でプログラムを書き、<br /><br />
４．ライターでマイコンに書き込む<br /><br />
で終わりです。基本的に１～３を何度も反復してデザインを進めるらしい。</p>
<p>■PSoC Designer 手順１．PWMモジュールを選ぶ<br /><br />
「Device Editor」の「User Module Selction View」を選択<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417684541/"><img src="http://farm1.static.flickr.com/159/417684541_e80f1cc398.jpg" alt="PSoC Designer" width="500" height="362" /></a></p>
<p>左側のツールパネルからPWM16bitを右クリックして、「Select」<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417686228/"><img src="http://farm1.static.flickr.com/173/417686228_8e84d790da_o.png" alt="PSoC Designer" width="159" height="187" /></a></p>
<p>すると配置されて、<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417686962/"><img src="http://farm1.static.flickr.com/157/417686962_be3afd0011_o.png" alt="PSoC Designer" width="251" height="117" /></a><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417687493/"><img src="http://farm1.static.flickr.com/164/417687493_d02cd482b9_o.png" alt="PSoC Designer" width="260" height="165" /></a><br /><br />
DigitalBlockが2つ消費される。FFみたいでかっこいい。<br /><br />
8bitPWMなら1つ消費です。</p>
<p>■PSoC Designer 手順２．PWMモジュールをLEDに繋がっているピンに結線する<br /><br />
「Device Editor」のまま「Interconnect View」を選択します</p>
<p>モジュールの設定と、入出力ピンへの結線を行なうビュー<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417714864/"><img src="http://farm1.static.flickr.com/163/417714864_6f34680ced.jpg" alt="PSoC Designer" width="500" height="362" /></a></p>
<p>上にあるPWMモジュールを右クリックして、「Place」を選択<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417715952/"><img src="http://farm1.static.flickr.com/166/417715952_ba5d32778d_o.png" alt="PSoC Designer" width="196" height="202" /></a></p>
<p>すると、真ん中の回路図みたいな所に配置できる。緑色になって2ブロック占有したら配置成功<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417716637/"><img src="http://farm1.static.flickr.com/119/417716637_4f78bb299c_o.png" alt="PSoC Designer" width="370" height="114" /></a><br /><br />
ここから更に、モジュールの動作設定を行なう。</p>
<p>その前にマイコンの動作設定を行なおう。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417717969/"><img src="http://farm1.static.flickr.com/126/417717969_0e2affce36_o.png" alt="PSoC Designer" width="257" height="416" /></a><br /><br />
特にPWMはクロックソースの設定次第で動きが変わるので、先にマイコンの設定をしておく。</p>
<p>PWM16_1モジュールの設定。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417718886/"><img src="http://farm1.static.flickr.com/169/417718886_9f4597ddfd_o.png" alt="PSoC Designer" width="277" height="264" /></a><br /><br />
ここで「Compare Out」で出力先を「Row_0_Output_3」に指定する。</p>
<p>すると、PWMモジュールからRO0[3]に接続される。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417720385/"><img src="http://farm1.static.flickr.com/182/417720385_90cf8ea331_o.png" alt="PSoC Designer" width="477" height="191" /></a><br /><br />
そのままつながった先の一番右端の四角をクリック。</p>
<p>クリックしたら出てくる画面で、さらに三角形をクリックして「GlobalOutEven_3」を指定<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417721910/"><img src="http://farm1.static.flickr.com/182/417721910_2c34ce556d.jpg" alt="PSoC Designer" width="500" height="338" /></a><br /><br />
青くなったらClose</p>
<p>さて、段々とPWMが外側のピンに向けて結線されてきました。<br /><br />
今度は外から攻めます。<br /><br />
ミニ評価ボードの回路を見ると、マイコン左側の7番ピンがLEDに接続されているので<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417651006/"><img src="http://farm1.static.flickr.com/128/417651006_e53f33b896.jpg" alt="CY8C29466 PWM" width="500" height="375" /></a></p>
<p>そいつがPort_2_3という名前だと確認。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417723406/"><img src="http://farm1.static.flickr.com/174/417723406_b862ef2175_o.png" alt="PSoC Designer" width="316" height="367" /></a></p>
<p>Port_2_3をクリックして、「Select」を選択<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417724255/"><img src="http://farm1.static.flickr.com/176/417724255_fcd826059e_o.png" alt="PSoC Designer" width="160" height="90" /></a></p>
<p>さっきも出てきた「GlobalOutEven_3」を選択すると、PWMからピンまでが1本に繋がります<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417724960/"><img src="http://farm1.static.flickr.com/160/417724960_219469060d_o.png" alt="PSoC Designer" width="441" height="321" /></a></p>
<p>ちゃんと1本に繋がってる。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417726629/"><img src="http://farm1.static.flickr.com/168/417726629_80e5177878.jpg" alt="PSoC Designer" width="500" height="269" /></a></p>
<p>■PSoC Designer 手順３．プログラムを書く<br /><br />
プログラムはmain以外ほぼ自動で書かれます。<br /><br />
Interconnect Viewの「Generate Application」のボタンを押すと<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417749361/"><img src="http://farm1.static.flickr.com/133/417749361_160fb9e93c_o.png" alt="PSoC Designer" width="86" height="31" /></a><br /><br />
アプリケーションを書くためのAPIが全部作られます。</p>
<p>「Application Editor」に移動する。<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417750853/"><img src="http://farm1.static.flickr.com/184/417750853_365f0a81c7_o.png" alt="PSoC Designer" width="137" height="31" /></a></p>
<p>普通のIDE<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417751950/"><img src="http://farm1.static.flickr.com/178/417751950_3dd62c91a1.jpg" alt="PSoC Designer" width="500" height="362" /></a></p>
<p>モジュールを操作するためのAPIが自動生成されているので、「Library Headers」の「pwm16_1.h」を開くと<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417753998/"><img src="http://farm1.static.flickr.com/123/417753998_b774909453.jpg" alt="PSoC Designer" width="500" height="133" /></a><br /><br />
コードが見れる。<strong>ソース嫁</strong><br /><br />
ソース読むのが一番楽。C言語なのでヘッダファイルにユーザが使うべき関数がわかりやすい名前で書いてある。</p>
<p>PWMの初期設定はDevice EditorのInterconnect Viewで済ませてあるので、そのようにレジスタも代入されている。<br /><br />
素直に PWM16_1_Start(); だけmain()の中に書けばok<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417756117/"><img src="http://farm1.static.flickr.com/171/417756117_317f88e926_o.png" alt="PSoC Designer" width="379" height="176" /></a><br /><br />
これだけでPWMが動く。</p>
<p>ツールバーから「Build」して、「Program Part」すると<br /><br />
<a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417757902/"><img src="http://farm1.static.flickr.com/181/417757902_fe9ac36985_o.png" alt="PSoC Designer" width="177" height="31" /></a><br /><br />
PSoC Programmerが起動する。</p>
<p><a title="Photo Sharing" href="http://www.flickr.com/photos/shokai/417770987/"><img src="http://farm1.static.flickr.com/166/417770987_4e8c583df2.jpg" alt="PSoC Programmer" width="500" height="169" /></a><br /><br />
そのまま「Program」ボタンを押して書き込む。30秒ぐらいかかる。<br /><br />
書き込んだら、右側の「Toggle Device Power」でUSBで5V電源だけ供給してやると動く。</p>
<p>LEDをPWMで点滅させる<br /><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/bydSOX6C1kQ" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/bydSOX6C1kQ" wmode="transparent"></embed></object><br /><br />
デジカメで撮影すると点滅がよくわからないな…</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1283/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>avr-gccのレジスタ操作で16進数とか使わない方法</title>
		<link>http://shokai.org/blog/archives/1270</link>
		<comments>http://shokai.org/blog/archives/1270#comments</comments>
		<pubDate>Fri, 02 Mar 2007 07:47:31 +0000</pubDate>
		<dc:creator>moblog</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[avr-gcc]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shlog.sakura.ne.jp/blog/?p=1270</guid>
		<description><![CDATA[最近出たこの本、すごくいい。 マイコンもATmega168で最新だし、gccでのコードが載っているのでよくわかる。 AVRマイコン活用ブック—オリジナル電子ゲーム&#038;ロボット製作 posted with amaz [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>最近出たこの本、すごくいい。<br /><br />
マイコンもATmega168で最新だし、gccでのコードが載っているのでよくわかる。</p>
<div class="amazlet-box" style="margin-bottom:0px;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4885540011/shokai-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/P/4885540011.09.MZZZZZZZ.jpg" alt="AVRマイコン活用ブック—オリジナル電子ゲーム&#038;ロボット製作" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4885540011/shokai-22/ref=nosim/" name="amazletlink" target="_blank">AVRマイコン活用ブック—オリジナル電子ゲーム&#038;ロボット製作</a><br />
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4885540011/shokai-22" title="AVRマイコン活用ブック—オリジナル電子ゲーム&#038;ロボット製作" target="_blank">amazlet</a> on 07.03.02</div>
</div>
<div class="amazlet-detail">松原 拓也 <br />電波新聞社 (1982/01)<br />売り上げランキング: 23347</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4885540011/shokai-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
<p>でもIOの操作で16進数とか使うのがあんまり好きじゃない。別にどう書いても動けばいいんだけど…<br /><br />
</p>
<blockquote><p>PORTB&nbsp;=&nbsp;0&#215;21;</p></blockquote>
<p>
<p>とか。0&#215;21、つまり10進数の33を代入しているので、PB5とPB0のピンを出力に設定しているという事だ。</p>
<p>でもこう書いたほうが好きだな。<br /><br />
</p>
<blockquote><p>PORTB&nbsp;=&nbsp;_BV(PB5)|_BV(PB0);</p></blockquote>
<p>
<p>それかアセンブラ風にこういうのも好き。<br /><br />
</p>
<blockquote><p>sbi(PORTB,PB5);<br />
sbi(PORTB,PB0);</p></blockquote>
<p>
<p>こういう書き方の方が16進数慣れてない人には見やすい。ピン配置とプログラムをある程度柔軟に変えやすいのが近代的。（PB0からPB3に変えるのも、エディタの置換で一発だ）</p>
<p>どうなってるのかというと……</p>
<p><span id="more-1270"></span><br /><br />
■PB5やPB0とは何か？<br /><br />
C:\WinAVR\avr\include\avr\iom8.h を見ると</p>
</p>
<blockquote><p>/*&nbsp;PORTB&nbsp;*/<br />
#define&nbsp;PB7&nbsp;&nbsp;7<br />
#define&nbsp;PB6&nbsp;&nbsp;6<br />
#define&nbsp;PB5&nbsp;&nbsp;5<br />
#define&nbsp;PB4&nbsp;&nbsp;4<br />
#define&nbsp;PB3&nbsp;&nbsp;3<br />
#define&nbsp;PB2&nbsp;&nbsp;2<br />
#define&nbsp;PB1&nbsp;&nbsp;1<br />
#define&nbsp;PB0&nbsp;&nbsp;0</p></blockquote>
<p>
と宣言されている。なので<br /><br />
</p>
<blockquote><p>PORTB = _BV(PB5)|_BV(PB0);</p></blockquote>
<p>
<p>は<br /><br />
</p>
<blockquote><p>PORTB = _BV(5)|_BV(0);</p></blockquote>
<p>
<p>と同じ事。</p>
<p>■_BV()とは何か？<br /><br />
C:\WinAVR\avr\include\avr\sfr_defs.h を見ると<br /><br />
</p>
<blockquote><p>#define&nbsp;_BV(bit)&nbsp;(1&nbsp;&lt;&lt;&nbsp;(bit))</p></blockquote>
<p>
<p>となっている。</p>
</p>
<blockquote><p>PORTB&nbsp;=&nbsp;_BV(5)|_BV(0);</p></blockquote>
<p>
<p>は<br /><br />
</p>
<blockquote><p>PORTB&nbsp;=&nbsp;1&lt;&lt;5|1&lt;&lt;0;</p></blockquote>
<p>
<p>となる。<br /><br />
つまり、_BVはn+1桁目のビットだけがセットされた数を返すマクロだ。</p>
<p>■論理和<br /><br />
最後に | は、両辺のビットの論理和をとるので</p>
</p>
<blockquote><p>0b100|0b001&nbsp;==&nbsp;0b101;</p></blockquote>
<p>
<p>になる。<br /><br />
というわけで_BVを使うのがわかりやすい。</p>
<p>■sbi, cbi<br /><br />
sbiとcbiをマクロで定義しておくと、レジスタ操作はアセンブラ風に書けて、ルーチンはC言語で書ける。<br /><br />
</p>
<blockquote><p>#define&nbsp;sbi(BYTE,BIT)&nbsp;BYTE|=_BV(BIT)<br />
#define&nbsp;cbi(BYTE,BIT)&nbsp;BYTE&amp;=~_BV(BIT)</p></blockquote>
<p>
<p>こんな風に。<br /><br />
</p>
<blockquote><p>sbi(PORTB,PB5);<br />
sbi(PORTB,PB0);</p></blockquote>
<p>
<p>■関連：<a href="http://web.sfc.keio.ac.jp/~shokai/archives/2005/08/avrgcc.html">s.h.log: AVR-GCCのレジスタ操作関数&#038;マクロ</a></p>
</p>
<blockquote><p>loop_until_bit_is_set(UCSRA,UDRE);</p></blockquote>
<p>
<p>とか<br /><br />
</p>
<blockquote><p>if(bit_is_set(PINC,&nbsp;PC0))&nbsp;return&nbsp;0;<br />
if(bit_is_set(PINC,&nbsp;PC1))&nbsp;return&nbsp;1;<br />
if(bit_is_set(PINC,&nbsp;PC2))&nbsp;return&nbsp;2;<br />
if(bit_is_set(PINC,&nbsp;PC3))&nbsp;return&nbsp;3;<br />
if(bit_is_set(PINC,&nbsp;PC4))&nbsp;return&nbsp;4;<br />
if(bit_is_set(PINC,&nbsp;PC5))&nbsp;return&nbsp;5;</p></blockquote>
<p>
<p>とかもある。</p>
<p>そろそろ自分のlibcを整備しようかな</p>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/1270/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

