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