bugfix read analog
This commit is contained in:
parent
4461dca8f2
commit
16fa63ebac
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "wiring_private.h"
|
#include "wiring_private.h"
|
||||||
#include "pins_arduino.h"
|
#include "pins_arduino.h"
|
||||||
|
#include "adc.h"
|
||||||
|
|
||||||
uint8_t analog_reference = DEFAULT;
|
uint8_t analog_reference = DEFAULT;
|
||||||
|
|
||||||
|
@ -39,59 +40,7 @@ void analogReference(uint8_t mode)
|
||||||
|
|
||||||
int analogRead(uint8_t pin)
|
int analogRead(uint8_t pin)
|
||||||
{
|
{
|
||||||
uint8_t low, high;
|
return readADC(pin);
|
||||||
|
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
|
||||||
if (pin >= 54) pin -= 54; // allow for channel or pin numbers
|
|
||||||
#elif defined(__AVR_ATmega32U4__)
|
|
||||||
if (pin >= 18) pin -= 18; // allow for channel or pin numbers
|
|
||||||
#elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__)
|
|
||||||
if (pin >= 24) pin -= 24; // allow for channel or pin numbers
|
|
||||||
#elif defined(__AVR_ATmega128RFA1__)
|
|
||||||
if (pin >= 26) pin -= 26; // allow for channel or pin numbers
|
|
||||||
#else
|
|
||||||
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__AVR_ATmega32U4__)
|
|
||||||
pin = analogPinToChannel(pin);
|
|
||||||
ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
|
|
||||||
#elif defined(ADCSRB) && defined(MUX5)
|
|
||||||
// the MUX5 bit of ADCSRB selects whether we're reading from channels
|
|
||||||
// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
|
|
||||||
ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
|
|
||||||
#endif
|
|
||||||
// set the analog reference (high two bits of ADMUX) and select the
|
|
||||||
// channel (low 4 bits). this also sets ADLAR (left-adjust result)
|
|
||||||
// to 0 (the default).
|
|
||||||
#if defined(ADMUX)
|
|
||||||
ADMUX = (analog_reference << 6) | (pin & 0x07);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// without a delay, we seem to read from the wrong channel
|
|
||||||
//delay(1);
|
|
||||||
|
|
||||||
#if defined(ADCSRA) && defined(ADCL)
|
|
||||||
// start the conversion
|
|
||||||
sbi(ADCSRA, ADSC);
|
|
||||||
|
|
||||||
// ADSC is cleared when the conversion finishes
|
|
||||||
while (bit_is_set(ADCSRA, ADSC));
|
|
||||||
|
|
||||||
// we have to read ADCL first; doing so locks both ADCL
|
|
||||||
// and ADCH until ADCH is read. reading ADCL second would
|
|
||||||
// cause the results of each conversion to be discarded,
|
|
||||||
// as ADCL and ADCH would be locked when it completed.
|
|
||||||
low = ADCL;
|
|
||||||
high = ADCH;
|
|
||||||
#else
|
|
||||||
// we dont have an ADC, return 0
|
|
||||||
low = 0;
|
|
||||||
high = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// combine the two bytes
|
|
||||||
return (high << 8) | low;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right now, PWM output only works on the pins with
|
// Right now, PWM output only works on the pins with
|
||||||
|
|
Loading…
Reference in a new issue