忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
[1]  [2
うちのロボカップ研究部の部員は、大抵がNXTやRCXなどのレゴと

PICなどのマイコンの両方を使うことができます。


どちらもプログラムはC言語なので、構成は大差ありません。

と、言うか関数さえ作ってしまえばNXCのプログラムやrobotCのプログラムであれば、

そのままコピペでPICを動かすことも可能ではあります。

じゃあこのふたつはプログラムを書く時にどのような違いが出てくるのか。今日はそれについてお話しします。


NXTとPIC、まず一番に違いがでるのが、処理速度の早さでしょう。

NXT内蔵のARM7と比べると、PICは塵にも等しいですが、NXTと比べると、何故かPICが勝ってしまうんです。

RCXの時にもあった、レゴ社特有のアレですね。

これ、し速度なんて早い方がいい。そう思う方は多いと思うのですが、その通りです。


唯、早いには早いなりにNXTの時には起こり得ないような問題が発生するのです。


例えばノイズ。


NXTであれば、よっぽどモーターに負荷でもかけない限り、センサーの値は常にしっかりと返ってきてくれますよね。

でも、センサーの読み取りの早いPICではそうはいきません。

ちょっとのことで生まれた電源のノイズやらなんやら、モロに出力に反映されてしまいます。

だから例えば、黒を見るまで回転する・・・なんてプログラムは危険ですね。
どこでノイズが乗ってセンサーの値が瞬間的に下がるかわかりませんからね。


他にもあるのがセンサーとモーターのラグ。

NXTにもあったかと思いますが、PICではもっと酷いです。

だってセンサーの読み取りはNXTより早くなっているのに、

モーターの応答速度はモーターの問題ですからマイコン側は関係ありません。


つまり・・・ラグは大きくなる一方と・・・。


後は問題が起きた時の原因について。

NXTでは動作が思うようにいかなければ、それはロボットの構造的問題かセンサーの挿しミス、あるいはプログラム。

特にNXT熟練者であれば、問題は十中八九プログラムといっても過言ではないでしょう。


でもPIC、特にメインボードから自作した場合、その原因の欄に「回路」というものが堂々追加されます。

今まで十中八九プログラムだったのが、新たに回路という不確定要素が加わる。これ程厄介なことはありません。

本当に慣れないとどっちが原因かなんてすぐ判別はできませんからね。難しいです。


このように、問題が生じた時の原因の思考も変える必要があるんです。


だからややこしい。難しい。


NXTにもPICにも同様にややこしい問題は多いのです。


(^・ω・)ノ RadiumProduction in RoboCup Junior
書く書く詐欺をして思いっきり放置したコンテンツの一つが此方。

PICkit2で新しい16Fの4桁シリーズに書き込みをする方法についてです。

と、いうのは、PICkit2は元々の仕様的に新しい16F が出来る前に作られたものなので、

PICへの書き込み機であるにも関わらず、書き込みができません。
PICkit2。選択すらさせてくれません。
標準だとPICkit3やICD2,3などを使用する必要があります。


でも、PICkit3は使いにくいし、ICDは高い・・・とにかくPICkit2の普及率は異常なんですよね。

だからなんとかしてPICkit2で新型の4桁16Fに書き込みができないか。というのが今回の記事です。


結論から言うと、できます。

まずはこちらのサイトでパッチファイルをダウンロードします。

この辺にパッチファイルのリンクがあるのでポチッとやって落としましょう。
パッチファイルのあるサイトです。丸の中をクリックで落とせます。


落ちたら。解凍するなり何なりして中身を開きます。ZIPなのでWindowsなら問題なく開けるでしょう。

そして中にあるPK2DeviceFile.datというファイルをCopy。ファイルは1つしかありませんから間違えようがないでしょう。


そしてそれをCドライブのProgramFilesにあるMicrochipというフォルダ内のPICkit 2 v2というフォルダに貼り付けます。
このMicrochipフォルダの位置はOS、設定によって変わります。
とにかく標準でソフトウェアがインストールされるであろうフォルダ内に行けばまず間違い無いです。



上書きがどうこう言われるので、はいを押しましょう。上書きしないとパッチになりませんからね。



そしたら・・・MPLABを再度開いてもっぺん選択してみると・・・
PICkit2。選択すらさせてくれません。

変わりませんね。僕のやつはVersionが8.50という古いものだからなのかもしれませんが、結局使えません。


となると手段はひとつ。PICkit2の標準ソフトを使う方法です。

実はPICkit2にはデバッガ付きの標準の専用ソフトが存在します。一応3にもあるんですけど・・・。

それがこの、PICkit 2 Programmerというソフトです。
PICkit 2 Programmer

先程パッチファイルをペーストしたフォルダと同じフォルダのPICkit2V2.exeというソフトがそれに当たります。

まず、起動すると、上のような画面になります。


使い方は簡単。まずは上のDevice Familyで使うPIC の種類を決定します。基本はあるところから型番を探すのですが、

今日本でメジャーであろうPIC のほとんどはここにはありません。

16Fを使うときはとりあえず一番上のbaselineとしておいて下さい。

これでとりあえずPICの設定は終わり。次に書き込み方ですが、

まず、適当なコンパイラ、またはMPLABでソースコードをコンパイルします。

すると、そのプロジェクトファイルと同じフォルダにプロジェクト名.hexというファイルができていると思います。

それが実際に書き込むときに使うファイル、つまり機械語化されたプログラムになります。
hexだから16進数で書かれていますね。


まずそれをインポートします。方法は
左上のImport Hexをクリック
Ctl+Iでインポートウィンドウを開いて、
コンパイルに作成された.hexファイルを選択して開くを押します。
コンパイル時に作成されたHexファイルを選択、インポートします。


すると、画面がこのようになって
インポート成功の文字、Writeボタンで書き込めます。
この状態でいつも通り、PICkit2と電源をPICのに繋いで、Writeボタンを押すと書き込まれます。

というのが、このソフトの使い方。これでPICkit2でも4桁16Fに書き込みを行うことが出来るようになります。


そんな感じで今日はこの辺で・・・。

久しぶりにまともな記事書いた気がします。


また、DropBoxを始めてみたいという方は此方のリンクから行っていただくと、500MBサービスされるらしいです。

(^・ω・)ノ RadiumProduction in RoboCup Junior
最近常時テスターをポケットに入れるようになりました。これは異常でしょうか?

今日の午後の話なのですが、部屋の掃除をしていたら、懐かしのPIC16F877Aが出てきました。

例の3年前の残念自作機を作った時に使ったPICですね。

特徴は・・・特徴は・・・。

あれ。1939に勝てる要素が見つからない。駄目だ、特徴とか書くの止めにしよう。


とにかくそんなPICを本棚の隙間から発見しました。

と、言うわけで使ってみよう。

まずは電源を繋いで動作確認・・・

俺のPICが燃えるように熱い!

つまり燃焼→放棄→本棚の隙間・・・と。

なるほど理解致しました。だからこんなところに・・・というか捨てましょうよ。

そんな感じで放物線を描きながらPIC16F877はゴミ箱の中へと消えていきました・・・。


そろそろPICの供養塔を建てたほうがいいのではないでしょうか。


(^・ω・)ノ RadiumProduction in RoboCup Junior
最近、腰にPICを付けて生活しているのですが、今日、そのPICにとんでもないことが起きているに気がついてしまいました。

磨耗PICの写真です。
・・・。

磨耗してる・・・。


角のところがツルっと丸くなってしまっているのがお分かりになられるでしょうか?

実はこの状態で中の銀の部分がチラッと見えたり見えなかったり。

あぁ。PICって使ってるとこうなるんだ。やっぱり電子回路部品って消耗品ですね。


今日はそんな突っ込みどころ満載の記事でした。


(^・ω・)ノRadiumProduction in RoboCupJunior
C82の影響はやはり大きく、今日も結構遅刻者が出てしまったようです。


今日は一応前期最後の授業日ということで、みんな浮き足立っていましたね。

僕の場合は、基本的に夏休みも休みなしなので、全く関係ないのですけど・・・。


と、言うわけで、今日の内容はPIC24Fについてです。
PIC24Fです。見た目は16Fとは変わりません。
以前に、僕がシンガポールの世界大会で使用したロボットがこのPICを使用していました。

公称クロック32MHzですが、実際の内部クロックは半分の16MHzの残念な16bitの子です。


そして色々と問題が多いことでも有名ですね。某ピンとか某コンパイラとか・・・


とはいえ、この24Fにも勿論良い所は沢山あります。


まずはピン割り付け機能。

PWMやI2C等の幅広い機能を普通のPICなら決められたピンに接続しないと使用することができませんでしたが、

24FではRPピンというピンが複数個あって、そのピンに使いたいモジュールのピンを自由に割り付けることが出来る機能です。

性能という面では影響を及ぼしませんが、非常に使いやすい便利な機能です。某AVRにも搭載されている機能ですね。


次にMSSPモジュールの複数搭載

要するに16Fでは一つしか搭載されていなかったI2CやSPIのモジュールが、なんと2つも搭載されています。

これにによって、16Fでは不可能だったSPIとI2Cの併用ができるようになっています。

それに両方I2Cに設定すれば、同じアドレスのセンサーを2つ使用することも出来るわけです。


そして莫大なプログラムメモリの量。

24Fは16Fとは文字通りケタ違いのプログラムメモリを持っています。実は24HやDSPシリーズ、32MX よりもメモリの量は多く、

それ故に処理速度自体が遅い割に、かなり高度なプログラムを描くことが出来、

同クラスのマイコンと比較すると、安価でかなり高機能なシステムを制作することができます。


只、この長所は何れも単純なプログラムではあまり効果を発揮しません。

システムが高度になればなるほど力を発揮するもののようなので、24F自体、使い所は難しいですね。

今日はそんな感じで24Fの紹介でした。


先程から麻雀の勝ち抜き戦をやっているのですが、現在41連勝。止まらなくなりました(笑)

(^・ω・)ノ RadiumProduction in RoboCup Junior
SkypeでC30を部員に叩きつけようとしたら、残り1時間って表示されました。どういうことなの・・・。

という訳でC30をもう一度やることになりました。しかもおまけ付きで。


もちろん媒体は24F。

ちょっと16Fだとメモリ的に足りなくなるようなプログラムを書く必要に迫られてしまったのでまた乗り換えです。

以前にこんなにメモリ使うんか?なんて記事を書いたような気が致しますが、まさかこれが伏線になるとは。フラグ建築って難しいです。

そんなこんなでまた24Fです。今度は何処らへんで飽きるのでしょうか・・・。


それでは今日はこの辺で。

(^・ω・)ノ RadiumProduction in RoboCup Junior
と言っても教えるのは僕ではないですけどね。今年はニートに徹します。

対象は今年の一年生。担当は2年生だそうです。そしてつい最近まで存在すら知らなかった部長が居ました。


ですが・・・明日からは期末試験2週間前なので一年生は部活不可・・・

という訳で8月以降に持ち越しになりました。


なんか16F1938を使うとか使わないとか言っている部員がいるのでPickit3の購入を推奨します。

まさか部で買ったのが足りなくなるとはなぁ。予想外も予想外ですね。


そんなこんなでどうなるかは未定ですが、来月から始まるようですね。夏休みにかかってやるのかな?

夏休みになればNESTロボコンの活動の方も始まりますので一年生二年生は大忙しですね。


これでおーでーのだけでなく、PIC勢も増えるのか・・・。今年はホント転機、英語で言うとTurning Pointですね。

それにしても、なかなか面白いことになって来ました。そろそろ部長の手に負えないぞ・・・。

・・・という、「今までは仕事をしていた」ようなコメントを残したところで今日はこの辺で。

(^・ω・)ノ RadiumProduction in RoboCup Junior
というのも、うちの学校は(海側は)海抜2m前後なので雨が降ると沈みます。よくこんなところに学校作ったなぁ・・・
最近こんなものが張られました・・・因みにこっちは西側で2.2mとありますが、東側は1.9mとなっていたり・・・
台風が来ると必ずといっていいほど辺り一面が鮫洲湖に・・・。今日もそうなる前に強制下校となりました。


最近まともに部活できてないような・・・昨日も爆破実験で終わりましたし。


という訳で、今日の授業中なのですが、なんとなく、PICでの並列処理について考えていました。

というのも、PICはLEGOなどに比べたら処理はとても早いですが、マイコンとしてはやっぱり残念な方です。

勿論カメラの制御だったりといった複雑な処理は出来るはずもありません。

だったら最近流行りのCPUのように並列処理をすればいいのではないか・・・と言うことになった訳なんです。



それで色々考えていたのですが・・・結論から言ってムリですね。

と、言うのも並列処理で処理をいくら早くしても、通信に時間がかかって結局意味をなさなくなってしまうのです。

それこそ通信線を2ケタ使うぐらい頑張った通信じゃないと通信で時間を食って逆に遅くなるという計算結果に。


ピンを増やす目的でなら問題無いですが、速度向上を目的としてPICの並列処理をさせるのはどうにも難しようでした。

入出力ピン半分ほど犠牲にするならできなくもありませんが・・・そこまでしてやりたくもありませんし。

という訳でここ数日は訳の分からない思考から訳の分からない発想をしたり、実験をしたり

そんな日々が続いています。


それでは今日はこの辺で。


(^・ω・)ノ RadiumProduction in RoboCup Junior
実は新型の16FPICには、以前紹介したPIC16F1827よりも、もっと小さいPICがあるのをご存しでしょうか。

それがこのPIC16F1823です。
16F1823です。このサイズにこの機能。使える子です。

なんとピン数は14ピン。

一般的に販売されている74HC等のロジックICと同じピン数でありながら、16F1827と同等の性能を持ちます。

まぁ無論ピン数だけはどうしても足りていないのですけど・・・


そして驚くべきはその値段。

なんと90円(秋月電子通商価格)。遂に100円のオーダーを切ったんです。

今まで100円を切るPIC。と言えば、16F6XXとか、10Fとか12Fとか、残念な子たちしかいませんでした。

でも16F1823は新型の4桁台の16FPICです。勿論、そんな残念な子達の一員ではありません。


この低価格、そしてこの性能。正直非常お得なPICだと思うんですよ。

16F1827 同様、サブのPICとして非常に役立ってくれること間違いないでしょう。I2Cが使えることも大きいですよね。

という訳で今日はそんな格安PICの紹介でした。


(^・ω・)ノ RadiumProduction in RoboCup Junior
電源を入れると、ふいーん↓という感じで電源の電圧が落下する現象が発生しました。


・・・PICが燃えたようです(苦笑)

回路に変更がないのに急にこの現象が起きた・・・と言うことはまぁ十中八十九PICですからまた買いに行きませんと。

というか前に一度、回路間違えた時に恐らく焼けていたのでしょうね。プログラム自体は動作してるから質が悪い。

まぁそんなこんななので今週の土日はまたアキバに行くことになりそうです。
最近は本当にお金がいくらあっても足りないような気がするのは・・・・やっぱりこの子達のせいなんだろうなぁ。


ここ数ヶ月ずっと赤字が続いているので、ぶっちゃけそろそろヤバイのですが・・・どうしたものか。

とにかく支出を減らさないとなのですが、消耗品の使用が激しいのでどうなることやら・・・。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日は新しい方の16FのPICの中でも19XX のほうではなくて、18XXの方のPICについて紹介します。

今日、紹介するのは16F1827というPICです。
PIC16F1827です。
http://akizukidenshi.com/catalog/g/gI-04430/

このPIC、何かといいますと、18PINの小型なPICにも関わらず、アナログピンが12ピンあったり、I2Cが使えたりと、

滅茶苦茶な性能しているPICなんです。


センサー用のサブPICとして非常に便利に扱うことが出来るだけでなく、

動作周波数も32MHzなので、比較的処理速度も速く、

16ビットタイマーも搭載されているので色々と汎用性の高いPICです。

まぁピン数が少ないので大規模構成の回路のメインCPU・・・という訳にはいきませんけどね。


今日はそんな16f1827の紹介でした。


(^・ω・)ノ RadiumProduction in RoboCup Junior
やっと電子情報科に戻ってきたようです。

機械作業も一段落・・・というか、部室に部品を忘れて出来ないだけなんですけど、回路の方もほぼ終了したので、

PICの基盤のプログラムをあれこれ書いています。

例えばタイマーを使って遊んでみたり、センサーから値を読んでみたり・・・

やってることは自分がTruthで教えていることと同じような・・・。媒体がPICって辺りが違うんですけど。


しかもこのあたりは一度24Fで既にやっているんですよね。去年のはじめにも16F1936でやった気もしますし・・・。

まぁだから特に新しいことはやっていないつもりです。アホみたいに久しぶりだから最初からやり直しているようなものですけど・・・。

だから割と何でもかんでもスムーズに行ってくれますね。

研究室でまともに活動が始まったらこういうことをする時間は一切なくなってしまうでしょうか、今のうちに・・・。

そんな魂胆で今またPICで遊んでいる真っ最中です(笑)


PICについてはまた一段落ついたら色々記事に挙げていこうと思います。

それでは今日のはこの辺で。

(^・ω・)ノ RadiumProduction in RoboCup Junior
今日は23時頃にPICのタイマー関数を作ろうと決意して作る。この作業ぐらいしかしていないように思えます。

まぁ実際は練馬で2つほど授業をやってきたんですけど・・・。

タイマー関数というのは、所謂NXT的タイマーです。

PICにもタイマーはあるのですが、秒単位でなく、PICのクロックそのものをカウントするという簡素なものなのです。

なのでNXTの様にタイマーを使用するには、色々とプログラムを書かないといけないのです。


でもそれはいちいちメンドクサイ・・・。


という訳で今回はNQCの様に、

ClearTimer関数で、タイマーリセット、Timer関数でタイマーの値を1ms単位で読み取るような関数を作ってみました。


それで一応完成はしたのですが、なにかがおかしいんです。

というのも、関数を作る際に、クロック数を秒に変換する変換公式があって、それに基づいて変換を行なうのですが、

16F1939で旧型の16Fの公式でそれをやったら、ちょうど1/20倍値が小さくなってしまいました。1/14倍でした。

つまり1秒のつもりが・・・えっと・・・0.05秒?になってしまったのです。約0.07秒ですね。

プログラムも変換式も間違っていないはずなのですが、何故かこんなことに。

とりあえず今のところは普通に値を20倍して難を逃れていますが、これはいったどういうことなのでしょうね。14倍!

これも旧型→新型の仕様変更なのか、自分の残念なミスなのかはまだ不明ですが、今のところこうなりました。


にしても不思議。2のn乗倍じゃなくて、1/20倍になるなんて。とりあえず試験後にでも原因探ってみようと思います。
1/14倍でも不思議ですよねー。

という訳で今日はこの辺でー。

(^・ω・)ノ RadiumProduction in RoboCup Junior
今日は中間前最後の部活動でした。

僕はPICいじって遊んでいたのですが、どうにも上手く行きません。

というのも、何故か、単純なPINのON/OFFができていないようなのです。


プログラムにも、問題はないし・・・どういうことなのでしょうか・・・

まあこういう時って十中八九PICがお亡くなりになっているのが原因なんですけど・・・

さてと、家に帰ってPIC交換してみるかな。

今日はそんな感じで久しぶりにプログラムの一日でした。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回の記事は今更感溢れる、PICkit3に関してです。
PICkit3です。色がなんかカッコイイ気がする。
PICkit2の上位互換で、ちょっと高いPIC用のライターですっていう説明が定番ですけど、本当にそうなのでしょうか。

まぁ値段が高いというのは本当ですけど・・・

因みにPICkitは何故か販売店によって価格が全然違います。

ICとかでもよくあることですが、こんなに違う品物は珍しいです。


話を戻します。まずは対応しているPICについてです。

PICkit2は、たまに対応していないPICがあって、32MXシリーズや、新しい16Fシリーズ等のPICが該当します。

そして、PICkit3では、今のところ、全てのPICに対応しているようです。


こう見ると、PICkit3の方が良いようにも見えますが、

実は新型の16Fシリーズの場合、microchip社からパッチが出ているので当てれば普通に使えるようになります。

32MXに関しては、PIC自体が入手が割りと難しいので、使えなくてもあまり問題はありません。

それに、きっとそのうち32MXの方もパッチがリリースされるでしょう。


後はPICkit2の場合はバスパワーと言って、PICkit2の方から回路電源を取ることができましたが、

PICkit3では、それができず、外部から電源をとる必要があります。

そもそも、PICkit3の場合、外部電源を繋がないとPICを認識すらしない仕様になっています。


また、PICkit2では、UARTによるデバッグが行えたり、PCとの通信ができたりしたのですが、

これもPICkit3には搭載されていません。


まぁこのように、仕様としては、割とPICkit2より残念だったりします。

只、PICkit2よりかは基本動作が安定しているような気がしますので、そういう意味では使い易いです。

でも正直なところ、これを買うくらいなら、ハンバーガー基、ICD2や3を買った方が良いように思います。
ICD3、形やロゴ的な意味で隠語はハンバーガーです。

まぁそんな感じのPICkit3、因みに僕は見た目がカッコいいのでPICkit3を使っています。

(^・ω・)ノ RadiumProduction in RoboCup Junior
いろんな人が回路を作っているのを見ていて思うのは、

やっぱり回路には設計者の性格が出る、という点でしょうか。


キタナイ人はキタナイ回路、キチガイな人にはキチガイな回路。

変態は変態なりに変態な回路を作るものです。

現状のロボカップ部もそれなりにみんなキチガイなので、生まれてくる回路も当然キチガイなものが多いです。

まぁその原因のほとんどはうちのロボカップ部の部員はみんなパターン図を書かないからなんですけど・・・


そんな中、今回のPIC回路は、本当に数年ぶりにちゃんとパターン図を書いて作ってみました。

そのおかげで大分まともな回路にはなりましたけど・・・やっぱり線の数がなんか変です(笑)

こんな感じになりました。
今回作成した・・・というか作成途中のPIC回路です。PICが見えない・・・
一見何も無いようにも見えますが、この連結ピンの数、明らかに事故の臭いがします。

しかも2段構造なのでPICがほとんど見えていない・・・ということで横からの写真も。
PIC回路横から見るとこうなります。えぐいです。
ずらーっと並ぶピンヘッダ。そして2つのPIC16F1939、出せるI/Oピンを全て投入した結果こんなことになりました。

めんどくさくなったので殆どのピンにはコネクタを付けていません。費用削減のためにコード直繋ぎでいこうと思います。

でもちゃんとピンの配線までは行なっているので、2枚目の裏の配線はとんでもないことになっています。



まぁそんなこんなでちゃんと動作するPICのメイン基盤が完成しました。まぁまだメイン基板しか無いので何も出来ませんけど・・・。

こっからあれやこれやと投入してキチガイ基盤を量産する予定です。

産技祭用のキチガイ基盤の作らないとだし・・・最近回路の仕事が多いです(笑)


(^・ω・)ノ RadiumProduction in RoboCup Junior
それにしても最近、周りの部活との交流がかなり盛んになっているような・・・

どこもかしこも協定結びまくっているような・・・。気のせいでしょうか。



今日は昨日の続き、例のPIC回路の続きです。

といっても、一日かかってまだハンダ付けの途中で終わってしまいました(笑)

まぁ後コネクタ一つなので、明日にはこっちの基盤は終わるであろうと推測されています。

と思ったけど明日は会議なので進展はないでしょうね(笑)じゃあ明後日完成かな?

何れにしてもまだまだ作る基盤は沢山あるので、暫くははんだごてとの生活が続きそうですね。

それでは今日はこの辺で。


(^・ω・)ノ RadiumProduction in RoboCup Junior
ぶいーん。ただいま例の電ノコで基盤を切っています。


今日はあっという間に実験が終わってしまったので割りと暇でした。

という訳で取り組んだのが、

例の16F1939基盤の拡張です。

というのも、この基盤、40ピンのPICが2つも乗っているせいで無駄にI/Oピンが多いんです。

全体だと60以上あるんじゃないかな。多すぎます。


まぁ勿論こんな数、実装できるはずもないので

基盤は2段に分けてI/Oピンやらなんやらはそっちの方からだしていくようになりました。


それでも回路図も自力ではんだづけするには狂っているぐらい面倒な基盤になってきています。

回路図も完成しないまま、回路作成に入ったりもしましたが、全然完成する気配がありません。
っていうかこれ本当に出来るのか・・・?


とにかく毎度のことですが、キチガイな基盤が出来る方向なのはまず間違いないでしょうね・・・。

それでは今日はこのへんで。できたらまた報告します。これは一日二日じゃムリだろうなぁ。レポートあるし。


(^・ω・)ノ RadiumProduction in RoboCup Junior
PIC16F1939。 ここ暫く、何度もその単語が出ている PICの型番なのですが、

よくよく考えると、このPIC自体はまだ一回も話題に上がってないんです。


という訳で今回の記事では、このPIC16F1939 についてです。

まず概観はこんな感じ。40PINのPICです。
PIC16F1939です。画像は秋月のサイトから。
秋月電子通商にて170円で売ってます。

16Fファミリなので8bitのPICですが、16bitの24Fより早いです。

I/Oピンは最大で36ピン、発振子内蔵型のPICなので普通にフルで使えます。

電源電圧はなんと1.8V~5.0Vまで対応、どの電圧でも動きますが、最高性能を出したい際は5Vで。


動作周波数は最大32MHzとなっています。

旧型の16FはMIPSの関係上、事実上のシステムクロックは動作周波数の4分の1になっていましたが、

この16F19XXシリーズがは、1サイクル1命令なので(分岐を除く)、システムクロックも32MHzです。


A/Dコンバーターは10bit、24Fのように複数個の搭載はされていませんが、アナログピンは全部で14chあります。

アナログ入力14個はこのサイズのPICでは多い方なのではないでしょうか。結構使い勝手がいいですね。


そしてタイマーは独立して5つ搭載されています。当然ですが、そこいらの16Fとは数も質も全然違います。

なんと8bitマイコンのくせに16biタイマーが標準で搭載されていたりするんです。


後、通信モジュールはシリアルのSPI、I2C、EUSARTが対応しています。UARTがないのはちょっと痛いですね・・・。

CCPモジュール、つまりPWM等の波形を扱うモジュールの数も5つと、旧型の16Fを圧倒しています。

後はLCDドライバやらタッチセンサモジュールやら、色々と面白い機能が搭載されています。


まぁこのように、なんか凄いよ。という新しいPICの種類なんですね。

また、同じ40PINで実は160円(10円安い!)で16F1937 というPICも発売されています。
16F1937 です。といっても見た目は余り変わらない・・・これも写真は秋月電子から。

これとの違いはなにかといいますと、RAMとプログラムメモリの量が1939の半分しかなかったりします。

まぁ基本的な性能は変わりませんので、安い方がいいというのであれば此方の方がいいかもしれませんね。(10円だけど)


僕の場合は記述するプログラムの量的な問題から1939の方を使用しています。

でもまぁ普通にプログラムするのであれば、1937のメモリサイズで事足りると思います。

因みに24F なんかになると、ここらへんのメモリの量とか、通信モジュールの数とかが増え始めます。

特にメモリとかがおかしな領域に突入するんです。システム的に絶対あんなに必要ないと思われる量のメモリがあったり・・・。


まぁモジュールはともかく、メモリはそんなに使うことは余り無いと思われますので、

どう考えても24Fのアレは一体・・・ってなりますよね。そんな高度なプログラム、わざわざPICで書かないって。


といっても、結構頑張ったプログラムにしちゃうと1937の場合は足りなくなる場合もでてきますので、

プログラムがつがつ書いちゃうような人には1939の方がお勧めだったりします。


そんな感じで、今日はPIC16F1939 の紹介でした。

(^・ω・)ノRadiumProduction in RoboCupJunior
今日はもう・・・相当な事故り様でしたね。

全員が全員酷かったなぁ。特に安定の副部長!!


そんな今日は、さりげなくちゃんと部活もやっていたり。

今日取り組んだのは、コンパスセンサーHMC6352という型番です。
HMC6352というコンパスセンサーです。I2Cバスに対応していますね。
http://www.alpha-crucis.com/en/accelerometers-gyros-compasses/1607-compass-module-hmc6352-0845156000517.html

昨日辺りからプログラムを作ってはいたのですが、謎の値を読み出さない現象が発生していました。

これがとっても厄介な状態で、I2Cの通信自体は成功していて、結果も返ってくるのに、

何故か一部の方位の値のみを返さなかったんです。

今日はそんな謎の状況と戦っていました。


それから、戦うことだいたい一時間。

とりあえずちゃんと値を読み出すことに成功しました。

結局原因はタイミングやらノイズやら。

色々重なった結果のようです。


最後面倒になって一気にパラメータを変えたらなんか成功しちゃったので、

最終的に何がいけなかったのかは・・・謎です。

まぁとにかく成功しましたっていう報告です。


今できていないのは・・・後はPICでのI2Cの相互通信だけなのですが・・・何が原因なんだろう。

とりあえず明日、通信速度を下げてもう一度やってみようと思います。

24Fならできるのに、なんで16Fだとこうも時間がかかるんだろう。

謎は深まるばかりです。


(^・ω・)ノ RadiumProduction in RoboCup Junior
という訳で、全く脈略もないままに16F19XXHITECコンパイラでのPWMの作動方法について書くことになりました。


PWMについての説明やらなんやらはもう以前の記事で再々やっているような気がいたしますので、

ここでは省略させて頂きます。

という訳で今回はプログラムのお話を。
因みに今回の記事はデータシートが手元にあることを前提としていますので、レジスタの中の詳しい紹介等は行いません。

まず、PWMを行なうにはタイマーの設定が必要です。

これは要するに波の周期を決定するために使われるもので、一般には慣例としてタイマー2が使われるようですね。

別に1でなければどのタイマーでも大丈夫なはずです。

タイマーの設定をするレジスタはT2CONレジスタ。

今回は特に何か指定することもなかったのでEnable、つまりタイマーを有効にする設定のみを行なっています。


あと重要なのが、PR2レジスタで、この値でPWMの周期を決めます。

この値はある計算値を基にして求められるのですが、わざわざ求めなくても、

データシートにPRレジスタの値と主なPWM周期の表が載っていたりします。

ということで今回はこの表に基づいて0xFFとしました。これだと周波数は31.25kHzになりますね。

因みに計算式もその表の付近に載っています。


こんな感じであっけなくタイマーの設定は終了。タイマーのレジスタについてはまた別途の記事で詳しく説明します。


そして今度はPWMの設定。PICではPWMはCCPとかECCPというモジュール内に含まれている機能ですので、

このCCPのレジスタを利用してPWMの設定を行います。

まずは、CCP2CON、今回はCCP2を使うのでこのレジスタを使います。

このレジスタは

ビット7-6:拡張PWMの設定

ビット5-4:デューティ比の最下位2ビット

ビット3-0:モードの選択

となっています。

今回は拡張に興味が無いので7-6は00、

デューティ比はこのPICの場合、最高10ビットで設定出来るようなので、下位ビット分がこんなところで設定できます。

でも、下位ビットっていうと1か2の違いですから、正直どうでもいい。どっちも00でいいでしょう。

3-0は当然PWMの設定になりますね。ECCPの場合はアクティブハイがどうたらと書いてありますが、

どちらもアクティブハイでないと後々面倒なので全部アクティブハイになる1100でいいでしょう。



こんな感じでPWMの初期設定は終了です。

あとはCCPR2Lレジスタで上位8ビット分のデューティ比をプログラム内で設定してやれば

後は勝手にモジュールの方が波形を出力してくれます。

因みにデューティ比は実際には、 設定した値/4(PR+1) になります。

なのでそのあたりはちょっと注意が必要です。


でもこの値ってよく考えるとPRがFFだと分母は10進数で1024になりますよね。

だから単純に1024段階と思って頂ければ何も考えることは無いかと思います。


とまぁPWMのプログラムはこんな感じ。

細かいレジスタ等の紹介はまた別途で行いたいと思います。

という訳で今日は最後に適当なプログラムを乗っけて終了です。このプログラム動いたっけかなぁ・・・?

もしかしたらPICのヘッダをhtcかそこら辺にしないと動かないかもしれません。
 
#include "pic16f1939.h"
#define _XTAL_FREQ 32000000
 
__CONFIG(
FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF
& CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF
);
__CONFIG(
WRT_OFF & PLLEN_ON & STVREN_ON & LVP_OFF
);
 
 
int main(void)
{
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
ANSELA=0;
ANSELB=0;
ANSELD=0;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00011000;
TRISD = 0b00000000;
 
OSCCON=0b01110000;
 
CCP2CON = 0b00001100; //PWMモードにする
PR2 = 0xFF;
T2CON = 0b00000100; //Timer2 Enable
 
while(1)
{
CCPR2L = 0x80;
}
 
}

(^・ω・)ノ RadiumProduction in RoboCup Junior
またI2Cが動かなくなりました。

なんていうか、アドレスをずっと送り続けているのか、SSPBUFが空になっていないのか。

原因は不明です。

とにかくまともに動作をしなくなってしまいました。

プログラム変わってないのに・・・おかしいなぁ。


とりあえず、訳がわからないのでプログラムを書き直すことにしました。

回路にも異常はないし、一体なんなのでしょうね。

とにかくこれは解決しないと・・・

今回作成した基盤はi2cがないと話にならない仕様なので困りましたね。

参考資料も乏しいので嫌な予感がしますがもうちょっと頑張ってみようと思います。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今日はコンピューターで使われる数字や数列についてのお話です。


一般に、今使われている数字は10進法という方式ですね。

これは、0123456789

この10個の数字単位で桁があがっていく仕組みです。9の次は10ですからね。

時計だったら60秒、60分で桁というか、単位が変わりますよね。だから時計は60進法です。

このように、数というのは、場合、用途によって、桁上がりのタイミング、即ち進法が変わることがあります。

実はコンピューターでも使われている進法がまた違うのです。


コンピューターでは、2進法という進法が使われています。

2進法では、数字は0と1しか使いません。

つまり、0の次が1、その次がもう桁があがって10になる訳です。

これは、人間からしたら非常にわかりにくい進法ですが、コンピューターからしたら、とてもありがたい進法なのです。

何故コンピューターでは2進法がいいのでしょう。


コンピューターはデジタル回路で動作していますから、制御信号は電圧のONとOFFの2つです。

また、2進法も、0と1の2つで構成されています。

もうお分かりですね。2進法は、デジタル回路の信号とデータの構成が同じなので、

2進法で書かれた数字(2進数)は、コンピューターの信号と等価とみることができます。

だから、信号を数字に置換してやるだけで簡単にコンピューターに命令を送ってやることができるのです。

その置換を実際にやっているのが、プログラムの書込機、

つまりPickitなどのライターや、マイコンそのものの機能になる訳です。


要するにこっちからやるべきことは、その命令となる数字を送ってやること、

これがレジスタの書き換えであり、プログラムそのものなのです。


そういう2進数、0と1だけで書かれたプログラムが機械語というものです。

でもこれは只の0と1の集まりなので、まず人間には理解できません。

そこでコンパイラができ、人間に理解ができるプログラミング言語というものでプログラムができるようになりました。


2進法の話のはずが、随分逸れましたね。

これが2進法の説明です。

因みに、レジスタに書き込む時は言語でも2進数で書かれることがありますが、やっぱり長ったらしくなります。

なので今のプログラムでは、この命令を2進数ではなく、16進数で記述する場合が多いです。

16進数では、数字の順番が

0123456789ABCDEF

となっていて、Fの次が10になります。


何故わざわざまた別の進数を使って記述するかと言いますと、

プログラムではこの2進数で記述される命令の一桁一桁をbitと呼ぶのですが、

そのbitによる命令を行う際にある特性の影響で命令自体を16進数で記述した方がいいんです。

そういう訳で、実用的には16進数で記述される方が多いです。


bitに関しては、また他の記事で紹介することにして、以上が2進数と16進数の紹介でした。

今日はA/D変換の動作が確認できました。

明日はLCDをつけてみようと思います。


(^・ω・)ノ RadiumProduction in RoboCup Junior
今回は前々から告知していた「レジスタ」というものについてお話しします。

レジスタとは、パソコンのプロセッサ、つまり中のCPUだとかDSPだとか、

そういった処理装置が持つ所謂小さなメモリのようなものです。


通常コンピューターは実際に処理を行なっている部分とデータを保存している部分はそれぞれ独立していて、

片方をCPUだとか言って、もう片方をメモリだとか言ったりしますよね。

コンピューターは通常、このようにデータの保存場所とデータで処理を行う場所が分かれているので、

いちいち何かする度にメモリとCPU間でデータの通信を行う必要があります。

でもそれだと、通信の時間分、処理速度が遅くなってしまいますので性能としては残念なコンピューターが出来上がる訳です。

だからといって、CPUとメモリを一緒にしてしまうと、それはそれで勝手が悪くなるし、何より汎用性が低下してしまいます。

だったら、データの中でも常に使われてデータ総量も少ないもの、

例えば一番簡素な「命令」のデータなどはCPUと一緒でいいんじゃないか?ということになりまして、


そこで考えだされたのがレジスタです。

レジスタというのは、CPUに内蔵されている高速メモリだと考えて頂ければわかりやすいと思います。

よく使われる命令などのデータに関してはCPUに直接保存することで、通信の量を抑え、処理を高速化しているのです。


まぁレジスタってのはそんなものです。逆に言うと、レジスタのデータ自体が一つの命令として意味を持っているので

レジスタ自体を直接書き換えてしまえば、一番早く、的確にCPUに命令を送ることが出来るという訳です。

この仕組みはマイコンであるPICも変わりませんから、今まで何度も「レジスタを書き換える」という話が出てきたのです。


レジスタのデータは基本的にbit単位で構成されていて、

8bitCPUなら8bit、16bitCPUなら16bitでひとつのレジスタは構成されています。

このレジスタのbitの中身、つまり0、1を変えてやることでレジスタの中身は書き換えられます。

基本的に一つのレジスタの中にはいくつかの命令が組み込まれていて、

レジスタ内の0,1を変えることでレジスタ内の命令の全てを同時に変更することもできたりします。


また、レジスタは書き込むだけではなくて、読み込むこともでき、

指定しているレジスタのbitが書き込みオンリー(W)なのか、読み込みオンリー(R)なのか

読み書きどっちも行えるのか(R/W)というのも重要な点です。

特に(R/W)のレジスタは、思いもよらない様な使い道を見つける場合も多々ありますので要チェックですね。



と、まぁこれでレジスタの説明は以上です。

と言っても文章だけなのでちょっとわかりにくいですよね。

PIC Cだとレジスタ一つ一つに名前がついていて、変数と同じような感覚で(R/W)が行えます。

先程の記事で記載したプログラムでも大量にレジスタの書き込みは行なっているので

こっちのプログラムからレジスタを探してみると、大体の感じはわかって頂けるのではないでしょうか。

このプログラムだと、直接レジスタを操作する命令はint mainの中にしかありませんが、

その中だと、見た感じ9割近くそれに該当するような・・・。


HITECでプログラムを書くと本当にレジスタだらけになってきてしまいますので、

PIC、特にHITECでプログラムを書く場合はこのレジスタの理解が大事であるということが解って頂ければと思います。


という訳で今回の記事はこのへんで。


(^・ω・)ノ RadiumProduction in RoboCup Junior

今日は大変壮大な事故をしました。

ちょっとPIC16F1939UARTをやってみようとしたのですが、

プログラムを書いても動かないのでデータシートを見てみたら・・・

UARTモジュールがなかった(笑)

EUSART、つまりUARTが同期式になったバージョンの通信には対応しているようですが、

非同期式のUARTには対応していないようです・・・。


という訳でUART通信をやるには自分で一からメンドクサイプログラムを書かないといけない・・・と。

単純な2線シリアルの非同期式の通信なので、やろうと思えば結構簡単にできるのですが、

そこまでしてやる気は全く起きない・・・というかやる必要性と有用性が全く皆無なので止めました。


という訳で今日はA/D変換のプログラムを書いて、書き終わって、今は後輩に投げた回路待ちです。

PIC自体はもう昔からやっていますから、コンパイラPICの仕様が変わっただけなので、

PICそのものの特性さえ理解出来れば、後はささっと終わってしまいますね。


という訳で明日アナログ入力ができているか確認して、LCDのプログラムでも作ってみようと思います。

まぁこれもライブラリ落とすだけの簡単なお仕事ですから、今回はライブラリごとは作りませんよ!すぐに終わるはずです。

そしてARMの方も順調で、遂にgccでのCのプログラムが書き込めるようになりました。

後はUSBの制御とか、そこら辺ができています。今年はマイコへの勢いが強いので、スムーズに行ってくれますね。


それで、今日は1936のプログラムを一つ上げてみようと思います。

まぁ簡単にLEDつけるだけのプログラムですけど・・・。

書き込みの方法とか、プログラム自体の説明はまた今度ということで、

とりあえず今は参考までにということでプログラムだけここに記載します。

 
#include <pic.h>
 
//#include<htc.h>
//#include "pic16f1939.h"
#define _XTAL_FREQ 32000000
 
 
__CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF );
__CONFIG( WRT_OFF & PLLEN_ON & STVREN_ON & LVP_OFF );
 
 
 
 
void delay_ms(long x)
{
 long i;
 for(i=0;i<x;i++)
  { 
   __delay_ms(1);
  }
 
}
 
int main( void ){
 
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
ANSELA=0;
ANSELB=0;
ANSELD=0;
 
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00011000;
TRISD = 0b00000000;
 
OSCCON=0b01110000;
 
 
while(1){
 RD2=1;
 delay_ms(500);
 RD2=0;
 delay_ms(500);
 } 
}


とりあえずこんな感じです。1秒周期でLEDが点滅するようなプログラムですね。


一先ず今日はこれを投げて終了です。もう少ししたらPickit3についての記事を書くと思いますので

その時に書き込みについてもお話できたらいいなぁ。

と言うことで今日の記事はこのへんで。


(^・ω・)ノ RadiumProduction in RoboCup Junior
カレンダー
07 2017/08 09
S M T W T F S
1 2 3 4 5
7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
最新CM
[09/25 ONE RoboCuper]
[11/19 big]
[11/11 お馬さん]
[08/08 うまごやぐらし!]
[04/20 匿名(にさせてw]
かうんた
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
年齢:
23
性別:
男性
誕生日:
1994/02/15
職業:
大学生
趣味:
ラボ畜
自己紹介:
初めまして。Luzと申します。
某大学の情報学科に入りました。のんびりと生活を送るのが今年の夢です。
めーる
radiumproduction☆yahoo.co.jp
※☆を@に変更して下さい。
バーコード

PR

忍者ブログ 2007-2017,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...