test publish
Dependencies: BLE_API nRF51822 mbed
Fork of KS7 by
io.cpp@30:f67850cc3cfe, 2016-05-23 (annotated)
- Committer:
- masaaki_makabe
- Date:
- Mon May 23 05:15:58 2016 +0000
- Branch:
- KS3
- Revision:
- 30:f67850cc3cfe
- Child:
- 31:b5e19d153db4
io??????????????????main.cpp??????????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masaaki_makabe | 30:f67850cc3cfe | 1 | #include "io.h" |
masaaki_makabe | 30:f67850cc3cfe | 2 | #include "mbed.h" |
masaaki_makabe | 30:f67850cc3cfe | 3 | |
masaaki_makabe | 30:f67850cc3cfe | 4 | // COL[2:0]: P0_27 P0_26 P0_21 |
masaaki_makabe | 30:f67850cc3cfe | 5 | // ROW[7:0]: P0_19 P0_16 P0_15 P0_13 P0_12 P0_11 P0_09 P0_08 |
masaaki_makabe | 30:f67850cc3cfe | 6 | // PowA : P0_00 |
masaaki_makabe | 30:f67850cc3cfe | 7 | // Vin : P0_01 |
masaaki_makabe | 30:f67850cc3cfe | 8 | // SWx/y : P0_02 P0_03 |
masaaki_makabe | 30:f67850cc3cfe | 9 | // PWM : P0_05 |
masaaki_makabe | 30:f67850cc3cfe | 10 | // |
masaaki_makabe | 30:f67850cc3cfe | 11 | // 0a 0b 0c 1f 1g 1h 3c 3d 3e 4h 5a 5b |
masaaki_makabe | 30:f67850cc3cfe | 12 | // 0d 0e 2a 2b 3f 3g 5c 5d 6e 6f 6g |
masaaki_makabe | 30:f67850cc3cfe | 13 | // 0f 0g 0h 2c 2d 2e 3h 4a 4b 5e 5f 5g 6h |
masaaki_makabe | 30:f67850cc3cfe | 14 | // 1a 1b 2f 2g 4c 4d 5h 6a 7a 7b |
masaaki_makabe | 30:f67850cc3cfe | 15 | // 1c 1d 1e 2h 3a 3b 4e 4f 4g 6b 6c 6d 7c 7d 7e |
masaaki_makabe | 30:f67850cc3cfe | 16 | // [hgfe:dcba] |
masaaki_makabe | 30:f67850cc3cfe | 17 | // |
masaaki_makabe | 30:f67850cc3cfe | 18 | // 1 2 3 14 15 16 27 28 29 40 41 42 |
masaaki_makabe | 30:f67850cc3cfe | 19 | // 4 5 17 18 30 31 43 44 53 54 55 |
masaaki_makabe | 30:f67850cc3cfe | 20 | // 6 7 8 19 20 21 32 33 34 45 46 47 56 |
masaaki_makabe | 30:f67850cc3cfe | 21 | // 9 10 22 23 35 36 48 49 57 58 |
masaaki_makabe | 30:f67850cc3cfe | 22 | // 11 12 13 24 25 26 37 38 39 50 51 52 59 60 61 |
masaaki_makabe | 30:f67850cc3cfe | 23 | // seg[3] seg[2] seg[1] seg[0] |
masaaki_makabe | 30:f67850cc3cfe | 24 | // |
masaaki_makabe | 30:f67850cc3cfe | 25 | // COL 0 1 2 3 4 5 6 7 |
masaaki_makabe | 30:f67850cc3cfe | 26 | // 1-8 9-16 17-24 25-31 32-40 41-48 49-56 57-(64) |
masaaki_makabe | 30:f67850cc3cfe | 27 | // |
masaaki_makabe | 30:f67850cc3cfe | 28 | // seg0 |
masaaki_makabe | 30:f67850cc3cfe | 29 | // seg5 seg1 |
masaaki_makabe | 30:f67850cc3cfe | 30 | // seg6 |
masaaki_makabe | 30:f67850cc3cfe | 31 | // seg4 seg2 |
masaaki_makabe | 30:f67850cc3cfe | 32 | // seg3 |
masaaki_makabe | 30:f67850cc3cfe | 33 | // |
masaaki_makabe | 30:f67850cc3cfe | 34 | // Joystick connection |
masaaki_makabe | 30:f67850cc3cfe | 35 | // |
masaaki_makabe | 30:f67850cc3cfe | 36 | // o o o |
masaaki_makabe | 30:f67850cc3cfe | 37 | //o |
masaaki_makabe | 30:f67850cc3cfe | 38 | //o +->x |
masaaki_makabe | 30:f67850cc3cfe | 39 | //o | |
masaaki_makabe | 30:f67850cc3cfe | 40 | // y |
masaaki_makabe | 30:f67850cc3cfe | 41 | |
masaaki_makabe | 30:f67850cc3cfe | 42 | |
masaaki_makabe | 30:f67850cc3cfe | 43 | Ticker _tk; |
masaaki_makabe | 30:f67850cc3cfe | 44 | |
masaaki_makabe | 30:f67850cc3cfe | 45 | // multiple condition in #ifdef |
masaaki_makabe | 30:f67850cc3cfe | 46 | // http://qiita.com/D-3/items/b98b63c2629496856654 |
masaaki_makabe | 30:f67850cc3cfe | 47 | #if defined(PCB_VER1) || defined(PCB_VER2) |
masaaki_makabe | 30:f67850cc3cfe | 48 | I2C i2c(P0_13, P0_15); |
masaaki_makabe | 30:f67850cc3cfe | 49 | #define I2C_FREQ 100000 |
masaaki_makabe | 30:f67850cc3cfe | 50 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 51 | |
masaaki_makabe | 30:f67850cc3cfe | 52 | #ifdef PCB_VER2 |
masaaki_makabe | 30:f67850cc3cfe | 53 | #define ADC_ADS1115 // use 16bit ADC |
masaaki_makabe | 30:f67850cc3cfe | 54 | |
masaaki_makabe | 30:f67850cc3cfe | 55 | #ifdef ADC_ADS1115 |
masaaki_makabe | 30:f67850cc3cfe | 56 | #define I2C_ADDR 0x90 // for ADS1115 |
masaaki_makabe | 30:f67850cc3cfe | 57 | #else |
masaaki_makabe | 30:f67850cc3cfe | 58 | #define I2C_ADDR 0x68 // for MAX11613 |
masaaki_makabe | 30:f67850cc3cfe | 59 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 60 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 61 | |
masaaki_makabe | 30:f67850cc3cfe | 62 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 63 | io::io(PinName CLK, PinName DAT) : _hx711(P0_14, DAT, CLK) |
masaaki_makabe | 30:f67850cc3cfe | 64 | #else |
masaaki_makabe | 30:f67850cc3cfe | 65 | io::io() |
masaaki_makabe | 30:f67850cc3cfe | 66 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 67 | { |
masaaki_makabe | 30:f67850cc3cfe | 68 | _col = 0; |
masaaki_makabe | 30:f67850cc3cfe | 69 | for (uint8_t i = 0; i < 4; i++) _seg[i] = 0x00; |
masaaki_makabe | 30:f67850cc3cfe | 70 | // COL[2:0]: P0_27 P0_26 P0_21 |
masaaki_makabe | 30:f67850cc3cfe | 71 | // ROW[7:0]: P0_19 P0_16 P0_15 P0_13 P0_12 P0_11 P0_09 P0_08 |
masaaki_makabe | 30:f67850cc3cfe | 72 | #if defined(UART_DEBUG) |
masaaki_makabe | 30:f67850cc3cfe | 73 | #if defined(PCB_VER1) || defined(PCB_VER2) // UART: P0_8 & P0_9 (sg0&sg1) |
masaaki_makabe | 30:f67850cc3cfe | 74 | _sg2 = new DigitalOut(P0_11, 0); |
masaaki_makabe | 30:f67850cc3cfe | 75 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 76 | #if defined(PCB_VER3) // UART: P0_8 & P0_11(sg0&sg2) |
masaaki_makabe | 30:f67850cc3cfe | 77 | _sg1 = new DigitalOut(P0_9, 0); |
masaaki_makabe | 30:f67850cc3cfe | 78 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 79 | #if defined(PCB_VER4) // UART: P0_9 & P0_11(sg1&sg2) |
masaaki_makabe | 30:f67850cc3cfe | 80 | _sg0 = new DigitalOut(P0_8, 0); |
masaaki_makabe | 30:f67850cc3cfe | 81 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 82 | #else |
masaaki_makabe | 30:f67850cc3cfe | 83 | _sg0 = new DigitalOut(P0_8, 0); |
masaaki_makabe | 30:f67850cc3cfe | 84 | _sg1 = new DigitalOut(P0_9, 0); |
masaaki_makabe | 30:f67850cc3cfe | 85 | _sg2 = new DigitalOut(P0_11, 0); |
masaaki_makabe | 30:f67850cc3cfe | 86 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 87 | _sg3 = new DigitalOut(P0_12, 0); |
masaaki_makabe | 30:f67850cc3cfe | 88 | |
masaaki_makabe | 30:f67850cc3cfe | 89 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 90 | _sg4 = new DigitalOut(P0_13, 0); |
masaaki_makabe | 30:f67850cc3cfe | 91 | _sg5 = new DigitalOut(P0_15, 0); |
masaaki_makabe | 30:f67850cc3cfe | 92 | #else |
masaaki_makabe | 30:f67850cc3cfe | 93 | _sg4 = new DigitalOut(P0_2, 0); |
masaaki_makabe | 30:f67850cc3cfe | 94 | _sg5 = new DigitalOut(P0_3, 0); |
masaaki_makabe | 30:f67850cc3cfe | 95 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 96 | _sg6 = new DigitalOut(P0_16, 0); |
masaaki_makabe | 30:f67850cc3cfe | 97 | _sg7 = new DigitalOut(P0_19, 0); |
masaaki_makabe | 30:f67850cc3cfe | 98 | _sa0 = new DigitalOut(P0_21, 0); |
masaaki_makabe | 30:f67850cc3cfe | 99 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 100 | _sa1 = new DigitalOut(P0_26, 0); |
masaaki_makabe | 30:f67850cc3cfe | 101 | _sa2 = new DigitalOut(P0_27, 0); |
masaaki_makabe | 30:f67850cc3cfe | 102 | _jx = new AnalogIn(P0_2); |
masaaki_makabe | 30:f67850cc3cfe | 103 | _jy = new AnalogIn(P0_3); |
masaaki_makabe | 30:f67850cc3cfe | 104 | _weight = new AnalogIn(P0_1); |
masaaki_makabe | 30:f67850cc3cfe | 105 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 106 | #if defined(PCB_VER2) || defined(PCB_VER3) || defined(PCB_VER4) |
masaaki_makabe | 30:f67850cc3cfe | 107 | _sa1 = new DigitalOut(P0_24, 0); |
masaaki_makabe | 30:f67850cc3cfe | 108 | _sa2 = new DigitalOut(P0_25, 0); |
masaaki_makabe | 30:f67850cc3cfe | 109 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 110 | _pow = new DigitalOut(P0_0, 1); // initial: analog power off |
masaaki_makabe | 30:f67850cc3cfe | 111 | _pwm = new PwmOut(P0_5); |
masaaki_makabe | 30:f67850cc3cfe | 112 | // _pwm = new PwmOut(P0_15); // for BLEnano debug |
masaaki_makabe | 30:f67850cc3cfe | 113 | _adc0 = 0; |
masaaki_makabe | 30:f67850cc3cfe | 114 | _pwm->period_us(100); |
masaaki_makabe | 30:f67850cc3cfe | 115 | _pwm->write(0.0); |
masaaki_makabe | 30:f67850cc3cfe | 116 | #if defined(PCB_VER1) || defined(PCB_VER2) |
masaaki_makabe | 30:f67850cc3cfe | 117 | i2c.frequency(I2C_FREQ); |
masaaki_makabe | 30:f67850cc3cfe | 118 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 119 | |
masaaki_makabe | 30:f67850cc3cfe | 120 | #ifdef PCB_VER3 |
masaaki_makabe | 30:f67850cc3cfe | 121 | _sw = new DigitalIn(P0_4, PullDown); |
masaaki_makabe | 30:f67850cc3cfe | 122 | _adc_ck = new DigitalOut(P0_15, 0); |
masaaki_makabe | 30:f67850cc3cfe | 123 | _adc_di = new DigitalIn(P0_13); |
masaaki_makabe | 30:f67850cc3cfe | 124 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 125 | for (uint8_t i = 0; i < 24; i++) { |
masaaki_makabe | 30:f67850cc3cfe | 126 | _adc_ck->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 127 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 128 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 129 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 130 | } |
masaaki_makabe | 30:f67850cc3cfe | 131 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 132 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 133 | _hx711.format(8, 1); // 8bit mode1 |
masaaki_makabe | 30:f67850cc3cfe | 134 | _hx711.frequency(500000); // 500kHz |
masaaki_makabe | 30:f67850cc3cfe | 135 | _sw = new DigitalIn(P0_4, PullDown); |
masaaki_makabe | 30:f67850cc3cfe | 136 | // _sw = new DigitalIn(P0_13, PullDown); // for BLEnano debug |
masaaki_makabe | 30:f67850cc3cfe | 137 | // _adc_ck = new DigitalOut(P0_15, 0); // for software SPI |
masaaki_makabe | 30:f67850cc3cfe | 138 | // _adc_di = new DigitalIn(P0_13); // for software SPI |
masaaki_makabe | 30:f67850cc3cfe | 139 | _PselSCK = NRF_SPI1->PSELSCK; // for hardware SPI |
masaaki_makabe | 30:f67850cc3cfe | 140 | _PselMISO = NRF_SPI1->PSELMISO; // for hardware SPI |
masaaki_makabe | 30:f67850cc3cfe | 141 | _reg_ps = new DigitalOut(P0_1, 1); // 1=normal, 0=power_save |
masaaki_makabe | 30:f67850cc3cfe | 142 | // _adc_rate = new DigitalOut(P0_6, 0); // 0=10Hz, 1=80Hz (HX711's RATE pin) |
masaaki_makabe | 30:f67850cc3cfe | 143 | _adc_rate = new DigitalOut(P0_6, 1); // 0=10Hz, 1=80Hz (HX711's RATE pin) |
masaaki_makabe | 30:f67850cc3cfe | 144 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 145 | _fDisplaying = 0; |
masaaki_makabe | 30:f67850cc3cfe | 146 | } |
masaaki_makabe | 30:f67850cc3cfe | 147 | |
masaaki_makabe | 30:f67850cc3cfe | 148 | io::~io() |
masaaki_makabe | 30:f67850cc3cfe | 149 | { |
masaaki_makabe | 30:f67850cc3cfe | 150 | } |
masaaki_makabe | 30:f67850cc3cfe | 151 | |
masaaki_makabe | 30:f67850cc3cfe | 152 | void io::_set_col() |
masaaki_makabe | 30:f67850cc3cfe | 153 | { |
masaaki_makabe | 30:f67850cc3cfe | 154 | if ((_col & 0x01) == 0) _sa0->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 155 | else _sa0->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 156 | if ((_col & 0x02) == 0) _sa1->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 157 | else _sa1->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 158 | if ((_col & 0x04) == 0) _sa2->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 159 | else _sa2->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 160 | } |
masaaki_makabe | 30:f67850cc3cfe | 161 | |
masaaki_makabe | 30:f67850cc3cfe | 162 | void io::_set_row(uint8_t d) |
masaaki_makabe | 30:f67850cc3cfe | 163 | { |
masaaki_makabe | 30:f67850cc3cfe | 164 | #if defined(UART_DEBUG) |
masaaki_makabe | 30:f67850cc3cfe | 165 | #if defined(PCB_VER1) || defined(PCB_VER2) // UART: P0_8 & P0_9 (sg0&sg1) |
masaaki_makabe | 30:f67850cc3cfe | 166 | if ((d & 0x04) == 0) _sg2->write(0); else _sg2->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 167 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 168 | #if defined(PCB_VER3) // UART: P0_8 & P0_11 (sg0&sg2) |
masaaki_makabe | 30:f67850cc3cfe | 169 | if ((d & 0x02) == 0) _sg1->write(0); else _sg1->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 170 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 171 | #if defined(PCB_VER4) // UART: P0_9 & P0_11(sg1&sg2) |
masaaki_makabe | 30:f67850cc3cfe | 172 | if ((d & 0x01) == 0) _sg0->write(0); else _sg0->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 173 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 174 | #else |
masaaki_makabe | 30:f67850cc3cfe | 175 | if ((d & 0x01) == 0) _sg0->write(0); else _sg0->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 176 | if ((d & 0x02) == 0) _sg1->write(0); else _sg1->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 177 | if ((d & 0x04) == 0) _sg2->write(0); else _sg2->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 178 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 179 | if ((d & 0x08) == 0) _sg3->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 180 | else _sg3->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 181 | if ((d & 0x10) == 0) _sg4->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 182 | else _sg4->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 183 | if ((d & 0x20) == 0) _sg5->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 184 | else _sg5->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 185 | if ((d & 0x40) == 0) _sg6->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 186 | else _sg6->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 187 | if ((d & 0x80) == 0) _sg7->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 188 | else _sg7->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 189 | } |
masaaki_makabe | 30:f67850cc3cfe | 190 | |
masaaki_makabe | 30:f67850cc3cfe | 191 | uint8_t io::_set_segment(uint8_t d) |
masaaki_makabe | 30:f67850cc3cfe | 192 | { |
masaaki_makabe | 30:f67850cc3cfe | 193 | // seg0 |
masaaki_makabe | 30:f67850cc3cfe | 194 | // seg5 seg1 |
masaaki_makabe | 30:f67850cc3cfe | 195 | // seg6 |
masaaki_makabe | 30:f67850cc3cfe | 196 | // seg4 seg2 |
masaaki_makabe | 30:f67850cc3cfe | 197 | // seg3 |
masaaki_makabe | 30:f67850cc3cfe | 198 | uint8_t v; |
masaaki_makabe | 30:f67850cc3cfe | 199 | switch(d) { |
masaaki_makabe | 30:f67850cc3cfe | 200 | case 0: |
masaaki_makabe | 30:f67850cc3cfe | 201 | v = 0x3f; |
masaaki_makabe | 30:f67850cc3cfe | 202 | break; |
masaaki_makabe | 30:f67850cc3cfe | 203 | case 1: |
masaaki_makabe | 30:f67850cc3cfe | 204 | v = 0x06; |
masaaki_makabe | 30:f67850cc3cfe | 205 | break; |
masaaki_makabe | 30:f67850cc3cfe | 206 | case 2: |
masaaki_makabe | 30:f67850cc3cfe | 207 | v = 0x5b; |
masaaki_makabe | 30:f67850cc3cfe | 208 | break; |
masaaki_makabe | 30:f67850cc3cfe | 209 | case 3: |
masaaki_makabe | 30:f67850cc3cfe | 210 | v = 0x4f; |
masaaki_makabe | 30:f67850cc3cfe | 211 | break; |
masaaki_makabe | 30:f67850cc3cfe | 212 | case 4: |
masaaki_makabe | 30:f67850cc3cfe | 213 | v = 0x66; |
masaaki_makabe | 30:f67850cc3cfe | 214 | break; |
masaaki_makabe | 30:f67850cc3cfe | 215 | case 5: |
masaaki_makabe | 30:f67850cc3cfe | 216 | v = 0x6d; |
masaaki_makabe | 30:f67850cc3cfe | 217 | break; |
masaaki_makabe | 30:f67850cc3cfe | 218 | case 6: |
masaaki_makabe | 30:f67850cc3cfe | 219 | v = 0x7d; |
masaaki_makabe | 30:f67850cc3cfe | 220 | break; |
masaaki_makabe | 30:f67850cc3cfe | 221 | case 7: |
masaaki_makabe | 30:f67850cc3cfe | 222 | v = 0x27; |
masaaki_makabe | 30:f67850cc3cfe | 223 | break; |
masaaki_makabe | 30:f67850cc3cfe | 224 | case 8: |
masaaki_makabe | 30:f67850cc3cfe | 225 | v = 0x7f; |
masaaki_makabe | 30:f67850cc3cfe | 226 | break; |
masaaki_makabe | 30:f67850cc3cfe | 227 | case 9: |
masaaki_makabe | 30:f67850cc3cfe | 228 | v = 0x6f; |
masaaki_makabe | 30:f67850cc3cfe | 229 | break; |
masaaki_makabe | 30:f67850cc3cfe | 230 | default : |
masaaki_makabe | 30:f67850cc3cfe | 231 | v = 0x00; |
masaaki_makabe | 30:f67850cc3cfe | 232 | break; |
masaaki_makabe | 30:f67850cc3cfe | 233 | } |
masaaki_makabe | 30:f67850cc3cfe | 234 | return(v); |
masaaki_makabe | 30:f67850cc3cfe | 235 | } |
masaaki_makabe | 30:f67850cc3cfe | 236 | |
masaaki_makabe | 30:f67850cc3cfe | 237 | void io::_timer_ticker() |
masaaki_makabe | 30:f67850cc3cfe | 238 | { |
masaaki_makabe | 30:f67850cc3cfe | 239 | _set_row(0); |
masaaki_makabe | 30:f67850cc3cfe | 240 | _set_col(); |
masaaki_makabe | 30:f67850cc3cfe | 241 | _set_row(_row_out[_col]); |
masaaki_makabe | 30:f67850cc3cfe | 242 | _col++; |
masaaki_makabe | 30:f67850cc3cfe | 243 | if (_col == 8) { |
masaaki_makabe | 30:f67850cc3cfe | 244 | _col = 0; |
masaaki_makabe | 30:f67850cc3cfe | 245 | if (display_value < 0) _display_value = 0; |
masaaki_makabe | 30:f67850cc3cfe | 246 | else if (display_value > 9999) _display_value = 9999; |
masaaki_makabe | 30:f67850cc3cfe | 247 | else _display_value = display_value; |
masaaki_makabe | 30:f67850cc3cfe | 248 | |
masaaki_makabe | 30:f67850cc3cfe | 249 | #ifdef DISPLAY_ZERO_SUPPRESS |
masaaki_makabe | 30:f67850cc3cfe | 250 | if (_display_value < 1000) _seg[3] = 0; |
masaaki_makabe | 30:f67850cc3cfe | 251 | else |
masaaki_makabe | 30:f67850cc3cfe | 252 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 253 | _seg[3] = _set_segment(_display_value / 1000); |
masaaki_makabe | 30:f67850cc3cfe | 254 | #ifdef DISPLAY_ZERO_SUPPRESS |
masaaki_makabe | 30:f67850cc3cfe | 255 | if (_display_value < 100) _seg[2] = 0; |
masaaki_makabe | 30:f67850cc3cfe | 256 | else |
masaaki_makabe | 30:f67850cc3cfe | 257 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 258 | _seg[2] = _set_segment((_display_value / 100) % 10); |
masaaki_makabe | 30:f67850cc3cfe | 259 | #ifdef DISPLAY_ZERO_SUPPRESS |
masaaki_makabe | 30:f67850cc3cfe | 260 | if (_display_value < 10) _seg[1] = 0; |
masaaki_makabe | 30:f67850cc3cfe | 261 | else |
masaaki_makabe | 30:f67850cc3cfe | 262 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 263 | _seg[1] = _set_segment((_display_value / 10) % 10); |
masaaki_makabe | 30:f67850cc3cfe | 264 | _seg[0] = _set_segment(_display_value % 10); |
masaaki_makabe | 30:f67850cc3cfe | 265 | for (uint8_t i = 0; i < 8; i++) _row_out[i] = 0; |
masaaki_makabe | 30:f67850cc3cfe | 266 | |
masaaki_makabe | 30:f67850cc3cfe | 267 | if ((_seg[3] & 0x40) != 0) _row_out[0] |= 0xe0; // seg6/0f-0g-0h |
masaaki_makabe | 30:f67850cc3cfe | 268 | if ((_seg[3] & 0x20) != 0) _row_out[0] |= 0x29; // seg5/0a-0d-0f |
masaaki_makabe | 30:f67850cc3cfe | 269 | if ((_seg[3] & 0x10) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 270 | _row_out[0] |= 0x20; // seg4/0f-1a-1c |
masaaki_makabe | 30:f67850cc3cfe | 271 | _row_out[1] |= 0x05; |
masaaki_makabe | 30:f67850cc3cfe | 272 | } |
masaaki_makabe | 30:f67850cc3cfe | 273 | if ((_seg[3] & 0x08) != 0) _row_out[1] |= 0x1c; // seg3/1c-1d-1e |
masaaki_makabe | 30:f67850cc3cfe | 274 | if ((_seg[3] & 0x04) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 275 | _row_out[0] |= 0x80; // seg2/0h-1b-1e |
masaaki_makabe | 30:f67850cc3cfe | 276 | _row_out[1] |= 0x12; |
masaaki_makabe | 30:f67850cc3cfe | 277 | } |
masaaki_makabe | 30:f67850cc3cfe | 278 | if ((_seg[3] & 0x02) != 0) _row_out[0] |= 0x94; // seg1/0c-0e-0h |
masaaki_makabe | 30:f67850cc3cfe | 279 | if ((_seg[3] & 0x01) != 0) _row_out[0] |= 0x07; // seg0/0a-0b-0c |
masaaki_makabe | 30:f67850cc3cfe | 280 | |
masaaki_makabe | 30:f67850cc3cfe | 281 | if ((_seg[2] & 0x40) != 0) _row_out[2] |= 0x1c; // seg6/2c-2d-2e |
masaaki_makabe | 30:f67850cc3cfe | 282 | if ((_seg[2] & 0x20) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 283 | _row_out[2] |= 0x05; // seg5/1f-2a-2c |
masaaki_makabe | 30:f67850cc3cfe | 284 | _row_out[1] |= 0x20; |
masaaki_makabe | 30:f67850cc3cfe | 285 | } |
masaaki_makabe | 30:f67850cc3cfe | 286 | if ((_seg[2] & 0x10) != 0) _row_out[2] |= 0xa4; // seg4/2c-2f-2h |
masaaki_makabe | 30:f67850cc3cfe | 287 | if ((_seg[2] & 0x08) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 288 | _row_out[3] |= 0x03; // seg3/2h-3a-3b |
masaaki_makabe | 30:f67850cc3cfe | 289 | _row_out[2] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 290 | } |
masaaki_makabe | 30:f67850cc3cfe | 291 | if ((_seg[2] & 0x04) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 292 | _row_out[3] |= 0x02; // seg2/2e-2g-3b |
masaaki_makabe | 30:f67850cc3cfe | 293 | _row_out[2] |= 0x50; |
masaaki_makabe | 30:f67850cc3cfe | 294 | } |
masaaki_makabe | 30:f67850cc3cfe | 295 | if ((_seg[2] & 0x02) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 296 | _row_out[2] |= 0x12; // seg1/1h-2b-2e |
masaaki_makabe | 30:f67850cc3cfe | 297 | _row_out[1] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 298 | } |
masaaki_makabe | 30:f67850cc3cfe | 299 | if ((_seg[2] & 0x01) != 0) _row_out[1] |= 0xe0; // seg0/1f-1g-1h |
masaaki_makabe | 30:f67850cc3cfe | 300 | |
masaaki_makabe | 30:f67850cc3cfe | 301 | if ((_seg[1] & 0x40) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 302 | _row_out[4] |= 0x03; // seg6/3h-4a-4b |
masaaki_makabe | 30:f67850cc3cfe | 303 | _row_out[3] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 304 | } |
masaaki_makabe | 30:f67850cc3cfe | 305 | if ((_seg[1] & 0x20) != 0) _row_out[3] |= 0xa4; // seg5/3c-3f-3h |
masaaki_makabe | 30:f67850cc3cfe | 306 | if ((_seg[1] & 0x10) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 307 | _row_out[4] |= 0x14; // seg4/3h-4c-4e |
masaaki_makabe | 30:f67850cc3cfe | 308 | _row_out[3] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 309 | } |
masaaki_makabe | 30:f67850cc3cfe | 310 | if ((_seg[1] & 0x08) != 0) _row_out[4] |= 0x70; // seg3/4e-4f-4g |
masaaki_makabe | 30:f67850cc3cfe | 311 | if ((_seg[1] & 0x04) != 0) _row_out[4] |= 0x4a; // seg2/4b-4d-4g |
masaaki_makabe | 30:f67850cc3cfe | 312 | if ((_seg[1] & 0x02) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 313 | _row_out[4] |= 0x02; // seg1/3e-3g-4b |
masaaki_makabe | 30:f67850cc3cfe | 314 | _row_out[3] |= 0x50; |
masaaki_makabe | 30:f67850cc3cfe | 315 | } |
masaaki_makabe | 30:f67850cc3cfe | 316 | if ((_seg[1] & 0x01) != 0) _row_out[3] |= 0x1c; // seg0/3c-3d-3e |
masaaki_makabe | 30:f67850cc3cfe | 317 | |
masaaki_makabe | 30:f67850cc3cfe | 318 | if ((_seg[0] & 0x40) != 0) _row_out[5] |= 0x70; // seg6/5e-5f-5g |
masaaki_makabe | 30:f67850cc3cfe | 319 | if ((_seg[0] & 0x20) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 320 | _row_out[5] |= 0x14; // seg5/4h-5c-5e |
masaaki_makabe | 30:f67850cc3cfe | 321 | _row_out[4] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 322 | } |
masaaki_makabe | 30:f67850cc3cfe | 323 | if ((_seg[0] & 0x10) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 324 | _row_out[6] |= 0x02; // seg4/5e-5h-6b |
masaaki_makabe | 30:f67850cc3cfe | 325 | _row_out[5] |= 0x90; |
masaaki_makabe | 30:f67850cc3cfe | 326 | } |
masaaki_makabe | 30:f67850cc3cfe | 327 | if ((_seg[0] & 0x08) != 0) _row_out[6] |= 0x0e; // seg3/6b-6c-6d |
masaaki_makabe | 30:f67850cc3cfe | 328 | if ((_seg[0] & 0x04) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 329 | _row_out[6] |= 0x09; // seg2/5g-6a-6d |
masaaki_makabe | 30:f67850cc3cfe | 330 | _row_out[5] |= 0x40; |
masaaki_makabe | 30:f67850cc3cfe | 331 | } |
masaaki_makabe | 30:f67850cc3cfe | 332 | if ((_seg[0] & 0x02) != 0) _row_out[5] |= 0x4a; // seg1/5b-5d-5g |
masaaki_makabe | 30:f67850cc3cfe | 333 | if ((_seg[0] & 0x01) != 0) { |
masaaki_makabe | 30:f67850cc3cfe | 334 | _row_out[5] |= 0x03; // seg0/4h-5a-5b |
masaaki_makabe | 30:f67850cc3cfe | 335 | _row_out[4] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 336 | } |
masaaki_makabe | 30:f67850cc3cfe | 337 | // _row_out[6] |= 0xf0; _row_out[7] |= 0x1f; // 6e-6f-6g-6h 7a-7b-7c-7d-7e |
masaaki_makabe | 30:f67850cc3cfe | 338 | |
masaaki_makabe | 30:f67850cc3cfe | 339 | // display unit ('G') |
masaaki_makabe | 30:f67850cc3cfe | 340 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 341 | _row_out[6] |= 0xf0; |
masaaki_makabe | 30:f67850cc3cfe | 342 | _row_out[7] |= 0x1f; // 6e-6f-6g-6h 7a-7b-7c-7d-7e |
masaaki_makabe | 30:f67850cc3cfe | 343 | #else |
masaaki_makabe | 30:f67850cc3cfe | 344 | _row_out[6] |= 0xf0; |
masaaki_makabe | 30:f67850cc3cfe | 345 | _row_out[7] |= 0xf4; // 6e-6f-6g-6h 7c-7e-7f-7g-7h |
masaaki_makabe | 30:f67850cc3cfe | 346 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 347 | } |
masaaki_makabe | 30:f67850cc3cfe | 348 | } |
masaaki_makabe | 30:f67850cc3cfe | 349 | |
masaaki_makabe | 30:f67850cc3cfe | 350 | void io::display(float f) |
masaaki_makabe | 30:f67850cc3cfe | 351 | { |
masaaki_makabe | 30:f67850cc3cfe | 352 | _pwm->write(f); |
masaaki_makabe | 30:f67850cc3cfe | 353 | if (f > 0.0 && _fDisplaying == 0) { |
masaaki_makabe | 30:f67850cc3cfe | 354 | // ref: https://developer.mbed.org/cookbook/Compiler-Error-304 |
masaaki_makabe | 30:f67850cc3cfe | 355 | _tk.attach(this, &io::_timer_ticker, 0.002); |
masaaki_makabe | 30:f67850cc3cfe | 356 | _fDisplaying = 1; |
masaaki_makabe | 30:f67850cc3cfe | 357 | } else if (f == 0.0 && _fDisplaying == 1) { |
masaaki_makabe | 30:f67850cc3cfe | 358 | _tk.detach(); |
masaaki_makabe | 30:f67850cc3cfe | 359 | _fDisplaying = 0; |
masaaki_makabe | 30:f67850cc3cfe | 360 | } |
masaaki_makabe | 30:f67850cc3cfe | 361 | } |
masaaki_makabe | 30:f67850cc3cfe | 362 | |
masaaki_makabe | 30:f67850cc3cfe | 363 | float io::get_weight() |
masaaki_makabe | 30:f67850cc3cfe | 364 | { |
masaaki_makabe | 30:f67850cc3cfe | 365 | float w; |
masaaki_makabe | 30:f67850cc3cfe | 366 | w = (float)get_weight_raw() / WEIGHT_COEFFICIENT; // ToDo: coefficient calibration |
masaaki_makabe | 30:f67850cc3cfe | 367 | return(w); |
masaaki_makabe | 30:f67850cc3cfe | 368 | } |
masaaki_makabe | 30:f67850cc3cfe | 369 | |
masaaki_makabe | 30:f67850cc3cfe | 370 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 371 | uint32_t io::get_weight_raw() |
masaaki_makabe | 30:f67850cc3cfe | 372 | #else |
masaaki_makabe | 30:f67850cc3cfe | 373 | uint16_t io::get_weight_raw() |
masaaki_makabe | 30:f67850cc3cfe | 374 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 375 | { |
masaaki_makabe | 30:f67850cc3cfe | 376 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 377 | long w; |
masaaki_makabe | 30:f67850cc3cfe | 378 | #else |
masaaki_makabe | 30:f67850cc3cfe | 379 | int w; |
masaaki_makabe | 30:f67850cc3cfe | 380 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 381 | w = _get_adc_raw(0) - _adc0; |
masaaki_makabe | 30:f67850cc3cfe | 382 | if (w < 0) w = 0; |
masaaki_makabe | 30:f67850cc3cfe | 383 | return(w); |
masaaki_makabe | 30:f67850cc3cfe | 384 | } |
masaaki_makabe | 30:f67850cc3cfe | 385 | |
masaaki_makabe | 30:f67850cc3cfe | 386 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 387 | float io::_get_x() |
masaaki_makabe | 30:f67850cc3cfe | 388 | { |
masaaki_makabe | 30:f67850cc3cfe | 389 | float v; |
masaaki_makabe | 30:f67850cc3cfe | 390 | v = _get_adc(1); |
masaaki_makabe | 30:f67850cc3cfe | 391 | return(v); |
masaaki_makabe | 30:f67850cc3cfe | 392 | } |
masaaki_makabe | 30:f67850cc3cfe | 393 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 394 | |
masaaki_makabe | 30:f67850cc3cfe | 395 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 396 | float io::_get_y() |
masaaki_makabe | 30:f67850cc3cfe | 397 | { |
masaaki_makabe | 30:f67850cc3cfe | 398 | float v; |
masaaki_makabe | 30:f67850cc3cfe | 399 | v = _get_adc(2); |
masaaki_makabe | 30:f67850cc3cfe | 400 | return(v); |
masaaki_makabe | 30:f67850cc3cfe | 401 | } |
masaaki_makabe | 30:f67850cc3cfe | 402 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 403 | |
masaaki_makabe | 30:f67850cc3cfe | 404 | uint8_t io::get_switch() |
masaaki_makabe | 30:f67850cc3cfe | 405 | { |
masaaki_makabe | 30:f67850cc3cfe | 406 | uint8_t f; |
masaaki_makabe | 30:f67850cc3cfe | 407 | #if defined(PCB_VER1) || defined(PCB_VER2) |
masaaki_makabe | 30:f67850cc3cfe | 408 | #ifdef USE_JOYSTICK |
masaaki_makabe | 30:f67850cc3cfe | 409 | if (_get_x() > 0.8 || _get_y() > 0.8) f = 1; |
masaaki_makabe | 30:f67850cc3cfe | 410 | else f = 0; |
masaaki_makabe | 30:f67850cc3cfe | 411 | #else |
masaaki_makabe | 30:f67850cc3cfe | 412 | if(_get_adc(1) > 0.5) f = 1; |
masaaki_makabe | 30:f67850cc3cfe | 413 | else f = 0; |
masaaki_makabe | 30:f67850cc3cfe | 414 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 415 | #else |
masaaki_makabe | 30:f67850cc3cfe | 416 | if (_sw->read() == 1) f = 1; |
masaaki_makabe | 30:f67850cc3cfe | 417 | else f = 0; |
masaaki_makabe | 30:f67850cc3cfe | 418 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 419 | return(f); |
masaaki_makabe | 30:f67850cc3cfe | 420 | } |
masaaki_makabe | 30:f67850cc3cfe | 421 | |
masaaki_makabe | 30:f67850cc3cfe | 422 | void io::analog_pow(uint8_t f) |
masaaki_makabe | 30:f67850cc3cfe | 423 | { |
masaaki_makabe | 30:f67850cc3cfe | 424 | if (f == 1){ |
masaaki_makabe | 30:f67850cc3cfe | 425 | _pow->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 426 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 427 | _set_adc_ck(0); |
masaaki_makabe | 30:f67850cc3cfe | 428 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 429 | } |
masaaki_makabe | 30:f67850cc3cfe | 430 | else{ |
masaaki_makabe | 30:f67850cc3cfe | 431 | _pow->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 432 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 433 | _enableSPI(0); |
masaaki_makabe | 30:f67850cc3cfe | 434 | _set_adc_ck(1); |
masaaki_makabe | 30:f67850cc3cfe | 435 | wait(0.01); // keep HX711's SCK=1 to enter HX711 into sleep mode |
masaaki_makabe | 30:f67850cc3cfe | 436 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 437 | } |
masaaki_makabe | 30:f67850cc3cfe | 438 | } |
masaaki_makabe | 30:f67850cc3cfe | 439 | |
masaaki_makabe | 30:f67850cc3cfe | 440 | void io::_set_adc_ck(uint8_t f) |
masaaki_makabe | 30:f67850cc3cfe | 441 | { |
masaaki_makabe | 30:f67850cc3cfe | 442 | // if (f == 0) NRF_GPIO->OUTCLR |= (1 << _PselSCK); |
masaaki_makabe | 30:f67850cc3cfe | 443 | // else NRF_GPIO->OUTSET |= (1 << _PselSCK); |
masaaki_makabe | 30:f67850cc3cfe | 444 | if (f == 0) NRF_GPIO->OUTCLR = (1 << _PselSCK); |
masaaki_makabe | 30:f67850cc3cfe | 445 | else NRF_GPIO->OUTSET = (1 << _PselSCK); |
masaaki_makabe | 30:f67850cc3cfe | 446 | } |
masaaki_makabe | 30:f67850cc3cfe | 447 | |
masaaki_makabe | 30:f67850cc3cfe | 448 | void io::_enableSPI(uint8_t f) |
masaaki_makabe | 30:f67850cc3cfe | 449 | { |
masaaki_makabe | 30:f67850cc3cfe | 450 | if (f == 0){ |
masaaki_makabe | 30:f67850cc3cfe | 451 | NRF_SPI1->ENABLE = 0; |
masaaki_makabe | 30:f67850cc3cfe | 452 | NRF_SPI1->PSELSCK = 0xffffffff; |
masaaki_makabe | 30:f67850cc3cfe | 453 | NRF_SPI1->PSELMISO = 0xffffffff; |
masaaki_makabe | 30:f67850cc3cfe | 454 | } |
masaaki_makabe | 30:f67850cc3cfe | 455 | else{ |
masaaki_makabe | 30:f67850cc3cfe | 456 | NRF_SPI1->ENABLE = 0; |
masaaki_makabe | 30:f67850cc3cfe | 457 | NRF_SPI1->PSELSCK = _PselSCK; |
masaaki_makabe | 30:f67850cc3cfe | 458 | NRF_SPI1->PSELMISO = _PselMISO; |
masaaki_makabe | 30:f67850cc3cfe | 459 | NRF_SPI1->ENABLE = 1; |
masaaki_makabe | 30:f67850cc3cfe | 460 | } |
masaaki_makabe | 30:f67850cc3cfe | 461 | } |
masaaki_makabe | 30:f67850cc3cfe | 462 | |
masaaki_makabe | 30:f67850cc3cfe | 463 | uint8_t io::_spi_transfer() |
masaaki_makabe | 30:f67850cc3cfe | 464 | { |
masaaki_makabe | 30:f67850cc3cfe | 465 | return(_hx711.write(0x00)); |
masaaki_makabe | 30:f67850cc3cfe | 466 | } |
masaaki_makabe | 30:f67850cc3cfe | 467 | |
masaaki_makabe | 30:f67850cc3cfe | 468 | void io::calibrate_weight() |
masaaki_makabe | 30:f67850cc3cfe | 469 | { |
masaaki_makabe | 30:f67850cc3cfe | 470 | // (2016/3/28: take average in weight calibration) |
masaaki_makabe | 30:f67850cc3cfe | 471 | int Navg = 10; |
masaaki_makabe | 30:f67850cc3cfe | 472 | uint32_t _adc0_s = 0; |
masaaki_makabe | 30:f67850cc3cfe | 473 | for (int i = 0; i < Navg; i++){ |
masaaki_makabe | 30:f67850cc3cfe | 474 | _adc0_s += _get_adc_raw(0); |
masaaki_makabe | 30:f67850cc3cfe | 475 | } |
masaaki_makabe | 30:f67850cc3cfe | 476 | _adc0 = (uint32_t)((float)_adc0_s / (float)Navg); |
masaaki_makabe | 30:f67850cc3cfe | 477 | } |
masaaki_makabe | 30:f67850cc3cfe | 478 | |
masaaki_makabe | 30:f67850cc3cfe | 479 | float io::_get_adc(uint8_t ch) |
masaaki_makabe | 30:f67850cc3cfe | 480 | { |
masaaki_makabe | 30:f67850cc3cfe | 481 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 482 | return(_get_adc_raw(ch) / (float)0xffffff); |
masaaki_makabe | 30:f67850cc3cfe | 483 | #else |
masaaki_makabe | 30:f67850cc3cfe | 484 | return(_get_adc_raw(ch) / (float)0xffff); |
masaaki_makabe | 30:f67850cc3cfe | 485 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 486 | } |
masaaki_makabe | 30:f67850cc3cfe | 487 | |
masaaki_makabe | 30:f67850cc3cfe | 488 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 489 | uint32_t io::_get_adc_raw(uint8_t ch) |
masaaki_makabe | 30:f67850cc3cfe | 490 | #else |
masaaki_makabe | 30:f67850cc3cfe | 491 | uint16_t io::_get_adc_raw(uint8_t ch) |
masaaki_makabe | 30:f67850cc3cfe | 492 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 493 | { |
masaaki_makabe | 30:f67850cc3cfe | 494 | #ifdef PCB_VER1 |
masaaki_makabe | 30:f67850cc3cfe | 495 | if (ch == 0) return(_weight->read()); |
masaaki_makabe | 30:f67850cc3cfe | 496 | else if (ch == 1) return(_jx->read()); |
masaaki_makabe | 30:f67850cc3cfe | 497 | else return(_jy->read()); |
masaaki_makabe | 30:f67850cc3cfe | 498 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 499 | |
masaaki_makabe | 30:f67850cc3cfe | 500 | #ifdef PCB_VER2 |
masaaki_makabe | 30:f67850cc3cfe | 501 | uint16_t adc = 0; |
masaaki_makabe | 30:f67850cc3cfe | 502 | uint8_t dh, dl; |
masaaki_makabe | 30:f67850cc3cfe | 503 | #ifdef ADC_ADS1115 |
masaaki_makabe | 30:f67850cc3cfe | 504 | // for ADS1115 |
masaaki_makabe | 30:f67850cc3cfe | 505 | // Input Voltage Range |
masaaki_makabe | 30:f67850cc3cfe | 506 | // VIN3 = VDD/2 = 1.65 |
masaaki_makabe | 30:f67850cc3cfe | 507 | // VIN0 = 1.8Vpp --> 0.75V - 2.55V |
masaaki_makabe | 30:f67850cc3cfe | 508 | // VIN0 - VIN3 = -0.9 - +0.9V (+-1.024V) |
masaaki_makabe | 30:f67850cc3cfe | 509 | _adc_dat[0] = 0x01; // config reg. |
masaaki_makabe | 30:f67850cc3cfe | 510 | if (ch == 0) _adc_dat[1] = 0x17; // single conv. & FS=+-1.0.24V, AIN0/1/2-AIN3 |
masaaki_makabe | 30:f67850cc3cfe | 511 | else if (ch == 1) _adc_dat[1] = 0x27; |
masaaki_makabe | 30:f67850cc3cfe | 512 | else _adc_dat[1] = 0x37; |
masaaki_makabe | 30:f67850cc3cfe | 513 | _adc_dat[1] |= 0x80; |
masaaki_makabe | 30:f67850cc3cfe | 514 | |
masaaki_makabe | 30:f67850cc3cfe | 515 | _adc_dat[2] = 0x83; // 128SPS & disable comp. |
masaaki_makabe | 30:f67850cc3cfe | 516 | |
masaaki_makabe | 30:f67850cc3cfe | 517 | i2c.write(I2C_ADDR, _adc_dat, 3); |
masaaki_makabe | 30:f67850cc3cfe | 518 | uint8_t f = 0; |
masaaki_makabe | 30:f67850cc3cfe | 519 | uint16_t count = 10; |
masaaki_makabe | 30:f67850cc3cfe | 520 | while (f == 0) { |
masaaki_makabe | 30:f67850cc3cfe | 521 | _adc_dat[0] = 0x01; |
masaaki_makabe | 30:f67850cc3cfe | 522 | i2c.write(I2C_ADDR, _adc_dat, 1); |
masaaki_makabe | 30:f67850cc3cfe | 523 | i2c.read(I2C_ADDR, _adc_dat, 2); |
masaaki_makabe | 30:f67850cc3cfe | 524 | if ((_adc_dat[0] & 0x80) != 0) f = 1; |
masaaki_makabe | 30:f67850cc3cfe | 525 | |
masaaki_makabe | 30:f67850cc3cfe | 526 | if(--count == 0) { |
masaaki_makabe | 30:f67850cc3cfe | 527 | break; |
masaaki_makabe | 30:f67850cc3cfe | 528 | } |
masaaki_makabe | 30:f67850cc3cfe | 529 | } |
masaaki_makabe | 30:f67850cc3cfe | 530 | _adc_dat[0] = 0x00; |
masaaki_makabe | 30:f67850cc3cfe | 531 | i2c.write(I2C_ADDR, _adc_dat, 1); |
masaaki_makabe | 30:f67850cc3cfe | 532 | i2c.read(I2C_ADDR, _adc_dat, 2); |
masaaki_makabe | 30:f67850cc3cfe | 533 | dh = _adc_dat[0]; |
masaaki_makabe | 30:f67850cc3cfe | 534 | dl = _adc_dat[1]; |
masaaki_makabe | 30:f67850cc3cfe | 535 | adc = dh << 8 | dl; |
masaaki_makabe | 30:f67850cc3cfe | 536 | #else |
masaaki_makabe | 30:f67850cc3cfe | 537 | // for MAX11613 |
masaaki_makabe | 30:f67850cc3cfe | 538 | _adc_dat[0] = 0xda; // setup / int.reference, ext.clock unipolar |
masaaki_makabe | 30:f67850cc3cfe | 539 | _adc_dat[1] = 0x61 | (ch << 1); // config / single-ended |
masaaki_makabe | 30:f67850cc3cfe | 540 | i2cwrite(I2C_ADDR, _adc_dat, 2); |
masaaki_makabe | 30:f67850cc3cfe | 541 | |
masaaki_makabe | 30:f67850cc3cfe | 542 | i2cread(I2C_ADDR, _adc_dat, 2); |
masaaki_makabe | 30:f67850cc3cfe | 543 | dh = _adc_dat[0] & 0x0f; |
masaaki_makabe | 30:f67850cc3cfe | 544 | dl = _adc_dat[1]; |
masaaki_makabe | 30:f67850cc3cfe | 545 | adc = (dh << 8 | dl) << 4; // align to 16 bit |
masaaki_makabe | 30:f67850cc3cfe | 546 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 547 | // convert 2's complementary -> straight binary |
masaaki_makabe | 30:f67850cc3cfe | 548 | // 0x8000 -> 0x0000 |
masaaki_makabe | 30:f67850cc3cfe | 549 | // 0x0000 -> 0x8000 |
masaaki_makabe | 30:f67850cc3cfe | 550 | // 0x7fff -> 0xffff |
masaaki_makabe | 30:f67850cc3cfe | 551 | adc = (adc + 0x8000) & 0xffff; |
masaaki_makabe | 30:f67850cc3cfe | 552 | return(adc); |
masaaki_makabe | 30:f67850cc3cfe | 553 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 554 | |
masaaki_makabe | 30:f67850cc3cfe | 555 | #ifdef PCB_VER3 |
masaaki_makabe | 30:f67850cc3cfe | 556 | uint16_t adc = 0; |
masaaki_makabe | 30:f67850cc3cfe | 557 | // MAX11205, parameter ch is ignored |
masaaki_makabe | 30:f67850cc3cfe | 558 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 559 | while(_adc_di->read() == 1); // wait until conversion is finished |
masaaki_makabe | 30:f67850cc3cfe | 560 | // ToDo: data ready timeout |
masaaki_makabe | 30:f67850cc3cfe | 561 | for (uint8_t i = 0; i < 16; i++) { |
masaaki_makabe | 30:f67850cc3cfe | 562 | _adc_ck->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 563 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 564 | adc = adc << 1; |
masaaki_makabe | 30:f67850cc3cfe | 565 | if (_adc_di->read() == 1) adc |= 0x01; |
masaaki_makabe | 30:f67850cc3cfe | 566 | else adc &= ~0x01; |
masaaki_makabe | 30:f67850cc3cfe | 567 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 568 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 569 | } |
masaaki_makabe | 30:f67850cc3cfe | 570 | for (uint8_t i = 0; i < 10; i++) { // additional clock for self calibration |
masaaki_makabe | 30:f67850cc3cfe | 571 | _adc_ck->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 572 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 573 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 574 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 575 | } |
masaaki_makabe | 30:f67850cc3cfe | 576 | // 0x8000 -> 0x0000 |
masaaki_makabe | 30:f67850cc3cfe | 577 | // 0xffff -> 0x7fff |
masaaki_makabe | 30:f67850cc3cfe | 578 | // 0x0000 -> 0x8000 |
masaaki_makabe | 30:f67850cc3cfe | 579 | // 0x7fff -> 0xffff |
masaaki_makabe | 30:f67850cc3cfe | 580 | adc = (adc + 0x8000) & 0xffff; |
masaaki_makabe | 30:f67850cc3cfe | 581 | return(adc); |
masaaki_makabe | 30:f67850cc3cfe | 582 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 583 | |
masaaki_makabe | 30:f67850cc3cfe | 584 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 585 | // using HX711 |
masaaki_makabe | 30:f67850cc3cfe | 586 | uint32_t adc = 0; |
masaaki_makabe | 30:f67850cc3cfe | 587 | // hardware SPI |
masaaki_makabe | 30:f67850cc3cfe | 588 | uint8_t d2, d1, d0; |
masaaki_makabe | 30:f67850cc3cfe | 589 | _set_adc_ck(0); |
masaaki_makabe | 30:f67850cc3cfe | 590 | // note: comment out the while() below for debugging without ADC, HX711 |
masaaki_makabe | 30:f67850cc3cfe | 591 | while((NRF_GPIO->IN & (1 << _PselMISO))); |
masaaki_makabe | 30:f67850cc3cfe | 592 | _enableSPI(1); |
masaaki_makabe | 30:f67850cc3cfe | 593 | d2 = _spi_transfer(); |
masaaki_makabe | 30:f67850cc3cfe | 594 | d1 = _spi_transfer(); |
masaaki_makabe | 30:f67850cc3cfe | 595 | d0 = _spi_transfer(); |
masaaki_makabe | 30:f67850cc3cfe | 596 | _enableSPI(0); |
masaaki_makabe | 30:f67850cc3cfe | 597 | _set_adc_ck(1); wait_us(1); |
masaaki_makabe | 30:f67850cc3cfe | 598 | _set_adc_ck(0); |
masaaki_makabe | 30:f67850cc3cfe | 599 | adc = (d2 << 16) | (d1 << 8) | d0; |
masaaki_makabe | 30:f67850cc3cfe | 600 | /* |
masaaki_makabe | 30:f67850cc3cfe | 601 | // software SPI |
masaaki_makabe | 30:f67850cc3cfe | 602 | while(_adc_di->read() == 1); // wait until conversion is finished |
masaaki_makabe | 30:f67850cc3cfe | 603 | // _tk.detach(); // disable timer to keep _adc_ck's H timeb |
masaaki_makabe | 30:f67850cc3cfe | 604 | for (uint8_t i = 0; i < 24; i++) { |
masaaki_makabe | 30:f67850cc3cfe | 605 | _adc_ck->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 606 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 607 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 608 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 609 | adc = adc << 1; |
masaaki_makabe | 30:f67850cc3cfe | 610 | if (_adc_di->read() == 1) adc |= 0x01; |
masaaki_makabe | 30:f67850cc3cfe | 611 | else adc &= ~0x01; |
masaaki_makabe | 30:f67850cc3cfe | 612 | } |
masaaki_makabe | 30:f67850cc3cfe | 613 | for (uint8_t i = 0; i < 1; i++) { |
masaaki_makabe | 30:f67850cc3cfe | 614 | _adc_ck->write(1); |
masaaki_makabe | 30:f67850cc3cfe | 615 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 616 | _adc_ck->write(0); |
masaaki_makabe | 30:f67850cc3cfe | 617 | wait_us(10); |
masaaki_makabe | 30:f67850cc3cfe | 618 | } |
masaaki_makabe | 30:f67850cc3cfe | 619 | */ |
masaaki_makabe | 30:f67850cc3cfe | 620 | // _tk.attach(this, &io::_timer_ticker, 0.002); |
masaaki_makabe | 30:f67850cc3cfe | 621 | adc = (adc + 0x800000) & 0xffffff; |
masaaki_makabe | 30:f67850cc3cfe | 622 | return(adc); |
masaaki_makabe | 30:f67850cc3cfe | 623 | #endif |
masaaki_makabe | 30:f67850cc3cfe | 624 | } |
masaaki_makabe | 30:f67850cc3cfe | 625 | |
masaaki_makabe | 30:f67850cc3cfe | 626 | #ifdef PCB_VER4 |
masaaki_makabe | 30:f67850cc3cfe | 627 | // f=1 for power-save mode during sleep |
masaaki_makabe | 30:f67850cc3cfe | 628 | void io::power_save_mode(uint8_t f) |
masaaki_makabe | 30:f67850cc3cfe | 629 | { |
masaaki_makabe | 30:f67850cc3cfe | 630 | if (f == 1) _reg_ps->write(0); // power save mode for sleep |
masaaki_makabe | 30:f67850cc3cfe | 631 | else _reg_ps->write(1); // non-power save (high power) mode for normal operation |
masaaki_makabe | 30:f67850cc3cfe | 632 | } |
masaaki_makabe | 30:f67850cc3cfe | 633 | #endif |