Keiju Nakano
/
mbed1114_shakehands_host_DirectRegisterPWM
うごく
main.cpp@2:ad8fad576e79, 2015-05-09 (annotated)
- Committer:
- maxonK
- Date:
- Sat May 09 08:23:08 2015 +0000
- Revision:
- 2:ad8fad576e79
- Parent:
- 1:f50a49407c60
??????????????;
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 | 2:ad8fad576e79 | 187 | Cflag = true; |
maxonK | 1:f50a49407c60 | 188 | setup = true; |
maxonK | 1:f50a49407c60 | 189 | } |
maxonK | 0:9a0a89ffaa43 | 190 | |
maxonK | 1:f50a49407c60 | 191 | //タイムアウトによるデータ送信要求フラグセット |
maxonK | 1:f50a49407c60 | 192 | if(timeOutTimer.read() >= 1){ |
maxonK | 1:f50a49407c60 | 193 | Cflag = true; |
maxonK | 1:f50a49407c60 | 194 | } |
maxonK | 0:9a0a89ffaa43 | 195 | |
maxonK | 0:9a0a89ffaa43 | 196 | //データ送信要求 |
maxonK | 1:f50a49407c60 | 197 | //sensSerial.putc('C'); |
maxonK | 1:f50a49407c60 | 198 | if(Cflag){ |
maxonK | 1:f50a49407c60 | 199 | sensSerial.putc('C'); |
maxonK | 1:f50a49407c60 | 200 | Cflag = false; |
maxonK | 1:f50a49407c60 | 201 | //タイマリセット |
maxonK | 1:f50a49407c60 | 202 | timeOutTimer.stop(); |
maxonK | 1:f50a49407c60 | 203 | timeOutTimer.reset(); |
maxonK | 1:f50a49407c60 | 204 | timeOutTimer.start(); |
maxonK | 1:f50a49407c60 | 205 | } |
maxonK | 1:f50a49407c60 | 206 | |
maxonK | 1:f50a49407c60 | 207 | |
maxonK | 0:9a0a89ffaa43 | 208 | //ハードウェアバッファに到着した情報があるか |
maxonK | 0:9a0a89ffaa43 | 209 | //空ならリターン、あるなら受信値格納用変数にうつす |
maxonK | 0:9a0a89ffaa43 | 210 | if(!sensSerial.readable()) { |
maxonK | 0:9a0a89ffaa43 | 211 | //空のとき |
maxonK | 0:9a0a89ffaa43 | 212 | return -1; |
maxonK | 0:9a0a89ffaa43 | 213 | } else { //あるとき |
maxonK | 0:9a0a89ffaa43 | 214 | receiveChar = sensSerial.getc(); |
maxonK | 0:9a0a89ffaa43 | 215 | } |
maxonK | 0:9a0a89ffaa43 | 216 | //バッファ書き込み位置変数が大きくなりすぎている |
maxonK | 0:9a0a89ffaa43 | 217 | //(ストップビットがくるはずがきてない)ときリターン |
maxonK | 0:9a0a89ffaa43 | 218 | if(stringPosition > (dataLength - 2)) { |
maxonK | 0:9a0a89ffaa43 | 219 | stringPosition = 0; |
maxonK | 0:9a0a89ffaa43 | 220 | //ハードウェアバッファクリア |
maxonK | 0:9a0a89ffaa43 | 221 | bufferClear(); |
maxonK | 0:9a0a89ffaa43 | 222 | return -2; |
maxonK | 0:9a0a89ffaa43 | 223 | } |
maxonK | 0:9a0a89ffaa43 | 224 | |
maxonK | 0:9a0a89ffaa43 | 225 | //到着していたデータがスタートビットだった場合 |
maxonK | 0:9a0a89ffaa43 | 226 | if(receiveChar == startbitChar) { |
maxonK | 0:9a0a89ffaa43 | 227 | |
maxonK | 0:9a0a89ffaa43 | 228 | //バッファクリア |
maxonK | 0:9a0a89ffaa43 | 229 | for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~ |
maxonK | 0:9a0a89ffaa43 | 230 | receiveDataString[i] = '\0'; |
maxonK | 0:9a0a89ffaa43 | 231 | } |
maxonK | 0:9a0a89ffaa43 | 232 | //書き込み位置変数クリア |
maxonK | 0:9a0a89ffaa43 | 233 | stringPosition = 0; |
maxonK | 0:9a0a89ffaa43 | 234 | //バッファへ書き込み |
maxonK | 0:9a0a89ffaa43 | 235 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:9a0a89ffaa43 | 236 | |
maxonK | 0:9a0a89ffaa43 | 237 | |
maxonK | 0:9a0a89ffaa43 | 238 | //書き込み位置進め |
maxonK | 0:9a0a89ffaa43 | 239 | stringPosition ++; |
maxonK | 0:9a0a89ffaa43 | 240 | //-1リターン |
maxonK | 0:9a0a89ffaa43 | 241 | return -3; |
maxonK | 0:9a0a89ffaa43 | 242 | } |
maxonK | 0:9a0a89ffaa43 | 243 | |
maxonK | 0:9a0a89ffaa43 | 244 | //到着していたデータが数字だった場合 |
maxonK | 0:9a0a89ffaa43 | 245 | if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9') { |
maxonK | 0:9a0a89ffaa43 | 246 | //バッファへ書き込み |
maxonK | 0:9a0a89ffaa43 | 247 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:9a0a89ffaa43 | 248 | |
maxonK | 0:9a0a89ffaa43 | 249 | //書き込み位置進め |
maxonK | 0:9a0a89ffaa43 | 250 | stringPosition++; |
maxonK | 0:9a0a89ffaa43 | 251 | //-1リターン |
maxonK | 0:9a0a89ffaa43 | 252 | return -4; |
maxonK | 0:9a0a89ffaa43 | 253 | } |
maxonK | 0:9a0a89ffaa43 | 254 | |
maxonK | 0:9a0a89ffaa43 | 255 | //到着していたデータがストップビットだった場合 |
maxonK | 0:9a0a89ffaa43 | 256 | if(receiveChar == stopbitChar) { |
maxonK | 0:9a0a89ffaa43 | 257 | //使う変数宣言 |
maxonK | 0:9a0a89ffaa43 | 258 | //バッファ内容をコピーするための文字列 |
maxonK | 0:9a0a89ffaa43 | 259 | char copyString [dataLength] = {'\0'}; |
maxonK | 0:9a0a89ffaa43 | 260 | //スタート、ストップビットをトリムしたデータだけの文字列 |
maxonK | 0:9a0a89ffaa43 | 261 | char trimString [dataLength] = {'\0'}; |
maxonK | 0:9a0a89ffaa43 | 262 | //文字列→数値変換後の値を格納する変数 |
maxonK | 0:9a0a89ffaa43 | 263 | int intVal = 0; |
maxonK | 0:9a0a89ffaa43 | 264 | |
maxonK | 0:9a0a89ffaa43 | 265 | //バッファへ書き込み |
maxonK | 0:9a0a89ffaa43 | 266 | receiveDataString[stringPosition] = receiveChar ; |
maxonK | 0:9a0a89ffaa43 | 267 | //null終端 |
maxonK | 0:9a0a89ffaa43 | 268 | copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 0:9a0a89ffaa43 | 269 | receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端 |
maxonK | 0:9a0a89ffaa43 | 270 | |
maxonK | 0:9a0a89ffaa43 | 271 | |
maxonK | 0:9a0a89ffaa43 | 272 | //バッファの内容をうつす |
maxonK | 0:9a0a89ffaa43 | 273 | strlcpy(copyString,receiveDataString,sizeof(copyString)); |
maxonK | 0:9a0a89ffaa43 | 274 | //バッファクリア |
maxonK | 0:9a0a89ffaa43 | 275 | for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~ |
maxonK | 0:9a0a89ffaa43 | 276 | receiveDataString[i] = '\0'; |
maxonK | 0:9a0a89ffaa43 | 277 | } |
maxonK | 0:9a0a89ffaa43 | 278 | //ハードウェアバッファクリア |
maxonK | 0:9a0a89ffaa43 | 279 | bufferClear(); |
maxonK | 0:9a0a89ffaa43 | 280 | //書き込み位置クリア |
maxonK | 0:9a0a89ffaa43 | 281 | stringPosition = 0; |
maxonK | 0:9a0a89ffaa43 | 282 | |
maxonK | 0:9a0a89ffaa43 | 283 | //以下チェックとAtoI |
maxonK | 0:9a0a89ffaa43 | 284 | //先頭がスタートビットになってるか |
maxonK | 0:9a0a89ffaa43 | 285 | if(!(copyString[0] == startbitChar)) { |
maxonK | 0:9a0a89ffaa43 | 286 | return -5; |
maxonK | 0:9a0a89ffaa43 | 287 | } |
maxonK | 0:9a0a89ffaa43 | 288 | //末尾がストップビットになっているか(配列の最後はnull) |
maxonK | 0:9a0a89ffaa43 | 289 | if(!(copyString[(dataLength - 2)] == stopbitChar)) { |
maxonK | 0:9a0a89ffaa43 | 290 | return -6; |
maxonK | 0:9a0a89ffaa43 | 291 | } |
maxonK | 0:9a0a89ffaa43 | 292 | //データだけをトリミング |
maxonK | 0:9a0a89ffaa43 | 293 | //1個目から、後ろから2個目まで*xxxx#(\n) |
maxonK | 0:9a0a89ffaa43 | 294 | for(int Idx = 1; Idx < (dataLength - 2) ; Idx++) { |
maxonK | 0:9a0a89ffaa43 | 295 | trimString[(Idx - 1) ] = copyString[Idx]; |
maxonK | 0:9a0a89ffaa43 | 296 | } |
maxonK | 0:9a0a89ffaa43 | 297 | //null終端 |
maxonK | 0:9a0a89ffaa43 | 298 | trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */ |
maxonK | 0:9a0a89ffaa43 | 299 | //文字列→数値 |
maxonK | 0:9a0a89ffaa43 | 300 | intVal = atoi(trimString); |
maxonK | 1:f50a49407c60 | 301 | //送信要求フラグセット |
maxonK | 1:f50a49407c60 | 302 | Cflag = true; |
maxonK | 0:9a0a89ffaa43 | 303 | //数値リターン |
maxonK | 0:9a0a89ffaa43 | 304 | return intVal; |
maxonK | 0:9a0a89ffaa43 | 305 | |
maxonK | 0:9a0a89ffaa43 | 306 | } |
maxonK | 0:9a0a89ffaa43 | 307 | |
maxonK | 0:9a0a89ffaa43 | 308 | |
maxonK | 0:9a0a89ffaa43 | 309 | //以上にひっかからなかった異常時 |
maxonK | 0:9a0a89ffaa43 | 310 | //バッファクリア |
maxonK | 0:9a0a89ffaa43 | 311 | for (int i = 0; i <dataLength; i++) { //配列の要素は0~ 大きさは1~ |
maxonK | 0:9a0a89ffaa43 | 312 | receiveDataString[i] = '\0'; |
maxonK | 0:9a0a89ffaa43 | 313 | } |
maxonK | 0:9a0a89ffaa43 | 314 | //ハードウェアバッファクリア |
maxonK | 0:9a0a89ffaa43 | 315 | bufferClear(); |
maxonK | 0:9a0a89ffaa43 | 316 | //書き込み位置クリア |
maxonK | 0:9a0a89ffaa43 | 317 | stringPosition = 0; |
maxonK | 0:9a0a89ffaa43 | 318 | //-3リターン |
maxonK | 0:9a0a89ffaa43 | 319 | return -7; |
maxonK | 0:9a0a89ffaa43 | 320 | } |
maxonK | 0:9a0a89ffaa43 | 321 | |
maxonK | 0:9a0a89ffaa43 | 322 | |
maxonK | 0:9a0a89ffaa43 | 323 | //cramp関数 |
maxonK | 0:9a0a89ffaa43 | 324 | int cramp(int val , int min , int max) |
maxonK | 0:9a0a89ffaa43 | 325 | { |
maxonK | 0:9a0a89ffaa43 | 326 | if(val < min) { |
maxonK | 0:9a0a89ffaa43 | 327 | return min; |
maxonK | 0:9a0a89ffaa43 | 328 | } |
maxonK | 0:9a0a89ffaa43 | 329 | if(val > max) { |
maxonK | 0:9a0a89ffaa43 | 330 | return max; |
maxonK | 0:9a0a89ffaa43 | 331 | } |
maxonK | 0:9a0a89ffaa43 | 332 | |
maxonK | 0:9a0a89ffaa43 | 333 | return val; |
maxonK | 0:9a0a89ffaa43 | 334 | } |
maxonK | 0:9a0a89ffaa43 | 335 | |
maxonK | 0:9a0a89ffaa43 | 336 | //serialハードウェアバッファクリア関数 |
maxonK | 0:9a0a89ffaa43 | 337 | void bufferClear() |
maxonK | 0:9a0a89ffaa43 | 338 | { |
maxonK | 0:9a0a89ffaa43 | 339 | char temp = 0; |
maxonK | 0:9a0a89ffaa43 | 340 | while(sensSerial.readable()) { |
maxonK | 0:9a0a89ffaa43 | 341 | temp = sensSerial.getc(); |
maxonK | 0:9a0a89ffaa43 | 342 | } |
maxonK | 0:9a0a89ffaa43 | 343 | return; |
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 | |
maxonK | 0:9a0a89ffaa43 | 351 | void CT32B0_MAT3_PWM_registerSet(unsigned int pwmFrequency) |
maxonK | 0:9a0a89ffaa43 | 352 | { |
maxonK | 0:9a0a89ffaa43 | 353 | //PWM機能設定用 |
maxonK | 0:9a0a89ffaa43 | 354 | //pwmピンのピン機能選択をmbedで行う |
maxonK | 0:9a0a89ffaa43 | 355 | //PwmOut MAT2(dp24);//CT32B0_MAT2 |
maxonK | 0:9a0a89ffaa43 | 356 | //PWM周波数 |
maxonK | 0:9a0a89ffaa43 | 357 | //unsigned int pwmFrequency = 4; |
maxonK | 0:9a0a89ffaa43 | 358 | //各種レジスタ設定用ビットマスク |
maxonK | 0:9a0a89ffaa43 | 359 | //システムAHBクロック制御レジスタマスク |
maxonK | 0:9a0a89ffaa43 | 360 | unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9; |
maxonK | 0:9a0a89ffaa43 | 361 | //IO設定レジスタレジスタマスク |
maxonK | 0:9a0a89ffaa43 | 362 | unsigned int mask_IOCON_PIO0_11 = 0x3; |
maxonK | 0:9a0a89ffaa43 | 363 | //タイマ制御レジスタマスク |
maxonK | 0:9a0a89ffaa43 | 364 | //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ |
maxonK | 0:9a0a89ffaa43 | 365 | unsigned int mask_TMR32B0TCR = 1; |
maxonK | 0:9a0a89ffaa43 | 366 | //プリスケールレジスタマスク |
maxonK | 0:9a0a89ffaa43 | 367 | unsigned int val_TMR32B0PR = 0; |
maxonK | 0:9a0a89ffaa43 | 368 | //マッチ制御レジスタマスク |
maxonK | 0:9a0a89ffaa43 | 369 | //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する |
maxonK | 0:9a0a89ffaa43 | 370 | //残りのマッチレジスタはディスエーブルにする |
maxonK | 0:9a0a89ffaa43 | 371 | //mbedのピン配列ではタイマ0は0番をTCリセットに使うといいかも |
maxonK | 0:9a0a89ffaa43 | 372 | unsigned int mask_TMR32B0MCR = 1 << 1; |
maxonK | 0:9a0a89ffaa43 | 373 | //PWM制御レジスタマスク |
maxonK | 0:9a0a89ffaa43 | 374 | //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで |
maxonK | 0:9a0a89ffaa43 | 375 | //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする |
maxonK | 0:9a0a89ffaa43 | 376 | //mbedではMAT2がpwmOutになってるがISPモードに使用しているので、dp4-MAT3を試す |
maxonK | 0:9a0a89ffaa43 | 377 | unsigned int mask_TMR32B0PWMC = 1 << 3; |
maxonK | 0:9a0a89ffaa43 | 378 | //マッチレジスタ値 |
maxonK | 0:9a0a89ffaa43 | 379 | //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する |
maxonK | 0:9a0a89ffaa43 | 380 | // ((48*10^6)/nHz)で任意の周波数になる、はずである |
maxonK | 0:9a0a89ffaa43 | 381 | //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する |
maxonK | 0:9a0a89ffaa43 | 382 | // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない |
maxonK | 0:9a0a89ffaa43 | 383 | unsigned int val_TMR32B0MR0 = /*10;*/((48000000) / (pwmFrequency)); |
maxonK | 0:9a0a89ffaa43 | 384 | unsigned int val_TMR32B0MR3 = /*8;*/((48000000) / (pwmFrequency)) + 1; |
maxonK | 0:9a0a89ffaa43 | 385 | |
maxonK | 0:9a0a89ffaa43 | 386 | //システムAHBクロック制御レジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 387 | volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080; |
maxonK | 0:9a0a89ffaa43 | 388 | //IO設定レジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 389 | volatile unsigned int *IOCON_PIO0_11Local = (unsigned int *)0x40044074; |
maxonK | 0:9a0a89ffaa43 | 390 | //プリスケールレジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 391 | volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C; |
maxonK | 0:9a0a89ffaa43 | 392 | //タイマ制御レジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 393 | volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004); |
maxonK | 0:9a0a89ffaa43 | 394 | //マッチ制御レジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 395 | volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014); |
maxonK | 0:9a0a89ffaa43 | 396 | //マッチレジスタ0アドレス |
maxonK | 0:9a0a89ffaa43 | 397 | volatile unsigned int *TMR32B0MR0 = (unsigned int *)(0x40014018); |
maxonK | 0:9a0a89ffaa43 | 398 | //マッチレジスタ3アドレス |
maxonK | 0:9a0a89ffaa43 | 399 | volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024); |
maxonK | 0:9a0a89ffaa43 | 400 | //PWM制御レジスタアドレス |
maxonK | 0:9a0a89ffaa43 | 401 | volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074); |
maxonK | 0:9a0a89ffaa43 | 402 | |
maxonK | 0:9a0a89ffaa43 | 403 | //PWM機能制御レジスタセット |
maxonK | 0:9a0a89ffaa43 | 404 | //システムAHBクロック制御レジスタセット |
maxonK | 0:9a0a89ffaa43 | 405 | *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL; |
maxonK | 0:9a0a89ffaa43 | 406 | //IO設定レジスタセット |
maxonK | 0:9a0a89ffaa43 | 407 | *IOCON_PIO0_11Local |= mask_IOCON_PIO0_11; |
maxonK | 0:9a0a89ffaa43 | 408 | //プリスケーラレジスタセット |
maxonK | 0:9a0a89ffaa43 | 409 | *TMR32B0PRLocal = val_TMR32B0PR; |
maxonK | 0:9a0a89ffaa43 | 410 | //PWM制御レジスタセット |
maxonK | 0:9a0a89ffaa43 | 411 | *TMR32B0PWMC |= mask_TMR32B0PWMC; |
maxonK | 0:9a0a89ffaa43 | 412 | //マッチレジスタセット |
maxonK | 0:9a0a89ffaa43 | 413 | //デフォルト値設定操作 |
maxonK | 0:9a0a89ffaa43 | 414 | //MR0_周波数 |
maxonK | 0:9a0a89ffaa43 | 415 | *TMR32B0MR0 = val_TMR32B0MR0; |
maxonK | 0:9a0a89ffaa43 | 416 | //MR3_LOWパルス長 |
maxonK | 0:9a0a89ffaa43 | 417 | *TMR32B0MR3 = val_TMR32B0MR3; |
maxonK | 0:9a0a89ffaa43 | 418 | //マッチ制御レジスタセット |
maxonK | 0:9a0a89ffaa43 | 419 | *TMR32B0MCR |= mask_TMR32B0MCR; |
maxonK | 0:9a0a89ffaa43 | 420 | //タイマ制御レジスタセット |
maxonK | 0:9a0a89ffaa43 | 421 | *TMR32B0TCR |= mask_TMR32B0TCR; |
maxonK | 0:9a0a89ffaa43 | 422 | } |