/***********************************************************************/ /* */ /* FILE :sample.c */ /* DATE :Mon, Sep 13, 2010 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :H8/36064 */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.16). */ /* */ /***********************************************************************/ #include #include "iodefine.h" void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif volatile int timer; // タイマカウント用変数 // デフォルトの設定は 5[ms]ごとにインクリメント // 長時間実行する場合はint 型のoverflowが起きる volatile char reset; // Quit signalのフラグ volatile int LED1flag; //LED1のON/OFFフラグ volatile int Buzzerflag; //ブザーのON/OFFフラグ volatile int sensor; // メカニカルスイッチのフラグ volatile int sensorONtime; // メカニカルスイッチの検出時刻 /*************************************************** 以下はブザーを鳴らすために必要な関数である. フォルダ内に創造設計用のライブラリss2.hがある. ライブラリを使用する場合は,ss2.h,ss2.cを追加し, 下の3つの関数をコメントアウト,もしくは削除する. ****************************************************/ // ブザーを設定する関数 Buzzer ( 音程 0~255 , 音量 0~128) void Buzzer (unsigned char pitch, unsigned char vol) { TV.TCRV0.BYTE = 0x10; // 割り込み禁止 コンペアマッチBでクリア クロック入力禁止 TV.TCRV1.BYTE = 0x01; // トリガ入力禁止 カウントアップを停止しない TV.TCSRV.BYTE = 0x06; // コンペアマッチBで0出力 コンペアマッチAで1出力 // 音量の設定 TV.TCORA = (unsigned char)(((unsigned int)(pitch) * (unsigned int)(vol)) >> 8); // 音程の設定 TV.TCORB = pitch; } // ブザーをONにする関数 void BuzzerON() { TV.TCRV0.BIT.CKS = 0x03; } // ブザーをOFFにする関数 void BuzzerOFF() { TV.TCRV0.BIT.CKS = 0x00; } void main(void) { //変数の初期化 timer = 0; reset = 0; sensor = 0; LED1flag = 1; Buzzerflag = 0; sensorONtime = 0; /************ 課題1a-2 ここから *******************/ // コメントアウトを外す. //すべての割り込みを禁止 set_imask_ccr(1); // TB1 : 5 [ms] ごとに割り込みを入れる TB1.TMB1.BIT.RLD = 1; TB1.TMB1.BIT.CKS = 2; TB1.TLB1 = 112; IENR2.BIT.IENTB1 = 1; IRR2.BIT.IRRTB1 = 0; set_imask_ccr(0); // すべての割り込みを許可 /************ 課題1a-2 ここまで *******************/ /************ 課題1a-3 ここから *******************/ // コメントアウトを外す. // IENR1.BIT.IENWP = 1; // WKP int enable IO.PMR5.BIT.WKP0 = 1; // P50 is input IEGR2.BIT.WPEG0 = 1; // 立ち下がり検出 // 負論理であることに注意する. IWPR.BIT.IWPF0 = 0; // 割り込みフラグレジスタ Buzzer(128,128); // ブザーの設定. // ポートの設定などもこの関数で行っている. BuzzerOFF(); //初期状態ではブザーはOFF /************ 課題1a-3 ここまで *******************/ /************ 課題1a-1 ここから *******************/ // コメントアウトを外す IO.PCR6 |= 0x10; // ?? を LED2 を光るように方向レジスタを設定する // 具体的には BIT4(5番目) を 1 にする.(16進数表記) IO.PDR6.BIT.B4 = 0; // P64の出力をLowに設定 //負論理(Lowで点灯,Highで消灯) /************ 課題1a-1 ここまで *******************/ while (1) { /************ 課題1a-2 ここまで *******************/ // 先頭のコメントアウトを外す. // reset ボタンが押されたら強制的に終了する // MONITORプログラムの端末にプロンプトが返る // まれに応答しない場合がある if (reset != 0) { reset = 0; break; } /************ 課題1a-1 ここまで *******************/ /************ 課題1a-2 ここから *******************/ // 先頭のコメントアウトを外す. // LED1flagの値によってLED1のON/OFFを切り替える. if(LED1flag == 1){ IO.PDR6.BIT.B4 = 0; }else{ IO.PDR6.BIT.B4 = 1; } /************ 課題1a-2 ここまで *******************/ /************ 課題1a-3 ここから *******************/ // 先頭のコメントアウトを外す. // 1a-2を参考にして,sensorという変数の値によって,ブザーのON/OFFを // 切り替えるコードを記述する. // 参考:ブザーをON,OFFする関数,BuzzerON(),BuzzerOFF()が用意されている. // // sensorの値によってブザーのON/OFFを切り替える. if(sensor == 1){ BuzzerON(); }else{ BuzzerOFF(); } /************ 課題1a-3 ここまで *******************/ } } #ifdef __cplusplus void abort(void) { } #endif // 割り込み用関数 // 宣言はresetprg.cの中で行っている. // resetprg.c内で宣言した関数には必ず処理を記述する必要がある. #pragma section IntPRG __interrupt(vect=18) void INT_WKP(void) { /************ 課題1a-3 ここから *******************/ // 先頭のコメントアウトを外す IWPR.BIT.IWPF0 = 0; if (sensorONtime + 20 < timer){ // sensorフラグが切り替わってから0.1秒間は // フラグを反転させない.(数字は変更可) sensor = 1 -sensor ; // 割り込んだたびに sensor の値を反転させる. sensorONtime = timer; // sersorフラグが反転した時刻を記憶 } /************ 課題1a-3 ここから *******************/ } __interrupt(vect=29) void INT_TimerB1(void) { /************ 課題1a-2 ここから *******************/ // 先頭のコメントアウトを外す IRR2.BIT.IRRTB1 = 0; timer++; // 関数が呼び出される度にtimerをインクリメントする. // 5[ms] 刻みの タイマカウントである. if ( (timer%100) == 0 ) { // 0.5秒ごとに真なる条件式を記述する. LED1flag = 1- LED1flag ; // LED1flagの値を反転させる. // LED1flag は 0,1 の二つ値しか取らない変数である. } // ボタンを押すことで終了のフラグをたてる. if (IO.PDR5.BIT.B5 == 0) reset = 1; /************ 課題1a-2 ここまで *******************/ }