test publish

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

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?

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