diff options
-rw-r--r-- | boards.txt | 1 | ||||
-rwxr-xr-x | cores/arduino/Print.cpp | 3 | ||||
-rwxr-xr-x | cores/arduino/Print.h | 5 | ||||
-rw-r--r-- | cores/arduino/USBAPI.h | 1 | ||||
-rw-r--r-- | cores/arduino/WInterrupts.c | 36 | ||||
-rwxr-xr-x | cores/arduino/wiring_private.h | 2 | ||||
-rw-r--r-- | libraries/SD/utility/Sd2PinMap.h | 63 | ||||
-rw-r--r-- | libraries/SPI/SPI.cpp | 27 | ||||
-rw-r--r-- | libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino | 24 | ||||
-rw-r--r-- | libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino | 20 | ||||
-rw-r--r-- | platform.txt | 2 |
11 files changed, 121 insertions, 63 deletions
@@ -20,7 +20,6 @@ uno.build.mcu=atmega328p uno.build.f_cpu=16000000L uno.build.core=arduino uno.build.variant=standard -uno.build.extra_flags= ############################################################## diff --git a/cores/arduino/Print.cpp b/cores/arduino/Print.cpp index e541a6c..711251c 100755 --- a/cores/arduino/Print.cpp +++ b/cores/arduino/Print.cpp @@ -226,6 +226,9 @@ size_t Print::printFloat(double number, uint8_t digits) { size_t n = 0; + if (isnan(number)) return print("nan"); + if (isinf(number)) return print("inf"); + // Handle negative numbers if (number < 0.0) { diff --git a/cores/arduino/Print.h b/cores/arduino/Print.h index 1af6b72..dc76150 100755 --- a/cores/arduino/Print.h +++ b/cores/arduino/Print.h @@ -46,7 +46,10 @@ class Print void clearWriteError() { setWriteError(0); } virtual size_t write(uint8_t) = 0; - size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } + size_t write(const char *str) { + if (str == NULL) return 0; + return write((const uint8_t *)str, strlen(str)); + } virtual size_t write(const uint8_t *buffer, size_t size); size_t print(const __FlashStringHelper *); diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h index d5abdb6..eb2e593 100644 --- a/cores/arduino/USBAPI.h +++ b/cores/arduino/USBAPI.h @@ -39,6 +39,7 @@ public: virtual int read(void); virtual void flush(void); virtual size_t write(uint8_t); + using Print::write; // pull in write(str) and write(buf, size) from Print operator bool(); }; extern Serial_ Serial; diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c index 8f3ec84..62efc9c 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -59,6 +59,14 @@ void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { EICRA = (EICRA & ~((1<<ISC10) | (1<<ISC11))) | (mode << ISC10); EIMSK |= (1<<INT1); break; + case 2: + EICRA = (EICRA & ~((1<<ISC20) | (1<<ISC21))) | (mode << ISC20); + EIMSK |= (1<<INT2); + break; + case 3: + EICRA = (EICRA & ~((1<<ISC30) | (1<<ISC31))) | (mode << ISC30); + EIMSK |= (1<<INT3); + break; #elif defined(EICRA) && defined(EICRB) && defined(EIMSK) case 2: EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); @@ -147,12 +155,18 @@ void detachInterrupt(uint8_t interruptNum) { // ATmega8. There, INT0 is 6 and INT1 is 7.) switch (interruptNum) { #if defined(__AVR_ATmega32U4__) - case 0: - EIMSK &= ~(1<<INT0); - break; - case 1: - EIMSK &= ~(1<<INT1); - break; + case 0: + EIMSK &= ~(1<<INT0); + break; + case 1: + EIMSK &= ~(1<<INT1); + break; + case 2: + EIMSK &= ~(1<<INT2); + break; + case 3: + EIMSK &= ~(1<<INT3); + break; #elif defined(EICRA) && defined(EICRB) && defined(EIMSK) case 2: EIMSK &= ~(1 << INT0); @@ -226,6 +240,16 @@ SIGNAL(INT1_vect) { intFunc[EXTERNAL_INT_1](); } +SIGNAL(INT2_vect) { + if(intFunc[EXTERNAL_INT_2]) + intFunc[EXTERNAL_INT_2](); +} + +SIGNAL(INT3_vect) { + if(intFunc[EXTERNAL_INT_3]) + intFunc[EXTERNAL_INT_3](); +} + #elif defined(EICRA) && defined(EICRB) SIGNAL(INT0_vect) { diff --git a/cores/arduino/wiring_private.h b/cores/arduino/wiring_private.h index f0ceb0c..026ce1a 100755 --- a/cores/arduino/wiring_private.h +++ b/cores/arduino/wiring_private.h @@ -56,6 +56,8 @@ extern "C"{ #define EXTERNAL_NUM_INTERRUPTS 8 #elif defined(__AVR_ATmega1284P__) #define EXTERNAL_NUM_INTERRUPTS 3 +#elif defined(__AVR_ATmega32U4__) +#define EXTERNAL_NUM_INTERRUPTS 4 #else #define EXTERNAL_NUM_INTERRUPTS 2 #endif diff --git a/libraries/SD/utility/Sd2PinMap.h b/libraries/SD/utility/Sd2PinMap.h index 4bd75a3..1c76dd3 100644 --- a/libraries/SD/utility/Sd2PinMap.h +++ b/libraries/SD/utility/Sd2PinMap.h @@ -166,44 +166,43 @@ static const pin_map_t digitalPinMap[] = { };
//------------------------------------------------------------------------------
#elif defined(__AVR_ATmega32U4__)
-// Teensy 2.0
+// Leonardo
// Two Wire (aka I2C) ports
-uint8_t const SDA_PIN = 6;
-uint8_t const SCL_PIN = 5;
+uint8_t const SDA_PIN = 2;
+uint8_t const SCL_PIN = 3;
// SPI port
-uint8_t const SS_PIN = 0;
-uint8_t const MOSI_PIN = 2;
-uint8_t const MISO_PIN = 3;
-uint8_t const SCK_PIN = 1;
+uint8_t const SS_PIN = 17;
+uint8_t const MOSI_PIN = 16;
+uint8_t const MISO_PIN = 14;
+uint8_t const SCK_PIN = 15;
static const pin_map_t digitalPinMap[] = {
- {&DDRB, &PINB, &PORTB, 0}, // B0 0
- {&DDRB, &PINB, &PORTB, 1}, // B1 1
- {&DDRB, &PINB, &PORTB, 2}, // B2 2
- {&DDRB, &PINB, &PORTB, 3}, // B3 3
- {&DDRB, &PINB, &PORTB, 7}, // B7 4
- {&DDRD, &PIND, &PORTD, 0}, // D0 5
- {&DDRD, &PIND, &PORTD, 1}, // D1 6
- {&DDRD, &PIND, &PORTD, 2}, // D2 7
- {&DDRD, &PIND, &PORTD, 3}, // D3 8
- {&DDRC, &PINC, &PORTC, 6}, // C6 9
- {&DDRC, &PINC, &PORTC, 7}, // C7 10
- {&DDRD, &PIND, &PORTD, 6}, // D6 11
- {&DDRD, &PIND, &PORTD, 7}, // D7 12
- {&DDRB, &PINB, &PORTB, 4}, // B4 13
- {&DDRB, &PINB, &PORTB, 5}, // B5 14
- {&DDRB, &PINB, &PORTB, 6}, // B6 15
- {&DDRF, &PINF, &PORTF, 7}, // F7 16
- {&DDRF, &PINF, &PORTF, 6}, // F6 17
- {&DDRF, &PINF, &PORTF, 5}, // F5 18
- {&DDRF, &PINF, &PORTF, 4}, // F4 19
- {&DDRF, &PINF, &PORTF, 1}, // F1 20
- {&DDRF, &PINF, &PORTF, 0}, // F0 21
- {&DDRD, &PIND, &PORTD, 4}, // D4 22
- {&DDRD, &PIND, &PORTD, 5}, // D5 23
- {&DDRE, &PINE, &PORTE, 6} // E6 24
+ {&DDRD, &PIND, &PORTD, 2}, // D2 0
+ {&DDRD, &PIND, &PORTD, 3}, // D3 1
+ {&DDRD, &PIND, &PORTD, 1}, // D1 2
+ {&DDRD, &PIND, &PORTD, 0}, // D0 3
+ {&DDRD, &PIND, &PORTD, 4}, // D4 4
+ {&DDRC, &PINC, &PORTC, 6}, // C6 5
+ {&DDRD, &PIND, &PORTD, 7}, // D7 6
+ {&DDRE, &PINE, &PORTE, 6}, // E6 7
+ {&DDRB, &PINB, &PORTB, 4}, // B4 8
+ {&DDRB, &PINB, &PORTB, 5}, // B5 9
+ {&DDRB, &PINB, &PORTB, 6}, // B6 10
+ {&DDRB, &PINB, &PORTB, 7}, // B7 11
+ {&DDRD, &PIND, &PORTD, 6}, // D6 12
+ {&DDRC, &PINC, &PORTC, 7}, // C7 13
+ {&DDRB, &PINB, &PORTB, 3}, // B3 14
+ {&DDRB, &PINB, &PORTB, 1}, // B1 15
+ {&DDRB, &PINB, &PORTB, 2}, // B2 16
+ {&DDRB, &PINB, &PORTB, 0}, // B0 17
+ {&DDRF, &PINF, &PORTF, 7}, // F7 18
+ {&DDRF, &PINF, &PORTF, 6}, // F6 19
+ {&DDRF, &PINF, &PORTF, 5}, // F5 20
+ {&DDRF, &PINF, &PORTF, 4}, // F4 21
+ {&DDRF, &PINF, &PORTF, 1}, // F1 22
+ {&DDRF, &PINF, &PORTF, 0}, // F0 23
};
//------------------------------------------------------------------------------
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 42915df..5e48073 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -14,27 +14,32 @@ SPIClass SPI; void SPIClass::begin() { - // Set direction register for SCK and MOSI pin. - // MISO pin automatically overrides to INPUT. + + // Set SS to high so a connected chip will be "deselected" by default + digitalWrite(SS, HIGH); + // When the SS pin is set as OUTPUT, it can be used as // a general purpose output port (it doesn't influence // SPI operations). - - pinMode(SCK, OUTPUT); - pinMode(MOSI, OUTPUT); pinMode(SS, OUTPUT); - - digitalWrite(SCK, LOW); - digitalWrite(MOSI, LOW); - digitalWrite(SS, HIGH); - // Warning: if the SS pin ever becomes a LOW INPUT then SPI - // automatically switches to Slave, so the data direction of + // Warning: if the SS pin ever becomes a LOW INPUT then SPI + // automatically switches to Slave, so the data direction of // the SS pin MUST be kept as OUTPUT. SPCR |= _BV(MSTR); SPCR |= _BV(SPE); + + // Set direction register for SCK and MOSI pin. + // MISO pin automatically overrides to INPUT. + // By doing this AFTER enabling SPI, we avoid accidentally + // clocking in a single bit since the lines go directly + // from "input" to SPI control. + // http://code.google.com/p/arduino/issues/detail?id=888 + pinMode(SCK, OUTPUT); + pinMode(MOSI, OUTPUT); } + void SPIClass::end() { SPCR &= ~_BV(SPE); } diff --git a/libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino b/libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino index 69bcc01..6101bb1 100644 --- a/libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino +++ b/libraries/SoftwareSerial/examples/SoftwareSerialExample/SoftwareSerialExample.ino @@ -5,11 +5,20 @@ Receives from software serial, sends to hardware serial. The circuit: - * RX is digital pin 2 (connect to TX of other device) - * TX is digital pin 3 (connect to RX of other device) + * RX is digital pin 10 (connect to TX of other device) + * TX is digital pin 11 (connect to RX of other device) + + Note: + Not all pins on the Mega and Mega 2560 support change interrupts, + so only the following can be used for RX: + 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 + + Not all pins on the Leonardo support change interrupts, + so only the following can be used for RX: + 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). created back in the mists of time - modified 9 Apr 2012 + modified 25 May 2012 by Tom Igoe based on Mikal Hart's example @@ -18,17 +27,17 @@ */ #include <SoftwareSerial.h> -SoftwareSerial mySerial(2, 3); // RX, TX +SoftwareSerial mySerial(10, 11); // RX, TX void setup() { - // Open serial communications and wait for port to open: + // Open serial communications and wait for port to open: Serial.begin(57600); - while (!Serial) { + while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } - + Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port @@ -43,3 +52,4 @@ void loop() // run over and over if (Serial.available()) mySerial.write(Serial.read()); } + diff --git a/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino b/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino index d9f8f45..d607ee6 100644 --- a/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino +++ b/libraries/SoftwareSerial/examples/TwoPortReceive/TwoPortReceive.ino @@ -16,8 +16,17 @@ * First serial device's TX attached to digital pin 2, RX to pin 3 * Second serial device's TX attached to digital pin 4, RX to pin 5 + Note: + Not all pins on the Mega and Mega 2560 support change interrupts, + so only the following can be used for RX: + 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 + + Not all pins on the Leonardo support change interrupts, + so only the following can be used for RX: + 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). + created 18 Apr. 2011 - modified 9 Apr 2012 + modified 25 May 2012 by Tom Igoe based on Mikal Hart's twoPortRXExample @@ -26,11 +35,12 @@ */ #include <SoftwareSerial.h> -// software serial #1: TX = digital pin 2, RX = digital pin 3 -SoftwareSerial portOne(2, 3); +// software serial #1: TX = digital pin 10, RX = digital pin 11 +SoftwareSerial portOne(10,11); -// software serial #2: TX = digital pin 4, RX = digital pin 5 -SoftwareSerial portTwo(4, 5); +// software serial #2: TX = digital pin 8, RX = digital pin 9 +// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega +SoftwareSerial portTwo(8,9); void setup() { diff --git a/platform.txt b/platform.txt index f3f45bd..557b2d3 100644 --- a/platform.txt +++ b/platform.txt @@ -20,6 +20,8 @@ compiler.elf2hex.flags=-O ihex -R .eeprom compiler.elf2hex.cmd=avr-objcopy compiler.ldflags= compiler.size.cmd=avr-size +# this can be overriden in boards.txt +build.extra_flags= # AVR compile patterns # -------------------- |