トラ技 2007年1月号付録 MSP430F4270
TOPページへもどる
2007.01.58 直流電圧測定の実験
5番目のプログラムとして、電圧計の実験をしました。これに先立ち、ポート6.0〜6.3に接続用のピンソケットを付けています。例によって、0.5mm程度の
導線を差し込むと実験的に接続できるようにするためです。
プログラムは付録の SD16_AC_A.c をgccに書き換えました。
付録のプログラムはDC測定に関していくつかあるのですが、チャネル5のVccを読むものと、チャネル6の温度測定のものしか無く、一般的なチャネル0,1,2の
例題がないのは残念でした。とりあえず、上記のVccをポーリングで読むプログラムをgccに持ってきています。
連続測定のために、1秒間に約4回の読み取りを遅延ループで時間調整をして行っています。原本は32回を連続読み取りして配列に保存していますが、ここでは
単純変数で扱っています。
測定電圧は、AD変換値/65535*0.6*1000(mV)となりますが、0.1mVまで表示するために 0.1Vを単位とする数値は、
AD変換値/65535*0.6*10000
となります。 式を変形すると、
AD変換値*10000/65535*0.6 → AD変換値*10000/(65535/0.6) =AD変換値*10000/109225
となって整数計算できることになります。LCDへの表示は例によって十進分解し、最後の一つ前に小数点を書いています。
1.5V乾電池−−4.7kΩ−−5kΩバリオーム の組み合わせで、0〜0.75Vの可変電源を作り測定してみたところ、手持ちのテスター(秋月METEX P10)との
指示値の違いは0.5%以下でした。どちらが正確なのかは、アマチュアには判定できません。
別の測定法もあると思いますが、とりあえず付録プログラムを修正しての実験です。測定端子としてA0+とA0-を使用しているために、被測定回路とこの測定器回路の
GNDをアイソレートする必要があります。電池電源ならよいのですが一つの電源装置を共有する実験では使えないことになります。A0+とGNDで測定する方法が
あると思いますが、まだそこまで辿りついていません。hexファイルから計算すると実行ファイルは約14kBになっています。見苦しい内容ですが、
ソースリスト(整理のためファイル名を変えています)を置きます。
GNDを共通に電圧が測定できると、いろいろなセンサと接続できると思います。
******************************************************************************************
2007.01.22 正弦波発生を付け加える
4番目のプログラムとして、正弦波をDACで作ることにしました。付録CDの \4270DAC\DAC_CAL_A\DAC_CAL_A.c をgccに取り込みました。サブルーチンの
形を変えることと、他のプログラムと同居ですから変数の設定も変えねばなりません。また、割り込みプログラムから呼び出すsin値の配列変数はグローバル領域に置く
ことにしました。IARのプログラムでは
割り込みルーチンから呼び出しもとのルーチンが見えるのですね。変数がそのまま使えています。gccの割り込みルーチンでも見えるのでしょうか、見えないと思って
いました。時間ができたら調べてみましょう。ここでは見えないものと思って、元のルーチンと割り込みルーチンの両方で使う変数はグローバルとしています。
いろいろ問題がありましたが、中でも「'sin'がない」には困りました。コンパイラの最後の方でメッセージが出ます。トラ技にはgccにある、と書いてあるのですが。
掲示板に書きましたところ、早速 すんさん が関係のページを教えてくれました。http://easter.kuee.kyoto-u.ac.jp/~tsutsui/manual/c_math.html
リンクができていないのですよ、と教えられ、makefileのそれらしきところを探して、
${CC} -mmcu=${CPU} -o $@ ${OBJECTS} -lm
と -lm を書き加えましたら無事コンパイルできました。(またまたWebに助けていただきました)
「ここで重要なのは -l option です.たとえば,-lm とすると,libm.a という file と link してくれます. libm.a のなかに sin 等の関数が納められています.
libm.a はたとえば,/usr/lib/libm.a とかにあります.」と書かれています。
あちらこちらを調整して正弦波が、40年前の古典的オシロで、見えたのですが1周期の後ろの方が極端に乱れます。DA変換する過程で後ろの部分をカットすると乱れません。
合計4つのプログラムを載せましたからRAMが不足して、sin値を格納する配列変数の後ろの部分が他の変数領域あるいはスタックと重なっているのだろうとの結論に
達しました(256バイト=128ワードのRAMは厳しいのではないでしょうか、64分割の配列で64ワードになります)。
50分割にしたものが右の写真です。約 560Hzです。
******************************************************************************************
2007.01.21 DIP-swを付けてプログラムの切り換え、入力スイッチのテスト
DIPスイッチを取り付けました。プログラム実験をしていると書き換えている間に混乱が生じます(私だけか)。4bitのswがありましたので、
ポート6.4〜6.7に47kでプルアップして接続しました。onでlow、offでhighになります。感覚上、上下逆さに付けてあげたときにoff(=1)になるようにしました。
また、LSBとMSBを間違いましたので、プログラムで無理矢理補正しています(恥ずかしい)。
リセットsw(左下の針金製)を取り付けて、DIP-swを切り換えてリセットします。現在は3ビットを使って8つのプログラムまで書けるようにしています。
0番は時計、1番は温度計(すんさんのプログラムから、表示は違いますが。未調整です。)、3番は方形波564Hzをポート1.0から出します。
この方形波は1ms時間待ちのサブルーチンのテスト用に使ったものをそのまま置いています。
タクトスイッチを付けました。入力デバイスとしてP2.0に47kΩでプルアップして取り付けました。SW解放でP2.0=H、押すとP2.0=Lになります。
ポート2.0は割り込み機能がありますので、SWの検出は割り込みで行えます。立ち下がりエッジで割り込みを検出するテストをしました。1ミリ秒単位の時間待ち
ルーチンを使って、トラ技のとおりチャタリングを防止しています。まだ実用にはしていません。
今までは、1つの実験をしても次には消去(書き換え)しましたが、この切り替えで前の実験を残したまま書けるので違った楽しみがあります。思い出して修正・改良
も用意です。ここまででhexファイルから計算すると5.4kバイトほどです。32kから見ると随分書けるように思います。切り換え毎にリセットすますから、SRAMもゴミも
心配ないかと思います。ただavrのように文字定数が残るとSRAMが小さいだけに心配もありますが。
現在のプログラムをここに置きますが、実験途上のものですからその点をお含みください。保存の都合上、ファイル名を変えています。
トラ技p139リスト3の
BTCTL = BT_ADLY_1000; // クロック源はACLK/256の設定だけに使用・・A
には悩みました。プログラム中に32.768*datとありますから、分周の必要はないのにどうしてだろうと迷いましたが、結局は、BasicTimerをカスケードに繋いだときに
2段目の8ビットカウンタ入力がACLK/256になることで、今は1段目しか使っていないので、この行は関係ない(削除しても変わらない)とわかりました。
どうして要らないプログラムを朱書のコメントを付けて書くのでしょうか。著者がわかっていない訳はないと思いますが、他の部分からの流用(そこでは必要だった)
だとすれば、あまりにも読者をないがしろにしています。また、basictimerをtimerBと書いて訂正していますが、MSP430にはtimerA3、A5のものがあり、timerBを備えて
いるものがあるわけですから、basictimerと間違うはずがありません。4270だけしか見ていないと別ですが。(やっつけ仕事だったのかなあ)
******************************************************************************************
2007.01.13 キャラクタ液晶表示の方法(ドライバ完成)など
まずはじめに、Cって恐ろしいものですね。すんさんがAVR用のドライバlcd.cとlcd.hを改良してEW430で文字列を表示
してしまいました。すんさんのドライバを
丹念に見せていただいて(そして頂戴して 感謝!)今までAVRで使っていたものをmspgccで使えるようにできました。
今まではポートの0〜3をデータに使っていましたが、今回P5.1〜4をデータに使っています。そこを巧妙に解決しておられます。私は今までR/Wを読まず、LCDの端子を
GNDに落としてWだけを有効にしてきましたのでそれを踏襲することにしました。したがって、LCDの5番ピンR/Wは直接GNDに半田付けを変えました。
このドライバでは、液晶表示器の初期化、表示クリア、書き込み場所(行とカラム)の指定、1文字(キャラクタ)の書き込みと文字列の
書き込み ができ
ますから、設定データや測定データの表示が自由にできます。ためしに、自前の時計を動かしてみました。(幾種類もの個体を作ることはないので、LCDの接続は
固定します)
makefileは付録から持ってきて自分用に修正しています。私は main の名を使わず、それぞれに固有の名を付けますからその名の変更と同時コンパイルの
ファイル名を書くだけで使えるものを考えています。破綻がくるまでこのmakefileを使うことにします。
MSP430を使う基礎固めができてきましたが、今日は行数の割りに時間がかかりました(笑)。
lcd.c lcd.h(サーバの関係で.txtとしている) t1.c(時計の試作)
makefile(サーバの関係で.txtとしている) を置きます。
******************************************************************************************
2007.01.12 システムクロックについて
MCUがどのようなクロックで動いているのか、それがはっきりしないと薄気味悪いので調べてみました。トラ技を何度も読み、ユーザーズガイドも読みましたが
難解でした。そのなかでこんなものかな、と思ったことを。
- FLL+レジスタには次のものがあります。
SCFQCTL システムクロック制御
SCFI0 システムクロック周波数積分器0
SCFI1 システムクロック周波数積分器1
FLL_CTL0 FLL+制御レジスタ0
FLL_CTL1 FLL+制御レジスタ1
IE1 イネーブル・レジスタ
IFG1 SFR割り込みフラグ・レジスタ
- 時計用の32.768kHzの水晶は、コンデンサが未実装なので、負荷容量をプログラムする必要があります。無ければ安定した発振をしないようです。
FLL_CTL0=XCAP18PF; で設定できます。 他に、0PF 10PF 14PF がありますが試していません。
- メインクロックは、RCリングオッシレータの出力を分周したものを32.768kHzと比べて周波数を調整しているようです。したがって、32.768kHzの整数倍だけが水晶の
精度で使えるようです。このとき閏年調整をしているようで、等間隔でない、ジッタのあるクロックとなるようです。
この調整をoffにすると、ジッタは減るようですが、細かな調整ができない周波数になるようです。
- リセット後、MCLKとSMCLKはACLK(32.768kHz)の32倍(1.048576MHz)になります。
- 一般的には、精度を得るために水晶の整数倍のクロックを使うことを考えます。
- 設定の関係から、@0.65〜2MHz A2〜4MHz B4〜8MHz の3つの範囲に分けると設定しやすいと思います。(FN_指定は発振器の適
合タップです)
- 0.65〜2MHz の範囲では、SCFQCTL=(N-1); FLL_CTL0=XCAP18PF; SCFI0=0; と設定します。N=32.768の倍数、
N×32.768kHzがMCLKとなります。
- 2〜4MHz の範囲では、、SCFQCTL=(N-1); FLL_CTL0=XCAP18PF; SCFI0=FN_2; と設定します。N=32.768の倍数、
N×32.768kHzがMCLKとなります。
- 4〜8MHz の範囲では、
SCFQCTL=(N-1); FLL_CTL0=DCOPLUS+XCAP18PF; SCFI0=FLLD_2+FN_2; と設定します。
DCOPLUS=1とすることで2分周されずに(2倍のクロックになって)MCLKが生成されます。 Nは(32.768*2)の倍数で、
N×2×32.768kHzがMCLKとなります。
Nの値は128までです。分周しないとmaxの128を採っても128*32.768=4.19MHzですから、4MHzfを超えると2分周が必要になります。
したがって、設定間隔は32.768*2となります。(訂正しました)
- 設定は割り込みイネーブルの状態で行います。
- 希望クロックから設定を計算してみると、たとえば、
3.6864MHzの近くに設定したいときは、2番目の範囲で、n=3.6864/0.032768=112.5 となりますから、113を採用して n-1 に 113-1 を入れます。
SCFQCTL=(113-1); FLL_CTL0=XCAP18PF; SCFI0=FN_2; と書きます。MCLK=3.702784MHzとなります。(0.4%ほどずれます)
5MHz付近に設定したいときは、3番目の範囲で、5/(0.032768*2)=76.3 ですから、76を採用して、
SCFQCTL=(76-1); FLL_CTL0=DCOPLUS+XCAP18PF; SCFI0=FLLD_2+FN_2; となります。MCLK=4.980736MHz です。
** 実験していないので確証はありませんがこれでいいのではないかと思っています。バグがあればお教えください。時間ができたらMCLKをタイマーに入れてクロックを
分周して確認しようと考えています。 **
******************************************************************************************
2007.01.08_2 LCDバイアス用電源の実装と水晶の安定発振
チャージポンプの負電源を実装しました。ボードに組み込んでから動きが悪いといやなので小さな万能基板に組み込んでみました。
TC4049が裏側にあって、両面テープで貼り付けています。写真では見えにくいかも知れませんが、それぞれ2つの0.1uFセラミックとショットキーDiを付けています。
半田付けに少々苦労しました。最終段は3つのインバータを並列にして出力を稼いでいます。単三電池よりは小さくできました。
回路はChaNさんのもの
をいただいています。
同時に電源は3.3V3端子レギュレータを用意しました。主としてそれを使おうと思っています。
水晶の発振が不安定なため、ACLKを用いた割り込みがうまく起動しなかったようです。悩みをBBS(2チャンネル
TI MSP430シリーズ 1クロック )に書いたところ親切な方が、
FLL_CTL0 = DCOPLUS + XCAP18PF;
を設定するよう教えてくれました。早速、引っかかっていた2つのプログラムに書き加えたところ、電源ONとともに、確実に作動するようになりました。
mspgccの割り込み問題もこれで終わりそうです。(他にも同様の書き込みがありました。開発途中や雑誌発売までにチェックできなかったのでしょうか。
同様の悩みを持つ人がかなりおられるのではないかと思います。)
******************************************************************************************
2007.01.08 割り込みが動いたこと、時計が動いたこと
mspgccで書いたプログラムでは割り込みが発生していないことを書きましたが、著者の方に相談・お願いをしましたところ確実に動くバイナリファイルを送って
戴きました。それを私のターゲットで実行しましたが、やはり点滅してくれません。許可を得て他の方にテストしていただいたところ動作したとの報告をいただきまし
た。
そこで、再度挑戦したところ20〜30回ほど電源を入れ直していると1回だけ点滅しました。再現性を調べましたが、なかなか点滅してくれません。
思わぬ半田不良がないかと
見ましたがそれもなく、リセットピンをGNDに落としてもダメです。
そうこうするうちに、基板に指を触れると点滅動作をする事を知りました。さらに詳しく調べると
水晶の脚に触れると確実に点滅動作(割り込み動作)をする事がわかりました。
自作の点滅プログラムも水晶にタッチすると動きます。設計が悪いのか、個体が悪いのか、水晶が発振していない時にシステムクロックがどうなっているのか、など
は私の知識では知りようがありません。ただ、水晶が発振していないとtimerにSCLKを指定しているので割り込みが働かないのかも知れません。EW430では
正常に動いたものの、しばしば電源を何度も入れ直さないと動作しないことがあって、「不安定だな」と思ったこともありました。
これからの実験で毎回ピンセットで水晶にタッチする必要があると思うと憂鬱です。付録だから仕方がないのでしょうか。でも、特別価格だし...
char_lcdの時計が動きました。さんざんいじりまくったプログラムを戻そうとしましたが、はじめからポート5の変更を加える方が確実なので、その作業を
するうちに時計が動きました。(LCDをポート5に変更したのが怪我の功名だったようです) 以下にその流れをトレースします。
- \mspgcc\examples\char_lcdを自分用のフォルダにコピーします。(原本は保存しておきましょう)
- hardware.hを変更します。エディタで"P1"をすべて"P5"に置換します。13ヶ所あります。注釈文ですがPORT1もPORT5に変えておきます。
- main.cを修正します。ここも"P1"をすべて"P5"に置換します。9ヶ所あります。
- makefileを修正します。4行目のmsp430x1121をmsp430x4270に変えます。
- makeを実行してコンパイルします。main.cで次のエラーが出ます。
61:'P5IES' undeclared;
63:'P5IE' undeclared;
66:'BCSCTRL1' undeclared;
66:'DIVA0' undeclared;
66:'DIVA1' undeclared;
ポート5には割り込みがありませんので、61、63行は消去します。また、66行は4270に無いようですのでこれも消します。(他の定義があるのかも知れません−−
不勉強)
- makeを実行します。今度は成功して charlcd.a43 ができます。
- MspFet.exe を起動して、charlcd.a43をドラッグアンドドロップでセットし、デバイス名を確認して、AUTOで書き込みます。
- 一瞬の初期設定の後、猛烈に速い時計が表示されます。66行目のクロック分周を消したからでしょう。
- 再びhardware.hを修正します。
52行目の "#define ONESECOND 512" を 4096 に変更します。
- 再度makeして、MspFet.exeで書き込みます。これで完了です。
変更前のポート1使用ではデバイスを1211から4270に変えてもコンパイルができました(ように思います)。コンパイルはできてもこれらのデバイスには
違った内容になっていたのかも知れません。ポート1を解放したくてポート5に引越したのですが、たまたま解決の糸口になりました。
時計として使うには時刻あわせも必要でしょうが、とりあえず。なお、手持ちの時計とは6時間で4秒ほど違いがありました。
追試されましたら感想などお寄せいただければ幸甚です。
(補足)ハードウエアの変更は、P1.1〜1.7 をそのまま P5.1〜5.7 に変えるだけです。
LCD_RS :P5.1
LCD_RW :P5.2
LCD_E :P5.3
LCD_D4 :P5.4
LCD_D5 :P5.5
LCD_D6 :P5.6
LCD_D7 :P5.7
******************************************************************************************
2007.01.06 キャラクタLCDのポート変更
mspgccのサンプルプログラムchar_lcdはポート1を使うようになっています。ところが、このポートは他のモジュールのポートと重なっていて、たとえば唯一の
DACとも競合してしまいます。一方ポート5はモジュールとしてはLCDドライバだけですから、競合の心配がありません。
プログラムを見るとほとんどがhardware.hで設定されていますのでここを変えればいいだろうと変更にかかりました。あと、main.cに少しの変更が必要でしたが
無事ポートの変更に成功しました。
変更点は、hardware.hのすべての「P1***」を「P5***」に変更します。main.cも同様にすべてを変更しますが、P5IES と P5IE は割り込み機能がないために
定義無しでエラーになりますから、この2行は削除しました。
これからLCDを半田付けしようという方にお薦めします。(半田付けを変更するときにスッポンでランドをとばしてしまって、ヒャッとしました。何とか導通がありますので
そっとしています。一般の基板より熱に弱いようです。)
gccの割り込みは一向に明かりが見えません。ポート5を実験用に引き出していましたが、ポート1から取り出すことにします。
******************************************************************************************
2007.01.05 負電圧発生回路とmspgccの割り込み
負電圧発生回路の電圧が十分でなかった理由について、470pFが無かったので1500pFを付けたために電源のインピーダンスが悪くなってしまったのではないかと思い
つき(2.7kHzで発振していました)、再度ブレッドボードにTC4049BP(ジャンク箱に取り外したものが山ほどある)をセットして、コンデンサは無いので10kの抵抗を
1.5kに換え
てみました。液晶がうすく見えるようになりましたので、余っている2回路を使って、最終段は3つのインバータをパラにしました。ドライブ能力が上がったためか、無負荷
の-2.7Vは変わりませんが、液晶負荷のとき-1.2Vが得られ、実用的なコントラストとなりました。電源は3.3V安定化電源を使いましたが、単三2本の3.0Vでも実用になり
ます。発振周波数は160kHzになっています。手持ちの関係でシリコンダイオードを使っていますが、ショットキに変えるともう少し上がるかも知れません。
ただ、ボタン電池に比べてかさばりますのでどうしたものかと思っています。
mspgccのサンプルプログラムchar_lcdには、前に書いたように時計が書かれています。プログラムを読むと1秒ごとの割り込みで時計が動くようになっています。
掲示板に書いたように、割り込みが働いていないようです。割り込み以外のプログラムを書き換えるとターゲットに反映します。試しに、付録CDの指示の通りに
LED点滅プログラムを書いてみましたが、割り込みがかからず点滅しません。割り込みをやめて、遅延回路で点滅させると正常に動きます。
付録の変更プログラムにはありませんが割り込み許可の eint(); を入れてもダメでした。何か重大なものを忘れている様な気がするのですが、わかりません。
暗中模索がしばらく続きそうです。
ボードに10ピンのソケットを付けました。P5.0〜P5.7を引き出しています。残りの2本はGNDです。実験用のリードを挿すのに使います。
******************************************************************************************
2007.01.04 LCDをつけました
デジットで以前購入したキャラクタLCDを繋ぎました(以前は\300、今は\600)。mspgccサンプルの中でも「LCDのICは3Vで動作する。表示器はそれ以上必要に
なるから、そのために負電源を用意すると良い」旨の記述があります。ChaNさんのレポートに詳細があり、GO2さんがこのボードで成功されました。
要するに、コントローラが3Vで動けば、コントラスト端子はVccより4.5Vほど低いところにあれば使えるということになります。ChaNさんの74HC04によるチャージポンプを
試してみましたが、私が使った東芝のLCDはコントラスト端子(3番ピン)に1.3mAほど流れます。チャージポンプではこの電流に耐えられず表示ができませんでした。
仕方なくボタン型乾電池を繋いだところ実用になるコントラストが得られたので、ボタン電池で負電圧を賄っています。1.3mAの負荷が電池にとってどのようなものかわかり
ませんが、実験的に使うわけですからもたなかったら単三でも抱かせようかと思います。回路としてはコントラスト端子をVccの抵抗による分圧から取らず、+極をGNDにつ
ないだ電池の−極に接続しているだけです。(一つ困ったことは、Vccをoffにしても電池から1.3mAは流れ続けます。使わないときはとりあえず抜き取るようにしています。
)
正規のLCDと違って表示桁が大きいだけでなく、アルファベットも使えますからいろいろ遊べると思います。
mspgccフォルダのサンプルプログラムchar_lcdをコンパイルしMspFet.exeで書き込んでみました。写真のように Hi, I'm a clock_ と表示されました。
******************************************************************************************
2007.01.03 gccにトライしました
mspgccには勿論使用制限がありません。フラッシュROMが自由に使えます。WinAVRもgccですから共通点も多いことと思います。gccでhexファイルができれば、
前回のmspfetで簡単に書き込むことができます。シミュレートとデバグはできませんが、AVRでもそれらを使わずに楽しんできましたから、効率は悪いかも知れません
が使えるだろうと考え、gccに足を踏み入れました。掲示板に書いたように、一時は挫折しそうになりましたが、GO2さんにヒントをもらって悪戦苦闘の末(無力の
証明)サンプルプログラムのコンパイルに成功し、ターゲットにled点滅プログラムを書くことができました。
コンパイラの準備は、回り道と試行錯誤でたどりつきましたので無駄があるかも知れませんが、次のように結果的になっています。
- 添付CDの \tools\gcc\mspgcc-20060502.exe を実行して mspgcc をインストールしました。
- cygwinをCygwin Information and Installationからインストールしました。(必要なのかどうか私には判断できません)
GO2さん紹介の会津大学からのインストールは私にはできませんでした。
- cygwin\binのcygwin1.dllをmspgcc\binのcygwin1.dllに上書きしました。添付CDのcygwinがバージョンが古くて使えないようです。
この状態でサンプルプログラムをコンパイルする事ができました。なお、最新のcygwin1.dllはCygwin Snapshots
からダウンロードできますが、それをmspgccに入れると cigwinのcygwin1.dllを新しくせよと警告が出ます。上書きすると警告なくコンパイルできます。(だから、
cygwinのインストールは必要なのかな、と思います。)
サンプルプログラムはC:\mspgcc\examples\ledsを使いました。生成されたleds.a43をmspfetでターゲットに書き込むとledが点滅しましたので
成功したと思っています。(書くとわずかに数行ですが、ずいぶん多くの時間が必要でした。早いPCがほしい。)
makefileとバッチファイルについて:流れがWinAVRと同じですから、同じ感覚で使いたいと考えて、makefileを変更してみました。解説のmakefileを
WinAVRのものに近づけようとしています。プログラム名とソースファイルを書き換えれば常に使えるものを期待しています。他からのコピーで.a43ファイル(.hexファイル
?)も生成するようにしています。確認はしていませんが、少なくとも1つの.cファイルで構成されていて、プログラム名と.cファイル名が同じであれば使えると
思います。 DOS窓のコンパイルのコマンドラインは何回も使うのでバッチファイルにしてDDできるようにしています。makeコマンドは、WinAVR用とbcc用と合計
3つありますのでフルパスで指定しています。
サンプルの内容をここに置きます。
******************************************************************************************
2007.01.01 フラッシュROMの読み書き−−MspFet.exe
フラッシュROMの読み書きソフトが同梱されていることをGO2さんが教えてくれました。インストールをする必要が無く、exeファイルを置くだけで使えます。
書き込み・読み出しともに
簡単な操作で行えそうです。試しにLED点滅プログラムを読み出してhexファイルに保存して、プログラムを消去してみました。勿論ROMはFFが書かれてLEDは動かなくなり
ますが取り出してあるhexファイルを"auto"で書き込むと正常に実行しました。gccを使うようになると常用のツールになるかも知れません。
あたらしいプログラムを作ってみる
MSP430F4270の16ビットカウンタTimer_A3には3つのキャプチャ/コンペア・レジスタがあって、カウンタが3つあるのと同じ働きをします、とあります。これを
使って2つのポートのLEDを異なった周期で点滅するプログラムTA_interval_cがあるとp151右上に書いてあります。AVRにはない機能ですから、試してみたいと探しました
が、付属のプログラムは説明と違って1つのLEDの点灯時間と消灯時間の割合を2つのレジスタで制御するものです(誌面に偽りあり)。これならレジスタ1つでもできるの
でおもしろくありません。そこで、新しいプログラムを作る方法を学ぶ機会として書いてみることにしました。(備忘のためにここに置きます)
構想は、c:\4270にmytestフォルダをつくり、ここにワークスペースmytestを作ることにします。このフォルダにプロジェクト(プログラム)led1を置くフォルダLED1を
作ります。.cファイルは上記のTA_interval_cを変更して作ります。
- フォルダ c:\4270\mytest とその下に c:\4270\mytest¥LED1 を作ります。
- 付属のTA_interval_c.cをled1.cと名前を変えてLED1フォルダにコピーします。
- ワークスペースを作ります。統合開発環境EW430を起動して、
- [File]-[New]-[WorkSpace]で白紙の画面を作ります。
- プロジェクトを作ります。
- [Project]-[Create New Project]を選択すると、Create New Project画面が現れます。 Empty Project を選び、[ok]します。
- 「名前を付けて保存」で、作って置いたプロジェクトフォルダLED1を指定します。
- ファイル名led1でenterすると空白のプロジェクトができます。
- 用意して置いたled1.cをドラッグでled1-Debug*にドロップします。
- ワークスペースに名前を付けます。[File]-[Save Workspace]で画面の「保存する場所」を1つ上に上げてmytestとして保存します。
- プロジェクトのオプションを設定します。
- Workspceウインドウでled1-Debugを選択して、[Project]-[Option]で画面を開き、MSP430F4270を設定します。
- C/C++ compilerのOptimizationsタブでNoneを設定します。(最適化は最後に行います)
- Listタブでoutput fileのすべてにチェックを入れます。
- Debugger SetupタブでドライバをFET Debuggerを設定します。
- ConnectionでLptを選びます。
- led1.cファイルを編集します。
プログラムは次のように変更しました。
//******************************************************************************
// MSP430F4270 テストソフト 1つのタイマーで2つのポートを別々に制御する
//
// CCR1, CCR2タイマー割込みでP1.0とP1.1を点滅
// 点滅周期 = 20000 / 32768 = 0.61s
// 点灯時間 = 10000 / 32768 = 0.31s
// ポイントは割り込み時に次の時間を設定すること、どちらの割り込みかを判断すること。
//******************************************************************************
#include "msp430x42x0.h"
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // WDTの停止
P1OUT &= ~0x03; // P1.0,1の出力を0に設定(入力設定なのでLEDは点灯しない)
CCTL1 = CCIE; // CCR1 割込み許可
CCR1 = 20000; // TAR = CCR1(20000)の時に割込み発生
CCTL2 = CCIE; // CCR2 割込み許可
CCR2 = 10000; // TAR = CCR2(10000)の時に割込み発生
TACTL = TASSEL_1 + MC_2; // クロック源はACLK, 連続カウントモード(TARは0FFFFhまでカウント)
_BIS_SR(LPM0_bits + GIE); // LPM0に入る, 周辺モジュール割込み許可
}
// Timer A1 割込みサービスルーチン
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)
{
switch (TAIV)
{
case 2: // CCR1割込み
P1DIR ^= 0x01; // P1.0は出力(LEDが点灯する)
CCR1 += 20000; // 次の割込み時間(CCR1 + 20000)の設定
break;
case 4: // CCR2割込み
P1DIR ^= 0x02; // P1.0は入力(LEDが消灯する)
CCR2 += 10000; // 次の割込み時間(CCR2 + 10000)の設定
break;
}
}
******************************************************************************************
2006.12.28 電源の変更とTA_interval_A書き込み成功
JTAGインターフェイスの電源をターゲットボードから取ることにしたのはいいのですが、ターゲットを接続せずにLPTポートに繋ぐと配線して
いないVcc端子に3.8Vほどの電圧が出ます。入力端子の電圧がHC244のVcc端子経由で出てくるのでしょうか。すっきりしないのでLEDパイロットランプはやめて原本どおり
シリーズレギュレータでHC244の電源を取ることにしました。消費電流がごくわずかなので3Vを保てるようです。ターゲットボードとの電源のやりとりはなしにしました。
最初のプログラム TA_interval_A.c が思うように動かないので、P1.0のほかにP1.1にも出力するように変更してみると、なぜか点滅するようになりました。P1.0だけに戻し
ても正常に点滅します。原因が不明のまま、解決しました。電源のせいだとは思えないのですが。lowで点灯することも、点滅周期を変更することもできました。
あと、電源の保護抵抗を1kから47Ωに変更しました。また、コネクタのコード半田付けの部分をホットボンドで固めました。断線の心配が無く取り外しが楽になりました。
******************************************************************************************
2006.12.27 JTAGインターフェイス−書き込み器−を作りました。 苦労して1208サイズ(?)のショットキーダイ
オードを付けて、シリーズレギュレータ
の電源回路を付けてみました。5Vの電源でテストしたときは具合良く3.0Vになっていたのですが、いざLPポートに繋いでみると全く電流が取り出せません。330Ωでショート
すると2.1Vしか出ません。記事とは逆にターゲットの電源をもらうことにしました。AVRの時と同じです。せっかくの電源はLEDのパイロットランプに流用しています。
説明の通りEW430をインストールして(Cドライブは使いたくないのですが、よくわからないときはデフォルト設定があったりして困るのでC:\に)、その次がわかりません。
結局いろいろ試行の末、c:\に4270ディレクトリを作ってそこにプログラム集を置いて作業をするらしい。私にとってトラ技は難解です。記事と同じ画面が現れません。
workspaceウインドウにはflashing...は出てきません。TA-interval...と表示されます。初めてのものにはつらいところです。
この付録にはLEDが点滅するプログラムが書かれています。初めてさわるなら、書き込み器が正しいかどうかもわからないので、まずはプログラムを読み出してみたいのですが
その方法を見つけ得ませんでした。仕方なく書いてあるとおり点滅プログラムを書き込むと、当然のことながら、書き込み済みだったプログラムは無くなって点滅しなくなり
ました。テスト用はP1.0のhighで点滅するようになっていましたが、新しいプログラムはlowで点灯するようですから、緑のLEDを用意して配線しました。が、点滅してくれま
せん。ライタが悪いのだろうか。割り込みが働いていないようなので、とりあえずP1.0をmainで出力設定にして、0を書いてみたらLEDが点灯しました。
今日はここまでですが、ライタは正常と判断していいのでしょうか。もっと簡単なプログラムから勉強することにしましょう。なお、電源の保護抵抗1kは大きすぎるように
思います。LEDを弱く点灯しただけで単三2本が2.5Vまで下がります。逆接続に注意して外すことにしましょう。
******************************************************************************************
2006.12.19 2007年1月号付録 MSP430F4270 とたわむれます。 誘われて買った付録に手を付けてみました。
とりあえず電源を繋ぐと一つのポートP1.0が1秒ごとにon,offしてLEDが点滅するプログラムが組み込まれているとのことですから、実験してみることにしました。
適当な大きさの基板がありませんので、小さな基板2枚をつなぐことから始まります。多分、DMMまで作ることはしないでしょうから、付録基板は両面テープで支えて、
ソケットは使わずに直に半田付けします。適当に配置して、電源端子を付けました。
推奨どおり電源の逆接続対策として、ダイオードを入れましたが、スイッチ代わりにも使うコネクタを3本脚にして中央を+に、両端を−にしています。逆差ししても
同じです。テスト用のLEDはGNDは半田付けしましたがポート側は接触しているだけです。
電源は単3を2本としましたが、ホルダが3本用しかなかったので、1本はダミーでショート板を保持するために使っています。
無事LEDが点滅しましたので、次へと進むことにします。
便利なライタは持ち合わせていません。ライタを作るのが大変なら、放棄するのですが(4月号の付録は25本フル実装のプリンタケーブルは無かろうと思い、そのままに
なっています)、掲載されているJTAG(聞いたことはあるけれど、さわったことはない)の回路が作れそうなので進むことにします。
古いプリンタケーブルを探し出して切ってみると、25本の線が入っていました。せっかく25本あるのですから、すべてをピンソケットに取り出して使ってみようと思います。
あと、回路図を見ると、いつものようにプログラマの電源をターゲットから取るようにすれば、74HC244と抵抗とコネクタですむようです。
ソフトウエアには全く目を通していませんがぼつぼつやってみましょう。