Adding analogReference() function - needs testing on an ATmega8 (but works on the ATmega 168).

This commit is contained in:
David A. Mellis 2007-12-14 04:21:59 +00:00
parent 444c2dee32
commit 05717a198c
5 changed files with 24 additions and 8 deletions

View File

@ -116,7 +116,7 @@
productName = App;
productReference = 33DD8FB6096AC8DA0013AF8F /* Arduino.app */;
productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
<key>CFBundleDevelopmentRegion</key>
@ -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;

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);