忍者ブログ

Azukish

消えゆく世界と流れる未来に最後の灯を since 2006/4/3

2016/07/09

MSP430G2 Launchpad買った+割り込みに関する備忘録(けっこう長文)

社会人になってあまりブログを書く時間が無くてほったらかしにしてたのは非常に申し訳ないと思っている。。。
以前、Arduinoを買ってLCD接続して~みたいな話はしたと思いますが、あれから全く遊んでない 笑
それなのにも関わらず、TIのMSP430G2を買ってきて~みたいな話になると、まーた無駄遣いして!みたいになりますが、まあ一人暮らしだし、誰も責める人がいないというのは良いことだ
というわけで、MSP430をアキバに行ったときに秋月で買ってきたわけだが、これって日本語の情報がすっげ少ないですね。。。割り込みさせるだけでもかなり手間取ったので、なんとなくまとめてみた。




大抵の人が
ボタン押す→LED光る
タイマでLEDを光らせる
程度の話で、そもそもP1とかって何よ?みたいなところは結構飛ばされがちな気がします。
というより、こういうのをやる人はそういうことを予め知ってるのか?
いずれにせよ、ArduinoやH8マイコンの話ばかりでMSP430って結構使ってる人が国内には少ないのかな?って感じはします。

あと、基本的にデータシートやユーザーガイドとにらめっこしながらやることになるので、国外メーカーの製品で設計するのは英語がある程度読めないと辛そうというのは大いにあるかも。
ただ、欲しい情報に関してはほとんどがそれらに載っているので、一応ダウンロードして、読めるようにしておくと良いでしょう。
MSP430G2 LaunchpadにはMSP430G2553が載っているので、
MSP430G2553のページの上の方にある
データシート:MSP430G2x53, MSP430G2x13 Mixed Signal Microcontroller (英語)
ユーザーガイド:MSP430x2xx Family User's Guide (英語)
と、MSP430G2 Launchpadのページの上の方にある
LaunchPadの説明書:MSP-EXP430G2 LaunchPad Development Kit User's Guide
は持っておくと何かと便利。正直これに関するプログラム例(MSP-EXP430G2 Software Examples)は敷居が高すぎて、自分としてはチンプンカンプンだった 笑
あと、日本語のページだと技術資料のバージョンが表示されないみたいですね・・・。日本語に優しくないなあ・・・

とりあえず、以下の話は今日(2016/07/09)の話であり、英語のページにおけるデータシートとユーザーガイドのバージョンはRev.J、LaunchPadの説明書のバージョンはRev.Gということでお願いします。ページ数が変わったりすることがあるかもしれないので念のため。

IDE(統合開発環境)はCode Composer Studio (CCS)を使います。
一応、Arduinoライクな簡易的開発環境であるEnergiaってのもあるみたいだけど、どーせちゃんとした組み込みやるんだったらCCS使った方がいいかと思う。
CCSは無料だけど、myTIに登録する必要がある。めんどい。最新版は現状だとv6

Microsoft Visual Studio 2015 Expressが既に入っていると、インストール時にコケるようなので、注意。コケた場合はVisual Studio 2015再頒布パッケージを削除したらうまくいきました。

自分の場合、初回起動時にAvast!が起動して、初回起動時の生成物がぐちゃぐちゃになってしまったらしく、コンパイル時にERROR: cannot run cg430 - file could not be foundとかいうのが出てしまいました。
結構手間取ったけれど、最終的にHelp→Install new software→右下にある青文字のAlready Installed→MSP430 Compiler Toolsを一度Uninstallしてから、下記にあるようにしてAvast!のスキャン対象から除外して、Code Generation Tools UpdatesのTI Compiler UpdatesにあるMSP430 Compiler ToolsをInstallしたところ、うまくいきました。
Avast!を使っている場合は、歯車マーク→一般→スキャンからの除外で、"C:\ti\*"(CCSをインストールした場所)と"C:\Users\ユーザ名\ti\*"(デフォルトのワークベンチが入る場所)を追加しといた方が良いでしょう。



ではようやくプログラムの話ができる。
ごく入門的な話に関しては大阪工業大学の小林裕之先生のページに非常に良く解説されています。要は説明するのが面倒だからそっち読んでください 笑
で、それに補足するような形でいくつか。


ピンに何が接続されているのかに関してはLaunchpadのUserGuideに載っています。
例えば上図。90°回転させてありますが、17ページに載ってます。
これを見ると20ピンのMSP430G2553のうち、8本のピン(P1.0-P1.7、P2.0-P2.5)を制御することができそう、LED1がP1.0に繋がっていて、P1.0をON/OFFするとLEDの制御ができそうということが分かります。
みたいな感じです。


MSP430みたいなマイコンの多くは割り込み処理という処理法ができるようになっています。
割り込み処理というのは、名前の通り、今やっている処理(Aと名付ける)をぶった切って指定された処理(Bと名付ける)を行って、Bが終わったらAに戻って続きをやる、みたいなイメージです。
自分はPCのプログラムでは割り込みとかマルチコアな環境での並列処理とかやったことなかったので、そこでめっちゃ苦労しました 笑

で、その割り込み処理ですが、自分的にMSP430の中でよく使うやつはタイマ割り込みとポート割り込みってやつです。

タイマ割り込み:とある時間が経過するごとに割り込みを入れてくれる形式です。
3秒で設定すると、メインの処理→3秒経過→タイマ割り込み発生(点A)→タイマ割り込みの処理終了→メインの処理に戻る→点Aから3秒経過→タイマ割り込み発生→...
というような感じで延々と処理を継続してくれます。

ポート割り込み:ポートに入力があったりすると発火する形式です。
P1.3(ボタン)の入力に対してポート割り込みを設定すると、メインの処理→P1.3の入力(ボタンが押された!)→ポート割り込み発生→ポート割り込みの処理終了→メインの処理に戻る
というような感じです。

で、このタイマ割り込みとポート割り込みなんですが、MSP430G2553には独立して動くタイマ割り込みが2つ、独立して動かせるポート割り込みが2つ備わってるようです。
インクルードするmsp430g2553.hの下の方か、データシートの2ページにタイマの個数(2x TA3と書いてある)が、割り込み関係の仕様に関してはデータシートの11ページに詳しく載ってます。
独立して動かせるポート割り込みが何に使えるのかはちょっと分からないけど、たぶん便利なんでしょう(適当)

で、タイマ割り込みなんですが、これと連動して勝手に動いてくれるように設定できるピンがいるようです。
データシートの49ページを見ると、こんな感じになってて、
P1DIR.6=1, P1SEL1.6=1, P1SEL2=0, ADC10AE.6=0, )1.6のJTAG Mode無効, CAPD.6=0とするとTimer0_A1(TA0.1)というタイマに合わせてON/OFFしてくれるということが分かります。
つまりTimer0_A1というタイマを設定して上記設定をしてやると割り込み処理を自分で書かなくても勝手にピンが0、1、0となってくれるということです。便利。
で、なんでP1.6をここで出したかというと、P1.6は上の配線図を見れば分かると思いますが、LED2に接続されているので、動いているか否かが簡単に分かるからです。

では、基本部分は上の小林先生のページのうち、5番(消費電力を減らそう(Low-Power Mode に入る))くらいまでやってもらって、それが理解できたら、タイマに関してちょっとサンプルを動かしてみましょうか。基本的なところの説明はめんどい 笑

#include <msp430.h>
#include "msp430g2553.h"

int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR |= BIT6;
P1SEL |= BIT6;
P1SEL2&= ~BIT6;

TA0CTL = TASSEL_2 + ID_3 + MC_1; // SMCLK/8, Up
TA0CCR0 = 50000;
TA0CCTL1 = OUTMOD_7;
TA0CCR1 = 4500;
TA0CCTL2 = OUTMOD_7;
TA0CCR2 = 4000;
__bis_SR_register(LPM0_bits + GIE);
}




簡単に説明を入れると、前半部分でP1.6を勝手にON/OFFにしてくれるモードにしておいて、後半部分(空行より下)でタイマの設定をしています。
SMCLKという内部のクロックが8回ON/OFFしたものをTimer0_Aの中での1クロックとして、50000クロックを1周期としています。

---以下めんどいので細かいのとか長文ダメな人は省略で---
SMCLKはデフォルトだとDCOCLKを参照してるみたいで(ユーザガイドの284ページ)、
DCOCLKはBCSCTL1のRSELとDCOCTLのDCOとMODというレジスタで設定できるみたい(ユーザガイドの283ページ)で、デフォルトだとRSEL=0111b=7、MOD=0、DCO=011b=3となってる。
で、データシートの29ページを読むとこの設定の時のDCOのクロック周波数は0.8から1.5MHzに収まりますよ、と書いてある。
けっこう幅が広いけれど、周波数なんて温度によってかなり変わってしまうのでこんなものでしょう。たぶん室温だと1MHzくらいになるように設定されていると思う。
で、1MHzで計算すると、1MHz/50000/8=2.5Hzということで、おおよそ1秒間に2.5回ほど光るようになっています。
結構ごちゃごちゃ書いたので理解できなかったかもしれませんが、書いてる本人すらきちんと理解できてるかどうか怪しいので、要は割り込み処理を書かなくても光るよ、やったねたえちゃん!ということです。
---ここまで---

P1.6はTA0.1に対応してON/OFFするということを上の方で書きました。
で、TA0.1というのは、TA0CCR2(4000)からTA0CCR1(4500)の間だと思います。
つまり、Timer0_Aの1クロックの中で、
開始(0)→TA0CCR2(4000、ここでLED点灯)→TA0CCR1(4500、ここでLED消灯)→TA0CCR0(50000、終了、クロックリセット)→開始(0)→TA0CCR2→TA0CCR1→...
という具合に繰り返されている感じですかね。

ちなみに、実行中、一時停止してRegisterからTA0CCR1やTA0CCR2の値をいじると点灯時間が変わります。TA0CCR0だけはいじれないみたいだけど。
ん?と思った方もいらっしゃるかも知れませんが、TA0CCR1やTA0CCR2の値は実行中も変更可です。
なので、PWM制御とかしたい方は割り込みを使ってそれらのレジスタの値を変えれば、適当なタイミングでそのピンのON/OFF時間の調整がなされます。


なお、Timer_Aに関しては、Timer0_AとTimer1_Aの二つが独立して存在するので、
#include <msp430.h>
#include "msp430g2553.h"

int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR |= BIT6;
P1SEL |= BIT6;
P1SEL2&= ~BIT6;

TA0CTL = TASSEL_2 + ID_3 + MC_1; // SMCLK/8, Up, clr, interrupt enable
TA0CCR0 = 50000;
TA0CCTL1 = OUTMOD_7;
TA0CCR1 = 4500;
TA0CCTL2 = OUTMOD_7;
TA0CCR2 = 4000;


P1DIR |= BIT0;
TA1CCTL0 = OUTMOD_7 + CCIE;
TA1CCR0 = 40000;
TA1CTL = TASSEL_2 + ID_3 + MC_1; // SMCLK/8, Up, clr, interrupt enable
__bis_SR_register(LPM0_bits + GIE);
__no_operation();
}

#pragma vector=TIMER1_A0_VECTOR
__interrupt void BP1(void) {
P1OUT ^= BIT0;
}




みたいなコードを書くと、LED1とLED2がズレて光ってくれると思います(40000と50000じゃちょっと分かりづらいかも)。

今日はここまで。
次回は未定。
とりあえず超久しぶりに長文書いたので疲れた 笑

拍手

コメント













カウンター

カレンダー

05 2019/06 07
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

アーカイブ

AD

Azkishはamazon.co.jpを宣伝しリンクすることによって サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。