First Release

Dependencies:   USBDevice

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?

UserRevisionLine numberNew 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 }