MSP430入門セミナーのお土産の話 [MSP430]
セミナーの内容自体は、MSP430の特徴と、今後の製品展開で、時間も短いですし、まあ本当の入門と言った所です。
もう少し詳しい話が聞きたいなら、年末辺りで予定されているアドバンスド・テクニカル・カンファレンスに参加して下さいとの事です。こっちは有料でしたっけ。
お土産は、ez430開発ツールと、公示されていた容量性タッチパッドです。
しかしこのタッチパッド、それだけではなく、LEDをフォトダイオードとして使う事で明るさのセンサーとなり、暗くなったらLEDを点灯させるデモも実現可能です。写真はそのデモを動かしている所ですが、写真ではさっぱり判りませんね。
LEDをフォトダイオードとして利用する例は、どっかのWEBページで随分前に見ましたが、このデモの場合、ΔΣ A/Dを使う事で外付け部品を殆ど排除できている所が、らしくて良いですね。
※まあフリースケールもそうですが、T.I.も本国のサイトから入手できるサンプルプログラムがよく出来ていて、これを見るだけでもプログラミングの参考になりますな。
これでコメントを日本語に直した物が有れば。
8月1日某所にて [MSP430]
某セミナーに申し込んでしまいました。
http://www.tij.co.jp/jcm/msp430/msp430day2007/index.htm#place
午前の部です。午後は締め切られていますね。
※何か見たい物が有ったら、リクエストどうぞ。
今更気付いた話ですが、、、 [MSP430]
MSP430のTimerAには、割り込み要因によってベクタージャンプできる機能が有るのね。
; TACCR0 CCIFG の割り込みハンドラ サイクル CCIFG_0_HND ; ... ; ハンドラの開始- 割り込み遅延 6 RETI 5 ; TAIFG、TACCR1 と TACCR2 の CCIFG の割り込みハンドラ TA_HND ... ; 割り込み遅延 6 ADD &TAIV,PC ; オフセットをJump(移動)テーブルに追加 3 RETI ; ベクタ 0: 割り込みなし 5 JMP CCIFG_1_HND ; ベクタ 2:TACCR1 2 JMP CCIFG_2_HND ; ベクタ 4:TACCR2 2 RETI ; ベクタ 6: 予約済み 5 RETI ; ベクタ 8: 予約済み 5 TAIFG_HND ; ベクタ 10:TAIFG フラグ ... ; タスクはここから開始 RETI 5 CCIFG_2_HND ; ベクタ 4:TACCR2 ... ; タスクはここから開始 RETI ; メイン・プログラムに復帰する 5 CCIFG_1_HND ; ベクタ 2:TACCR1 ... ; タスクはここから開始 RETI ; メイン・プログラムに復帰する 5
とまあアセンブラでの記述例は有るんですが、C言語はどうするんだ?。
マルツでDIP版MSP430F20xxベースボードの発売開始です。やっと出た。 [MSP430]
出ましたよ、やっと出ました。
MSP430F2012とかMSP430F2013のDIP版を購入された方、これから購入する方、簡単に評価ができるユニバーサル領域付きベースボードです。
http://www.marutsu.co.jp/user/shohin.php?p=40016
開発にはMSP430CQの開発に使用したパラレルのデバックツール(WEBには無いけれど、店舗にはまだ在庫が有りました)が使えます。
勿論ez430も使えます。ついでにマルツでもez430-F2013の取り扱いが始まっていますので、同時に購入されると良いかも知れません。
※店舗での取り扱いは週末になるそうです。
但し、ez430で開発するには1.27mmピッチのコネクタからの引き出しを何とかせねばなりません。
なんとかならないか問い合わせ中ですが、難しいみたいです。
※この基板のCN1は、ez430-F2013の先っちょ(ターゲット)基板のあの穴の信号線に合わせてあるんですよ。だからDIPマイコンを用意しなくとも、さきっちょ基板をこの基板にマウントする事も可能です。その時は実装方向に注意してね。
P板.COM登録ユーザー1万人(本当か?)突破記念企画 [MSP430]
※間違えた!P板.COMの方が1万人突破だった。
突破と言う事らしいので、記念にCADLUSで作成したMSP430F22xxを評価できる基板のデータを無償配布したいと思います。
勿論アットマークエレの登録ユーザーでないとデータを取得できません。
MSP430F22xxシリーズのTSOPタイプのチップを基板上に実装でき、すっぱいばいわいやーでデバックが出来ます。
基板外形は、ジャスト40pin DIPサイズです。ICソケットの入手も容易ですし、使い易いサイズだと思います。
搭載部品は各自手配して下さい。お任せします。でも、若干のアドバイスはできます。
回路図は、このblogには回路図をアップする方法が無いので、連絡ください。
CADLUS XまたはCADLUS ONEを用意すれば、このデータを見る事ができます。
別にCADLUSで見なくとも、P板の注文フォームでこのデータを登録すれば、基板が出来てしまいます。
別の両面板を注文する時、ついでに異種面付けしてもらうと良いのかもしれない。
適用は評価のみでお願いします。営利目的での利用はお断りしています。
データの著作権の放棄はしません。
何らかの問題が有っても、責任は勿論持てません。各自、自分の責任で作成、動作させて下さい。
大雑把に案内を書いていますが、不明点はコメント欄にでも書いてください。
近況 [MSP430]
blogの更新が滞っていますが、死んでいる訳ではありません。でも、やるべき事が多過ぎて、連日寝るのは深夜の1時、2時です。
とりあえず写真の基板がマルツさんから発売される予定です。担当のYさん、もう少し密に連絡ちょうだい(・_・。)) 。
おっ!、下に写っている本は版が上がります。ちょびっとだけれど修正が入ります。
修正内容は、ここにも書かないといけませんね。
CQ出版のエレクトロニクスセミナーに参加して来ました。いや正確に言うと、参加させてもらった!です。
松井先生の講座に行きました。
良いですねー、松井先生の講座は楽しくて、そして、「よし、アナログやっちゃうぞ!」って気になります。お金払っても行きたくなる、そんな講座です。もっとも今回はA/Dコンバータの話ですけれど。
しかし、すんごい昔にアナデバのセミナーで松井先生をお見受けしましたが、久しぶりに受けてみると、、、変わらん、昔と同じ雰囲気だ!。
そうそう、東芝のガリウム・砒素のホール素子を開発したのが、松井先生だったんですね。
今このホール素子を使っています。意外と繋がりが有ったんですね。
松井先生の本。
センサ活用141の実践ノウハウ―実物写真と動作回路で素子の使い方を理解する
- 作者: 松井 邦彦
- 出版社/メーカー: CQ出版
- 発売日: 2001/05
- メディア: 単行本
センサ応用回路の設計・製作―実戦のための応用ノウハウを身につけよう
- 作者: 松井 邦彦
- 出版社/メーカー: CQ出版
- 発売日: 1990/05
- メディア: 単行本
OPアンプ活用100の実践ノウハウ―最善の性能を引き出す選択と活用のすべて
- 作者: 松井 邦彦
- 出版社/メーカー: CQ出版
- 発売日: 1998/12
- メディア: 単行本(ソフトカバー)
パスワールドさんのMSP430開発キットに+1000円でエミュレータが付いてくる? [MSP430]
http://passworld.co.jp/index.php?lang=JP&lieu=Sorobanの中の
PW-SB-169-PIF:Soroban dev. kit with parallel emulator 29900円
がそうです。
ソロバンキット単体では28900円なので、1000円で開発ツールが付属する事となります。
> 納期はTIの在庫により変わる事があります。
と言う事はT.I.純正ツール?。
※USBタイプのエミュレータセットも有ります。
※101×64のLCDではなく、諧調表現可能なLCDの方の発売が待たれていますが、コネクタの手配関係?のトラブルで発売が遅れているようです。もう暫く待ちましょう。
※以下のリンクもクリックしてみて
http://focus.ti.com/general/docs/thirdparty/companydetailaction.tsp?supplierId=1346
MSP430-CQベースボード をQ-STEERリモコンとして使う [MSP430]
WEBショップの販売ページはこちら
WEBショップでの扱いがまだなので、どうにもこうにも詳しい販売状況が判らない(※上のリンクから購入できます。)のですが、まあ今まで通り基板単体での発売となっているでしょうから、MSP430を使ってまた新たな事にチャレンジしたい方にはピッタリなんではないでしょうか。価格も今まで通りかな?。CPUボードは手持ちの物を使い回せば良いですし、なんだったらまだCQ出版には在庫有りますので、お近くの書店での取り寄せも可能でしょう。
紹介するのは、Q-STEERに限らず、赤外線リモコンとして遊んでみたい時の話です。
この場合、基板上の全部の部品を実装する必要は無く、一部の部品のみで実現できますので、リーズナブルに遊ぶ事が出来ます。
基本的にCPUボードをマウントする為のヘッダー関係は必要です。12pinのヘッダーはなかなか見つかりませんので、6pinシングルライン×2でやるか、この写真の様に14pinヘッダーの足2本をニッパで除去しても使えます。
それに、デバックコネクタとして14pinヘッダーは必要ですね。この写真の様にボックスヘッダーならば、ソケットの誤挿入を防止できますが、「俺は絶対誤挿入しないぜ!」と言う方は、ボックスヘッダーではない方が安かったり、手持ちで有ったりしますので、まあお任せします。 基板を設計する立場としては、誤挿入や周囲部品の干渉を考慮する為に、抜き差しを頻繁に行う所にはボックスコネクタを前提として設計しています。 電源スイッチやコンデンサの類も実装して下さい。 |
|
従来回路のPNP、NPNトランジスタによるプッシュ/プル回路でもLEDの点滅は可能ですが、流せる電流が小さくなってしまいますので、ここは2SA1015の様なPNPトランジスタのみで回路を構成しています。
ただし、シルクの通りには実装できませんので、TR7、TR8の間を跨ぐ様に実装して下さい。例えば2SA1015ならば、エミッタをTR7のコレクタの位置に、コレクタをTR8のエミッタの位置に、ベースをTR8のベースの位置に差し込みます。
まるで映画の宇宙戦争で出て来るトライポッドみたいな事になっていますが、これで流せる電流を増やす事ができます。
R25の抵抗は電流制限抵抗なので、30Ωから50Ω程度の抵抗を実装します。LED5、LED6には赤外線LEDを実装します。新品を買ってもそれ程高くはないのですが、不要なテレビのリモコンから再利用するとかでも良いかも知れません。 |
|
コントロールにスイッチを使用しますので、R17~R24までの抵抗は必要です。並列に付いているLED1~LED4は実装してもしなくても、どっちでも良いです。R17とR18、R19とR22、R20とR23、R21とR24は直列抵抗となっていますので、合成抵抗が10KΩ程度に成るように抵抗を選ぶと良いでしょう。
R10は赤外線LEDを駆動するトランジスタのベースに接続されますので、1K程度の抵抗を実装します。 基板の一番下に並んでいるタクトスイッチも必要です。 パスカルさんの所のLCDを使用するならば、シングルラインpinヘッダーまたはソケットを実装しておきます。 |
|
タカチのケースを使っても良いですが、あれ高いですから、そんな時は半田面側にコイン電池フォルダーを搭載可能です。コイン電池だと電池の内部抵抗が大きく、LEDを点灯させると電源電圧が落ちてしまいますが、それでもこのマイコンは問題無く動いています。流石ですね。 |
大体この程度の部品の実装で赤外線リモコンを実現できます。
Q-STEERなら、工作しても、プログラミングしても、動かしても楽しめますので、お子さんのマイコン教育に如何ですか。空飛ぶ方にも使えるかもしれません。お勧めです。
※スイッチが4つしか無いのでダッシュボタンが有りません。スイッチの組み合わせを工夫して実現してみて。
まずはこれが無いと
Qステア QSS03 インプレッサWRXスターターセット (A/B)
- 出版社/メーカー: タカラ
- メディア: おもちゃ&ホビー
MSP430-CQベースボード やっと販売か! [MSP430]
WEBショップの販売ページはこちら
やっと販売か~~~、秋葉原なんて月一でも行かないし、いつまでもWEBショップのステータスはエラーだし(※上のリンクから購入できます。)、販売したよ!と言う連絡も来ないし。どーなっちゃっているのか?と気を揉んでいた訳です 。
良かった、良かった。
追加機能の改造ポイント等は、後程記事にします。
今回の基板も製造分売切れてくれれば、またちょろっと機能追加を考えてみたいですね。あと周辺も考えねば。
何かリクエスト有ります?。
それと、グラフィックLCDやQ-STEERを試してみたい人はご連絡ください。
残念ながらLCDのドライバーはパスカルさんの物なので公開できないのですが、それ以外の私オリジナルな所は提供できます。
グラフィックや漢字のCソース変換ツールなんかも有ります。
パスワールドさん
http://passworld.co.jp/
※何故かごださんの所にトラックバックできん。
MSP430CQ-ベースボード Mk2 登場 [MSP430]
MSP430CQ-ベースボードは、マルツ(http://www.marutsu.co.jp/)で購入できます。
初期バージョンの売り切れ(現在WEBショップではベースボードの購入が出来なくなっております。)に伴い、新しいバージョンの発売が開始されます。
新しいベースボードは、不足していた抵抗の追加と、写真の様にグラフィックLCD、赤外線(でなくとも良いけれどね)LEDの搭載が可能となっています。
既存のバージョンをお持ちの方も、是非新しいベースボードを購入してみてください。マイコンボードは流用して、それでまた新しいハードウエアを作ってみては如何でしょう。
以下は、LCDコントロールライブラリを除く、作成したプログラムです。
/************************************************************/
/* F4270でQ-STEERの制御を試みるプログラム */
/* designed by hamayan from 2007/05/21 */
/************************************************************/
#include "msp430x42x0.h"
#include "iodefine.h"
#include "PW10164LCD.h"
#include "GPIOSPI.h"
#include "Graphic2013.h"
#define _MCLK_ (6023529UL) /*6023529*/
#define _SAMPLING_FREQ_ (38000UL)
#define BAND_A 0x00
#define BAND_B 0x01
#define BAND_C 0x02
#define BAND_D 0x03
#define SEPP P1_O.BIT.B3 /*またはTA2出力*/
#define FOWARD_SW P2_I.BIT.B0 /*前進*/
#define REVERSE_SW P2_I.BIT.B1 /*後退*/
#define LEFT_SW P1_I.BIT.B2 /*左折*/
#define RIGHT_SW P1_I.BIT.B0 /*右折*/
/************************************************************/
/* プロタイプ宣言 */
/************************************************************/
static void header_out( void );
static void two_bit_out( int data );
static void Ctrl( unsigned char code );
void ClearDisplay( void );
void PWDisplayInit( void );
void GPIOSPISendBuffer( unsigned char* buffer, size_t length );
/************************************************************/
/* 大域変数の皆さん */
/************************************************************/
extern const long K_F_PixWidth;
extern const long K_F_PixHeight;
extern const unsigned char K_F_GraphicBMPTable[];
extern const long K_R_PixWidth;
extern const long K_R_PixHeight;
extern const unsigned char K_R_GraphicBMPTable[];
extern const long K_Ri_PixWidth;
extern const long K_Ri_PixHeight;
extern const unsigned char K_Ri_GraphicBMPTable[];
extern const long K_L_PixWidth;
extern const long K_L_PixHeight;
extern const unsigned char K_L_GraphicBMPTable[];
extern const long A_F_PixWidth;
extern const long A_F_PixHeight;
extern const unsigned char A_F_GraphicBMPTable[];
extern const long A_R_PixWidth;
extern const long A_R_PixHeight;
extern const unsigned char A_R_GraphicBMPTable[];
extern const long A_FR_PixWidth;
extern const long A_FR_PixHeight;
extern const unsigned char A_FR_GraphicBMPTable[];
extern const long A_RR_PixWidth;
extern const long A_RR_PixHeight;
extern const unsigned char A_RR_GraphicBMPTable[];
extern const long A_RL_PixWidth;
extern const long A_RL_PixHeight;
extern const unsigned char A_RL_GraphicBMPTable[];
extern const long A_FL_PixWidth;
extern const long A_FL_PixHeight;
extern const unsigned char A_FL_GraphicBMPTable[];
extern const long STP_PixWidth;
extern const long STP_PixHeight;
extern const unsigned char STP_GraphicBMPTable[];
unsigned int period;
enum CTRL {RESERV,FOWARD,REVERSE,TURN_L,TURN_R,DASH_FOWARD,F_AND_L,F_AND_R,
DASH_F_AND_L,DASH_F_AND_R,R_AND_L,R_AND_R,DASH_REVERSE,DASH_R_AND_L,DASH_R_AND_R,STOP};
const unsigned char drive_pattern[] =
{
STOP,TURN_R,TURN_L,RESERV, //block0
FOWARD,F_AND_R,F_AND_L,RESERV, //block1
REVERSE,R_AND_R,R_AND_L,RESERV, //block2
RESERV,RESERV,RESERV,RESERV, //block3
RESERV,RESERV,RESERV,RESERV, //block4
DASH_FOWARD,DASH_F_AND_R,DASH_F_AND_L,RESERV, //block5
DASH_REVERSE,DASH_R_AND_R,DASH_R_AND_L,RESERV, //block6
/* RESERV,RESERV,RESERV,RESERV,*/ //block7
};
/************************************************************/
/* 記号表示 */
/************************************************************/
static void MarkDisplay( unsigned char *bmp, long w, int x, int y )
{
LCD_CS = 0;
MoveTo( x, y );
GPIOSPISendBuffer( bmp + (0 * 1 * 8), 16 );
MoveTo( x, y + 1 );
GPIOSPISendBuffer( bmp + (1 * 1 * 16), 16 );
LCD_CS = 1;
}
static void AllowDisplay( unsigned char *bmp, long w, int x, int y )
{
int i;
LCD_CS = 0;
for( i = 0; i < 6; i++ )
{
MoveTo( x, y + i );
GPIOSPISendBuffer( bmp + (i * 1 * 48), 48 );
}
LCD_CS = 1;
}
/* 前進表示 */
#define K_F_Display(x,y) MarkDisplay( (unsigned char *)K_F_GraphicBMPTable, K_F_PixWidth, x, y )
/* 後進表示 */
#define K_R_Display(x,y) MarkDisplay( (unsigned char *)K_R_GraphicBMPTable, K_R_PixWidth, x, y )
/* 左表示 */
#define K_L_Display(x,y) MarkDisplay( (unsigned char *)K_L_GraphicBMPTable, K_L_PixWidth, x, y )
/* 右表示 */
#define K_Ri_Display(x,y) MarkDisplay( (unsigned char *)K_Ri_GraphicBMPTable, K_Ri_PixWidth, x, y )
/* 方向表示 */
#define A_F_Display(x,y) AllowDisplay( (unsigned char *)A_F_GraphicBMPTable, A_F_PixWidth, x, y )
#define A_R_Display(x,y) AllowDisplay( (unsigned char *)A_R_GraphicBMPTable, A_R_PixWidth, x, y )
#define A_FR_Display(x,y) AllowDisplay( (unsigned char *)A_FR_GraphicBMPTable, A_FR_PixWidth, x, y )
#define A_RR_Display(x,y) AllowDisplay( (unsigned char *)A_RR_GraphicBMPTable, A_RR_PixWidth, x, y )
#define A_RL_Display(x,y) AllowDisplay( (unsigned char *)A_RL_GraphicBMPTable, A_RL_PixWidth, x, y )
#define A_FL_Display(x,y) AllowDisplay( (unsigned char *)A_FL_GraphicBMPTable, A_FL_PixWidth, x, y )
#define STP_Display(x,y) AllowDisplay( (unsigned char *)STP_GraphicBMPTable, STP_PixWidth, x, y )
/************************************************************/
/* プログラムmain */
/************************************************************/
void main( void )
{
int mode;
WDT_CTL.WORD = WDTPW + WDTHOLD; // WDTの停止
SCFQCTL = 92 - 1; // 変調器はディスエーブル、MCLK = 92 * ACLK * 2 = 6.02MHz, D = 2、6029312Hz
FLL_CTL0 = DCOPLUS + XCAP18PF; // DCOPLUS = 1, 水晶容量負荷は18pF
SCFI0 = FLLD_2 + FN_2; // D = 2, fDCOCLK = 2.2-17Mhz
InitGPIOSPI();
LCD_CS = 0;
PWDisplayInit();
ClearDisplay();
LCD_CS = 1;
K_F_Display(4 , 6);
K_R_Display(25 ,6);
K_L_Display(25 + 25 ,6);
K_Ri_Display(25 + 25 + 25 ,6);
/*入出力ポートの初期化*/
P1_D.BIT.B0 = 0; //p1_0を入力に設定
P1_D.BIT.B2 = 0; //p1_2を入力に設定
P2_D.BIT.B0 = 0; //p2_0を入力に設定
P2_D.BIT.B1 = 0; //p2_1を入力に設定
P1_D.BIT.B3 = 1; //p1_3を出力に設定
P1_O.BIT.B3 = 1; //p1_3を出力に設定
P1_SEL.BIT.B3 = 1; //p1_3を周辺ペリフェラルで使用する
//Timer A3の設定
TACCR0 = (_MCLK_ / 1 / _SAMPLING_FREQ_) - 1;
TACCR2 = TACCR0 / 2;
TA_CTL.BIT.SSEL = 2; //SMCLKを選択
TA_CTL.BIT.MC = 1; //UPモード、終わりはCCR0
TA_CCTL0.WORD = 0x0000; //コンペアマッチ割り込み無し
TA_CCTL2.WORD = 0x0060; //TA2 セット、リセット動作
WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTIS1; // Interval timer
IE1 |= WDTIE; // Enable WDT interrupt
while( 1 )
{
//スイッチのサンプリングを行う
if( FOWARD_SW == 0 ) //前進
mode = 0x04;
else if( REVERSE_SW == 0 ) //後退
mode = 0x08;
else
mode = 0;
if( RIGHT_SW == 0 ) //右折
mode |= 0x01;
else if( LEFT_SW == 0 ) //左折
mode |= 0x02;
else ;
if( mode & 0x04 )
{
if( mode & 0x01 )
{
A_FR_Display(26,0);
}
else if( mode & 0x02 )
{
A_FL_Display(26,0);
}
else
{
A_F_Display(26,0);
}
}
else if( mode & 0x08 )
{
if( mode & 0x01 )
{
A_RR_Display(26,0);
}
else if( mode & 0x02 )
{
A_RL_Display(26,0);
}
else
{
A_R_Display(26,0);
}
}
else
{
STP_Display(26,0);
}
Ctrl( drive_pattern[ mode ] );
}
}
/************************************************************/
/* WDTインターバルタイマ割込みサービスルーチン */
/* 425μs / 5(2353 * 5Hz)周期のインターバル */
/************************************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
static int loops = 0;
if( ++loops >= 5 )
{
period++;
loops = 0;
_BIC_SR_IRQ(LPM0_bits); // Clear LPM1 bits from 0(SR)
}
}
/************************************************************/
/* ヘッダー出力 */
/************************************************************/
static void header_out( void )
{
int i;
for( i = 0; i < 5; i++ )
{
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
P1_SEL.BIT.B3 = 1; //発振出力
}
P1_SEL.BIT.B3 = 0; //発振停止
}
/************************************************************/
/* 2bit出力 */
/************************************************************/
static void two_bit_out( int data )
{
int i;
for( i = 0; i < 2; i++ )
{
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
P1_SEL.BIT.B3 = 1; //発振出力
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
if( data & 0x02 )
{
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
}
P1_SEL.BIT.B3 = 0; //発振停止
data <<= 1;
}
}
/************************************************************/
/* 制御出力 */
/************************************************************/
static void Ctrl( unsigned char code )
{
unsigned int next;
static const unsigned char interval[] = {19 - 1,47 - 1,75 - 1,103 - 1};
period = 0;
header_out();
two_bit_out( BAND_A );
two_bit_out( code >> 2 );
two_bit_out( code );
next = period + interval[ BAND_A ];
do
{
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
} while( period < next );
header_out();
two_bit_out( BAND_A );
two_bit_out( code >> 2 );
two_bit_out( code );
do
{
_BIS_SR(LPM0_bits + GIE); // LPM1に入る, 周辺モジュール割込み許可
} while( period <= 238 );
}
/************************************************************/
/* designed by hamayan since 2007/05/21 */
/************************************************************/