First Release
Out_PCE/Cfunc_PCEDigital.cpp@1:6c392ebcd4d4, 2013-07-27 (annotated)
- Committer:
- sankichi
- Date:
- Sat Jul 27 14:19:33 2013 +0000
- Revision:
- 1:6c392ebcd4d4
- Parent:
- 0:e1265f6b3565
First release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sankichi | 0:e1265f6b3565 | 1 | #include "mbed.h" |
sankichi | 0:e1265f6b3565 | 2 | #include "Cfunc_PCEDigital.h" |
sankichi | 0:e1265f6b3565 | 3 | |
sankichi | 0:e1265f6b3565 | 4 | // mbed pins |
sankichi | 0:e1265f6b3565 | 5 | DigitalOut *_OUT_1Y; |
sankichi | 0:e1265f6b3565 | 6 | DigitalOut *_OUT_2Y; |
sankichi | 0:e1265f6b3565 | 7 | DigitalOut *_OUT_3Y; |
sankichi | 0:e1265f6b3565 | 8 | DigitalOut *_OUT_4Y; |
sankichi | 0:e1265f6b3565 | 9 | //BusOut *_OUT_BUS; |
sankichi | 0:e1265f6b3565 | 10 | InterruptIn *_INTR_DSEL; |
sankichi | 0:e1265f6b3565 | 11 | InterruptIn *_INTR_ST; |
sankichi | 0:e1265f6b3565 | 12 | |
sankichi | 0:e1265f6b3565 | 13 | // File local variables |
sankichi | 0:e1265f6b3565 | 14 | static volatile char *_PhaseData; //PhaseData[12] |
sankichi | 0:e1265f6b3565 | 15 | static volatile char *_pRapidFireValue; |
sankichi | 0:e1265f6b3565 | 16 | static volatile char *_pTemp; |
sankichi | 0:e1265f6b3565 | 17 | |
sankichi | 0:e1265f6b3565 | 18 | // Static variables |
sankichi | 0:e1265f6b3565 | 19 | static const int DIGITALPAD_PHASECOUNT_MAX = 10; |
sankichi | 0:e1265f6b3565 | 20 | |
sankichi | 0:e1265f6b3565 | 21 | // File local functions |
sankichi | 0:e1265f6b3565 | 22 | void DSelRiseISR(void); |
sankichi | 0:e1265f6b3565 | 23 | //void StrobeRiseISR(void); |
sankichi | 0:e1265f6b3565 | 24 | static void SetOutputPinsValue(char dat); |
sankichi | 0:e1265f6b3565 | 25 | |
sankichi | 0:e1265f6b3565 | 26 | |
sankichi | 0:e1265f6b3565 | 27 | |
sankichi | 0:e1265f6b3565 | 28 | void Cfunc_PCEDigital_Initialize( |
sankichi | 0:e1265f6b3565 | 29 | DigitalOut *out_1Y, |
sankichi | 0:e1265f6b3565 | 30 | DigitalOut *out_2Y, |
sankichi | 0:e1265f6b3565 | 31 | DigitalOut *out_3Y, |
sankichi | 0:e1265f6b3565 | 32 | DigitalOut *out_4Y, |
sankichi | 0:e1265f6b3565 | 33 | //BusOut *out_bus, |
sankichi | 0:e1265f6b3565 | 34 | InterruptIn *intr_DSEL, |
sankichi | 0:e1265f6b3565 | 35 | InterruptIn *intr_ST, |
sankichi | 0:e1265f6b3565 | 36 | volatile char *pPhaseData, |
sankichi | 0:e1265f6b3565 | 37 | volatile char *pRapidFireValue, |
sankichi | 0:e1265f6b3565 | 38 | volatile char *pTemp |
sankichi | 0:e1265f6b3565 | 39 | /* |
sankichi | 0:e1265f6b3565 | 40 | volatile char *pCh0, |
sankichi | 0:e1265f6b3565 | 41 | volatile char *pCh1, |
sankichi | 0:e1265f6b3565 | 42 | volatile char *pCh2, |
sankichi | 0:e1265f6b3565 | 43 | volatile int *pButtons, |
sankichi | 0:e1265f6b3565 | 44 | volatile char *pInputDeviceType |
sankichi | 0:e1265f6b3565 | 45 | */ |
sankichi | 0:e1265f6b3565 | 46 | ) |
sankichi | 0:e1265f6b3565 | 47 | { |
sankichi | 0:e1265f6b3565 | 48 | // 入出力pin |
sankichi | 0:e1265f6b3565 | 49 | _OUT_1Y = out_1Y; |
sankichi | 0:e1265f6b3565 | 50 | _OUT_2Y = out_2Y; |
sankichi | 0:e1265f6b3565 | 51 | _OUT_3Y = out_3Y; |
sankichi | 0:e1265f6b3565 | 52 | _OUT_4Y = out_4Y; |
sankichi | 0:e1265f6b3565 | 53 | //_OUT_BUS = out_bus; |
sankichi | 0:e1265f6b3565 | 54 | _INTR_DSEL = intr_DSEL; |
sankichi | 0:e1265f6b3565 | 55 | _INTR_ST = intr_ST; |
sankichi | 0:e1265f6b3565 | 56 | |
sankichi | 0:e1265f6b3565 | 57 | // PhaseDataポインタ |
sankichi | 0:e1265f6b3565 | 58 | _PhaseData = pPhaseData; |
sankichi | 0:e1265f6b3565 | 59 | |
sankichi | 0:e1265f6b3565 | 60 | _pRapidFireValue = pRapidFireValue; |
sankichi | 0:e1265f6b3565 | 61 | |
sankichi | 0:e1265f6b3565 | 62 | _pTemp =pTemp; |
sankichi | 0:e1265f6b3565 | 63 | |
sankichi | 0:e1265f6b3565 | 64 | // Inetrrupt Setting |
sankichi | 0:e1265f6b3565 | 65 | // _INTR_DSEL->rise(&DSelRiseISR); |
sankichi | 0:e1265f6b3565 | 66 | _INTR_ST->rise(&DSelRiseISR); |
sankichi | 0:e1265f6b3565 | 67 | |
sankichi | 0:e1265f6b3565 | 68 | // Initialize pin status |
sankichi | 0:e1265f6b3565 | 69 | SetOutputPinsValue(0x00); |
sankichi | 0:e1265f6b3565 | 70 | |
sankichi | 0:e1265f6b3565 | 71 | } |
sankichi | 0:e1265f6b3565 | 72 | |
sankichi | 0:e1265f6b3565 | 73 | |
sankichi | 0:e1265f6b3565 | 74 | void DSelRiseISR(void) |
sankichi | 0:e1265f6b3565 | 75 | { |
sankichi | 0:e1265f6b3565 | 76 | //printf("I\r\n"); |
sankichi | 0:e1265f6b3565 | 77 | ////////////////////////////////////// |
sankichi | 0:e1265f6b3565 | 78 | char dselStatus =0; |
sankichi | 0:e1265f6b3565 | 79 | //char loopCounter = 200; |
sankichi | 0:e1265f6b3565 | 80 | int loopCounter = 200; |
sankichi | 0:e1265f6b3565 | 81 | |
sankichi | 0:e1265f6b3565 | 82 | // Phase0(DSEL=1)の期間、待機 |
sankichi | 0:e1265f6b3565 | 83 | while( (_INTR_DSEL->read()) ) |
sankichi | 0:e1265f6b3565 | 84 | { |
sankichi | 0:e1265f6b3565 | 85 | |
sankichi | 0:e1265f6b3565 | 86 | loopCounter--; |
sankichi | 0:e1265f6b3565 | 87 | if( loopCounter<0 ) |
sankichi | 0:e1265f6b3565 | 88 | { |
sankichi | 0:e1265f6b3565 | 89 | break; |
sankichi | 0:e1265f6b3565 | 90 | } |
sankichi | 0:e1265f6b3565 | 91 | |
sankichi | 0:e1265f6b3565 | 92 | } |
sankichi | 0:e1265f6b3565 | 93 | |
sankichi | 0:e1265f6b3565 | 94 | |
sankichi | 0:e1265f6b3565 | 95 | // ただちにPhase1に移行 |
sankichi | 0:e1265f6b3565 | 96 | // Set data for current phase |
sankichi | 0:e1265f6b3565 | 97 | SetOutputPinsValue(_PhaseData[1]); |
sankichi | 0:e1265f6b3565 | 98 | |
sankichi | 0:e1265f6b3565 | 99 | // 開始 |
sankichi | 0:e1265f6b3565 | 100 | for(int i=2; i< DIGITALPAD_PHASECOUNT_MAX; i++ ) |
sankichi | 0:e1265f6b3565 | 101 | { |
sankichi | 0:e1265f6b3565 | 102 | loopCounter = 200; |
sankichi | 0:e1265f6b3565 | 103 | |
sankichi | 0:e1265f6b3565 | 104 | while( _INTR_DSEL->read()==dselStatus ) |
sankichi | 0:e1265f6b3565 | 105 | { |
sankichi | 0:e1265f6b3565 | 106 | |
sankichi | 0:e1265f6b3565 | 107 | loopCounter--; |
sankichi | 0:e1265f6b3565 | 108 | if( loopCounter<0 ) |
sankichi | 0:e1265f6b3565 | 109 | { |
sankichi | 0:e1265f6b3565 | 110 | break; |
sankichi | 0:e1265f6b3565 | 111 | } |
sankichi | 0:e1265f6b3565 | 112 | |
sankichi | 0:e1265f6b3565 | 113 | } |
sankichi | 0:e1265f6b3565 | 114 | |
sankichi | 0:e1265f6b3565 | 115 | // Set data for current phase |
sankichi | 0:e1265f6b3565 | 116 | SetOutputPinsValue(_PhaseData[i]); |
sankichi | 0:e1265f6b3565 | 117 | |
sankichi | 0:e1265f6b3565 | 118 | |
sankichi | 0:e1265f6b3565 | 119 | dselStatus = !dselStatus; |
sankichi | 0:e1265f6b3565 | 120 | } |
sankichi | 0:e1265f6b3565 | 121 | |
sankichi | 0:e1265f6b3565 | 122 | loopCounter = 200; |
sankichi | 0:e1265f6b3565 | 123 | while( _INTR_DSEL->read()==dselStatus ) |
sankichi | 0:e1265f6b3565 | 124 | { |
sankichi | 0:e1265f6b3565 | 125 | loopCounter--; |
sankichi | 0:e1265f6b3565 | 126 | if( loopCounter<0 ) |
sankichi | 0:e1265f6b3565 | 127 | { |
sankichi | 0:e1265f6b3565 | 128 | break; |
sankichi | 0:e1265f6b3565 | 129 | } |
sankichi | 0:e1265f6b3565 | 130 | } |
sankichi | 0:e1265f6b3565 | 131 | SetOutputPinsValue(_PhaseData[0]); |
sankichi | 0:e1265f6b3565 | 132 | |
sankichi | 0:e1265f6b3565 | 133 | *_pRapidFireValue = !(*_pRapidFireValue); |
sankichi | 0:e1265f6b3565 | 134 | //printf("O\r\n"); |
sankichi | 0:e1265f6b3565 | 135 | (*_pTemp)++; // デバッグ用 |
sankichi | 0:e1265f6b3565 | 136 | |
sankichi | 0:e1265f6b3565 | 137 | //NVIC_EnableIRQ(TIMER3_IRQn); // Tickerルーチンが呼ばれなくなる問題 |
sankichi | 0:e1265f6b3565 | 138 | //LPC_TIM3->IR = 0xff; // clear interrupt flags |
sankichi | 0:e1265f6b3565 | 139 | //LPC_TIM3->TCR = 1; // Enable Timer 悪化 |
sankichi | 0:e1265f6b3565 | 140 | } |
sankichi | 0:e1265f6b3565 | 141 | |
sankichi | 0:e1265f6b3565 | 142 | |
sankichi | 0:e1265f6b3565 | 143 | |
sankichi | 0:e1265f6b3565 | 144 | void SetOutputPinsValue(char dat) |
sankichi | 0:e1265f6b3565 | 145 | { |
sankichi | 0:e1265f6b3565 | 146 | _OUT_1Y->write( dat & 1 ); |
sankichi | 0:e1265f6b3565 | 147 | _OUT_2Y->write( (dat & 2) >> 1 ); |
sankichi | 0:e1265f6b3565 | 148 | _OUT_3Y->write( (dat & 4) >> 2 ); |
sankichi | 0:e1265f6b3565 | 149 | _OUT_4Y->write( (dat & 8) >> 3 ); |
sankichi | 0:e1265f6b3565 | 150 | //_OUT_BUS->write(dat); |
sankichi | 0:e1265f6b3565 | 151 | } |