From 05717a198cecd8dbc239d31a8537d990f41abe66 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Fri, 14 Dec 2007 04:21:59 +0000 Subject: [PATCH] Adding analogReference() function - needs testing on an ATmega8 (but works on the ATmega 168). --- build/macosx/Arduino.xcodeproj/project.pbxproj | 3 +-- build/shared/lib/keywords.txt | 4 ++++ hardware/cores/arduino/wiring.c | 4 ---- hardware/cores/arduino/wiring.h | 5 +++++ hardware/cores/arduino/wiring_analog.c | 16 ++++++++++++++-- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/build/macosx/Arduino.xcodeproj/project.pbxproj b/build/macosx/Arduino.xcodeproj/project.pbxproj index 93167b34e..32724f892 100644 --- a/build/macosx/Arduino.xcodeproj/project.pbxproj +++ b/build/macosx/Arduino.xcodeproj/project.pbxproj @@ -116,7 +116,7 @@ productName = App; productReference = 33DD8FB6096AC8DA0013AF8F /* Arduino.app */; productSettingsXML = " - + CFBundleDevelopmentRegion @@ -903,7 +903,6 @@ 33FFFD3F0965B1E40016AC38 /* Project object */ = { isa = PBXProject; buildConfigurationList = 33FFFD400965B1E40016AC38 /* Build configuration list for PBXProject "Arduino" */; - compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 0; mainGroup = 33FFFD3D0965B1E40016AC38; productRefGroup = 33FFFD3D0965B1E40016AC38; diff --git a/build/shared/lib/keywords.txt b/build/shared/lib/keywords.txt index 160d236f4..098b79d15 100644 --- a/build/shared/lib/keywords.txt +++ b/build/shared/lib/keywords.txt @@ -79,6 +79,7 @@ constrain KEYWORD2 constrain_ cos KEYWORD2 cos_ {} curlybraces -- decrement +DEFAULT KEYWORD1 DEFAULT default KEYWORD1 default delay KEYWORD2 delay_ delayMicroseconds KEYWORD2 @@ -88,6 +89,7 @@ delayMicroseconds KEYWORD2 else KEYWORD1 else == equality exp KEYWORD2 exp_ +EXTERNAL KEYWORD1 EXTERNAL false KEYWORD1 false float KEYWORD1 float float KEYWORD2 float_ @@ -101,6 +103,7 @@ if KEYWORD1 if_ != inequality int KEYWORD1 int int KEYWORD2 int_ +INTERNAL KEYWORD1 INTERNAL << leftshift < lessthan <= lessthanorequalto @@ -148,6 +151,7 @@ flush KEYWORD2 digitalWrite KEYWORD2 digitalRead KEYWORD2 pinMode KEYWORD2 +analogReference KEYWORD2 analogRead KEYWORD2 analogWrite KEYWORD2 attachInterrupt KEYWORD2 diff --git a/hardware/cores/arduino/wiring.c b/hardware/cores/arduino/wiring.c index 5dda822d3..ae8fcdd16 100755 --- a/hardware/cores/arduino/wiring.c +++ b/hardware/cores/arduino/wiring.c @@ -170,10 +170,6 @@ void init() sbi(TCCR2, WGM20); #endif - // set a2d reference to AVCC (5 volts) - cbi(ADMUX, REFS1); - sbi(ADMUX, REFS0); - // set a2d prescale factor to 128 // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. // XXX: this will not work properly for other clock speeds, and diff --git a/hardware/cores/arduino/wiring.h b/hardware/cores/arduino/wiring.h index e0c53156f..df43e6c67 100755 --- a/hardware/cores/arduino/wiring.h +++ b/hardware/cores/arduino/wiring.h @@ -57,6 +57,10 @@ extern "C"{ #define FALLING 2 #define RISING 3 +#define INTERNAL 3 +#define DEFAULT 1 +#define EXTERNAL 0 + // undefine stdlib's abs if encountered #ifdef abs #undef abs @@ -93,6 +97,7 @@ void pinMode(uint8_t, uint8_t); void digitalWrite(uint8_t, uint8_t); int digitalRead(uint8_t); int analogRead(uint8_t); +void analogReference(uint8_t mode); void analogWrite(uint8_t, int); void beginSerial(long); diff --git a/hardware/cores/arduino/wiring_analog.c b/hardware/cores/arduino/wiring_analog.c index 0ab32ebb6..30c5642cc 100755 --- a/hardware/cores/arduino/wiring_analog.c +++ b/hardware/cores/arduino/wiring_analog.c @@ -25,12 +25,24 @@ #include "wiring_private.h" #include "pins_arduino.h" +uint8_t analog_reference = DEFAULT; + +void analogReference(uint8_t mode) +{ + // can't actually set the register here because the default setting + // will connect AVCC and the AREF pin, which would cause a short if + // there's something connected to AREF. + analog_reference = mode; +} + int analogRead(uint8_t pin) { uint8_t low, high, ch = analogInPinToBit(pin); - // the low 4 bits of ADMUX select the ADC channel - ADMUX = (ADMUX & (unsigned int) 0xf0) | (ch & (unsigned int) 0x0f); + // 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). + ADMUX = (analog_reference << 6) | (pin & 0x0f); // without a delay, we seem to read from the wrong channel //delay(1);