電子ブロック工房 / LPC https://www.rad51.net/blog/mycom/ IC・トランジスタで出来たコンピューターを設計・製作するためのブログ / NXPのチップについて ja Jeans CMS © Weblog http://backend.userland.com/rss https://www.rad51.net/jeans/skins/jeans/images/jeans2.gif 電子ブロック工房 https://www.rad51.net/blog/mycom/ LPC810を使ったコンソール(技術編) https://www.rad51.net/blog/mycom/?itemid=908 Console 810の技術的なことに関するノート。特徴は、以下の通り。

・NXPのDIP-8の石、LPC810を使用
・モニター出力はNTSCビデオ信号
・キー入力はPS/2キーボード
・9600 bpsでのシリアル入出力

もともと、LPC810を見たとき、こういったコンソールには最適だと思っていた。ピンの数は8本で、電源に2本、NTSCビデオ信号に2本、PS/2キーボードに2本、シリアル入出力に2本には、過不足無い。RAMが1024 bytesあるので、32x24文字のディスプレイなら可能であり、文字数も、まずまず許せる範囲。本当は、80x24文字の物を作りたいのであるが、それ用には、LPC812を使う必要があるだろう。

LPC810は、Switch Matrixと呼ばれる機能により、電源以外のピンを自由に配置することが出来る。この設定に関しては、GUIの、Switch Matrix toolというソフトウェアが用意されているので、このソフトウェアの利用が便利である(要Java)。デフォルトで幾つかのピンがGPIOになっていないなど、Switchi Matrixには幾つかはまりどころがあるので、こういったツールを利用するのが確実のように思った。以下は、このツールを用いてアサインしたピン配置図。
2015-01-20-Image1.png
この石は、5番ピンの扱い方がミソのようで、電源投入時やリセット時に、5番ピンの入力がHになるようにしておかないといけないらしい。今回のプロジェクトでは、PS/2キー入力用にプルアップしたラインを繋げた。

NTSCのビデオシグナルを作成する場合、同期信号として以下のような物を出力する必要がある(ソースコードの、ntsc.cより、修正して抜粋)。
/* Video sync signal construction
 * 1 line: 1524 (+/- 16) clocks (15748 Hz; 63.5 usec)
 *
 * line #0-#2
 *     ________    ________
 * |__|        |__|
 * 2.3 usec    2.3 usec 
 *
 *
 * line #3-#5
 *          ___         ___
 * |_______|   |_______|
 *          4.7 usec    4.7 usec
 *
 *
 * line #6-#8
 *     ________    ________
 * |__|        |__|
 * 2.3 usec    2.3 usec
 *
 *
 * line #9-#261
 *      ___________________
 * |___|
 * 4.7 usec
 *
 *
 * This must produces 16275 Hz sync signal.
 *
 */
これを作成するのに、SCTという機能を利用した。

SCT(State Configurable Timer)は、LPC810の目玉機能の一つで、PWMの高機能版と言ったところ。1回のサイクルでシグナルを2回H/Lしたり、何らかの入力でタイマーを停めたり再起動したり、色々なことが出来る。SCTに関して色々と遊んだ記事があるので、興味のある方はそちらをご覧頂きたい。SCTを制御するコードをすべて自分で書くのは、その高機能さのために非常に骨の折れる作業であり、私には無理である。幸いにして、開発環境のLPCEpressoには、"Red State Machine File Generator"というGUIのツールがあるので、これを利用してコードを作成するのが確実である。"Red State Machine File Generator"の使い方については、まとめた記事を以前書いたことがあるので、参照して頂きたい。Console 810では、次のチャートのように、作成してある。
2015-01-20-Image.png
タイマーは、16ビットの物を2つ利用した。一つ(L timer)には、PWMとしての機能を担わせてある。垂直同期信号部分(lines #0-8)に対応させるため、4つのマッチ(MATCH1-3とMATCH0)を用意し、信号をL→H→L→Hと変化させる。但し、最後のマッチ(MATCH0)では、タイマーをリセットするだけではなく、停止させている。その理由は次の通り。NTSC同期信号を作成するためには、デューティー比を決めるMATCH0-3の値をダイナミックに変化させなければならない。タイマーが作動中はMATCH値を変更することが出来ないようで、変更するためには停止しないといけないらしい。その為に、MATCH0ではタイマーをリセットと同時に停止し、かつ割り込みをかけ、割り込みルーチン中でMATCH値を書き換えるようにした。停止したタイマーを再起動させるために、もう一つのタイマー(H timer)を用いるようにした。このように、SCTの持つ機能を使い切ることで、NTSC同期信号をうまく作成することが出来た。

NTSCの文字描画のための信号作成には、SPIを用いている。経験的に、8ドット32文字で計256ドットを出力するには、6 MHzの周波数でシグナル送出するのがベストである。LPC810の内蔵オシレーターは12 MHzだから、6 MHzを作るのにはちょうど良い。2倍の24 MHzをシステムクロックとし、その4分の1の 6 MHzを、SPI用のクロックとした。ところで、NTSC信号一ラインは24 MHzで1524クロック(15748 Hz; 63.5 usec)にしてあるが、この1524という値が、4(「4分の1」という設定に由来)で割り切れることが必要である。4で割り切れない値に設定すると、画面が波打ってしまい(ジッター)、綺麗な表示にならない。

割り込みはSCTにだけ割り当てていて、SPI、UARTと、PS/2キーボード読み取りのためのGPIOには、割り込みを用いていない。UARTの処理は、NTSC信号の水平同期時(63.5 usecごと)に行なえば間に合う。SPIは、割り込みを使うと、割り込みルーチン前後のスタック動作に余分に時間がかかるため、使わないようにした。SPI信号出力時は、CPUはこの仕事に専念している。PS/2キーボード信号の読み取りは結構な速度で行なう必要があるが、幸いにしてキーボードに対してbusy信号を送ることが出来るので、忙しいとき(SPIに集中しないといけないとき)はキーボードからの信号を拒否するようにし、それほど忙しくないとき(垂直同期時)のみ信号を受け付けるようにして、対応した。

最後に、このコンソールには、NTSCビデオ信号とPS/2キーボードという、かなり古い技術を用いている。NTSCは、白黒に限っていえば60年以上前に定められた規格である。最新の機器ではHDMIが主流でありNTSC出力しない物も多くなっているものの、当面の間は、モニターの側でNTSCをサポートするものと思っている。加えて、NTSC→HDMI変換アダプターなどもあるので、10-20年ぐらいは、未だ使える技術ではなかろうか。反面、PS/2キーボードは、入手が難しくなってきている。これについては、USBキーボードに対応したものを作るか、USB→PS/2アダプターのようなものを別途作るかしないといけないかも知れない。ただ、USBホストを作るとなると水晶発振子が必須なので、どうしても回路が大きくなってしまう。今回のような回路構成で扱えるNTSCビデオやPS/2キーボードは、やはり面白いなと思うし、私としてはまだまだ使っていくことになるだろう。

Console 810のダウンロードは、ここから。
ソースコードの管理は、こちら。]]>
LPC https://www.rad51.net/blog/mycom/?itemid=908 Tue, 20 Jan 2015 14:33:08 PST ITEM908_20150120
LPC810を使ったコンソール(紹介編) https://www.rad51.net/blog/mycom/?itemid=907 2015-01-13-IMG_0766.jpg
Console 810は、NXPの8ピンdipパッケージの32ビットマイコンである、LPC810を用いた、シリアルコンソールです。次の特徴があります。

・ 英数字を横32文字、縦24文字表示する、キャラクターディスプレイ
・ NTSCビデオ信号を通じて、モニターに文字を表示
・ PS/2 キーボードを接続可
・ 9600 bpsでの、シリアル入出力を実装
・ DIP-8の石を用いた省スペース設計
・ 外付け部品は、電源・コネクター以外は、パスコンと5つの抵抗だけ
・ ライセンスはLGPL

回路図は以下の通りで、パスコンとコネクター以外は、抵抗が5つの、シンプルな構成です。
2015-01-13-schematic.png
"NTSC out"にはNTSCビデオ入力のあるモニターに、"PS/2 connector"にはPS/2キーボード(101及び106キーボードに対応)を接続して下さい。

仕様としては、シリアル入力(9600 bps)で受け取ったASCIIコード文字を、NTSCビデオ32x24文字のディスプレイに表示し、PS/2キーボードからの入力を、ASCIIコードでシリアル出力(9600 bps)します。動作テストを行なう場合は、シリアル入出力部を直接接続して下さい。こうすることにより、キー入力がそのままディスプレイに表示されます。

私のテスト環境が、下の写真です。
2015-01-13-IMG_0769.jpg
5VをUSBから得て、3.3Vを出力する3端子レギュレーターを介して、LPC810に給電しています。ZIFソケットに刺してあるDIP-8の石がLPC810です。その左のDIP-20の石はPIC18F14K50で、USB接続でFlashMagicによりLPC810にファームウェアを書き込むための物です。ですので、実質的な本体は下の写真で拡大した部分。
2015-01-13-IMG_0770.jpg

用途としては、シリアル接続を介してPCと接続することにより使用するような回路を、スタンドアローンにすることが挙げられます。実際、私がこの回路を製作した動機は、これです。例えば、これとかこんな物を、スタンドアローンにすることが出来ます。えっ?どちらもCP/Mじゃないかって?そう、これは私がCP/Mで遊ぶために作った物です。

この回路が持っているすべての機能ではなく、一部の機能だけ使うのであれば、シリアル入力のキャラクターディスプレイとして、或いは、シリアル出力のキーボードとして使うような場面もあるかも知れません。LPC810はDIP-8という小さな石なので、これら一部の機能だけ使うとしても、場所ふさぎということはないでしょう。

LPC810の機能としては、Switch Matrix, UART, SPI, SCTを用いています。技術的なメモをまとめた「技術編」の記事は、後日公開致します(追記:公開しました)。

180529追記
このConsole 810のキットが、Yahooストアのオレンジピコにて販売されることになりました。ピコソフトの宇喜多さん、どうも有り難うございます。

バージョン 0.6は、ここからダウンロードできます。
Console 810は、ここからダウンロード出来ます。
ライセンスはLGPLで、商用利用が可能です。]]>
LPC https://www.rad51.net/blog/mycom/?itemid=907 Tue, 13 Jan 2015 17:47:07 PST ITEM907_20150113
LPC810でLチカ色々(SCT) https://www.rad51.net/blog/mycom/?itemid=891 一つ前の記事では、割込みも何も使わない最もシンプルな方法でGPIOを操作して、LEDをブリンクさせた。これは、単にLPC810へのプログラムの書き込みが出来ることを確認したに過ぎないので、もう少し高度なLEDブリンクを行なって、当面の目標(LPC810で作ってみたい、ある回路)に少しでも近づけたいと思う。

以前紹介したように、LPC810では、PWMの高機能版であるSCT(State Configurable Timer)が面白い。自分としては、是非これを使えるようにしておきたい。

まずは、Red State Machine file genaratorの設定は前と同じにした。ただし、maxcount=6000000とし、0.5秒に一度割り込みが起きる設定にしてある。ます、割り込みでソフト的にGPIOの出力をトグルして、ブリンクすることを試みた(注:正確な周期を生み出すには、5999999とするべきであろう)。

main.cは、以下の通り。
#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include <cr_section_macros.h>

// TODO: insert other include files here
#include "sct_fsm.h"

// TODO: insert other definitions and declarations here

void SCT_IRQHandler (void) {
	uint32_t status = LPC_SCT->EVFLAG;

	LPC_GPIO_PORT->NOT0 = 1<<0; // Toggle PIO0_0

	/* Acknowledge interrupts */
	LPC_SCT->EVFLAG = status;
}
int main(void) {

    // TODO: insert code here

	LPC_GPIO_PORT->DIR0 |= (1<<0); // PIO0_0: output

	// enable the SCT clock
	LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);

	sct_fsm_init();

	// Enable SCT interrupt
	NVIC_EnableIRQ(SCT_IRQn);

	// unhalt the SCT by clearing bit 2 of the unified CTRL register
	LPC_SCT->CTRL_U &= ~(1 << 2);

    // Force the counter to be placed into memory
//    volatile static int i = 0 ;
    // Enter an infinite loop, just incrementing a counter
    while(1) {
//        for (i=0;i<100000;i++);
    }
    return 0 ;
}

SCTを有効にするには、1)SCTにクロックを与える 2)halt状態を解除する の2つの手続きが必要なようである。また、割込みをSCT用に許可するようにしておく必要があった(いずれも、main()関数の冒頭)。割込み用の関数内では、LPC_SCT->EVFLAGの値を読み込んで、もう一度LPC_SCT->EVFLAGに入れ直す(?)必要があるようだ。この操作に何の意味があるのか、あとで調べておこう。いずれにしろ、このソースコードで、1秒おきのLEDブリンクが動いた。これで、SCTを用いた定期的な割込みのレッスンは、終了。

次に、普通のPWMを試してみる。まずは、定期的にトグルするモード。まずは、Red State Machineを書き換える。
2013-12-16-rsm2.png
イベントに、"TOGGLE Output pin 1"を追加してみた。始め、ここで言う"Output pin 1"が、GPIOの0_1と勘違いしており(LPC810のDIP-8の5番ピン)、「ん?動かない?」と思ったが、どうやら違うらしい。"Output pin 1"というのは、SCTにとっての1番ピンなのであって、それをSwitch Matrixという機構で、任意のピンに割り当てられるようである。それをふまえて作成したのが、次のmain.c
#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include <cr_section_macros.h>

// TODO: insert other include files here
#include "sct_fsm.h"

// TODO: insert other definitions and declarations here

void SCT_IRQHandler (void) {
	uint32_t status = LPC_SCT->EVFLAG;

	LPC_GPIO_PORT->NOT0 = 1<<0; // Toggle PIO0_0

	/* Acknowledge interrupts */
	LPC_SCT->EVFLAG = status;
}
int main(void) {

    // TODO: insert code here

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);  /* Enable the Switch Matrix                   */
    LPC_SWM->PINASSIGN7 = 0xFFFFFF01;     /* SCT CTOUT_1 at P0.1                         */
    LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<7);  /* Switch Matrix can be disabled to save current */

	LPC_GPIO_PORT->DIR0 |= (1<<0); // PIO0_0: output

	// enable the SCT clock
	LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);

	sct_fsm_init();

	// Enable SCT interrupt
	NVIC_EnableIRQ(SCT_IRQn);

	// unhalt the SCT by clearing bit 2 of the unified CTRL register
	LPC_SCT->CTRL_U &= ~(1 << 2);

    // Force the counter to be placed into memory
//    volatile static int i = 0 ;
    // Enter an infinite loop, just incrementing a counter
    while(1) {
//        for (i=0;i<100000;i++);
    }
    return 0 ;
}

先のコードに対して、Switch Matrixの設定を、main()関数の冒頭部分に書き加えた。Switch Matrixの設定をどの様に行なうかは、User Manualを参照。これで、トグルモードも、レッスン修了。

次に、普通のPWMのモード。様々なデューティー比を取れるようにしてみる。
2013-12-16-rsm3.png
今度は、MATCH0/MATCH1という、2つのマッチを設定し、それぞれタイマー値がmaxcountもしくはmaxcount/2になる場合と設定した。MATCH0では出力をLに、MATCH1では出力をHにする設定。MATCH1でマッチする値を書き換えれば、デューティー比を変更することが出来る。main.cは、上記と同じ物。これもうまく動いたので、LPC810で無事にPWMを使えるようになったようだ。

最後に、普通のPWMでは出来ない、応用編を。タイマーの1サイクルの間に、LHLHと、2回ブリンクする様にしてみた。
2013-12-16-rsm4.png
MATCH0-3はそれぞれ、maxcount, maxcount/4, maxcount/2, maxcount*3/4でのマッチに設定し、L, H, L, Hと出力を切換えるようにした。これも無事に動作確認できた。

LPC810、面白いね。ここに書いた方法で、NTSCビデオのsyncシグナル部分を作成する予定。うまく行けば、32x24文字出力・PS/2キーボード入力のコンソールが、DIP-8の石一つで出来そうだ。]]>
LPC https://www.rad51.net/blog/mycom/?itemid=891 Mon, 16 Dec 2013 18:38:02 PST ITEM891_20131216
LPC810を使ってみた。 https://www.rad51.net/blog/mycom/?itemid=890 NXP セミコンダクターのLPC810は、32ビットのARM Cortex-M0+を搭載しながらも、DIP-8パッケージという、一風変わった石である。小規模の回路を作成するのに面白そうなので、使ってみようと思う。一つ前の記事でも紹介したが、SCT(State Configurable Timer)という、高機能なPWMが面白そうである。

以前から興味を持っていたのだが、各種ディーラーでも、NXPでも在庫が無い状況がずっと続いていたが、近日入荷されたので、早速購入してみた。

2013-12-08-IMG_0390s.jpgDigi-Keyから、5個購入した。
2013-12-08-IMG_0391s.jpg2013-12-08-IMG_0392s.jpg


LPC812-LPCXpresso Board等を使うと石へのプログラムの書き込みだけでなくデバッグも出来るようである(参考)。他方、シリアルインターフェースを用いてのプログラムの書き込み方法が、紹介されている(参考)。8ピンの石でデバッグも何もないだろうと考えたので、LPCXpressoを購入する前に、まずシリアルでの書き込みからやってみることにした。気に入れば、LPC812なども今後使うだろうし、その時にLPCXpressoを買えばいい。

手元にPIC18F14K50と12 MHzの水晶、16ピンのZIFソケットなどがあったので、LPC810専用の書き込み機を作成。
2013-12-08-IMG_0394s.jpg
PIC18F14K50は、USBをシリアルインターフェースに変換するだけの簡単な動作。プログラムは誰か公開しているだろうとGoogle検索すると、こちらのページで見つけたので、使わせて頂いた。回路は簡単な物で、18F14K50とLPC810との間を100 Ωの抵抗で接続し、3.3 Vの定電圧電源をスイッチを介して繋げてあるだけなので、回路図は割愛。

開発環境は、LPCXpresso IDEを利用した。インストールやアクティべーションなどについては、こちらを参照。石への書き込みは、FLash Magicを用いている。Flash Magicを利用する場合はhexファイルが必要であるが、こちらのサイトを参考にして、ビルドする際にhexファイルも同時に作成されるようにしておくと便利である。なお、リンク先のページでは「arm-none-eabi-objcopy -O ihex "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.hex"; 」を最後に追加するように説明しているが、私の環境では、最後ではなく最初に追加しないと、hexファイルが作成されなかった。

あちらこちらで紹介されているLEDブリンキング(Lチカ)プログラムは、タイマーと割り込みなどを使った少し複雑な物がほとんどであったので、もう少しprimitiveな物を作成してみた。

LPCXpresso IDEの操作方法としては、

 1)空のworkspaceを作成。
 2)"Import project(s)"で、CMSIS_CORE_LPC8xxをインポート。
 3)"New project..."で、LPC810用の新規プロジェクトを、"C project"として作成(CRP (Code Read Protect)とMTB(Micro Trace Buffer)は使用しない設定で)。
 4)crp.cとmtb.cは使用しないので削除。
 5)main.cを編集。
 6)"Release"でビルド。

の順で行なった。main.cのソースコードは、次の通り。
#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include <cr_section_macros.h>

int main(void) {

    LPC_GPIO_PORT->DIR0 |= (1<<0); // PIO0_0: output

    // Force the counter to be placed into memory
    volatile static int i = 0 ;
    // Enter an infinite loop, just incrementing a counter
    while(1) {
        for (i=0;i<100000;i++);
        LPC_GPIO_PORT->NOT0 = 1<<0; // Toggle PIO0_0
    }
    return 0 ;
}

Flash Magicで石への書き込みを行なって実行すると、次のように。


うまく行った。色々遊べそうである。

なお、LPC8xxでのプログラミングについては、tomo_watanabeさんのブログ、「人と技術のマッシュアップ」の「LPCXpressoとLPC800-MAXでマイコンを学ぶ」というシリーズが詳しく、色々と参考になる。]]>
LPC https://www.rad51.net/blog/mycom/?itemid=890 Sun, 08 Dec 2013 21:56:51 PST ITEM890_20131208
LPCXpresso IDEのRed State Machine file generatorを使ってみた https://www.rad51.net/blog/mycom/?itemid=889  ・ 複数のPWMを制御
 ・ dead-timeコントロール付きのPWM
 ・ reset-capability付きのPWM
 ・ その他、今までのPWMでは出来なかった設定

一度設定すれば、CPUからの制御無しに、それ自身で動作を続ける。また、割り込みを掛けることも可能である。

一つの石あたり、32ビットのタイマーが一つ用意されている。また、2つの16ビットのタイマーとして使うことも出来るようだ。クロックは、内部及び外部からの両方が使用可能。基本的に、up-counterであるが、up/downを交互に行なうモードもあるらしい。

SCTには、"state"という概念があって、これで色々制御しているようである。次のイベントが用意されている。
 ・ counter match condition
 ・ input/output condition
 ・ 上記2つのコンビネーション(指定のstateにおいて)
 ・ count direction

個々のイベントでは、次のことが制御可能だ。
 ・ outputs
 ・ interrupts
 ・ states

ただし、
 ・ "Match register 0"というイベントは、automatic limitとして利用可能。
 ・ up/downカウンターとして使用している場合、そのdirectionごとにイベント設定が可能。
 ・ Matchイベントは、特定のイベントが起こるまで止めておくことが可能。

それぞれの設定は、次の個数だけ設けることが出来る。
 ・ 4 inputs
 ・ 4 outputs
 ・ 5 match/capture registers
 ・ 6 events
 ・ 2 states

このSCTという機能は、多種多彩な制御が出来る一方で、その複雑さ故に設定の方法は難易度が高くなっている。これを容易に行なう為のツールとして、LPCXpresso IDE内に、"Red State Machine file generator"という、GUIによる設定ツールが設けられているので、試してみた。

SCT用にCookbookとチュートリアルが用意されているので、それを参考に、基本となるSCT_blinky_irqというサンプルプログラムと同じコードを作成することを試みた。これは、一定周期ごとに割り込みを掛けるためのコードである。

最初、Cookbookを読んだだけではRed Stateの使い方が全く分からなかったが、support.code-red-tech.comで用意されているPDFファイルを元に、試行錯誤で操作してみた。結果として、ソースコードを直接編集することでSCTの使い方をマスターするよりも、このGUIの使い方をマスターする方が速かったように感じる。以下、自分用のメモとして、このツールの使い方をまとめておく。なお、使用したLPCXpressoのバージョンは、6.1.0である。

まず、LPCXpressoを起動し、SCTを利用したいworkspaceにおいて、"File->New->Other"を選択する。
2013-12-03-1.png

ウィザードで、"Red State Machine file generator"を選択する。
>div style="text-align: center"<>/div<

適当なファイル名を付ける(ここでは、rstestとした)。
2013-12-03-3.png

"Choose Target"ボタンから、利用する石を選択する(ここでは、LPC810)。
2013-12-03-4.png

2013-12-03-5.png

2013-12-03-6.png

最後に"Finish"を押すと、このような画面になり、"rstest.rsm"がソースに追加された。

中央部分は下のようになるが、これらのうち"U_ALWAYS"は使用しないので、右クリックから"Delete"を選択して、削除する。
2013-12-03-8.png

ここから先は、"Input"をシグナルとして選択し、そのシグナルを受けたときにどの様なアクションを"Output"に出力するかという概念で、設定してゆく。

まず、Inputから。ここでは、タイマーのカウント値がある値(maxcount)になった際にイベントが起こるように設定する。"Inputs for State Machine"タブの"+"アイコン(Add Input)をクリックすると、"input1"という名で項目が追加される。"a|"アイコン(Rename)をクリックした後に"maxcount"と打ち込む。右の"Source"の欄を、カウンターの上限値(ここでは1000)に設定する。"Type"の欄は、"const int"のままにしておく。
2013-12-03-9.png

2013-12-03-10.png

2013-12-03-11.png

つぎに、カウンター値がこの値にマッチすることを入力として定義する。"+"アイコンをクリックして新規の項目を作成し、"Type"の欄を"Match Unified"に設定し、"Source"に"maxcount"を設定する。
2013-12-03-12.png

2013-12-03-13.png

つぎに、このMATCH0入力をシグナルとして定義する。"Signals"タブにおいて、"+"アイコンを押して新規の項目を設定し、名前を"MATCH0"に変更する。下の"(none):change to click"の所を右クリックし、"Input->MATCH0"を選択する。
>div style="text-align: center"<>/div<

2013-12-03-15.png

2013-12-03-16.png

中央の"rstest.rsm"タブの少し左、"Transition"を選択する。中央の画面中でマウスを操作し、U_ENTRYから出た矢印がU_ENTRYに戻るように、設定する。
>div style="text-align: center"<>/div<

2013-12-03-18.png

"(no signal)/(no action)"と赤で表示されたところを右クリックし、"Set Signal->MATCH0"を選択する。
2013-12-03-19.png

2013-12-03-20.png

ここからは、Outputの処理。"Outputs for State Machine"タブにおいて、一番下までスクロールし、"IRQname"を"SCT_IRQ"に変更する。
2013-12-03-21.png
2013-12-03-22.png

中央画面で、"MATCH0/(no action)"となっているところ、右クリックで"Add action->CALL->Limit unified counter"を選択する。
2013-12-03-23.png

"Action list"タブに"action1"が追加されているので、名前を"event0"に変更する。
2013-12-03-24.png

2013-12-03-25.png

"Action list"タブの下の方を右クリックして、"Call->SCT_IRQ"を選択する。
2013-12-03-26.png

これで、中央に表示される漫画が、CookbookのSCT_blinky_irqでのそれと同じになった。
2013-12-03-27.png

"State Table"タブにある"Generate Code"をクリックすると、sct_fsm.smd/sct_fsm.c/sct_fsm.h/sct_user.hの4つのファイルが作成された。
2013-12-03-28.png

2013-12-03-29.png

sct_fsm.cの内容はCookbookのSCT_blinky_irqの項で紹介されている物と同じになったので、上記で述べた操作方法は正しかったと思われる。割り込みについては、別途void SCT_IRQHandler (void) { }を記述すればよいようだ。]]>
LPC https://www.rad51.net/blog/mycom/?itemid=889 Tue, 03 Dec 2013 16:39:08 PST ITEM889_20131203