aboutsummaryrefslogtreecommitdiff
path: root/libraries
AgeCommit message (Collapse)Author
2015-03-24EEPROM: examples: fix Serial for board LeonardoMartino Facchin
2015-03-24Fixed EEPROM examples and added readmeChris--A
2015-03-20Updated EEPROM examples.Chris--A
Removed hard coded lengths, which were incorrect for standard Arduino's now.
2015-03-19Small tweaks to EEPROM lib and examples.Chris--A
2015-03-18Updated EEPROM storage classChris--A
To avoid having a .cpp just for an extern variable definition, `static` has been chosen over `extern`. As the `EEPROMClass` class simply wraps functionality located elsewhere, it is completely compiled away. Even though each translation unit which includes the header will get a copy with internal linkage, there is no associated overhead. More info [here](http://stackoverflow.com/questions/29098518/extern-variable-only-in-header-unexpectedly-working-why)
2015-03-17Added additional examples to EEPROM libChris--A
2015-03-17Added new version of EEPROM library.Chris--A
2015-03-05Merge branch 'ide-1.5.x' into SoftwareSerialMartino Facchin
2015-03-05SoftwareSerial: match bool API with HardwareSerialMartino Facchin
2015-02-05Corrected some email contacts.Cristian Maglie
2015-01-26Prevent low pulse on TX initialization in SoftwareSerialMatthijs Kooijman
Previously, the TX pin would be set to output first and then written high (assuming non-inverted logic). When the pin was previously configured for input without pullup (which is normal reset state), this results in driving the pin low for a short when initializing. This could accidenttally be seen as a stop bit by the receiving side. By first writing HIGH and then setting the mode to OUTPUT, the pin will have its pullup enabled for a short while, which is harmless.
2015-01-26Remove unneeded #ifdef in SoftwareSerialMatthijs Kooijman
The debugPulse function definition already checks for _DEBUG, resulting in an empty function definiton and the function call being optimized away.
2015-01-26Fix SoftwareSerial timingsMatthijs Kooijman
Instead of using a lookup table with (wrong) timings, this calculates the timings in SoftwareSerial::begin. This is probably a bit slower, but since it typically happens once, this shouldn't be a problem. Additionally, since the lookup tables can be removed, this is also a lot smaller, as well as supporting arbitrary CPU speeds and baudrates, instead of the limited set that was defined before. Furthermore, this switches to use the _delay_loop_2 function from avr-libc instead of a handcoded delay function. The avr-libc function only takes two instructions, as opposed to four instructions for the old one. The compiler also inlines the avr-libc function, which makes the timings more reliable. The calculated timings directly rely on the instructions generated by the compiler, since a significant amount of time is spent processing (compared to the delays, especially at higher speeds). This means that if the code is changed, or a different compiler is used, the calculations might need changing (though a few cycles more or less shouldn't cause immediate breakage). The timings in the code have been calculated from the assembly generated by gcc 4.8.2 and gcc 4.3.2. The RX baudrates supported by SoftwareSerial are still not unlimited. At 16Mhz, using gcc 4.8.2, everything up to 115200 works. At 8Mhz, it works up to 57600. Using gcc 4.3.2, it also works up to 57600 at 16Mhz and up to 38400 at 8Mhz. Note that at these highest speeds, communication works, but is still quite sensitive to other interrupts (like the millis() interrupts) when bytes are sent back-to-back, so there still are corrupted bytes in RX. TX works up to 115200 for all combinations of compiler and clock rates. This fixes #2019
2015-01-26Disable the RX PCINT inside SoftwareSerial::recvMatthijs Kooijman
Before, the interrupt would remain enabled during reception, which would re-set the PCINT flag because of the level changes inside the received byte. Because interrupts are globally disabled, this would not immediately trigger an interrupt, but the flag would be remembered to trigger another PCINT interrupt immediately after the first one is processed. Typically this was not a problem, because the second interrupt would see the stop bit, or an idle line, and decide that the interrupt triggered for someone else. However, at high baud rates, this could cause the next interrupt for the real start bit to be delayed so much that the byte got corrupted. By clearing the interrupt mask bit for just the RX pin (as opposed to the PCINT mask bit for the entire port), any PCINT events on other bits can still set the PCINT flag and be processed as normal. In this case, it's likely that there will be corruption, but that's inevitable when (other) interrupts happen during SoftwareSerial reception.
2015-01-26Optimize SoftwareSerial::setRxIntMsk()Matthijs Kooijman
This precalculates the mask register and value, making setRxIntMask considerably less complicated. Right now, this is not a big deal, but simplifying it allows using it inside the ISR next.
2015-01-26In SoftwareSerial::recv, only calculate the new tail onceMatthijs Kooijman
This shortens the generated code a bit more.
2015-01-26Mark SoftwareSerial::recv and handle_interrupt as always_inlineMatthijs Kooijman
Since those functions are only called once now, it makes sense to inline them. This saves a few bytes of program space, but also saves a few cycles in the critical RX path.
2015-01-26In SoftwareSerial, use ISR_ALIASOF to prevent duplicationMatthijs Kooijman
Previously, up to four separate but identical ISR routines were defined, for PCINT0, PCINT1, PCINT2 and PCINT3. Each of these would generate their own function, with a lot of push-popping because another function was called. Now, the ISR_ALIASOF macro from avr-libc is used to declare just the PCINT0 version and make all other ISRs point to that one, saving a lot of program space, as well as some speed because of improved inlining. On an Arduino Uno with gcc 4.3, this saves 168 bytes. With gcc 4.8, this saves 150 bytes.
2015-01-26Optimize SoftwareSerial::recvMatthijs Kooijman
Similar to SoftwareSerial::write, this rewrites the loop to only touch the MSB and then shift those bits up, allowing the compiler to generate more efficient code. Unlike the write function however, it is not needed to put all instance variables used into local variables, for some reason the compiler already does this (and doing it manually even makes the code bigger). On the Arduino Uno using gcc 4.3 this saves 26 bytes. Using gcc 4.8 this saves 30 bytes. Note that this removes the else clause in the code, making the C code unbalanced, which looks like it breaks timing balance. However, looking at the code generated by the compiler, it turns out that the old code was actually unbalanced, while the new code is properly balanced.
2015-01-26Further optimize SoftwareSerial::writeMatthijs Kooijman
This change restructures the loop, to help the compiler generate shorter code (because now only the LSB of the data byte is checked and subsequent bytes are shifted down one by one, it can use th "skip if bit set" instruction). Furthermore, it puts most attributes in local variables, which causes the compiler to put them into registers. This makes the timing-critical part of the code smaller, making it easier to provide accurate timings. On an Arduino uno using gcc 4.3, this saves 58 bytes. On gcc 4.8, this saves 14 bytes.
2015-01-26Mark SoftwareSerial::tx_pin_write as "always_inline"Matthijs Kooijman
Somehow gcc 4.8 doesn't inline this function, even though it is always called with constant arguments and can be reduced to just a few instructions when inlined. Adding the always_inline attribute makes gcc inline it, saving 46 bytes on the Arduino uno. gcc 4.3 already inlined this function, so there are no space savings there.
2015-01-26Simplify SoftwareSerial::writeMatthijs Kooijman
Before, there was nearly identical code for the inverted and regular cases. However, simply inverting the byte in the inverted case allows using the regular code twice, reducing the generated code size by 100 bytes (on an Arduino Uno and gcc 4.3, on gcc 4.8 the reduction is 50 bytes).
2015-01-26Use stopListening() in SoftwareSerial::end()Matthijs Kooijman
stopListening also disabled the interrupt, if needed, so calling that function makes more sense. Since stopListening only disables the interrupt when the current SoftwareSerial is the active object, and that can only be the case when _rx_delay_stopbit is non-zero, there is no need to separately check _rx_delay_stopbit anymore.
2015-01-26Fix race condition in SoftwareSerial::overflow()Matthijs Kooijman
If an interrupt causing overflow would occur between reading _buffer_overflow and clearing it, this overflow condition would be immediately cleared and never be returned by overflow(). By only clearing the overflow flag if an overflow actually occurred, this problem goes away (worst case overflow() returns false even though an overflow _just_ occurred, but then the next call to overflow() will return true).
2015-01-26Toggle SoftwareSerial interrupts when starting / stopping to listenMatthijs Kooijman
This prevents interrupts from triggering when the SoftwareSerial instance is not even listening. Additionally, this removes the need to disable interrupts in SoftwareSerial::listen, since no interrupts are active while it touches the variables.
2015-01-26Add SoftwareSerial::stopListening()Matthijs Kooijman
This allows one to explicitly stop a SoftwareSerial instance from listening, without having to make another one listening.
2015-01-26Add SoftwareSerial::setRxIntMsk()Matthijs Kooijman
This moves the interrupt mask enabling / disabling code into a separate method, so we can call it from multiple spots next.
2015-01-26Let SoftwareSerial::end also check against _rx_delay_stopbitMatthijs Kooijman
The current check is still always false when the old check was, but additionally it will not disable the interrupts when they were never enabled (which shouldn't matter much, but this is more consistent).
2015-01-26Let SoftwareSerial::listen() fail on invalid rx baud ratesMatthijs Kooijman
In this case, SoftwareSerial::begin will not have enabled the interrupts, so better not allow the SoftwareSerial instance to enter the listening state either.
2015-01-26Clear SoftwareSerial rx delay if no interrupt register is foundMatthijs Kooijman
Before enabling interupts, begin would see if the given receive pin actually has an associated PCINT register. If not, the interrupts would not be enabled. Now, the same check is done, but when no register is available, the rx parameters are not loaded at all (which in turn prevents the interrupt from being enabled). This allows all code to use the same "is rx enabled" (which will be added next).
2014-11-25Fix atomicity issues in SPI::beginTransaction and SPI::endTransaction ↵Cristian Maglie
(Andrew Kroll) Previously, it could happen that SPI::beginTransaction was interrupted by an ISR, while it is changing the SPI_AVR_EIMSK register or interruptSave variable (it seems that there is a small window after changing SPI_AVR_EIMSK where an interrupt might still occur). If this happens, interruptSave is overwritten with an invalid value, permanently disabling the pin interrupts. To prevent this, disable interrupts globally while changing these values.
2014-11-25[avr] Made SPI.usingInterrupt() synchronized (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Added SPI.notUsingInterrupt() (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Made SPI.begin() and SPI.end() synchronized (Andrew Kroll)Cristian Maglie
2014-11-25[avr] Improved SPI speed on 16bit transfer.Cristian Maglie
From https://github.com/arduino/Arduino/pull/2376#issuecomment-59671152 Quoting Andrew Kroll: [..this commit..] introduces a small delay that can prevent the wait loop form iterating when running at the maximum speed. This gives you a little more speed, even if it seems counter-intuitive. At lower speeds, it is unnoticed. Watch the output on an oscilloscope when running full SPI speed, and you should see closer back-to-back writes. Quoting Paul Stoffregen: I did quite a bit of experimenting with the NOP addition. The one that's in my copy gives about a 10% speedup on AVR.
2014-11-14[avr] SPI: removed redundant includeCristian Maglie
2014-11-14[avr] Small comments and headers fixes in SPICristian Maglie
2014-08-01SPI Transactions for AVRPaulStoffregen
2014-07-18missing paragraph field in library.propertiesFede85
2014-07-18modified sentences in library.properties filesFede85
2014-07-02Merge pull request #1912 from Lauszus/issues440Cristian Maglie
Enable user to change the I2C clock frequency by calling setClock in the Wire library
2014-05-23Merge remote-tracking branch 'arduino/master' into ide-1.5.xCristian Maglie
Conflicts: build/shared/examples/01.Basics/Blink/Blink.ino build/shared/examples/09.USB/Keyboard/KeyboardReprogram/KeyboardReprogram.ino build/shared/examples/10.StarterKit/p02_SpaceshipInterface/p02_SpaceshipInterface.ino hardware/arduino/cores/arduino/HardwareSerial.cpp
2014-03-06Enable user to change the I2C clock frequency by calling setClock in the ↵Kristian Lauszus
Wire library
2013-11-21Revert "SPI library to new format"Cristian Maglie
2013-11-21Revert "EEPROM library to the new format"Cristian Maglie
This reverts commits: 3223d4fdca32ec03de4a3a2a0c22f2d40de5f374 77f8dd63ab102ab5d2929ac4edd5c00ae9d70493
2013-11-15Revert "SoftwareSerial library to the new format"Cristian Maglie
This reverts commit 38c3bbbd3c83eda057d4857635fbd78a4785c3a4.
2013-11-15Revert "Wire library to the 1.5 format"Cristian Maglie
This reverts commit a31857688bdc270ed65307755ff3b73ef4867982.
2013-09-10Wire library to the 1.5 formatFede85
2013-09-06SpacebrewYun library to the 1.5 formatFede85
2013-09-06Temboo library to the 1.5 formatFede85