うごく

Dependencies:   mbed

Committer:
maxonK
Date:
Sat May 09 08:07:38 2015 +0000
Revision:
1:f50a49407c60
Parent:
0:9a0a89ffaa43
Child:
2:ad8fad576e79
?????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxonK 0:9a0a89ffaa43 1
maxonK 0:9a0a89ffaa43 2 #include <mbed.h>
maxonK 0:9a0a89ffaa43 3 #include <stdlib.h>
maxonK 0:9a0a89ffaa43 4 #include <stdio.h>
maxonK 0:9a0a89ffaa43 5 #include <string.h>
maxonK 0:9a0a89ffaa43 6
maxonK 0:9a0a89ffaa43 7 //文字列受信関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 8 int stringReceive();
maxonK 0:9a0a89ffaa43 9 //float cramp関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 10 int cramp(int,int,int);
maxonK 0:9a0a89ffaa43 11 //serialハードウェアバッファクリア関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 12 void bufferClear ();
maxonK 0:9a0a89ffaa43 13
maxonK 0:9a0a89ffaa43 14 //dp4pwm初期化関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 15 void CT32B0_MAT3_PWM_registerSet(unsigned int );
maxonK 0:9a0a89ffaa43 16 //グローバル変数宣言
maxonK 0:9a0a89ffaa43 17 //dp4pwmDuty
maxonK 0:9a0a89ffaa43 18 unsigned int dp4pwmDuty = 0;
maxonK 0:9a0a89ffaa43 19 //dp4pwmFrequency
maxonK 0:9a0a89ffaa43 20 unsigned int dp4pwmFrequency = 0;
maxonK 0:9a0a89ffaa43 21
maxonK 0:9a0a89ffaa43 22
maxonK 0:9a0a89ffaa43 23 DigitalOut myled(LED1);
maxonK 1:f50a49407c60 24 //タイムアウトタイマー初期化
maxonK 1:f50a49407c60 25 Timer timeOutTimer;
maxonK 0:9a0a89ffaa43 26
maxonK 0:9a0a89ffaa43 27 //シリアル初期化
maxonK 0:9a0a89ffaa43 28 Serial sensSerial (dp16, dp15);
maxonK 0:9a0a89ffaa43 29 /*
maxonK 0:9a0a89ffaa43 30 //I2C初期化
maxonK 0:9a0a89ffaa43 31 I2C i2c(dp5 , dp27 ); //sda scl
maxonK 0:9a0a89ffaa43 32 const int addr = 0x20 << 1; // I2C address
maxonK 0:9a0a89ffaa43 33 */
maxonK 0:9a0a89ffaa43 34
maxonK 0:9a0a89ffaa43 35 //割り込みハンドラ(PICでいうISRのこと)
maxonK 0:9a0a89ffaa43 36 void TIMER32_0_IRQHandler(void)
maxonK 0:9a0a89ffaa43 37 {
maxonK 0:9a0a89ffaa43 38 //タイマー操作
maxonK 0:9a0a89ffaa43 39 //タイマリセット→保持
maxonK 0:9a0a89ffaa43 40 //タイマ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 41 volatile unsigned int *TMR32B0TCRLocal = (unsigned int *)0x40014004;
maxonK 0:9a0a89ffaa43 42 //1ビット目を1にしてタイマリセット
maxonK 0:9a0a89ffaa43 43 unsigned int mask_TMR32B0TCR = 1 << 1;
maxonK 0:9a0a89ffaa43 44 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 45 *TMR32B0TCRLocal |= mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 46 /***********************************************************************************/
maxonK 0:9a0a89ffaa43 47 //マッチレジスタセット
maxonK 0:9a0a89ffaa43 48 //新しくセットする値はグローバルで宣言しとく(割り込みハンドラは、引数、戻り値ともに意味を成さない)
maxonK 0:9a0a89ffaa43 49 //0~1023もらって0%~100%のpwm出力する
maxonK 0:9a0a89ffaa43 50 //CT32B0_MAT3に対応したマッチレジスタアドレス
maxonK 0:9a0a89ffaa43 51 volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
maxonK 0:9a0a89ffaa43 52 //デューティセット
maxonK 0:9a0a89ffaa43 53 *TMR32B0MR3 = ((((48000000 / dp4pwmFrequency)/20)*18)+((((48000000 / dp4pwmFrequency)/20)/1024) * (1024 - dp4pwmDuty)));//停波(18ms)+((1ms/1024)*(1024-Duty))
maxonK 0:9a0a89ffaa43 54 //*TMR32B0MR2 = (((48000000 / dp24pwmFrequency) / 1024)*(1024 - dp24pwmDuty));
maxonK 0:9a0a89ffaa43 55 /*******************************************************************************************/
maxonK 0:9a0a89ffaa43 56
maxonK 0:9a0a89ffaa43 57 //タイマリセット解除
maxonK 0:9a0a89ffaa43 58 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 59 *TMR32B0TCRLocal &= ~mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 60 /*******************************************************************************************/
maxonK 0:9a0a89ffaa43 61
maxonK 0:9a0a89ffaa43 62 //マッチチャネル0 用の割り込みフラグリセット
maxonK 0:9a0a89ffaa43 63 //割り込みレジスタアドレス
maxonK 0:9a0a89ffaa43 64 volatile unsigned int *TMR32B0IRLocal = (unsigned int *)0x40014000;
maxonK 0:9a0a89ffaa43 65 //0ビット目を1にしてMR0の割り込みフラグをリセット
maxonK 0:9a0a89ffaa43 66 unsigned int mask_TMR32B0IR = 1;
maxonK 0:9a0a89ffaa43 67 //割り込みレジスタセット
maxonK 0:9a0a89ffaa43 68 *TMR32B0IRLocal |= mask_TMR32B0IR;
maxonK 0:9a0a89ffaa43 69
maxonK 0:9a0a89ffaa43 70 }
maxonK 0:9a0a89ffaa43 71
maxonK 0:9a0a89ffaa43 72
maxonK 0:9a0a89ffaa43 73 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
maxonK 0:9a0a89ffaa43 74 /*****************************************************************************************************************/
maxonK 0:9a0a89ffaa43 75
maxonK 0:9a0a89ffaa43 76 int main()
maxonK 0:9a0a89ffaa43 77 {
maxonK 0:9a0a89ffaa43 78 //setup
maxonK 0:9a0a89ffaa43 79 sensSerial.baud(9600);//シリアル通信開く
maxonK 0:9a0a89ffaa43 80 //(switchmbed基板でUSB通信するときは低速に抑えること)
maxonK 0:9a0a89ffaa43 81 myled = 0;
maxonK 0:9a0a89ffaa43 82
maxonK 0:9a0a89ffaa43 83 //割り込み設定
maxonK 0:9a0a89ffaa43 84 //Interrupt Service Routineが書いてある、割り込み時ジャンプ先アドレス設定?
maxonK 0:9a0a89ffaa43 85 NVIC_SetVector(TIMER_32_0_IRQn, (uint32_t)&TIMER32_0_IRQHandler);
maxonK 0:9a0a89ffaa43 86 //割り込みハンドライネーブル
maxonK 0:9a0a89ffaa43 87 NVIC_EnableIRQ(TIMER_32_0_IRQn);
maxonK 0:9a0a89ffaa43 88 //割り込み優先順位設定
maxonK 0:9a0a89ffaa43 89 NVIC_SetPriority(TIMER_32_0_IRQn, 1);
maxonK 0:9a0a89ffaa43 90 //PWM周波数
maxonK 0:9a0a89ffaa43 91 dp4pwmFrequency = 50;
maxonK 0:9a0a89ffaa43 92 //dp4pwm初期化
maxonK 0:9a0a89ffaa43 93 CT32B0_MAT3_PWM_registerSet(dp4pwmFrequency);
maxonK 0:9a0a89ffaa43 94
maxonK 0:9a0a89ffaa43 95 //ESCのセンター感知のため中立サーボ信号を5秒間出力
maxonK 0:9a0a89ffaa43 96 //pwm関係
maxonK 0:9a0a89ffaa43 97 //グローバルdp4pwmDutyセット
maxonK 0:9a0a89ffaa43 98 dp4pwmDuty = (1024 / 2);
maxonK 0:9a0a89ffaa43 99 //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更
maxonK 0:9a0a89ffaa43 100 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 101 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 102 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 103 //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される
maxonK 0:9a0a89ffaa43 104 unsigned int mask_TMR32B0MCR = 1;
maxonK 0:9a0a89ffaa43 105 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 106 *TMR32B0MCR = mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 107 //待ち
maxonK 0:9a0a89ffaa43 108 wait(5);
maxonK 0:9a0a89ffaa43 109
maxonK 0:9a0a89ffaa43 110 /***************************************************************************/
maxonK 0:9a0a89ffaa43 111 //mainloop
maxonK 0:9a0a89ffaa43 112 while(1) {
maxonK 0:9a0a89ffaa43 113 int receiveVal = 0;
maxonK 0:9a0a89ffaa43 114 static int sReceiveVal = 0;
maxonK 0:9a0a89ffaa43 115 int gain = 10;
maxonK 0:9a0a89ffaa43 116 receiveVal = stringReceive();
maxonK 0:9a0a89ffaa43 117
maxonK 0:9a0a89ffaa43 118
maxonK 0:9a0a89ffaa43 119 if(receiveVal >= 0) {
maxonK 0:9a0a89ffaa43 120 myled = !myled;
maxonK 0:9a0a89ffaa43 121
maxonK 0:9a0a89ffaa43 122 //pwm関係
maxonK 0:9a0a89ffaa43 123 //グローバルdp4pwmDutyセット
maxonK 0:9a0a89ffaa43 124 dp4pwmDuty = cramp((( receiveVal*gain ) - (((1023*gain)/2)-(1023/2)) ),0,1023);
maxonK 0:9a0a89ffaa43 125 //dp24pwmDuty = cramp((( receiveVal*gain ) - (((1023*gain)/2)-(1023/2)) - (512 - 76) ),51,102);
maxonK 0:9a0a89ffaa43 126 //dp24pwmDuty = receiveVal;
maxonK 0:9a0a89ffaa43 127
maxonK 0:9a0a89ffaa43 128 if(receiveVal != sReceiveVal) {
maxonK 0:9a0a89ffaa43 129 sReceiveVal = receiveVal;
maxonK 0:9a0a89ffaa43 130 //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更
maxonK 0:9a0a89ffaa43 131 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 132 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 133 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 134 //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される
maxonK 0:9a0a89ffaa43 135 unsigned int mask_TMR32B0MCR = 1;
maxonK 0:9a0a89ffaa43 136 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 137 *TMR32B0MCR = mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 138 }
maxonK 0:9a0a89ffaa43 139 /*
maxonK 0:9a0a89ffaa43 140 //I2C送信
maxonK 0:9a0a89ffaa43 141 char cmd[10] = {'\0'};//I2C送信バッファ
maxonK 0:9a0a89ffaa43 142 //int to asic2(sprintf関数)
maxonK 0:9a0a89ffaa43 143 sprintf(cmd ,"%4d",dp4pwmDuty);//格納する配列アドレス , 書式文字列
maxonK 0:9a0a89ffaa43 144 //null終端
maxonK 0:9a0a89ffaa43 145 cmd[sizeof(cmd) - 1] = '\0'; // NULL 終端する
maxonK 0:9a0a89ffaa43 146 //書き出し
maxonK 0:9a0a89ffaa43 147 i2c.write(addr, cmd, 7);
maxonK 0:9a0a89ffaa43 148 */
maxonK 0:9a0a89ffaa43 149 }
maxonK 0:9a0a89ffaa43 150
maxonK 0:9a0a89ffaa43 151 }
maxonK 0:9a0a89ffaa43 152 /****************************************************************************/
maxonK 0:9a0a89ffaa43 153
maxonK 0:9a0a89ffaa43 154 }
maxonK 0:9a0a89ffaa43 155
maxonK 0:9a0a89ffaa43 156 /*****************************************************************************************************************/
maxonK 0:9a0a89ffaa43 157 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
maxonK 0:9a0a89ffaa43 158
maxonK 0:9a0a89ffaa43 159
maxonK 0:9a0a89ffaa43 160 //受信関数
maxonK 0:9a0a89ffaa43 161 //受信完了時0~4095
maxonK 1:f50a49407c60 162 //タイムアウト検出用のタイマーをグローバルで初期化する必要あり
maxonK 1:f50a49407c60 163 //Timer timeOutTimer;
maxonK 0:9a0a89ffaa43 164 int stringReceive()
maxonK 0:9a0a89ffaa43 165 {
maxonK 0:9a0a89ffaa43 166 //各種定数
maxonK 0:9a0a89ffaa43 167 //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用
maxonK 0:9a0a89ffaa43 168 const int dataLength = 7;//7個(6個のデータ+null終端)(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する)
maxonK 0:9a0a89ffaa43 169 //startbitに使用する文字
maxonK 0:9a0a89ffaa43 170 char startbitChar = '*';
maxonK 0:9a0a89ffaa43 171 //stopbitに使用する文字
maxonK 0:9a0a89ffaa43 172 char stopbitChar = '#';
maxonK 0:9a0a89ffaa43 173 //各種変数
maxonK 0:9a0a89ffaa43 174 //現在書き込むべきバッファの位置変数
maxonK 0:9a0a89ffaa43 175 static int stringPosition = 0;
maxonK 0:9a0a89ffaa43 176 //受信値一時格納変数
maxonK 0:9a0a89ffaa43 177 char receiveChar = '\0';
maxonK 0:9a0a89ffaa43 178 //受信データ格納バッファ文字列
maxonK 0:9a0a89ffaa43 179 static char receiveDataString [dataLength] = {'\0'};//7個
maxonK 1:f50a49407c60 180 //データ送信要求フラグ
maxonK 1:f50a49407c60 181 static bool Cflag = true;
maxonK 1:f50a49407c60 182 //関数内セットアップルーチン実行staticフラグ
maxonK 1:f50a49407c60 183 //はじめてこの関数が呼ばれたときだけ実行される
maxonK 1:f50a49407c60 184 static bool setup = false;
maxonK 1:f50a49407c60 185 if(!setup){
maxonK 1:f50a49407c60 186 timeOutTimer.start();
maxonK 1:f50a49407c60 187 setup = true;
maxonK 1:f50a49407c60 188 }
maxonK 0:9a0a89ffaa43 189
maxonK 1:f50a49407c60 190 //タイムアウトによるデータ送信要求フラグセット
maxonK 1:f50a49407c60 191 if(timeOutTimer.read() >= 1){
maxonK 1:f50a49407c60 192 Cflag = true;
maxonK 1:f50a49407c60 193 }
maxonK 0:9a0a89ffaa43 194
maxonK 0:9a0a89ffaa43 195 //データ送信要求
maxonK 1:f50a49407c60 196 //sensSerial.putc('C');
maxonK 1:f50a49407c60 197 if(Cflag){
maxonK 1:f50a49407c60 198 sensSerial.putc('C');
maxonK 1:f50a49407c60 199 Cflag = false;
maxonK 1:f50a49407c60 200 //タイマリセット
maxonK 1:f50a49407c60 201 timeOutTimer.stop();
maxonK 1:f50a49407c60 202 timeOutTimer.reset();
maxonK 1:f50a49407c60 203 timeOutTimer.start();
maxonK 1:f50a49407c60 204 }
maxonK 1:f50a49407c60 205
maxonK 1:f50a49407c60 206
maxonK 0:9a0a89ffaa43 207 //ハードウェアバッファに到着した情報があるか
maxonK 0:9a0a89ffaa43 208 //空ならリターン、あるなら受信値格納用変数にうつす
maxonK 0:9a0a89ffaa43 209 if(!sensSerial.readable()) {
maxonK 0:9a0a89ffaa43 210 //空のとき
maxonK 0:9a0a89ffaa43 211 return -1;
maxonK 0:9a0a89ffaa43 212 } else { //あるとき
maxonK 0:9a0a89ffaa43 213 receiveChar = sensSerial.getc();
maxonK 0:9a0a89ffaa43 214 }
maxonK 0:9a0a89ffaa43 215 //バッファ書き込み位置変数が大きくなりすぎている
maxonK 0:9a0a89ffaa43 216 //(ストップビットがくるはずがきてない)ときリターン
maxonK 0:9a0a89ffaa43 217 if(stringPosition > (dataLength - 2)) {
maxonK 0:9a0a89ffaa43 218 stringPosition = 0;
maxonK 0:9a0a89ffaa43 219 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 220 bufferClear();
maxonK 0:9a0a89ffaa43 221 return -2;
maxonK 0:9a0a89ffaa43 222 }
maxonK 0:9a0a89ffaa43 223
maxonK 0:9a0a89ffaa43 224 //到着していたデータがスタートビットだった場合
maxonK 0:9a0a89ffaa43 225 if(receiveChar == startbitChar) {
maxonK 0:9a0a89ffaa43 226
maxonK 0:9a0a89ffaa43 227 //バッファクリア
maxonK 0:9a0a89ffaa43 228 for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 229 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 230 }
maxonK 0:9a0a89ffaa43 231 //書き込み位置変数クリア
maxonK 0:9a0a89ffaa43 232 stringPosition = 0;
maxonK 0:9a0a89ffaa43 233 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 234 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 235
maxonK 0:9a0a89ffaa43 236
maxonK 0:9a0a89ffaa43 237 //書き込み位置進め
maxonK 0:9a0a89ffaa43 238 stringPosition ++;
maxonK 0:9a0a89ffaa43 239 //-1リターン
maxonK 0:9a0a89ffaa43 240 return -3;
maxonK 0:9a0a89ffaa43 241 }
maxonK 0:9a0a89ffaa43 242
maxonK 0:9a0a89ffaa43 243 //到着していたデータが数字だった場合
maxonK 0:9a0a89ffaa43 244 if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9') {
maxonK 0:9a0a89ffaa43 245 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 246 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 247
maxonK 0:9a0a89ffaa43 248 //書き込み位置進め
maxonK 0:9a0a89ffaa43 249 stringPosition++;
maxonK 0:9a0a89ffaa43 250 //-1リターン
maxonK 0:9a0a89ffaa43 251 return -4;
maxonK 0:9a0a89ffaa43 252 }
maxonK 0:9a0a89ffaa43 253
maxonK 0:9a0a89ffaa43 254 //到着していたデータがストップビットだった場合
maxonK 0:9a0a89ffaa43 255 if(receiveChar == stopbitChar) {
maxonK 0:9a0a89ffaa43 256 //使う変数宣言
maxonK 0:9a0a89ffaa43 257 //バッファ内容をコピーするための文字列
maxonK 0:9a0a89ffaa43 258 char copyString [dataLength] = {'\0'};
maxonK 0:9a0a89ffaa43 259 //スタート、ストップビットをトリムしたデータだけの文字列
maxonK 0:9a0a89ffaa43 260 char trimString [dataLength] = {'\0'};
maxonK 0:9a0a89ffaa43 261 //文字列→数値変換後の値を格納する変数
maxonK 0:9a0a89ffaa43 262 int intVal = 0;
maxonK 0:9a0a89ffaa43 263
maxonK 0:9a0a89ffaa43 264 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 265 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 266 //null終端
maxonK 0:9a0a89ffaa43 267 copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */
maxonK 0:9a0a89ffaa43 268 receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端
maxonK 0:9a0a89ffaa43 269
maxonK 0:9a0a89ffaa43 270
maxonK 0:9a0a89ffaa43 271 //バッファの内容をうつす
maxonK 0:9a0a89ffaa43 272 strlcpy(copyString,receiveDataString,sizeof(copyString));
maxonK 0:9a0a89ffaa43 273 //バッファクリア
maxonK 0:9a0a89ffaa43 274 for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 275 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 276 }
maxonK 0:9a0a89ffaa43 277 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 278 bufferClear();
maxonK 0:9a0a89ffaa43 279 //書き込み位置クリア
maxonK 0:9a0a89ffaa43 280 stringPosition = 0;
maxonK 0:9a0a89ffaa43 281
maxonK 0:9a0a89ffaa43 282 //以下チェックとAtoI
maxonK 0:9a0a89ffaa43 283 //先頭がスタートビットになってるか
maxonK 0:9a0a89ffaa43 284 if(!(copyString[0] == startbitChar)) {
maxonK 0:9a0a89ffaa43 285 return -5;
maxonK 0:9a0a89ffaa43 286 }
maxonK 0:9a0a89ffaa43 287 //末尾がストップビットになっているか(配列の最後はnull)
maxonK 0:9a0a89ffaa43 288 if(!(copyString[(dataLength - 2)] == stopbitChar)) {
maxonK 0:9a0a89ffaa43 289 return -6;
maxonK 0:9a0a89ffaa43 290 }
maxonK 0:9a0a89ffaa43 291 //データだけをトリミング
maxonK 0:9a0a89ffaa43 292 //1個目から、後ろから2個目まで*xxxx#(\n)
maxonK 0:9a0a89ffaa43 293 for(int Idx = 1; Idx < (dataLength - 2) ; Idx++) {
maxonK 0:9a0a89ffaa43 294 trimString[(Idx - 1) ] = copyString[Idx];
maxonK 0:9a0a89ffaa43 295 }
maxonK 0:9a0a89ffaa43 296 //null終端
maxonK 0:9a0a89ffaa43 297 trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */
maxonK 0:9a0a89ffaa43 298 //文字列→数値
maxonK 0:9a0a89ffaa43 299 intVal = atoi(trimString);
maxonK 1:f50a49407c60 300 //送信要求フラグセット
maxonK 1:f50a49407c60 301 Cflag = true;
maxonK 0:9a0a89ffaa43 302 //数値リターン
maxonK 0:9a0a89ffaa43 303 return intVal;
maxonK 0:9a0a89ffaa43 304
maxonK 0:9a0a89ffaa43 305 }
maxonK 0:9a0a89ffaa43 306
maxonK 0:9a0a89ffaa43 307
maxonK 0:9a0a89ffaa43 308 //以上にひっかからなかった異常時
maxonK 0:9a0a89ffaa43 309 //バッファクリア
maxonK 0:9a0a89ffaa43 310 for (int i = 0; i <dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 311 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 312 }
maxonK 0:9a0a89ffaa43 313 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 314 bufferClear();
maxonK 0:9a0a89ffaa43 315 //書き込み位置クリア
maxonK 0:9a0a89ffaa43 316 stringPosition = 0;
maxonK 0:9a0a89ffaa43 317 //-3リターン
maxonK 0:9a0a89ffaa43 318 return -7;
maxonK 0:9a0a89ffaa43 319 }
maxonK 0:9a0a89ffaa43 320
maxonK 0:9a0a89ffaa43 321
maxonK 0:9a0a89ffaa43 322 //cramp関数
maxonK 0:9a0a89ffaa43 323 int cramp(int val , int min , int max)
maxonK 0:9a0a89ffaa43 324 {
maxonK 0:9a0a89ffaa43 325 if(val < min) {
maxonK 0:9a0a89ffaa43 326 return min;
maxonK 0:9a0a89ffaa43 327 }
maxonK 0:9a0a89ffaa43 328 if(val > max) {
maxonK 0:9a0a89ffaa43 329 return max;
maxonK 0:9a0a89ffaa43 330 }
maxonK 0:9a0a89ffaa43 331
maxonK 0:9a0a89ffaa43 332 return val;
maxonK 0:9a0a89ffaa43 333 }
maxonK 0:9a0a89ffaa43 334
maxonK 0:9a0a89ffaa43 335 //serialハードウェアバッファクリア関数
maxonK 0:9a0a89ffaa43 336 void bufferClear()
maxonK 0:9a0a89ffaa43 337 {
maxonK 0:9a0a89ffaa43 338 char temp = 0;
maxonK 0:9a0a89ffaa43 339 while(sensSerial.readable()) {
maxonK 0:9a0a89ffaa43 340 temp = sensSerial.getc();
maxonK 0:9a0a89ffaa43 341 }
maxonK 0:9a0a89ffaa43 342 return;
maxonK 0:9a0a89ffaa43 343 }
maxonK 0:9a0a89ffaa43 344
maxonK 0:9a0a89ffaa43 345
maxonK 0:9a0a89ffaa43 346
maxonK 0:9a0a89ffaa43 347
maxonK 0:9a0a89ffaa43 348
maxonK 0:9a0a89ffaa43 349
maxonK 0:9a0a89ffaa43 350 void CT32B0_MAT3_PWM_registerSet(unsigned int pwmFrequency)
maxonK 0:9a0a89ffaa43 351 {
maxonK 0:9a0a89ffaa43 352 //PWM機能設定用
maxonK 0:9a0a89ffaa43 353 //pwmピンのピン機能選択をmbedで行う
maxonK 0:9a0a89ffaa43 354 //PwmOut MAT2(dp24);//CT32B0_MAT2
maxonK 0:9a0a89ffaa43 355 //PWM周波数
maxonK 0:9a0a89ffaa43 356 //unsigned int pwmFrequency = 4;
maxonK 0:9a0a89ffaa43 357 //各種レジスタ設定用ビットマスク
maxonK 0:9a0a89ffaa43 358 //システムAHBクロック制御レジスタマスク
maxonK 0:9a0a89ffaa43 359 unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9;
maxonK 0:9a0a89ffaa43 360 //IO設定レジスタレジスタマスク
maxonK 0:9a0a89ffaa43 361 unsigned int mask_IOCON_PIO0_11 = 0x3;
maxonK 0:9a0a89ffaa43 362 //タイマ制御レジスタマスク
maxonK 0:9a0a89ffaa43 363 //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ
maxonK 0:9a0a89ffaa43 364 unsigned int mask_TMR32B0TCR = 1;
maxonK 0:9a0a89ffaa43 365 //プリスケールレジスタマスク
maxonK 0:9a0a89ffaa43 366 unsigned int val_TMR32B0PR = 0;
maxonK 0:9a0a89ffaa43 367 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 368 //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する
maxonK 0:9a0a89ffaa43 369 //残りのマッチレジスタはディスエーブルにする
maxonK 0:9a0a89ffaa43 370 //mbedのピン配列ではタイマ0は0番をTCリセットに使うといいかも
maxonK 0:9a0a89ffaa43 371 unsigned int mask_TMR32B0MCR = 1 << 1;
maxonK 0:9a0a89ffaa43 372 //PWM制御レジスタマスク
maxonK 0:9a0a89ffaa43 373 //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで
maxonK 0:9a0a89ffaa43 374 //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする
maxonK 0:9a0a89ffaa43 375 //mbedではMAT2がpwmOutになってるがISPモードに使用しているので、dp4-MAT3を試す
maxonK 0:9a0a89ffaa43 376 unsigned int mask_TMR32B0PWMC = 1 << 3;
maxonK 0:9a0a89ffaa43 377 //マッチレジスタ値
maxonK 0:9a0a89ffaa43 378 //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する
maxonK 0:9a0a89ffaa43 379 // ((48*10^6)/nHz)で任意の周波数になる、はずである
maxonK 0:9a0a89ffaa43 380 //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する
maxonK 0:9a0a89ffaa43 381 // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない
maxonK 0:9a0a89ffaa43 382 unsigned int val_TMR32B0MR0 = /*10;*/((48000000) / (pwmFrequency));
maxonK 0:9a0a89ffaa43 383 unsigned int val_TMR32B0MR3 = /*8;*/((48000000) / (pwmFrequency)) + 1;
maxonK 0:9a0a89ffaa43 384
maxonK 0:9a0a89ffaa43 385 //システムAHBクロック制御レジスタアドレス
maxonK 0:9a0a89ffaa43 386 volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080;
maxonK 0:9a0a89ffaa43 387 //IO設定レジスタアドレス
maxonK 0:9a0a89ffaa43 388 volatile unsigned int *IOCON_PIO0_11Local = (unsigned int *)0x40044074;
maxonK 0:9a0a89ffaa43 389 //プリスケールレジスタアドレス
maxonK 0:9a0a89ffaa43 390 volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C;
maxonK 0:9a0a89ffaa43 391 //タイマ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 392 volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004);
maxonK 0:9a0a89ffaa43 393 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 394 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 395 //マッチレジスタ0アドレス
maxonK 0:9a0a89ffaa43 396 volatile unsigned int *TMR32B0MR0 = (unsigned int *)(0x40014018);
maxonK 0:9a0a89ffaa43 397 //マッチレジスタ3アドレス
maxonK 0:9a0a89ffaa43 398 volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
maxonK 0:9a0a89ffaa43 399 //PWM制御レジスタアドレス
maxonK 0:9a0a89ffaa43 400 volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074);
maxonK 0:9a0a89ffaa43 401
maxonK 0:9a0a89ffaa43 402 //PWM機能制御レジスタセット
maxonK 0:9a0a89ffaa43 403 //システムAHBクロック制御レジスタセット
maxonK 0:9a0a89ffaa43 404 *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL;
maxonK 0:9a0a89ffaa43 405 //IO設定レジスタセット
maxonK 0:9a0a89ffaa43 406 *IOCON_PIO0_11Local |= mask_IOCON_PIO0_11;
maxonK 0:9a0a89ffaa43 407 //プリスケーラレジスタセット
maxonK 0:9a0a89ffaa43 408 *TMR32B0PRLocal = val_TMR32B0PR;
maxonK 0:9a0a89ffaa43 409 //PWM制御レジスタセット
maxonK 0:9a0a89ffaa43 410 *TMR32B0PWMC |= mask_TMR32B0PWMC;
maxonK 0:9a0a89ffaa43 411 //マッチレジスタセット
maxonK 0:9a0a89ffaa43 412 //デフォルト値設定操作
maxonK 0:9a0a89ffaa43 413 //MR0_周波数
maxonK 0:9a0a89ffaa43 414 *TMR32B0MR0 = val_TMR32B0MR0;
maxonK 0:9a0a89ffaa43 415 //MR3_LOWパルス長
maxonK 0:9a0a89ffaa43 416 *TMR32B0MR3 = val_TMR32B0MR3;
maxonK 0:9a0a89ffaa43 417 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 418 *TMR32B0MCR |= mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 419 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 420 *TMR32B0TCR |= mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 421 }