@@ -28,12 +28,16 @@ static uint8_t __analogCycles = 8;
28
28
static uint8_t __analogSamples = 0 ;//1 sample
29
29
static uint8_t __analogClockDiv = 1 ;
30
30
31
+ // Width of returned answer ()
32
+ static uint8_t __analogReturnedWidth = 12 ;
33
+
31
34
void __analogSetWidth (uint8_t bits ){
32
35
if (bits < 9 ){
33
36
bits = 9 ;
34
37
} else if (bits > 12 ){
35
38
bits = 12 ;
36
39
}
40
+ __analogReturnedWidth = bits ;
37
41
__analogWidth = bits - 9 ;
38
42
SET_PERI_REG_BITS (SENS_SAR_START_FORCE_REG , SENS_SAR1_BIT_WIDTH , __analogWidth , SENS_SAR1_BIT_WIDTH_S );
39
43
SET_PERI_REG_BITS (SENS_SAR_READ_CTRL_REG , SENS_SAR1_SAMPLE_BIT , __analogWidth , SENS_SAR1_SAMPLE_BIT_S );
@@ -124,14 +128,14 @@ void __analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation)
124
128
}
125
129
}
126
130
127
- uint16_t IRAM_ATTR __analogRead (uint8_t pin )
128
- {
131
+ bool IRAM_ATTR __adcAttachPin (uint8_t pin ){
132
+
129
133
int8_t channel = digitalPinToAnalogChannel (pin );
130
134
if (channel < 0 ){
131
- return 0 ;//not adc pin
135
+ return false ;//not adc pin
132
136
}
133
- int8_t pad = digitalPinToTouchChannel (pin );
134
137
138
+ int8_t pad = digitalPinToTouchChannel (pin );
135
139
if (pad >= 0 ){
136
140
uint32_t touch = READ_PERI_REG (SENS_SAR_TOUCH_ENABLE_REG );
137
141
if (touch & (1 << pad )){
@@ -149,22 +153,84 @@ uint16_t IRAM_ATTR __analogRead(uint8_t pin)
149
153
pinMode (pin , ANALOG );
150
154
151
155
__analogInit ();
156
+ return true;
157
+ }
152
158
153
- if (channel > 7 ){
154
- channel -= 10 ;
159
+ bool IRAM_ATTR __adcStart (uint8_t pin ){
155
160
156
- SET_PERI_REG_BITS (SENS_SAR_MEAS_START2_REG , SENS_SAR2_EN_PAD , (1 << channel ), SENS_SAR2_EN_PAD_S );
161
+ int8_t channel = digitalPinToAnalogChannel (pin );
162
+ if (channel < 0 ){
163
+ return false;//not adc pin
164
+ }
165
+
166
+ if (channel > 9 ){
167
+ channel -= 10 ;
157
168
CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_START_SAR_M );
169
+ SET_PERI_REG_BITS (SENS_SAR_MEAS_START2_REG , SENS_SAR2_EN_PAD , (1 << channel ), SENS_SAR2_EN_PAD_S );
158
170
SET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_START_SAR_M );
159
- while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DONE_SAR ) == 0 ) {}; //read done
160
- return GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DATA_SAR , SENS_MEAS2_DATA_SAR_S );
171
+ } else {
172
+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_START_SAR_M );
173
+ SET_PERI_REG_BITS (SENS_SAR_MEAS_START1_REG , SENS_SAR1_EN_PAD , (1 << channel ), SENS_SAR1_EN_PAD_S );
174
+ SET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_START_SAR_M );
161
175
}
176
+ return true;
177
+ }
178
+
179
+ bool IRAM_ATTR __adcBusy (uint8_t pin ){
162
180
163
- SET_PERI_REG_BITS (SENS_SAR_MEAS_START1_REG , SENS_SAR1_EN_PAD , (1 << channel ), SENS_SAR1_EN_PAD_S );
164
- CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_START_SAR_M );
165
- SET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_START_SAR_M );
166
- while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DONE_SAR ) == 0 ) {}; //read done
167
- return GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DATA_SAR , SENS_MEAS1_DATA_SAR_S );
181
+ int8_t channel = digitalPinToAnalogChannel (pin );
182
+ if (channel < 0 ){
183
+ return false;//not adc pin
184
+ }
185
+
186
+ if (channel > 7 ){
187
+ return (GET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DONE_SAR ) == 0 );
188
+ }
189
+ return (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DONE_SAR ) == 0 );
190
+ }
191
+
192
+ uint16_t IRAM_ATTR __adcEnd (uint8_t pin )
193
+ {
194
+
195
+ uint16_t value = 0 ;
196
+ int8_t channel = digitalPinToAnalogChannel (pin );
197
+ if (channel < 0 ){
198
+ return 0 ;//not adc pin
199
+ }
200
+ if (channel > 7 ){
201
+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DONE_SAR ) == 0 ); //wait for conversion
202
+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DATA_SAR , SENS_MEAS2_DATA_SAR_S );
203
+ } else {
204
+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DONE_SAR ) == 0 ); //wait for conversion
205
+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DATA_SAR , SENS_MEAS1_DATA_SAR_S );
206
+ }
207
+
208
+ // Shift result if necessary
209
+ uint8_t from = __analogWidth + 9 ;
210
+ if (from == __analogReturnedWidth ) {
211
+ return value ;
212
+ }
213
+ if (from > __analogReturnedWidth ) {
214
+ return value >> (from - __analogReturnedWidth );
215
+ }
216
+ return value << (__analogReturnedWidth - from );
217
+ }
218
+
219
+ uint16_t IRAM_ATTR __analogRead (uint8_t pin )
220
+ {
221
+ if (!__adcAttachPin (pin ) || !__adcStart (pin )){
222
+ return 0 ;
223
+ }
224
+ return __adcEnd (pin );
225
+ }
226
+
227
+ void __analogReadResolution (uint8_t bits )
228
+ {
229
+ if (!bits || bits > 16 ){
230
+ return ;
231
+ }
232
+ __analogSetWidth (bits ); // hadware from 9 to 12
233
+ __analogReturnedWidth = bits ; // software from 1 to 16
168
234
}
169
235
170
236
int __hallRead () //hall sensor without LNA
@@ -192,10 +258,16 @@ int __hallRead() //hall sensor without LNA
192
258
}
193
259
194
260
extern uint16_t analogRead (uint8_t pin ) __attribute__ ((weak , alias ("__analogRead" )));
261
+ extern void analogReadResolution (uint8_t bits ) __attribute__ ((weak , alias ("__analogReadResolution" )));
195
262
extern void analogSetWidth (uint8_t bits ) __attribute__ ((weak , alias ("__analogSetWidth" )));
196
263
extern void analogSetCycles (uint8_t cycles ) __attribute__ ((weak , alias ("__analogSetCycles" )));
197
264
extern void analogSetSamples (uint8_t samples ) __attribute__ ((weak , alias ("__analogSetSamples" )));
198
265
extern void analogSetClockDiv (uint8_t clockDiv ) __attribute__ ((weak , alias ("__analogSetClockDiv" )));
199
266
extern void analogSetAttenuation (adc_attenuation_t attenuation ) __attribute__ ((weak , alias ("__analogSetAttenuation" )));
200
267
extern void analogSetPinAttenuation (uint8_t pin , adc_attenuation_t attenuation ) __attribute__ ((weak , alias ("__analogSetPinAttenuation" )));
201
268
extern int hallRead () __attribute__ ((weak , alias ("__hallRead" )));
269
+
270
+ extern bool adcAttachPin (uint8_t pin ) __attribute__ ((weak , alias ("__adcAttachPin" )));
271
+ extern bool adcStart (uint8_t pin ) __attribute__ ((weak , alias ("__adcStart" )));
272
+ extern bool adcBusy (uint8_t pin ) __attribute__ ((weak , alias ("__adcBusy" )));
273
+ extern uint16_t adcEnd (uint8_t pin ) __attribute__ ((weak , alias ("__adcEnd" )));
0 commit comments