/*----------------------------------------------------------------------*/ /* Shisaku Kentou 2 for V720S RFID module sample program for V720 Lib. */ /* Author : Makoto Katsukura -> Renewal : Hyunjong Kim */ /* DATE : 2004/11/18(1st) -> 2006/11/16(2nd) */ /* */ /* -> Date : 2007/10/13 Renewal : Jumpei Nishizaki */ /* */ /* プログラム全てを理解する必要はありません。全体をざっと眺めて */ /* だいたいどの関数で何を行っているかを把握する程度で構いません。 */ /* RFIDはSS2でとても重要な役目を果たします。試作検討でその使い方 */ /* を理解してください */ /*----------------------------------------------------------------------*/ /* ─────────────────────────────────── Pragma Instructions ─────────────────────────────────── */ #include #include "sfr26.h" #include "v720s.h" #include "sleep.h" #include "LCDfunc.h" #include "nosprintf.h" // プロトタイプ宣言 //使わない関数についても記述する必要がある void ta1int( void ); //タイマーA1割込み関数 void ta2int( void ); //タイマーA2割込み関数 void ta3int( void ); //タイマーA3割込み関数 void ta4int( void ); //タイマーA4割込み関数 void tb0int( void ); //タイマーB0割込み関数 void tb1int( void ); //タイマーB1割込み関数 void tb2int( void ); //タイマーB2割込み関数 void adint( void ); //AD変換割込み関数 void int0int( void ); //外部割込み0関数 void int1int( void ); //外部割込み1関数 void int3int( void ); //外部割込み3関数 void int4int( void ); //外部割込み4関数 void int5int( void ); //外部割込み5関数 void uart0traint( void ); //uart0送信完了割り込み void uart0recint( void ); //uart0受信完了割り込み void uart1traint( void ); //uart1送信完了割り込み void uart1recint( void ); //uart1受信完了割り込み //割り込みの宣言 //使わない割り込みも記述する必要がある #pragma INTERRUPT ta0int #pragma INTERRUPT ta1int #pragma INTERRUPT ta2int #pragma INTERRUPT ta3int #pragma INTERRUPT ta4int #pragma INTERRUPT tb0int #pragma INTERRUPT tb1int #pragma INTERRUPT tb2int #pragma INTERRUPT adint #pragma INTERRUPT int0int #pragma INTERRUPT int1int #pragma INTERRUPT int3int #pragma INTERRUPT int4int #pragma INTERRUPT int5int #pragma INTERRUPT uart0recint #pragma INTERRUPT uart0traint #pragma INTERRUPT uart1recint #pragma INTERRUPT uart1traint /* RFIDモジュールからのデータ受信の完了を知らせるフラグ (uart2_received)を使うためには書いてください*/ extern unsigned char uart2_received; /* コマンドを出してからv720s_getdataを出すまで1で,それ以外は0. v720s_busy=0の時はコマンドを受け付けてもいいこと*/ extern unsigned int v720s_busy; /*デバッガのウォッチリストで確認するためには, グローバル変数として定義しないと大変です*/ unsigned char mode = 0; int time_count = 20; /*次のコマンド送るまでの時間設定,default2秒*/ /* --------------------効率的なメモリ管理のため------------------------ V720Sは一度の書き込み命令で最大64文字を書き込むことができます。 それで試作検討としては最大文字が書き込めるように設定となり message[64],rfid_data[64]のたくさんのメモリを使います。 しかし実際にはフリースペース64文字を全部使うことはないと思いますので 使うときにはmessageの文字列変数の大きさを調整してください。 追加としてRFIDタグに書き込みなし、ただ位置情報だけ読む場合は 書き込み内容格納のmessageの変数は必要ではなく 読み込んだ内容を格納する変数rfid_data[4]だけ設定すれば メモリの節約ができます。 また読み込むデータはページ単位の文字数なので 1ページ4文字、つまりrfid_dataの配列は4の倍数になる必要があります。 rfid_data[4, 8, 12, 16 ....]。 文字列の最後にはNULL='\0'が必ず入ることに注意 -------------------------------------------------------------------- */ unsigned char message00[64]; /*バンク00Hメッセージ*/ unsigned char message01[64]; /*バンク01Hメッセージ*/ void main(void) { unsigned char rfid_data[64]; /*rfidから受信したデータを格納する変数*/ unsigned char debug[80]; /* 変数宣言部分  */ /* 各種エラーコード格納用の変数 */ int init_error_code; int send_error_code; int receive_error_code; int count=0; unsigned char mode=0x00; unsigned char send_flag = 0; LCD_init(); LCD_cls(); pd10 = 0x0f; // トルグスイッチの設定 /* タイマの設定 */ /* 使用するタイマはTA0 詳細はハードウェアマニュアルを確認してください. */ udf = 0x00; /* ダウンカウントに設定 */ /* タイマーA0モードレジスタ*/ ta0mr = 0x80; /* タイマ値の初期化 ダウンカウントなので.*/ ta0 = 62500-1; /* タイマ割り込みの設定*/ ta0ic = 0x06; /*タイマスタート */ tabsr |= 0x01; /* 割り込み許可 */ _asm( "\tFSET I"); /* Enable interrupt */ /* 初期化 */ init_error_code = v720s_init(); /* 書き込むメッセージの準備 */ /* 文字列のコピーは,C言語では,代入演算子 = を使ってもできません */ /* strcpy(), strcat()などの関数をしようします.*/ /* C言語の詳細については,柴田先生のページが非常に使いやすいです. */ /* http://www.bohyoh.com/ */ /*ここはフリースペースに書き込む文字列をmessage変数に入れます.*/ /*自由に変えて書き込み命令を出した後, 読み取りコマンドを使って確認してください*/ strcpy(message00, "R:3>1>2 D:029cm "); strcpy(message01, "R:1>2>3 D:500cm "); /* 今回の試作検討では,(time_count/10)秒に一回, 連続してコマンドを送信します */ /* send_flag はそのためのものです.*/ send_flag = 1; while(1) { /*---------------ここから送るコマンドの選択-------------------*/ ///////////////////////////////////////////////////////////////////////////// // Controlボードのトグルスイッチを切り替えることで様々なコマンドを // // モジュールに出します. // // このサンプルプログラムで使用するトグルスイッチはControlボードの // // SW_D、SW_C、SW_Bです。スイッチとコマンドの対応は次の通り // //-------------------------------------------------------------------------// // SW_D SW_C SW_B Mode Command // // 上    上   上 0x00 バンク00hにmessage00の内容を書き込む// // 上 上 下 0x20   バンク01hにmessage01の内容を書き込む// // 上 下 上 0x40   バンク00hのデータを読み出す // // 上 下 下 0x60   バンク01hのデータを読み出す // // 下 上 上 0x80   タグ固有のシリアルナンバーを読み出す// // 下 上 下 0xa0   ストップコマンド // ///////////////////////////////////////////////////////////////////////////// mode = p10&0xE0; if( send_flag && ( (mode==0xA0) || (v720s_busy==0) ) ) { switch(mode) { case 0x00: /*バンク00hに書き込み*/ send_error_code = v720s_putcmd_write(V720S_MODE_ST,V720S_BANK_00H,0,message00); break; case 0x20: /*バンク01hに書き込み*/ send_error_code = v720s_putcmd_write(V720S_MODE_ST,V720S_BANK_01H,0,message01); break; case 0x40: /*バンク00hの読み込み*/ send_error_code = v720s_putcmd_read(V720S_MODE_ST,V720S_BANK_00H,2,5); break; case 0x60: /*バンク01hの読み込み*/ send_error_code = v720s_putcmd_read(V720S_MODE_ST,V720S_BANK_01H,2,5); break; case 0x80: /*シリアルナンバーの読み込み*/ send_error_code = v720s_putcmd_serial(V720S_MODE_ST); break; case 0xa0:/*Repeatコマンド停止,FIFOの発信停止*/ send_error_code = v720s_putcmd_stop(); break; default: break; } /*それぞれのLib.の関数の引数は資料を参考してください. ここで交信モードの選択としてdefaultで  V720S_MODE_ST→Single Triggerとなっています. 一通り4つのコマンドをやってみて,理解したら  V720S_MODE_ST→V720S_MODE_FT(FIFO Trigger)に変えて Singleとの違う点を調べてください.*/ /*試作検討としてはSingle&FIFO Triggerモードだけの試しとなりますが, RFIDモジュールを使う予定の班は必ずAuto,Repeatモード,特に V720S_MODE_FR(FIFO Repeat)モードはやってみてください.*/ send_flag = 0; } /*uart2_received は,uart2ライブラリから提供されるグローバル変数で, 使用するためには,ソースの先頭に #extern int uart2_received と 書いてください。上の方で宣言していると思います。 リードライトモジュールからのデータが到着すると, これが1になります。結構時間(最大0.1秒ぐらい)がかかるので, こうやってmainループの中で,監視してあげてください */ /*また,結果を受信するまでは送信をしないように, send_flagなどで管理するようにしてください (今回の場合は,試作検討なので,そういうことはしていません)*/ /* v720s_getdata(rfid_data) のrfid_data は char型の配列です. 必ず,配列数が65以上でないといけません*/ /* よくわからないときは,ガンガン質問してください. */ if(uart2_received) { receive_error_code = v720s_getdata(rfid_data); /* これを呼ぶと,dataの中に,データを格納してくれます. */ strcpy(debug,"se=0000 re=0000 "); exc_itoa(&debug[6],send_error_code); exc_itoa(&debug[14],receive_error_code); /* 読み込んだデータをそのまま出力させる */ strcat(debug,rfid_data); /* ゲートの順番や距離情報を抽出するにはこっちを使うと便利 */ /* 数字でない文字を読もうとすると0が出力されるので注意*/ // strcat(debug,"NextGate:"); // itoa_cat(debug,atoi(&rfid_data[10]),3); /* LCDに出力させる */ LCD_cls(); LCD_locate(0,0,0,0); LCD_print_str(debug); } count ++; /* (time_count/10)秒に一回送信する */ if(count > time_count) { count = 0; send_flag = 1; } /* 待つ */ /* リアルタイムプログラミングの基本!*/ sleep(); } } /* 割り込み関係の関数 */ /* 各自,使うときによく読んでください */ void ta0int() { /* ここではレジスタの読み込み以外のことはしない */ /* 「レジスタをいじる」=「マイコンの入出力(I/O)を直接操作する」ということ*/ /* 共有メモリとレジスタの操作のみ */ /* main ループに戻って再びsleepする */ sleep_flag = 0; } void ta1int( void ) {} void ta2int( void ) {} void ta3int( void ) {} void ta4int( void ) {} void tb0int( void ) {} void tb1int( void ) {} void tb2int( void ) {} void adint( void ) {} void int0int( void ) {} void int1int( void ) {} void int3int( void ) {} void int4int( void ) {} void int5int( void ) {} void uart0traint( void ){} void uart0recint( void ){} void uart1traint( void ){} void uart1recint( void ){}