arduino / ArduinoCore-sam

81 stars 108 forks source link

adc_disable_channel_differential_input does not correctly set config bit #102

Open natgaertner opened 4 years ago

natgaertner commented 4 years ago

https://github.com/arduino/ArduinoCore-sam/blob/c893c62ec9953ed36a256b5243272fda2e473c14/system/libsam/source/adc.c#L632-L635

By ORing with the previous value, the resulting of ANDing with the mask is undone, so the function results in no action being taken (once adc_enable_channel_differential_input is run, adc_disable_channel_differential_input doesn't work). trivially with one bit, the truth table for (A and B) or A is:

A B (A and B) or A
T T T
T F T
F T F
F F F

I believe the desired result could be obtained by ORing with the set value (basically running adc_enable_channel_differential_input), then XORing with the same value, but I'm not a good enough C programmer to know if this is the optimal way to do this.