mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-13 18:06:15 +00:00
Compare commits
21 Commits
z3t0-patch
...
v2.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1768b4deb | ||
|
|
679348568d | ||
|
|
47aadf559d | ||
|
|
eb7a0bee7d | ||
|
|
18f12d3aff | ||
|
|
f0aa48a4d1 | ||
|
|
691ea5bc53 | ||
|
|
e0c2649b9f | ||
|
|
419c948c29 | ||
|
|
9133814e60 | ||
|
|
3875097df9 | ||
|
|
88b294a0cd | ||
|
|
ffdb6081ae | ||
|
|
6b8f2bdbfc | ||
|
|
eae9de4307 | ||
|
|
513e104515 | ||
|
|
ccc9d0135c | ||
|
|
257a15130f | ||
|
|
1b56da6cc7 | ||
|
|
aa8f7b31fe | ||
|
|
048efb23a2 |
@@ -3,7 +3,6 @@ These are the active contributors of this project that you may contact if there
|
||||
|
||||
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
||||
* Email: zetoslab@gmail.com
|
||||
* Skype: polarised16
|
||||
- [shirriff](https://github.com/shirriff) : An amazing person who worked to create this awesome library and provide unending support
|
||||
- [AnalysIR](https:/github.com/AnalysIR): Active contributor and is amazing with providing support!
|
||||
- [Informatic](https://github.com/Informatic) : Active contributor
|
||||
@@ -16,7 +15,10 @@ These are the active contributors of this project that you may contact if there
|
||||
- [Sebazzz](https://github.com/sebazz): Contributor
|
||||
- [lumbric](https://github.com/lumbric): Contributor
|
||||
- [ElectricRCAircraftGuy](https://github.com/electricrcaircraftguy): Active Contributor
|
||||
- [henkel](https://github.com/henkel): Contributor
|
||||
- [philipphenkel](https://github.com/philipphenkel): Active Contributor
|
||||
- [MCUdude](https://github.com/MCUdude): Contributor
|
||||
- [marcmerlin](https://github.com/marcmerlin): Contributor (ESP32 port)
|
||||
- [bengtmartensson](https://github.com/bengtmartensson): Active Contributor
|
||||
- [MrBryonMiller](https://github.com/MrBryonMiller): Contributor
|
||||
|
||||
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
||||
|
||||
@@ -18,14 +18,17 @@
|
||||
// Whynter A/C ARC-110WD added by Francesco Meschia
|
||||
//******************************************************************************
|
||||
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
// Defining IR_GLOBAL here allows us to declare the instantiation of global variables
|
||||
#define IR_GLOBAL
|
||||
# include "IRremote.h"
|
||||
# include "IRremoteInt.h"
|
||||
#undef IR_GLOBAL
|
||||
|
||||
#ifdef HAS_AVR_INTERRUPT_H
|
||||
#include <avr/interrupt.h>
|
||||
#endif
|
||||
|
||||
|
||||
//+=============================================================================
|
||||
// The match functions were (apparently) originally MACROs to improve code speed
|
||||
// (although this would have bloated the code) hence the names being CAPS
|
||||
@@ -182,6 +185,7 @@ ISR (TIMER_INTR_NAME)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef BLINKLED
|
||||
// If requested, flash LED while receiving IR data
|
||||
if (irparams.blinkflag) {
|
||||
if (irdata == MARK)
|
||||
@@ -190,4 +194,5 @@ ISR (TIMER_INTR_NAME)
|
||||
else if (irparams.blinkpin) digitalWrite(irparams.blinkpin, LOW); // Turn user defined pin LED on
|
||||
else BLINKLED_OFF() ; // if no user defined LED pin, turn default LED pin for the hardware on
|
||||
}
|
||||
#endif // BLINKLED
|
||||
}
|
||||
|
||||
27
IRremote.h
27
IRremote.h
@@ -259,7 +259,18 @@ class IRrecv
|
||||
class IRsend
|
||||
{
|
||||
public:
|
||||
IRsend () { }
|
||||
#ifdef USE_SOFT_CARRIER
|
||||
|
||||
IRsend(int pin = SEND_PIN)
|
||||
{
|
||||
sendPin = pin;
|
||||
}
|
||||
#else
|
||||
|
||||
IRsend()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
void custom_delay_usec (unsigned long uSecs);
|
||||
void enableIROut (int khz) ;
|
||||
@@ -339,6 +350,20 @@ class IRsend
|
||||
# if SEND_LEGO_PF
|
||||
void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ;
|
||||
# endif
|
||||
|
||||
#ifdef USE_SOFT_CARRIER
|
||||
private:
|
||||
int sendPin;
|
||||
|
||||
unsigned int periodTime;
|
||||
unsigned int periodOnTime;
|
||||
|
||||
void sleepMicros(unsigned long us);
|
||||
void sleepUntilMicros(unsigned long targetTime);
|
||||
|
||||
#else
|
||||
const int sendPin = SEND_PIN;
|
||||
#endif
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
19
README.md
19
README.md
@@ -8,7 +8,7 @@ This library enables you to send and receive using infra-red signals on an Ardui
|
||||
|
||||
Tutorials and more information will be made available on [the official homepage](http://z3t0.github.io/Arduino-IRremote/).
|
||||
|
||||
## Version - 2.2.1
|
||||
## Version - 2.4.0b
|
||||
|
||||
## Installation
|
||||
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
|
||||
@@ -17,6 +17,12 @@ Tutorials and more information will be made available on [the official homepage]
|
||||
4. Move the "IRremote" folder that has been extracted to your libraries directory.
|
||||
5. Make sure to delete Arduino_Root/libraries/RobotIRremote. Where Arduino_Root refers to the install directory of Arduino. The library RobotIRremote has similar definitions to IRremote and causes errors.
|
||||
|
||||
|
||||
## FAQ
|
||||
- IR does not work right when I use Neopixels (aka WS2811/WS2812/WS2812B)
|
||||
Whether you use the Adafruit Neopixel lib, or FastLED, interrupts get disabled on many lower end CPUs like the basic arduinos. In turn, this stops the IR interrupt handler from running when it needs to. There are some solutions to this on some processors, [see this page from Marc MERLIN](http://marc.merlins.org/perso/arduino/post_2017-04-03_Arduino-328P-Uno-Teensy3_1-ESP8266-ESP32-IR-and-Neopixels.html)
|
||||
|
||||
|
||||
## Supported Boards
|
||||
- Arduino Uno / Mega / Leonardo / Duemilanove / Diecimila / LilyPad / Mini / Fio / Nano etc.
|
||||
- Teensy 1.0 / 1.0++ / 2.0 / 2++ / 3.0 / 3.1 / Teensy-LC; Credits: @PaulStoffregen (Teensy Team)
|
||||
@@ -25,6 +31,8 @@ Tutorials and more information will be made available on [the official homepage]
|
||||
- ATmega8535, 16, 32, 164, 324, 644, 1284,
|
||||
- ATmega64, 128
|
||||
- ATtiny 84 / 85
|
||||
- ESP32 (receive only)
|
||||
- ESP8266 is supported in a fork based on an old codebase that isn't as recent, but it works reasonably well given that perfectly timed sub millisecond interrupts are different on that chip. See https://github.com/markszabo/IRremoteESP8266
|
||||
|
||||
We are open to suggestions for adding support to new boards, however we highly recommend you contact your supplier first and ask them to provide support from their side.
|
||||
|
||||
@@ -42,12 +50,19 @@ We are open to suggestions for adding support to new boards, however we highly r
|
||||
| [ATmega8535 ATmega16, ATmega32](https://github.com/MCUdude/MightyCore) | **13** | **1** |
|
||||
| [ATmega64, ATmega128](https://github.com/MCUdude/MegaCore) | **13** | **1** |
|
||||
| ATmega1280, ATmega2560 | 5, 6, **9**, 11, 46 | 1, **2**, 3, 4, 5 |
|
||||
| [ESP32](http://esp32.net/) | N/A (not supported) | **1** |
|
||||
| [Teensy 1.0](https://www.pjrc.com/teensy/) | **17** | **1** |
|
||||
| [Teensy 2.0](https://www.pjrc.com/teensy/) | 9, **10**, 14 | 1, 3, **4_HS** |
|
||||
| [Teensy++ 1.0 / 2.0](https://www.pjrc.com/teensy/) | **1**, 16, 25 | 1, **2**, 3 |
|
||||
| [Teensy 3.0 / 3.1](https://www.pjrc.com/teensy/) | **5** | **CMT** |
|
||||
| [Teensy-LC](https://www.pjrc.com/teensy/) | **16** | **TPM1** |
|
||||
|
||||
|
||||
### Experimental patches
|
||||
The following are strictly community supported patches that have yet to make it into mainstream. If you have issues feel free to ask here. If it works well then let us know!
|
||||
|
||||
[Arduino 101](https://github.com/z3t0/Arduino-IRremote/pull/481#issuecomment-311243146)
|
||||
|
||||
The table above lists the currently supported timers and corresponding send pins, many of these can have additional pins opened up and we are open to requests if a need arises for other pins.
|
||||
|
||||
## Usage
|
||||
@@ -65,7 +80,7 @@ Check [here](Contributing.md) for some guidelines.
|
||||
|
||||
## Contact
|
||||
Email: zetoslab@gmail.com
|
||||
Please only email me if it is more appropriate than creating an Issue / PR. I **will** not respond to requests for adding support for particular boards, unless of course you are the creator of the board and would like to cooperate on the project. I will also **ignore** any emails asking me to tell you how to implement your ideas. However, if you have a private inquiry that you would only apply to you and you would prefer it to be via email, by all means.
|
||||
Please only email me if it is more appropriate than creating an Issue / PR. I **will** not respond to requests for adding support for particular boards, unless of course you are the creator of the board and would like to cooperate on the project. I will also **ignore** any emails asking me to tell you how to implement your ideas. However, if you have a private inquiry that you would only apply to you and you would prefer it to be via email, by all means.
|
||||
|
||||
## Contributors
|
||||
Check [here](Contributors.md)
|
||||
|
||||
157
boarddefs.h
157
boarddefs.h
@@ -20,6 +20,32 @@
|
||||
#ifndef boarddefs_h
|
||||
#define boarddefs_h
|
||||
|
||||
// Define some defaults, that some boards may like to override
|
||||
// (This is to avoid negative logic, ! DONT_... is just awkward.)
|
||||
|
||||
// This board has/needs the avr/interrupt.h
|
||||
#define HAS_AVR_INTERRUPT_H
|
||||
|
||||
// Define if sending is supported
|
||||
#define SENDING_SUPPORTED
|
||||
|
||||
// If defined, a standard enableIRIn function will be define.
|
||||
// Undefine for boards supplying their own.
|
||||
#define USE_DEFAULT_ENABLE_IR_IN
|
||||
|
||||
// Duty cycle in percent for sent signals. Presently takes effect only with USE_SOFT_CARRIER
|
||||
#define DUTY_CYCLE 50
|
||||
|
||||
// If USE_SOFT_CARRIER, this amount (in micro seconds) is subtracted from the
|
||||
// on-time of the pulses.
|
||||
#define PULSE_CORRECTION 3
|
||||
|
||||
// digitalWrite is supposed to be slow. If this is an issue, define faster,
|
||||
// board-dependent versions of these macros SENDPIN_ON(pin) and SENDPIN_OFF(pin).
|
||||
// Portable, possibly slow, default definitions are given at the end of this file.
|
||||
// If defining new versions, feel free to ignore the pin argument if it
|
||||
// is not configurable on the current board.
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Defines for blinking the LED
|
||||
//
|
||||
@@ -39,9 +65,34 @@
|
||||
# define BLINKLED_ON() (PORTD |= B00000001)
|
||||
# define BLINKLED_OFF() (PORTD &= B11111110)
|
||||
|
||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
||||
# define BLINKLED LED_BUILTIN
|
||||
# define BLINKLED_ON() (digitalWrite(LED_BUILTIN, HIGH))
|
||||
# define BLINKLED_OFF() (digitalWrite(LED_BUILTIN, LOW))
|
||||
|
||||
# define USE_SOFT_CARRIER
|
||||
// Define to use spin wait instead of delayMicros()
|
||||
//# define USE_SPIN_WAIT
|
||||
# undef USE_DEFAULT_ENABLE_IR_IN
|
||||
|
||||
// The default pin used used for sending.
|
||||
# define SEND_PIN 9
|
||||
|
||||
#elif defined(ESP32)
|
||||
// No system LED on ESP32, disable blinking by NOT defining BLINKLED
|
||||
|
||||
// avr/interrupt.h is not present
|
||||
# undef HAS_AVR_INTERRUPT_H
|
||||
|
||||
// Sending not implemented
|
||||
# undef SENDING_SUPPORTED#
|
||||
|
||||
// Supply own enbleIRIn
|
||||
# undef USE_DEFAULT_ENABLE_IR_IN
|
||||
|
||||
#else
|
||||
# define BLINKLED 13
|
||||
#define BLINKLED_ON() (PORTB |= B00100000)
|
||||
# define BLINKLED_ON() (PORTB |= B00100000)
|
||||
# define BLINKLED_OFF() (PORTB &= B11011111)
|
||||
#endif
|
||||
|
||||
@@ -125,15 +176,21 @@
|
||||
|
||||
// ATtiny84
|
||||
#elif defined(__AVR_ATtiny84__)
|
||||
#define IR_USE_TIMER1 // tx = pin 6
|
||||
#define IR_USE_TIMER1 // tx = pin 6
|
||||
|
||||
//ATtiny85
|
||||
#elif defined(__AVR_ATtiny85__)
|
||||
#define IR_USE_TIMER_TINY0 // tx = pin 1
|
||||
#define IR_USE_TIMER_TINY0 // tx = pin 1
|
||||
|
||||
#elif defined(ESP32)
|
||||
#define IR_TIMER_USE_ESP32
|
||||
|
||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
||||
#define TIMER_PRESCALER_DIV 64
|
||||
|
||||
#else
|
||||
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
||||
// ATmega48, ATmega88, ATmega168, ATmega328
|
||||
#else
|
||||
//#define IR_USE_TIMER1 // tx = pin 9
|
||||
#define IR_USE_TIMER2 // tx = pin 3
|
||||
|
||||
@@ -183,17 +240,17 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC2B_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC2B_PIN // Teensy
|
||||
# define SEND_PIN CORE_OC2B_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 9 // Arduino Mega
|
||||
# define SEND_PIN 9 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__)
|
||||
# define TIMER_PWM_PIN 14 // MightyCore
|
||||
# define SEND_PIN 14 // MightyCore
|
||||
#else
|
||||
# define TIMER_PWM_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
# define SEND_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||
|
||||
//---------------------------------------------------------
|
||||
@@ -236,22 +293,22 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC1A_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC1A_PIN // Teensy
|
||||
# define SEND_PIN CORE_OC1A_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 11 // Arduino Mega
|
||||
# define SEND_PIN 11 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||
# define TIMER_PWM_PIN 13 // MegaCore
|
||||
# define SEND_PIN 13 // MegaCore
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__)
|
||||
# define TIMER_PWM_PIN 13 // MightyCore
|
||||
# define SEND_PIN 13 // MightyCore
|
||||
#elif defined(__AVR_ATtiny84__)
|
||||
# define TIMER_PWM_PIN 6
|
||||
# define SEND_PIN 6
|
||||
#else
|
||||
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
# define SEND_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||
|
||||
//---------------------------------------------------------
|
||||
@@ -283,11 +340,11 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC3A_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC3A_PIN // Teensy
|
||||
# define SEND_PIN CORE_OC3A_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 5 // Arduino Mega
|
||||
# define SEND_PIN 5 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
||||
# define TIMER_PWM_PIN 6 // MightyCore
|
||||
# define SEND_PIN 6 // MightyCore
|
||||
#else
|
||||
# error "Please add OC3A pin number here\n"
|
||||
#endif
|
||||
@@ -331,9 +388,9 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC4A_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC4A_PIN // Teensy
|
||||
# define SEND_PIN CORE_OC4A_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega32U4__)
|
||||
# define TIMER_PWM_PIN 13 // Leonardo
|
||||
# define SEND_PIN 13 // Leonardo
|
||||
#else
|
||||
# error "Please add OC4A pin number here\n"
|
||||
#endif
|
||||
@@ -367,9 +424,9 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC4A_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC4A_PIN
|
||||
# define SEND_PIN CORE_OC4A_PIN
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 6 // Arduino Mega
|
||||
# define SEND_PIN 6 // Arduino Mega
|
||||
#else
|
||||
# error "Please add OC4A pin number here\n"
|
||||
#endif
|
||||
@@ -403,9 +460,9 @@
|
||||
|
||||
//-----------------
|
||||
#if defined(CORE_OC5A_PIN)
|
||||
# define TIMER_PWM_PIN CORE_OC5A_PIN
|
||||
# define SEND_PIN CORE_OC5A_PIN
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 46 // Arduino Mega
|
||||
# define SEND_PIN 46 // Arduino Mega
|
||||
#else
|
||||
# error "Please add OC5A pin number here\n"
|
||||
#endif
|
||||
@@ -472,7 +529,7 @@
|
||||
CMT_MSC = 0x03; \
|
||||
})
|
||||
|
||||
#define TIMER_PWM_PIN 5
|
||||
#define SEND_PIN 5
|
||||
|
||||
// defines for TPM1 timer on Teensy-LC
|
||||
#elif defined(IR_USE_TIMER_TPM1)
|
||||
@@ -502,7 +559,7 @@
|
||||
FTM1_C0V = 0; \
|
||||
FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0) | FTM_SC_TOF | FTM_SC_TOIE; \
|
||||
})
|
||||
#define TIMER_PWM_PIN 16
|
||||
#define SEND_PIN 16
|
||||
|
||||
// defines for timer_tiny0 (8 bits)
|
||||
#elif defined(IR_USE_TIMER_TINY0)
|
||||
@@ -536,7 +593,46 @@
|
||||
})
|
||||
#endif
|
||||
|
||||
#define TIMER_PWM_PIN 1 /* ATtiny85 */
|
||||
#define SEND_PIN 1 /* ATtiny85 */
|
||||
|
||||
//---------------------------------------------------------
|
||||
// ESP32 (ESP8266 should likely be added here too)
|
||||
//
|
||||
|
||||
// ESP32 has it own timer API and does not use these macros, but to avoid ifdef'ing
|
||||
// them out in the common code, they are defined to no-op. This allows the code to compile
|
||||
// (which it wouldn't otherwise) but irsend will not work until ESP32 specific code is written
|
||||
// for that -- merlin
|
||||
// As a warning, sending timing specific code from an ESP32 can be challenging if you need 100%
|
||||
// reliability because the arduino code may be interrupted and cause your sent waveform to be the
|
||||
// wrong length. This is specifically an issue for neopixels which require 800Khz resolution.
|
||||
// IR may just work as is with the common code since it's lower frequency, but if not, the other
|
||||
// way to do this on ESP32 is using the RMT built in driver like in this incomplete library below
|
||||
// https://github.com/ExploreEmbedded/ESP32_RMT
|
||||
#elif defined(IR_TIMER_USE_ESP32)
|
||||
|
||||
#define TIMER_RESET
|
||||
|
||||
#ifdef ISR
|
||||
# undef ISR
|
||||
#endif
|
||||
#define ISR(f) void IRTimer()
|
||||
|
||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
||||
// use timer 3 hardcoded at this time
|
||||
|
||||
#define TIMER_RESET
|
||||
#define TIMER_ENABLE_PWM // Not presently used
|
||||
#define TIMER_DISABLE_PWM
|
||||
#define TIMER_ENABLE_INTR NVIC_EnableIRQ(TC3_IRQn) // Not presently used
|
||||
#define TIMER_DISABLE_INTR NVIC_DisableIRQ(TC3_IRQn)
|
||||
#define TIMER_INTR_NAME TC3_Handler // Not presently used
|
||||
#define TIMER_CONFIG_KHZ(f)
|
||||
|
||||
#ifdef ISR
|
||||
# undef ISR
|
||||
#endif
|
||||
#define ISR(f) void irs()
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Unknown Timer
|
||||
@@ -545,4 +641,13 @@
|
||||
# error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
|
||||
#endif
|
||||
|
||||
// Provide default definitions, portable but possibly slower than necessary.
|
||||
#ifndef SENDPIN_ON
|
||||
#define SENDPIN_ON(pin) digitalWrite(pin, HIGH)
|
||||
#endif
|
||||
|
||||
#ifndef SENDPIN_OFF
|
||||
#define SENDPIN_OFF(pin) digitalWrite(pin, LOW)
|
||||
#endif
|
||||
|
||||
#endif // ! boarddefs_h
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
## 2.4.0 - 2017/08/10
|
||||
- Cleanup of hardware dependencies. Merge in SAM support [PR #437](https://github.com/z3t0/Arduino-IRremote/pull/437)
|
||||
|
||||
## 2.3.3 - 2017/03/31
|
||||
- Added ESP32 IR receive support [PR #427](https://github.com/z3t0/Arduino-IRremote/pull/425)
|
||||
|
||||
## 2.2.3 - 2017/03/27
|
||||
- Fix calculation of pause length in LEGO PF protocol [PR #427](https://github.com/z3t0/Arduino-IRremote/pull/427)
|
||||
|
||||
## 2.2.2 - 2017/01/20
|
||||
- Fixed naming bug [PR #398](https://github.com/z3t0/Arduino-IRremote/pull/398)
|
||||
|
||||
|
||||
39
esp32.cpp
Normal file
39
esp32.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifdef ESP32
|
||||
|
||||
// This file contains functions specific to the ESP32.
|
||||
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
// "Idiot check"
|
||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
||||
#error Must undef USE_DEFAULT_ENABLE_IR_IN
|
||||
#endif
|
||||
|
||||
hw_timer_t *timer;
|
||||
void IRTimer(); // defined in IRremote.cpp, masqueraded as ISR(TIMER_INTR_NAME)
|
||||
|
||||
//+=============================================================================
|
||||
// initialization
|
||||
//
|
||||
void IRrecv::enableIRIn ( )
|
||||
{
|
||||
// Interrupt Service Routine - Fires every 50uS
|
||||
// ESP32 has a proper API to setup timers, no weird chip macros needed
|
||||
// simply call the readable API versions :)
|
||||
// 3 timers, choose #1, 80 divider nanosecond precision, 1 to count up
|
||||
timer = timerBegin(1, 80, 1);
|
||||
timerAttachInterrupt(timer, &IRTimer, 1);
|
||||
// every 50ns, autoreload = true
|
||||
timerAlarmWrite(timer, 50, true);
|
||||
timerAlarmEnable(timer);
|
||||
|
||||
// Initialize state machine variables
|
||||
irparams.rcvstate = STATE_IDLE;
|
||||
irparams.rawlen = 0;
|
||||
|
||||
// Set pin modes
|
||||
pinMode(irparams.recvpin, INPUT);
|
||||
}
|
||||
|
||||
#endif // ESP32
|
||||
@@ -17,7 +17,11 @@ decode_results results;
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
// In case the interrupt driver crashes on setup, give a clue
|
||||
// to the user what's going on.
|
||||
Serial.println("Enabling IRin");
|
||||
irrecv.enableIRIn(); // Start the receiver
|
||||
Serial.println("Enabled IRin");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* You can change this to another available Arduino Pin.
|
||||
* Your IR receiver should be connected to the pin defined here
|
||||
*/
|
||||
int RECV_PIN = 11;
|
||||
int RECV_PIN = 11;
|
||||
|
||||
IRrecv irrecv(RECV_PIN);
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ void dumpTIMER() {
|
||||
|
||||
void dumpTimerPin() {
|
||||
Serial.print(F("IR Tx Pin: "));
|
||||
Serial.println(TIMER_PWM_PIN);
|
||||
Serial.println(SEND_PIN);
|
||||
}
|
||||
|
||||
void dumpClock() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* LegoPowerFunctionsTest: LEGO Power Functions Tests
|
||||
* Copyright (c) 2016 Philipp Henkel
|
||||
* Copyright (c) 2016, 2017 Philipp Henkel
|
||||
*/
|
||||
|
||||
#include <ir_Lego_PF_BitStreamEncoder.h>
|
||||
@@ -78,14 +78,14 @@ void testMessageBitCount(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
logTestResult(bitCount == 18);
|
||||
}
|
||||
|
||||
boolean check(LegoPfBitStreamEncoder& bitStreamEncoder, int markDuration, int pauseDuration) {
|
||||
boolean check(LegoPfBitStreamEncoder& bitStreamEncoder, unsigned long markDuration, unsigned long pauseDuration) {
|
||||
bool result = true;
|
||||
result = result && bitStreamEncoder.getMarkDuration() == markDuration;
|
||||
result = result && bitStreamEncoder.getPauseDuration() == pauseDuration;
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean checkNext(LegoPfBitStreamEncoder& bitStreamEncoder, int markDuration, int pauseDuration) {
|
||||
boolean checkNext(LegoPfBitStreamEncoder& bitStreamEncoder, unsigned long markDuration, unsigned long pauseDuration) {
|
||||
bool result = bitStreamEncoder.next();
|
||||
result = result && check(bitStreamEncoder, markDuration, pauseDuration);
|
||||
return result;
|
||||
@@ -129,16 +129,16 @@ void testMessage407Repeated(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
bool result = true;
|
||||
result = result && check(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 5 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026L + 5L * 16000L - 10844L);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 5 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026L + 5L * 16000L - 10844L);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 8 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026L + 8L * 16000L - 10844L);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 8 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026L + 8L * 16000L - 10844L);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
@@ -191,7 +191,3 @@ void testGetMessageLengthAllLow(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
bitStreamEncoder.reset(0x0, false);
|
||||
logTestResult(bitStreamEncoder.getMessageLength() == 9104);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -115,8 +115,10 @@ IRrecv::IRrecv (int recvpin, int blinkpin)
|
||||
//+=============================================================================
|
||||
// initialization
|
||||
//
|
||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
||||
void IRrecv::enableIRIn ( )
|
||||
{
|
||||
// Interrupt Service Routine - Fires every 50uS
|
||||
cli();
|
||||
// Setup pulse clock timer interrupt
|
||||
// Prescale /8 (16M/8 = 0.5 microseconds per tick)
|
||||
@@ -138,14 +140,17 @@ void IRrecv::enableIRIn ( )
|
||||
// Set pin modes
|
||||
pinMode(irparams.recvpin, INPUT);
|
||||
}
|
||||
#endif // USE_DEFAULT_ENABLE_IR_IN
|
||||
|
||||
//+=============================================================================
|
||||
// Enable/disable blinking of pin 13 on IR processing
|
||||
//
|
||||
void IRrecv::blink13 (int blinkflag)
|
||||
{
|
||||
#ifdef BLINKLED
|
||||
irparams.blinkflag = blinkflag;
|
||||
if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
|
||||
#endif
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
|
||||
58
irSend.cpp
58
irSend.cpp
@@ -1,6 +1,7 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
#ifdef SENDING_SUPPORTED
|
||||
//+=============================================================================
|
||||
void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz)
|
||||
{
|
||||
@@ -15,14 +16,59 @@ void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned in
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
|
||||
#ifdef USE_SOFT_CARRIER
|
||||
void inline IRsend::sleepMicros(unsigned long us)
|
||||
{
|
||||
#ifdef USE_SPIN_WAIT
|
||||
sleepUntilMicros(micros() + us);
|
||||
#else
|
||||
if (us > 0U) // Is this necessary? (Official docu https://www.arduino.cc/en/Reference/DelayMicroseconds does not tell.)
|
||||
delayMicroseconds((unsigned int) us);
|
||||
#endif
|
||||
}
|
||||
|
||||
void inline IRsend::sleepUntilMicros(unsigned long targetTime)
|
||||
{
|
||||
#ifdef USE_SPIN_WAIT
|
||||
while (micros() < targetTime)
|
||||
;
|
||||
#else
|
||||
unsigned long now = micros();
|
||||
if (now < targetTime)
|
||||
sleepMicros(targetTime - now);
|
||||
#endif
|
||||
}
|
||||
#endif // USE_SOFT_CARRIER
|
||||
|
||||
//+=============================================================================
|
||||
// Sends an IR mark for the specified number of microseconds.
|
||||
// The mark output is modulated at the PWM frequency.
|
||||
//
|
||||
void IRsend::mark (unsigned int time)
|
||||
|
||||
void IRsend::mark(unsigned int time)
|
||||
{
|
||||
#ifdef USE_SOFT_CARRIER
|
||||
unsigned long start = micros();
|
||||
unsigned long stop = start + time;
|
||||
if (stop + periodTime < start)
|
||||
// Counter wrap-around, happens very seldomly, but CAN happen.
|
||||
// Just give up instead of possibly damaging the hardware.
|
||||
return;
|
||||
|
||||
unsigned long nextPeriodEnding = start;
|
||||
unsigned long now = micros();
|
||||
while (now < stop) {
|
||||
SENDPIN_ON(sendPin);
|
||||
sleepMicros(periodOnTime);
|
||||
SENDPIN_OFF(sendPin);
|
||||
nextPeriodEnding += periodTime;
|
||||
sleepUntilMicros(nextPeriodEnding);
|
||||
now = micros();
|
||||
}
|
||||
#else
|
||||
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
|
||||
if (time > 0) custom_delay_usec(time);
|
||||
#endif
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
@@ -54,11 +100,16 @@ void IRsend::space (unsigned int time)
|
||||
//
|
||||
void IRsend::enableIROut (int khz)
|
||||
{
|
||||
#ifdef USE_SOFT_CARRIER
|
||||
periodTime = (1000U + khz/2) / khz; // = 1000/khz + 1/2 = round(1000.0/khz)
|
||||
periodOnTime = periodTime * DUTY_CYCLE / 100U - PULSE_CORRECTION;
|
||||
#endif
|
||||
|
||||
// Disable the Timer2 Interrupt (which is used for receiving IR)
|
||||
TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
|
||||
|
||||
pinMode(TIMER_PWM_PIN, OUTPUT);
|
||||
digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
|
||||
pinMode(sendPin, OUTPUT);
|
||||
SENDPIN_OFF(sendPin); // When not sending, we want it low
|
||||
|
||||
// COM2A = 00: disconnect OC2A
|
||||
// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
|
||||
@@ -85,3 +136,4 @@ void IRsend::custom_delay_usec(unsigned long uSecs) {
|
||||
//}
|
||||
}
|
||||
|
||||
#endif // SENDING_SUPPORTED
|
||||
@@ -4,7 +4,7 @@
|
||||
// L E E O O
|
||||
// L EEEE E EEE O O
|
||||
// L E E E O O LEGO Power Functions
|
||||
// LLLLLL EEEEEE EEEE OOOO Copyright (c) 2016 Philipp Henkel
|
||||
// LLLLLL EEEEEE EEEE OOOO Copyright (c) 2016, 2017 Philipp Henkel
|
||||
//==============================================================================
|
||||
|
||||
//+=============================================================================
|
||||
@@ -14,25 +14,25 @@ class LegoPfBitStreamEncoder {
|
||||
private:
|
||||
uint16_t data;
|
||||
bool repeatMessage;
|
||||
int messageBitIdx;
|
||||
int repeatCount;
|
||||
int messageLength;
|
||||
|
||||
// HIGH data bit = IR mark + high pause
|
||||
// LOW data bit = IR mark + low pause
|
||||
static const int LOW_BIT_DURATION = 421;
|
||||
static const int HIGH_BIT_DURATION = 711;
|
||||
static const int START_BIT_DURATION = 1184;
|
||||
static const int STOP_BIT_DURATION = 1184;
|
||||
static const int IR_MARK_DURATION = 158;
|
||||
static const int HIGH_PAUSE_DURATION = HIGH_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const int LOW_PAUSE_DURATION = LOW_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const int START_PAUSE_DURATION = START_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const int STOP_PAUSE_DURATION = STOP_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const int MESSAGE_BITS = 18;
|
||||
static const int MAX_MESSAGE_LENGTH = 16000;
|
||||
uint8_t messageBitIdx;
|
||||
uint8_t repeatCount;
|
||||
uint16_t messageLength;
|
||||
|
||||
public:
|
||||
// HIGH data bit = IR mark + high pause
|
||||
// LOW data bit = IR mark + low pause
|
||||
static const uint16_t LOW_BIT_DURATION = 421;
|
||||
static const uint16_t HIGH_BIT_DURATION = 711;
|
||||
static const uint16_t START_BIT_DURATION = 1184;
|
||||
static const uint16_t STOP_BIT_DURATION = 1184;
|
||||
static const uint8_t IR_MARK_DURATION = 158;
|
||||
static const uint16_t HIGH_PAUSE_DURATION = HIGH_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const uint16_t LOW_PAUSE_DURATION = LOW_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const uint16_t START_PAUSE_DURATION = START_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const uint16_t STOP_PAUSE_DURATION = STOP_BIT_DURATION - IR_MARK_DURATION;
|
||||
static const uint8_t MESSAGE_BITS = 18;
|
||||
static const uint16_t MAX_MESSAGE_LENGTH = 16000;
|
||||
|
||||
void reset(uint16_t data, bool repeatMessage) {
|
||||
this->data = data;
|
||||
this->repeatMessage = repeatMessage;
|
||||
@@ -43,9 +43,9 @@ class LegoPfBitStreamEncoder {
|
||||
|
||||
int getChannelId() const { return 1 + ((data >> 12) & 0x3); }
|
||||
|
||||
int getMessageLength() const {
|
||||
uint16_t getMessageLength() const {
|
||||
// Sum up all marks
|
||||
int length = MESSAGE_BITS * IR_MARK_DURATION;
|
||||
uint16_t length = MESSAGE_BITS * IR_MARK_DURATION;
|
||||
|
||||
// Sum up all pauses
|
||||
length += START_PAUSE_DURATION;
|
||||
@@ -75,9 +75,9 @@ class LegoPfBitStreamEncoder {
|
||||
}
|
||||
}
|
||||
|
||||
int getMarkDuration() const { return IR_MARK_DURATION; }
|
||||
uint8_t getMarkDuration() const { return IR_MARK_DURATION; }
|
||||
|
||||
int getPauseDuration() const {
|
||||
uint32_t getPauseDuration() const {
|
||||
if (messageBitIdx == 0)
|
||||
return START_PAUSE_DURATION;
|
||||
else if (messageBitIdx < MESSAGE_BITS - 1) {
|
||||
@@ -88,13 +88,13 @@ class LegoPfBitStreamEncoder {
|
||||
}
|
||||
|
||||
private:
|
||||
int getDataBitPause() const {
|
||||
uint16_t getDataBitPause() const {
|
||||
const int pos = MESSAGE_BITS - 2 - messageBitIdx;
|
||||
const bool isHigh = data & (1 << pos);
|
||||
return isHigh ? HIGH_PAUSE_DURATION : LOW_PAUSE_DURATION;
|
||||
}
|
||||
|
||||
int getStopPause() const {
|
||||
uint32_t getStopPause() const {
|
||||
if (repeatMessage) {
|
||||
return getRepeatStopPause();
|
||||
} else {
|
||||
@@ -102,12 +102,12 @@ class LegoPfBitStreamEncoder {
|
||||
}
|
||||
}
|
||||
|
||||
int getRepeatStopPause() const {
|
||||
uint32_t getRepeatStopPause() const {
|
||||
if (repeatCount == 0 || repeatCount == 1) {
|
||||
return STOP_PAUSE_DURATION + 5 * MAX_MESSAGE_LENGTH - messageLength;
|
||||
return STOP_PAUSE_DURATION + (uint32_t)5 * MAX_MESSAGE_LENGTH - messageLength;
|
||||
} else if (repeatCount == 2 || repeatCount == 3) {
|
||||
return STOP_PAUSE_DURATION
|
||||
+ (6 + 2 * getChannelId()) * MAX_MESSAGE_LENGTH - messageLength;
|
||||
+ (uint32_t)(6 + 2 * getChannelId()) * MAX_MESSAGE_LENGTH - messageLength;
|
||||
} else {
|
||||
return STOP_PAUSE_DURATION;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/z3t0/Arduino-IRremote.git"
|
||||
},
|
||||
"version": "2.2.1",
|
||||
"version": "2.3.3",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "atmelavr",
|
||||
"authors" :
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name=IRremote
|
||||
version=2.2.1
|
||||
version=2.2.3
|
||||
author=shirriff
|
||||
maintainer=shirriff
|
||||
sentence=Send and receive infrared signals with multiple protocols
|
||||
|
||||
102
sam.cpp
Normal file
102
sam.cpp
Normal file
@@ -0,0 +1,102 @@
|
||||
// Support routines for SAM processor boards
|
||||
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
#if defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
||||
|
||||
// "Idiot check"
|
||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
||||
#error Must undef USE_DEFAULT_ENABLE_IR_IN
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// ATSAMD Timer setup & IRQ functions
|
||||
//
|
||||
|
||||
// following based on setup from GitHub jdneo/timerInterrupt.ino
|
||||
|
||||
static void setTimerFrequency(int frequencyHz)
|
||||
{
|
||||
int compareValue = (SYSCLOCK / (TIMER_PRESCALER_DIV * frequencyHz)) - 1;
|
||||
//Serial.println(compareValue);
|
||||
TcCount16* TC = (TcCount16*) TC3;
|
||||
// Make sure the count is in a proportional position to where it was
|
||||
// to prevent any jitter or disconnect when changing the compare value.
|
||||
TC->COUNT.reg = map(TC->COUNT.reg, 0, TC->CC[0].reg, 0, compareValue);
|
||||
TC->CC[0].reg = compareValue;
|
||||
//Serial.print("COUNT.reg ");
|
||||
//Serial.println(TC->COUNT.reg);
|
||||
//Serial.print("CC[0].reg ");
|
||||
//Serial.println(TC->CC[0].reg);
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1);
|
||||
}
|
||||
|
||||
static void startTimer()
|
||||
{
|
||||
REG_GCLK_CLKCTRL = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID_TCC2_TC3);
|
||||
while (GCLK->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
|
||||
TcCount16* TC = (TcCount16*) TC3;
|
||||
|
||||
TC->CTRLA.reg &= ~TC_CTRLA_ENABLE;
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
|
||||
// Use the 16-bit timer
|
||||
TC->CTRLA.reg |= TC_CTRLA_MODE_COUNT16;
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
|
||||
// Use match mode so that the timer counter resets when the count matches the compare register
|
||||
TC->CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ;
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
|
||||
// Set prescaler to 1024
|
||||
//TC->CTRLA.reg |= TC_CTRLA_PRESCALER_DIV1024;
|
||||
TC->CTRLA.reg |= TC_CTRLA_PRESCALER_DIV64;
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
|
||||
setTimerFrequency(1000000 / USECPERTICK);
|
||||
|
||||
// Enable the compare interrupt
|
||||
TC->INTENSET.reg = 0;
|
||||
TC->INTENSET.bit.MC0 = 1;
|
||||
|
||||
NVIC_EnableIRQ(TC3_IRQn);
|
||||
|
||||
TC->CTRLA.reg |= TC_CTRLA_ENABLE;
|
||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// initialization
|
||||
//
|
||||
|
||||
void IRrecv::enableIRIn()
|
||||
{
|
||||
// Interrupt Service Routine - Fires every 50uS
|
||||
//Serial.println("Starting timer");
|
||||
startTimer();
|
||||
//Serial.println("Started timer");
|
||||
|
||||
// Initialize state machine variables
|
||||
irparams.rcvstate = STATE_IDLE;
|
||||
irparams.rawlen = 0;
|
||||
|
||||
// Set pin modes
|
||||
pinMode(irparams.recvpin, INPUT);
|
||||
}
|
||||
|
||||
void irs(); // Defined in IRRemote as ISR(TIMER_INTR_NAME)
|
||||
|
||||
void TC3_Handler(void)
|
||||
{
|
||||
TcCount16* TC = (TcCount16*) TC3;
|
||||
// If this interrupt is due to the compare register matching the timer count
|
||||
// we toggle the LED.
|
||||
if (TC->INTFLAG.bit.MC0 == 1) {
|
||||
TC->INTFLAG.bit.MC0 = 1;
|
||||
irs();
|
||||
}
|
||||
}
|
||||
|
||||
#endif // defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
||||
Reference in New Issue
Block a user