|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661 |
- //******************************************************************************
- // IRremote
- // Version 2.0.1 June, 2015
- // Copyright 2009 Ken Shirriff
- // For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
-
- // This file contains all board specific information. It was previously contained within
- // IRremoteInt.h
-
- // Modified by Paul Stoffregen <paul@pjrc.com> to support other boards and timers
- //
- // Interrupt code based on NECIRrcv by Joe Knapp
- // http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
- // Also influenced by http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
- //
- // JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
- // Whynter A/C ARC-110WD added by Francesco Meschia
-
- // Sparkfun Pro Micro support by Alastair McCormack
- //******************************************************************************
-
- #ifndef boarddefs_h
- #define boarddefs_h
-
- //------------------------------------------------------------------------------
- // Defines for blinking the LED
- //
-
- #if defined(CORE_LED0_PIN)
- # define BLINKLED CORE_LED0_PIN
- # define BLINKLED_ON() (digitalWrite(CORE_LED0_PIN, HIGH))
- # define BLINKLED_OFF() (digitalWrite(CORE_LED0_PIN, LOW))
-
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- # define BLINKLED 13
- # define BLINKLED_ON() (PORTB |= B10000000)
- # define BLINKLED_OFF() (PORTB &= B01111111)
-
- #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
- # define BLINKLED 0
- # define BLINKLED_ON() (PORTD |= B00000001)
- # define BLINKLED_OFF() (PORTD &= B11111110)
-
- // No system LED on ESP32, disable blinking
- #elif defined(ESP32)
- # define BLINKLED 255
- # define BLINKLED_ON() 1
- # define BLINKLED_OFF() 1
- #else
- # define BLINKLED 13
- # define BLINKLED_ON() (PORTB |= B00100000)
- # define BLINKLED_OFF() (PORTB &= B11011111)
- #endif
-
- //------------------------------------------------------------------------------
- // CPU Frequency
- //
- #ifdef F_CPU
- # define SYSCLOCK F_CPU // main Arduino clock
- #else
- # define SYSCLOCK 16000000 // main Arduino clock
- #endif
-
- // microseconds per clock interrupt tick
- #define USECPERTICK 50
-
- //------------------------------------------------------------------------------
- // Define which timer to use
- //
- // Uncomment the timer you wish to use on your board.
- // If you are using another library which uses timer2, you have options to
- // switch IRremote to use a different timer.
- //
-
- // Sparkfun Pro Micro
- #if defined(ARDUINO_AVR_PROMICRO)
- //#define IR_USE_TIMER1 // tx = pin 9
- #define IR_USE_TIMER3 // tx = pin 5
- //#define IR_USE_TIMER4_HS // tx = pin 5
-
- // Arduino Mega
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- //#define IR_USE_TIMER1 // tx = pin 11
- #define IR_USE_TIMER2 // tx = pin 9
- //#define IR_USE_TIMER3 // tx = pin 5
- //#define IR_USE_TIMER4 // tx = pin 6
- //#define IR_USE_TIMER5 // tx = pin 46
-
- // Teensy 1.0
- #elif defined(__AVR_AT90USB162__)
- #define IR_USE_TIMER1 // tx = pin 17
-
- // Teensy 2.0
- #elif defined(__AVR_ATmega32U4__)
- //#define IR_USE_TIMER1 // tx = pin 14
- //#define IR_USE_TIMER3 // tx = pin 9
- #define IR_USE_TIMER4_HS // tx = pin 10
-
- // Teensy 3.0 / Teensy 3.1
- #elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)
- #define IR_USE_TIMER_CMT // tx = pin 5
-
- // Teensy-LC
- #elif defined(__MKL26Z64__)
- #define IR_USE_TIMER_TPM1 // tx = pin 16
-
- // Teensy 4
- #elif defined(__IMXRT1062__)
- #define IR_USE_TIMER_FLEXPWM1 // tx = pin 8
-
- // Teensy++ 1.0 & 2.0
- #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
- //#define IR_USE_TIMER1 // tx = pin 25
- #define IR_USE_TIMER2 // tx = pin 1
- //#define IR_USE_TIMER3 // tx = pin 16
-
- // MightyCore - ATmega1284
- #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
- //#define IR_USE_TIMER1 // tx = pin 13
- #define IR_USE_TIMER2 // tx = pin 14
- //#define IR_USE_TIMER3 // tx = pin 6
-
- // MightyCore - ATmega164, ATmega324, ATmega644
- #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
- || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
- || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
- || defined(__AVR_ATmega164P__)
- //#define IR_USE_TIMER1 // tx = pin 13
- #define IR_USE_TIMER2 // tx = pin 14
-
- //MegaCore - ATmega64, ATmega128
- #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
- #define IR_USE_TIMER1 // tx = pin 13
-
- // MightyCore - ATmega8535, ATmega16, ATmega32
- #elif defined(__AVR_ATmega8535__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__)
- #define IR_USE_TIMER1 // tx = pin 13
-
- // Atmega8
- #elif defined(__AVR_ATmega8__)
- #define IR_USE_TIMER1 // tx = pin 9
-
- // ATtiny84
- #elif defined(__AVR_ATtiny84__)
- #define IR_USE_TIMER1 // tx = pin 6
-
- //ATtiny85
- #elif defined(__AVR_ATtiny85__)
- #define IR_USE_TIMER_TINY0 // tx = pin 1
-
- #elif defined(ESP32)
- #define IR_TIMER_USE_ESP32
- #else
- // Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
- // ATmega48, ATmega88, ATmega168, ATmega328
- //#define IR_USE_TIMER1 // tx = pin 9
- #define IR_USE_TIMER2 // tx = pin 3
-
- #endif
-
- //------------------------------------------------------------------------------
- // Defines for Timer
-
- //---------------------------------------------------------
- // Timer2 (8 bits)
- //
- #if defined(IR_USE_TIMER2)
-
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR2A |= _BV(COM2B1))
- #define TIMER_DISABLE_PWM (TCCR2A &= ~(_BV(COM2B1)))
- #define TIMER_ENABLE_INTR (TIMSK2 = _BV(OCIE2A))
- #define TIMER_DISABLE_INTR (TIMSK2 = 0)
- #define TIMER_INTR_NAME TIMER2_COMPA_vect
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint8_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR2A = _BV(WGM20); \
- TCCR2B = _BV(WGM22) | _BV(CS20); \
- OCR2A = pwmval; \
- OCR2B = pwmval / 3; \
- })
-
- #define TIMER_COUNT_TOP (SYSCLOCK * USECPERTICK / 1000000)
-
- //-----------------
- #if (TIMER_COUNT_TOP < 256)
- # define TIMER_CONFIG_NORMAL() ({ \
- TCCR2A = _BV(WGM21); \
- TCCR2B = _BV(CS20); \
- OCR2A = TIMER_COUNT_TOP; \
- TCNT2 = 0; \
- })
- #else
- # define TIMER_CONFIG_NORMAL() ({ \
- TCCR2A = _BV(WGM21); \
- TCCR2B = _BV(CS21); \
- OCR2A = TIMER_COUNT_TOP / 8; \
- TCNT2 = 0; \
- })
- #endif
-
- //-----------------
- #if defined(CORE_OC2B_PIN)
- # define TIMER_PWM_PIN CORE_OC2B_PIN // Teensy
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- # define TIMER_PWM_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
- #else
- # define TIMER_PWM_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
- #endif // ATmega48, ATmega88, ATmega168, ATmega328
-
- //---------------------------------------------------------
- // Timer1 (16 bits)
- //
- #elif defined(IR_USE_TIMER1)
-
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR1A |= _BV(COM1A1))
- #define TIMER_DISABLE_PWM (TCCR1A &= ~(_BV(COM1A1)))
-
- //-----------------
- #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega8535__) \
- || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
- || defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
- # define TIMER_ENABLE_INTR (TIMSK |= _BV(OCIE1A))
- # define TIMER_DISABLE_INTR (TIMSK &= ~_BV(OCIE1A))
- #else
- # define TIMER_ENABLE_INTR (TIMSK1 = _BV(OCIE1A))
- # define TIMER_DISABLE_INTR (TIMSK1 = 0)
- #endif
-
- //-----------------
- #define TIMER_INTR_NAME TIMER1_COMPA_vect
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR1A = _BV(WGM11); \
- TCCR1B = _BV(WGM13) | _BV(CS10); \
- ICR1 = pwmval; \
- OCR1A = pwmval / 3; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR1A = 0; \
- TCCR1B = _BV(WGM12) | _BV(CS10); \
- OCR1A = SYSCLOCK * USECPERTICK / 1000000; \
- TCNT1 = 0; \
- })
-
- //-----------------
- #if defined(CORE_OC1A_PIN)
- # define TIMER_PWM_PIN CORE_OC1A_PIN // Teensy
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- # define TIMER_PWM_PIN 11 // 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__) || defined(__AVR_ATmega32__) \
- || defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__) \
- || defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
- # define TIMER_PWM_PIN 13 // MightyCore, MegaCore
- #elif defined(__AVR_ATtiny84__)
- # define TIMER_PWM_PIN 6
- #else
- # define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, Sparkfun Pro Micro etc
- #endif // ATmega48, ATmega88, ATmega168, ATmega328
-
- //---------------------------------------------------------
- // Timer3 (16 bits)
- //
- #elif defined(IR_USE_TIMER3)
-
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR3A |= _BV(COM3A1))
- #define TIMER_DISABLE_PWM (TCCR3A &= ~(_BV(COM3A1)))
- #define TIMER_ENABLE_INTR (TIMSK3 = _BV(OCIE3A))
- #define TIMER_DISABLE_INTR (TIMSK3 = 0)
- #define TIMER_INTR_NAME TIMER3_COMPA_vect
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR3A = _BV(WGM31); \
- TCCR3B = _BV(WGM33) | _BV(CS30); \
- ICR3 = pwmval; \
- OCR3A = pwmval / 3; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR3A = 0; \
- TCCR3B = _BV(WGM32) | _BV(CS30); \
- OCR3A = SYSCLOCK * USECPERTICK / 1000000; \
- TCNT3 = 0; \
- })
-
- //-----------------
- #if defined(CORE_OC3A_PIN)
- # define TIMER_PWM_PIN CORE_OC3A_PIN // Teensy
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(ARDUINO_AVR_PROMICRO)
- # define TIMER_PWM_PIN 5 // Arduino Mega, Sparkfun Pro Micro
- #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
- # define TIMER_PWM_PIN 6 // MightyCore
- #else
- # error "Please add OC3A pin number here\n"
- #endif
-
- //---------------------------------------------------------
- // Timer4 (10 bits, high speed option)
- //
- #elif defined(IR_USE_TIMER4_HS)
-
- #define TIMER_RESET
-
- #if defined(ARDUINO_AVR_PROMICRO) // Sparkfun Pro Micro
- #define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A0)) // Use complimentary O̅C̅4̅A̅ output on pin 5
- #define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A0))) // (Pro Micro does not map PC7 (32/ICP3/CLK0/OC4A)
- // of ATmega32U4 )
- #else
- #define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A1))
- #define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A1)))
- #endif
-
- #define TIMER_ENABLE_INTR (TIMSK4 = _BV(TOIE4))
- #define TIMER_DISABLE_INTR (TIMSK4 = 0)
- #define TIMER_INTR_NAME TIMER4_OVF_vect
-
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR4A = (1<<PWM4A); \
- TCCR4B = _BV(CS40); \
- TCCR4C = 0; \
- TCCR4D = (1<<WGM40); \
- TCCR4E = 0; \
- TC4H = pwmval >> 8; \
- OCR4C = pwmval; \
- TC4H = (pwmval / 3) >> 8; \
- OCR4A = (pwmval / 3) & 255; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR4A = 0; \
- TCCR4B = _BV(CS40); \
- TCCR4C = 0; \
- TCCR4D = 0; \
- TCCR4E = 0; \
- TC4H = (SYSCLOCK * USECPERTICK / 1000000) >> 8; \
- OCR4C = (SYSCLOCK * USECPERTICK / 1000000) & 255; \
- TC4H = 0; \
- TCNT4 = 0; \
- })
-
- //-----------------
- #if defined(CORE_OC4A_PIN)
- # define TIMER_PWM_PIN CORE_OC4A_PIN // Teensy
- #elif defined(ARDUINO_AVR_PROMICRO)
- # define TIMER_PWM_PIN 5 // Sparkfun Pro Micro
- #elif defined(__AVR_ATmega32U4__)
- # define TIMER_PWM_PIN 13 // Leonardo
- #else
- # error "Please add OC4A pin number here\n"
- #endif
-
- //---------------------------------------------------------
- // Timer4 (16 bits)
- //
- #elif defined(IR_USE_TIMER4)
-
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A1))
- #define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A1)))
- #define TIMER_ENABLE_INTR (TIMSK4 = _BV(OCIE4A))
- #define TIMER_DISABLE_INTR (TIMSK4 = 0)
- #define TIMER_INTR_NAME TIMER4_COMPA_vect
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR4A = _BV(WGM41); \
- TCCR4B = _BV(WGM43) | _BV(CS40); \
- ICR4 = pwmval; \
- OCR4A = pwmval / 3; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR4A = 0; \
- TCCR4B = _BV(WGM42) | _BV(CS40); \
- OCR4A = SYSCLOCK * USECPERTICK / 1000000; \
- TCNT4 = 0; \
- })
-
- //-----------------
- #if defined(CORE_OC4A_PIN)
- # define TIMER_PWM_PIN CORE_OC4A_PIN
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- # define TIMER_PWM_PIN 6 // Arduino Mega
- #else
- # error "Please add OC4A pin number here\n"
- #endif
-
- //---------------------------------------------------------
- // Timer5 (16 bits)
- //
- #elif defined(IR_USE_TIMER5)
-
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR5A |= _BV(COM5A1))
- #define TIMER_DISABLE_PWM (TCCR5A &= ~(_BV(COM5A1)))
- #define TIMER_ENABLE_INTR (TIMSK5 = _BV(OCIE5A))
- #define TIMER_DISABLE_INTR (TIMSK5 = 0)
- #define TIMER_INTR_NAME TIMER5_COMPA_vect
-
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR5A = _BV(WGM51); \
- TCCR5B = _BV(WGM53) | _BV(CS50); \
- ICR5 = pwmval; \
- OCR5A = pwmval / 3; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR5A = 0; \
- TCCR5B = _BV(WGM52) | _BV(CS50); \
- OCR5A = SYSCLOCK * USECPERTICK / 1000000; \
- TCNT5 = 0; \
- })
-
- //-----------------
- #if defined(CORE_OC5A_PIN)
- # define TIMER_PWM_PIN CORE_OC5A_PIN
- #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- # define TIMER_PWM_PIN 46 // Arduino Mega
- #else
- # error "Please add OC5A pin number here\n"
- #endif
-
- //---------------------------------------------------------
- // Special carrier modulator timer
- //
- #elif defined(IR_USE_TIMER_CMT)
-
- #define TIMER_RESET ({ \
- uint8_t tmp __attribute__((unused)) = CMT_MSC; \
- CMT_CMD2 = 30; \
- })
-
- #define TIMER_ENABLE_PWM do { \
- CORE_PIN5_CONFIG = PORT_PCR_MUX(2) | PORT_PCR_DSE | PORT_PCR_SRE; \
- } while(0)
-
- #define TIMER_DISABLE_PWM do { \
- CORE_PIN5_CONFIG = PORT_PCR_MUX(1) | PORT_PCR_DSE | PORT_PCR_SRE; \
- } while(0)
-
- #define TIMER_ENABLE_INTR NVIC_ENABLE_IRQ(IRQ_CMT)
- #define TIMER_DISABLE_INTR NVIC_DISABLE_IRQ(IRQ_CMT)
- #define TIMER_INTR_NAME cmt_isr
-
- //-----------------
- #ifdef ISR
- # undef ISR
- #endif
- #define ISR(f) void f(void)
-
- //-----------------
- #define CMT_PPS_DIV ((F_BUS + 7999999) / 8000000)
- #if F_BUS < 8000000
- #error IRremote requires at least 8 MHz on Teensy 3.x
- #endif
-
- //-----------------
- #define TIMER_CONFIG_KHZ(val) ({ \
- SIM_SCGC4 |= SIM_SCGC4_CMT; \
- SIM_SOPT2 |= SIM_SOPT2_PTD7PAD; \
- CMT_PPS = CMT_PPS_DIV - 1; \
- CMT_CGH1 = ((F_BUS / CMT_PPS_DIV / 3000) + ((val)/2)) / (val); \
- CMT_CGL1 = ((F_BUS / CMT_PPS_DIV / 1500) + ((val)/2)) / (val); \
- CMT_CMD1 = 0; \
- CMT_CMD2 = 30; \
- CMT_CMD3 = 0; \
- CMT_CMD4 = 0; \
- CMT_OC = 0x60; \
- CMT_MSC = 0x01; \
- })
-
- #define TIMER_CONFIG_NORMAL() ({ \
- SIM_SCGC4 |= SIM_SCGC4_CMT; \
- CMT_PPS = CMT_PPS_DIV - 1; \
- CMT_CGH1 = 1; \
- CMT_CGL1 = 1; \
- CMT_CMD1 = 0; \
- CMT_CMD2 = 30; \
- CMT_CMD3 = 0; \
- CMT_CMD4 = (F_BUS / 160000 + CMT_PPS_DIV / 2) / CMT_PPS_DIV - 31; \
- CMT_OC = 0; \
- CMT_MSC = 0x03; \
- })
-
- #define TIMER_PWM_PIN 5
-
- // defines for TPM1 timer on Teensy-LC
- #elif defined(IR_USE_TIMER_TPM1)
- #define TIMER_RESET FTM1_SC |= FTM_SC_TOF;
- #define TIMER_ENABLE_PWM CORE_PIN16_CONFIG = PORT_PCR_MUX(3)|PORT_PCR_DSE|PORT_PCR_SRE
- #define TIMER_DISABLE_PWM CORE_PIN16_CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE
- #define TIMER_ENABLE_INTR NVIC_ENABLE_IRQ(IRQ_FTM1)
- #define TIMER_DISABLE_INTR NVIC_DISABLE_IRQ(IRQ_FTM1)
- #define TIMER_INTR_NAME ftm1_isr
- #ifdef ISR
- #undef ISR
- #endif
- #define ISR(f) void f(void)
- #define TIMER_CONFIG_KHZ(val) ({ \
- SIM_SCGC6 |= SIM_SCGC6_TPM1; \
- FTM1_SC = 0; \
- FTM1_CNT = 0; \
- FTM1_MOD = (F_PLL/2000) / val - 1; \
- FTM1_C0V = (F_PLL/6000) / val - 1; \
- FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0); \
- })
- #define TIMER_CONFIG_NORMAL() ({ \
- SIM_SCGC6 |= SIM_SCGC6_TPM1; \
- FTM1_SC = 0; \
- FTM1_CNT = 0; \
- FTM1_MOD = (F_PLL/40000) - 1; \
- FTM1_C0V = 0; \
- FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0) | FTM_SC_TOF | FTM_SC_TOIE; \
- })
- #define TIMER_PWM_PIN 16
-
- // defines for FlexPWM1 timer on Teensy 4
- #elif defined(IR_USE_TIMER_FLEXPWM1)
- #define TIMER_RESET FLEXPWM1_SM3STS = FLEXPWM_SMSTS_RF;
- #define TIMER_ENABLE_PWM FLEXPWM1_OUTEN |= FLEXPWM_OUTEN_PWMA_EN(8), \
- IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_00 = 6
- #define TIMER_DISABLE_PWM IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_00 = 5, \
- FLEXPWM1_OUTEN &= ~FLEXPWM_OUTEN_PWMA_EN(8)
- #define TIMER_ENABLE_INTR attachInterruptVector(IRQ_FLEXPWM1_3, pwm1_3_isr),\
- FLEXPWM1_SM3STS = FLEXPWM_SMSTS_RF, \
- FLEXPWM1_SM3INTEN = FLEXPWM_SMINTEN_RIE, \
- NVIC_ENABLE_IRQ(IRQ_FLEXPWM1_3)
- #define TIMER_DISABLE_INTR NVIC_DISABLE_IRQ(IRQ_FLEXPWM1_3)
- #define TIMER_INTR_NAME pwm1_3_isr
- #define TIMER_INT_DECLARE void pwm1_3_isr(void);
- #ifdef ISR
- #undef ISR
- #endif
- #define ISR(f) void f(void)
- #define TIMER_CONFIG_KHZ(val) ({ \
- uint32_t period = (float)F_BUS_ACTUAL / (float)((val) * 2000); \
- uint32_t prescale = 0; \
- while (period > 32767) { \
- period = period >> 1; \
- if (prescale < 7) prescale++; \
- } \
- FLEXPWM1_FCTRL0 |= FLEXPWM_FCTRL0_FLVL(8); \
- FLEXPWM1_FSTS0 = 0x0008; \
- FLEXPWM1_MCTRL |= FLEXPWM_MCTRL_CLDOK(8); \
- FLEXPWM1_SM3CTRL2 = FLEXPWM_SMCTRL2_INDEP; \
- FLEXPWM1_SM3CTRL = FLEXPWM_SMCTRL_HALF | FLEXPWM_SMCTRL_PRSC(prescale); \
- FLEXPWM1_SM3INIT = -period; \
- FLEXPWM1_SM3VAL0 = 0; \
- FLEXPWM1_SM3VAL1 = period; \
- FLEXPWM1_SM3VAL2 = -(period / 3); \
- FLEXPWM1_SM3VAL3 = period / 3; \
- FLEXPWM1_SM3VAL4 = 0; \
- FLEXPWM1_SM3VAL5 = 0; \
- FLEXPWM1_MCTRL |= FLEXPWM_MCTRL_LDOK(8) | FLEXPWM_MCTRL_RUN(8); \
- })
- #define TIMER_CONFIG_NORMAL() ({ \
- uint32_t period = (float)F_BUS_ACTUAL * (float)USECPERTICK * 0.0000005f; \
- uint32_t prescale = 0; \
- while (period > 32767) { \
- period = period >> 1; \
- if (prescale < 7) prescale++; \
- } \
- FLEXPWM1_FCTRL0 |= FLEXPWM_FCTRL0_FLVL(8); \
- FLEXPWM1_FSTS0 = 0x0008; \
- FLEXPWM1_MCTRL |= FLEXPWM_MCTRL_CLDOK(8); \
- FLEXPWM1_SM3CTRL2 = FLEXPWM_SMCTRL2_INDEP; \
- FLEXPWM1_SM3CTRL = FLEXPWM_SMCTRL_HALF | FLEXPWM_SMCTRL_PRSC(prescale); \
- FLEXPWM1_SM3INIT = -period; \
- FLEXPWM1_SM3VAL0 = 0; \
- FLEXPWM1_SM3VAL1 = period; \
- FLEXPWM1_SM3VAL2 = 0; \
- FLEXPWM1_SM3VAL3 = 0; \
- FLEXPWM1_SM3VAL4 = 0; \
- FLEXPWM1_SM3VAL5 = 0; \
- FLEXPWM1_MCTRL |= FLEXPWM_MCTRL_LDOK(8) | FLEXPWM_MCTRL_RUN(8); \
- })
- #define TIMER_PWM_PIN 7
-
- // defines for timer_tiny0 (8 bits)
- #elif defined(IR_USE_TIMER_TINY0)
- #define TIMER_RESET
- #define TIMER_ENABLE_PWM (TCCR0A |= _BV(COM0B1))
- #define TIMER_DISABLE_PWM (TCCR0A &= ~(_BV(COM0B1)))
- #define TIMER_ENABLE_INTR (TIMSK |= _BV(OCIE0A))
- #define TIMER_DISABLE_INTR (TIMSK &= ~(_BV(OCIE0A)))
- #define TIMER_INTR_NAME TIMER0_COMPA_vect
- #define TIMER_CONFIG_KHZ(val) ({ \
- const uint8_t pwmval = SYSCLOCK / 2000 / (val); \
- TCCR0A = _BV(WGM00); \
- TCCR0B = _BV(WGM02) | _BV(CS00); \
- OCR0A = pwmval; \
- OCR0B = pwmval / 3; \
- })
- #define TIMER_COUNT_TOP (SYSCLOCK * USECPERTICK / 1000000)
- #if (TIMER_COUNT_TOP < 256)
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR0A = _BV(WGM01); \
- TCCR0B = _BV(CS00); \
- OCR0A = TIMER_COUNT_TOP; \
- TCNT0 = 0; \
- })
- #else
- #define TIMER_CONFIG_NORMAL() ({ \
- TCCR0A = _BV(WGM01); \
- TCCR0B = _BV(CS01); \
- OCR0A = TIMER_COUNT_TOP / 8; \
- TCNT0 = 0; \
- })
- #endif
-
- #define TIMER_PWM_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
- #define TIMER_ENABLE_PWM
- #define TIMER_DISABLE_PWM Serial.println("IRsend not implemented for ESP32 yet");
- #define TIMER_ENABLE_INTR
- #define TIMER_DISABLE_INTR
- #define TIMER_INTR_NAME
-
- //---------------------------------------------------------
- // Unknown Timer
- //
- #else
- # error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
- #endif
-
- #endif // ! boarddefs_h
|