r_test2_2017_10_12_A

Dependencies:   mbed

Committer:
shobonwarrior
Date:
Thu Oct 12 07:58:10 2017 +0000
Revision:
0:75f108e75c3f
r_test2_2017_10_12_A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shobonwarrior 0:75f108e75c3f 1 /*
shobonwarrior 0:75f108e75c3f 2 *
shobonwarrior 0:75f108e75c3f 3 *
shobonwarrior 0:75f108e75c3f 4 *
shobonwarrior 0:75f108e75c3f 5 * PS3をSBDBTで使うときにでも使ってください(mbed LPC1768用、UART使用)
shobonwarrior 0:75f108e75c3f 6 *
shobonwarrior 0:75f108e75c3f 7 * =====使い方=====
shobonwarrior 0:75f108e75c3f 8 * 動作クロックは20MHz(それ以外でやる時は通信速度が2500bpsになるように調整してちょ)
shobonwarrior 0:75f108e75c3f 9 * まずPS3DefaultSetを一回実行してください。USARTレジスタの設定と構造体の初期化を行います。
shobonwarrior 0:75f108e75c3f 10 *
shobonwarrior 0:75f108e75c3f 11 * メインループでCheckInputData関数を一回実行してください。ボタンからのデータがpsdata配列(グローバル)に格納されます。
shobonwarrior 0:75f108e75c3f 12 * if文の条件式に、BTTRUE(***)またはBTFALSE(***)をぶち込んでください。
shobonwarrior 0:75f108e75c3f 13 * ***には各ボタンに対応した構造体の名前が入ります。
shobonwarrior 0:75f108e75c3f 14 *
shobonwarrior 0:75f108e75c3f 15 * (例)□ボタンが押されたときに処理したいとき
shobonwarrior 0:75f108e75c3f 16 * if(BTTRUE(SQUARE)){
shobonwarrior 0:75f108e75c3f 17 * 処理;
shobonwarrior 0:75f108e75c3f 18 * }
shobonwarrior 0:75f108e75c3f 19 *
shobonwarrior 0:75f108e75c3f 20 *
shobonwarrior 0:75f108e75c3f 21 * スティックに関しては、psdata配列から該当するバイトを丸ごと読んでください。
shobonwarrior 0:75f108e75c3f 22 * 64がニュートラル、0が下端、127が上端です。
shobonwarrior 0:75f108e75c3f 23 *
shobonwarrior 0:75f108e75c3f 24 * (例)右スティック縦軸が半分以上前に倒されている時に処理したいとき
shobonwarrior 0:75f108e75c3f 25 * if(RIGHT_VERTICAL > 80){
shobonwarrior 0:75f108e75c3f 26 * 処理;
shobonwarrior 0:75f108e75c3f 27 * }
shobonwarrior 0:75f108e75c3f 28 *
shobonwarrior 0:75f108e75c3f 29 * BTTOGGE関数は「ボタンが押されたら一回だけ実行したい処理」を処理するときに使ってください。
shobonwarrior 0:75f108e75c3f 30 * 押されるたびに変形するときとか
shobonwarrior 0:75f108e75c3f 31 *
shobonwarrior 0:75f108e75c3f 32 *
shobonwarrior 0:75f108e75c3f 33 */
shobonwarrior 0:75f108e75c3f 34
shobonwarrior 0:75f108e75c3f 35 /*
shobonwarrior 0:75f108e75c3f 36 * ボタン対応一覧
shobonwarrior 0:75f108e75c3f 37 *
shobonwarrior 0:75f108e75c3f 38 * ○ボタン CIRCLE
shobonwarrior 0:75f108e75c3f 39 * ×ボタン CROSS
shobonwarrior 0:75f108e75c3f 40 * □ボタン SQUARE
shobonwarrior 0:75f108e75c3f 41 * △ボタン TRIANGLE
shobonwarrior 0:75f108e75c3f 42 * 十字キー上 UP
shobonwarrior 0:75f108e75c3f 43 * 十字キー下 DOWN
shobonwarrior 0:75f108e75c3f 44 * 十字キー右 RIGHT
shobonwarrior 0:75f108e75c3f 45 * 十字キー左 LEFT
shobonwarrior 0:75f108e75c3f 46 * L1ボタン L1
shobonwarrior 0:75f108e75c3f 47 * L2ボタン L2
shobonwarrior 0:75f108e75c3f 48 * R1ボタン R1
shobonwarrior 0:75f108e75c3f 49 * R2ボタン R2
shobonwarrior 0:75f108e75c3f 50 * 右スティック縦軸 RIGHT_VERTICAL
shobonwarrior 0:75f108e75c3f 51 * 右スティック横軸 RIGHT_WYDE
shobonwarrior 0:75f108e75c3f 52 * 左スティック縦軸 LEFT_VERTICAL
shobonwarrior 0:75f108e75c3f 53 * 左スティック横軸 LEFT_WYDE
shobonwarrior 0:75f108e75c3f 54 *
shobonwarrior 0:75f108e75c3f 55 */
shobonwarrior 0:75f108e75c3f 56
shobonwarrior 0:75f108e75c3f 57
shobonwarrior 0:75f108e75c3f 58
shobonwarrior 0:75f108e75c3f 59 /************************************************************************/
shobonwarrior 0:75f108e75c3f 60 /* 構造体宣言 */
shobonwarrior 0:75f108e75c3f 61 /************************************************************************/
shobonwarrior 0:75f108e75c3f 62 typedef struct{
shobonwarrior 0:75f108e75c3f 63 int storebyte; //何バイト目か
shobonwarrior 0:75f108e75c3f 64 uint8_t data; //データ
shobonwarrior 0:75f108e75c3f 65 int toggleflag; //BTTOGGLEで使うフラグ
shobonwarrior 0:75f108e75c3f 66 } ps3;
shobonwarrior 0:75f108e75c3f 67
shobonwarrior 0:75f108e75c3f 68
shobonwarrior 0:75f108e75c3f 69 /************************************************************************/
shobonwarrior 0:75f108e75c3f 70 /* define スティック(何バイト目か) */
shobonwarrior 0:75f108e75c3f 71 /************************************************************************/
shobonwarrior 0:75f108e75c3f 72 #define LEFT_WYDE psdata[3] //左横軸
shobonwarrior 0:75f108e75c3f 73 #define LEFT_VERTICAL psdata[4] //左縦軸
shobonwarrior 0:75f108e75c3f 74 #define RIGHT_WYDE psdata[5] //右横軸
shobonwarrior 0:75f108e75c3f 75 #define RIGHT_VERTICAL psdata[6] //右縦軸
shobonwarrior 0:75f108e75c3f 76
shobonwarrior 0:75f108e75c3f 77 /************************************************************************/
shobonwarrior 0:75f108e75c3f 78 /* define 処理 */
shobonwarrior 0:75f108e75c3f 79 /************************************************************************/
shobonwarrior 0:75f108e75c3f 80 #define BTTRUE(Target) CheckBT(Target) == 1 //Targetで指定されたボタンが押されているか判定するifの条件式
shobonwarrior 0:75f108e75c3f 81 #define BTFALSE(Target) CheckBT(Target) == 0
shobonwarrior 0:75f108e75c3f 82 #define BTTOGGLE(Target) ToggleBT(&Target) == 1 //Targetが押されたら一回だけ実行する
shobonwarrior 0:75f108e75c3f 83
shobonwarrior 0:75f108e75c3f 84 /************************************************************************/
shobonwarrior 0:75f108e75c3f 85 /* define その他 */
shobonwarrior 0:75f108e75c3f 86 /************************************************************************/
shobonwarrior 0:75f108e75c3f 87 #define ERROR 1 //受信エラー
shobonwarrior 0:75f108e75c3f 88 #define SUCCESS 0 //正常に受信
shobonwarrior 0:75f108e75c3f 89
shobonwarrior 0:75f108e75c3f 90 /************************************************************************/
shobonwarrior 0:75f108e75c3f 91 /* グローバル変数宣言 */
shobonwarrior 0:75f108e75c3f 92 /************************************************************************/
shobonwarrior 0:75f108e75c3f 93 volatile uint8_t psdata[8]; //コントローラーからのデータを格納
shobonwarrior 0:75f108e75c3f 94 ps3 SQUARE,TRIANGLE,CIRCLE,CROSS,UP,DOWN,LEFT,RIGHT,L1,L2,R1,R2; //各ボタンに対応したデータが入ってる構造体×12
shobonwarrior 0:75f108e75c3f 95
shobonwarrior 0:75f108e75c3f 96 /************************************************************************/
shobonwarrior 0:75f108e75c3f 97 /* プロトタイプ宣言 */
shobonwarrior 0:75f108e75c3f 98 /************************************************************************/
shobonwarrior 0:75f108e75c3f 99 int CheckBT(ps3); //ボタン入力判定
shobonwarrior 0:75f108e75c3f 100 void CheckInputData(void); //受信用関数
shobonwarrior 0:75f108e75c3f 101 int ToggleBT(ps3 *TargetBT); //ボタンが押されたら一回だけ1を返す関数
shobonwarrior 0:75f108e75c3f 102 void PS3DefaultSet(void); //設定初期化
shobonwarrior 0:75f108e75c3f 103 int CheckError(void); //エラーチェック
shobonwarrior 0:75f108e75c3f 104
shobonwarrior 0:75f108e75c3f 105 /************************************************************************/
shobonwarrior 0:75f108e75c3f 106 /* レジスタ初期設定関数 */
shobonwarrior 0:75f108e75c3f 107 /************************************************************************/
shobonwarrior 0:75f108e75c3f 108
shobonwarrior 0:75f108e75c3f 109 Serial ps3com(p28,p27); //シリアルピン27,28使用
shobonwarrior 0:75f108e75c3f 110 void PS3DefaultSet(void){
shobonwarrior 0:75f108e75c3f 111 /*
shobonwarrior 0:75f108e75c3f 112 *レジスタの初期設定を行う関数
shobonwarrior 0:75f108e75c3f 113 *プログラムの最初に一回実行してください
shobonwarrior 0:75f108e75c3f 114 *mbed LPC以外を使う場合や20MHz以外の動作クロックでやる場合はこの関数をいじってください
shobonwarrior 0:75f108e75c3f 115 */
shobonwarrior 0:75f108e75c3f 116
shobonwarrior 0:75f108e75c3f 117 /**********UARTレジスタ設定**********/
shobonwarrior 0:75f108e75c3f 118
shobonwarrior 0:75f108e75c3f 119 //受信完了割り込み禁止、送信割り込み禁止、受信許可、送信禁止
shobonwarrior 0:75f108e75c3f 120 ps3com.format(8,Serial::None,1);
shobonwarrior 0:75f108e75c3f 121 //UART、パリティなし、停止ビット1、データビット8
shobonwarrior 0:75f108e75c3f 122 ps3com.baud(2400);//通信速度2400bps
shobonwarrior 0:75f108e75c3f 123
shobonwarrior 0:75f108e75c3f 124 /**********構造体の初期化**********/
shobonwarrior 0:75f108e75c3f 125
shobonwarrior 0:75f108e75c3f 126 SQUARE.storebyte = 1;
shobonwarrior 0:75f108e75c3f 127 TRIANGLE.storebyte = 2;
shobonwarrior 0:75f108e75c3f 128 CIRCLE.storebyte = 2;
shobonwarrior 0:75f108e75c3f 129 CROSS.storebyte = 2;
shobonwarrior 0:75f108e75c3f 130 UP.storebyte = 2;
shobonwarrior 0:75f108e75c3f 131 DOWN.storebyte = 2;
shobonwarrior 0:75f108e75c3f 132 LEFT.storebyte = 2;
shobonwarrior 0:75f108e75c3f 133 RIGHT.storebyte = 2;
shobonwarrior 0:75f108e75c3f 134 L1.storebyte = 1;
shobonwarrior 0:75f108e75c3f 135 L2.storebyte = 1;
shobonwarrior 0:75f108e75c3f 136 R1.storebyte = 1;
shobonwarrior 0:75f108e75c3f 137 R2.storebyte = 1;
shobonwarrior 0:75f108e75c3f 138
shobonwarrior 0:75f108e75c3f 139 UP.data = 0b00000001; //十字キー上
shobonwarrior 0:75f108e75c3f 140 DOWN.data = 0b00000010; //十字キー下
shobonwarrior 0:75f108e75c3f 141 RIGHT.data = 0b00000100; //十字キー右
shobonwarrior 0:75f108e75c3f 142 LEFT.data = 0b00001000; //十字キー左
shobonwarrior 0:75f108e75c3f 143 TRIANGLE.data = 0b00010000; //△ボタン
shobonwarrior 0:75f108e75c3f 144 CROSS.data = 0b00100000; //×ボタン
shobonwarrior 0:75f108e75c3f 145 CIRCLE.data = 0b01000000; //○ボタン
shobonwarrior 0:75f108e75c3f 146 SQUARE.data = 0b00000001; //□ボタン
shobonwarrior 0:75f108e75c3f 147 L1.data = 0b00000010; //L1ボタン
shobonwarrior 0:75f108e75c3f 148 L2.data = 0b00000100; //L2ボタン
shobonwarrior 0:75f108e75c3f 149 R1.data = 0b00001000; //R1ボタン
shobonwarrior 0:75f108e75c3f 150 R2.data = 0b00010000; //R2ボタン
shobonwarrior 0:75f108e75c3f 151
shobonwarrior 0:75f108e75c3f 152 SQUARE.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 153 TRIANGLE.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 154 CIRCLE.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 155 CROSS.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 156 UP.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 157 DOWN.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 158 LEFT.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 159 RIGHT.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 160 L1.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 161 L2.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 162 R1.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 163 R2.toggleflag = 0;
shobonwarrior 0:75f108e75c3f 164
shobonwarrior 0:75f108e75c3f 165 }
shobonwarrior 0:75f108e75c3f 166
shobonwarrior 0:75f108e75c3f 167
shobonwarrior 0:75f108e75c3f 168 /************************************************************************/
shobonwarrior 0:75f108e75c3f 169 /* ボタンチェック関数 */
shobonwarrior 0:75f108e75c3f 170 /************************************************************************/
shobonwarrior 0:75f108e75c3f 171 int CheckBT(ps3 TargetBT){ //構造体でデータぶっこむ
shobonwarrior 0:75f108e75c3f 172
shobonwarrior 0:75f108e75c3f 173 /*****指定されたボタンが押されているか判定して0か1を返す関数*****/
shobonwarrior 0:75f108e75c3f 174
shobonwarrior 0:75f108e75c3f 175 uint8_t ConpareData;
shobonwarrior 0:75f108e75c3f 176
shobonwarrior 0:75f108e75c3f 177 ConpareData = psdata[TargetBT.storebyte] & TargetBT.data;
shobonwarrior 0:75f108e75c3f 178
shobonwarrior 0:75f108e75c3f 179 if(ConpareData == TargetBT.data){
shobonwarrior 0:75f108e75c3f 180 return 1; //押されていたら
shobonwarrior 0:75f108e75c3f 181 }else{
shobonwarrior 0:75f108e75c3f 182 return 0; //押されていなかったら
shobonwarrior 0:75f108e75c3f 183 }
shobonwarrior 0:75f108e75c3f 184
shobonwarrior 0:75f108e75c3f 185 }
shobonwarrior 0:75f108e75c3f 186
shobonwarrior 0:75f108e75c3f 187
shobonwarrior 0:75f108e75c3f 188 /************************************************************************/
shobonwarrior 0:75f108e75c3f 189 /* ボタントグル判定関数 */
shobonwarrior 0:75f108e75c3f 190 /************************************************************************/
shobonwarrior 0:75f108e75c3f 191 int ToggleBT(ps3 *TargetBT){
shobonwarrior 0:75f108e75c3f 192
shobonwarrior 0:75f108e75c3f 193 if(BTTRUE(*TargetBT)){
shobonwarrior 0:75f108e75c3f 194 if(TargetBT->toggleflag == 0){
shobonwarrior 0:75f108e75c3f 195 TargetBT->toggleflag = 1;
shobonwarrior 0:75f108e75c3f 196 return 1;
shobonwarrior 0:75f108e75c3f 197 }
shobonwarrior 0:75f108e75c3f 198
shobonwarrior 0:75f108e75c3f 199 }else{
shobonwarrior 0:75f108e75c3f 200 TargetBT->toggleflag = 0;
shobonwarrior 0:75f108e75c3f 201 }
shobonwarrior 0:75f108e75c3f 202
shobonwarrior 0:75f108e75c3f 203 return 0;
shobonwarrior 0:75f108e75c3f 204 }
shobonwarrior 0:75f108e75c3f 205
shobonwarrior 0:75f108e75c3f 206 /************************************************************************/
shobonwarrior 0:75f108e75c3f 207 /* 受信データ処理関数 */
shobonwarrior 0:75f108e75c3f 208 /************************************************************************/
shobonwarrior 0:75f108e75c3f 209 void CheckInputData(){
shobonwarrior 0:75f108e75c3f 210 //ps3からのデータをpsdata配列に格納する関数
shobonwarrior 0:75f108e75c3f 211 int i;
shobonwarrior 0:75f108e75c3f 212 int flg;
shobonwarrior 0:75f108e75c3f 213
shobonwarrior 0:75f108e75c3f 214
shobonwarrior 0:75f108e75c3f 215
shobonwarrior 0:75f108e75c3f 216 // do{
shobonwarrior 0:75f108e75c3f 217 while(LPC_UART2->RBR!= 0x80); //第一バイトが来るまで待つ
shobonwarrior 0:75f108e75c3f 218
shobonwarrior 0:75f108e75c3f 219 for(i=0;i<=7;i++){
shobonwarrior 0:75f108e75c3f 220 psdata[i] =LPC_UART2->RBR;
shobonwarrior 0:75f108e75c3f 221 flg=LPC_UART2->LSR & 0x01;
shobonwarrior 0:75f108e75c3f 222 while(flg!=0x01){
shobonwarrior 0:75f108e75c3f 223 flg=LPC_UART2->LSR & 0x01;
shobonwarrior 0:75f108e75c3f 224 } //受信完了フラグが立つまで待つ
shobonwarrior 0:75f108e75c3f 225 }
shobonwarrior 0:75f108e75c3f 226
shobonwarrior 0:75f108e75c3f 227
shobonwarrior 0:75f108e75c3f 228 // chechsum = CheckError(); //エラーチェック
shobonwarrior 0:75f108e75c3f 229 //}while(chechsum == ERROR); //受信失敗したらリトライ
shobonwarrior 0:75f108e75c3f 230 }