Keiju Nakano
/
mbed1114_shakehands_host_DirectRegisterPWM
うごく
main.cpp@1:f50a49407c60, 2015-05-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |