Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Lilnija_29012017 NucleoF042K6_IRReceiver
Revision 3:17440cf7ab90, committed 2016-01-23
- Comitter:
- yuhki50
- Date:
- Sat Jan 23 15:09:34 2016 +0000
- Parent:
- 2:6bbd1e911324
- Child:
- 4:5e46ae042bc7
- Commit message:
- porting
Changed in this revision
--- a/IRremote.cpp Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremote.cpp Sat Jan 23 15:09:34 2016 +0000
@@ -18,8 +18,6 @@
// 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"
@@ -103,13 +101,11 @@
// As soon as first MARK arrives:
// Gap width is recorded; Ready is cleared; New logging starts
//
-ISR (TIMER_INTR_NAME)
+void IRrecv::timer_isr ()
{
- TIMER_RESET;
-
// Read if IR Receiver -> SPACE [xmt LED off] or a MARK [xmt LED on]
// digitalRead() is very slow. Optimisation is possible, but makes the code unportable
- uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
+ uint8_t irdata = _recvpin.read();
irparams.timer++; // One more 50uS tick
if (irparams.rawlen >= RAWBUF) irparams.rcvstate = STATE_OVERFLOW ; // Buffer overflow
@@ -164,13 +160,4 @@
irparams.rcvstate = STATE_STOP;
break;
}
-
- // If requested, flash LED while receiving IR data
- if (irparams.blinkflag) {
- if (irdata == MARK)
- if (irparams.blinkpin) digitalWrite(irparams.blinkpin, HIGH); // Turn user defined pin LED on
- else BLINKLED_ON() ; // if no user defined LED pin, turn default LED pin for the hardware on
- 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
- }
}
--- a/IRremote.h Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremote.h Sat Jan 23 15:09:34 2016 +0000
@@ -151,7 +151,7 @@
unsigned int address; // Used by Panasonic & Sharp [16-bits]
unsigned long value; // Decoded value [max 32-bits]
int bits; // Number of bits in decoded value
- volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks
+ unsigned int *rawbuf; // Raw intervals in 50uS ticks
int rawlen; // Number of records in rawbuf
int overflow; // true iff IR raw code too long
};
@@ -167,16 +167,15 @@
class IRrecv
{
public:
- IRrecv (int recvpin) ;
- IRrecv (int recvpin, int blinkpin);
-
- void blink13 (int blinkflag) ;
+ IRrecv (PinName recvpin) ;
int decode (decode_results *results) ;
void enableIRIn ( ) ;
+ void disableIRIn ( ) ;
bool isIdle ( ) ;
void resume ( ) ;
private:
+ void timer_isr ();
long decodeHash (decode_results *results) ;
int compare (unsigned int oldval, unsigned int newval) ;
@@ -243,6 +242,10 @@
# if DECODE_DENON
bool decodeDenon (decode_results *results) ;
# endif
+
+ DigitalIn _recvpin;
+ Ticker _ticker;
+ irparams_t irparams;
} ;
//------------------------------------------------------------------------------
@@ -251,7 +254,7 @@
class IRsend
{
public:
- IRsend () { }
+ IRsend (PinName sendpin) : _pwm(sendpin) { }
void custom_delay_usec (unsigned long uSecs);
void enableIROut (int khz) ;
@@ -327,6 +330,8 @@
# if SEND_PRONTO
void sendPronto (char* code, bool repeat, bool fallback) ;
# endif
+
+ PwmOut _pwm;
} ;
#endif
--- a/IRremoteInt.h Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremoteInt.h Sat Jan 23 15:09:34 2016 +0000
@@ -18,24 +18,9 @@
#define IRremoteint_h
//------------------------------------------------------------------------------
-// Include the right Arduino header
+// Include the right mbed header
//
-#if defined(ARDUINO) && (ARDUINO >= 100)
-# include <Arduino.h>
-#else
-# if !defined(IRPRONTO)
-# include <WProgram.h>
-# endif
-#endif
-
-//------------------------------------------------------------------------------
-// This handles definition and access to global variables
-//
-#ifdef IR_GLOBAL
-# define EXTERN
-#else
-# define EXTERN extern
-#endif
+#include "mbed.h"
//------------------------------------------------------------------------------
// Information for the Interrupt Service Routine
@@ -46,9 +31,6 @@
struct {
// The fields are ordered to reduce memory over caused by struct-padding
uint8_t rcvstate; // State Machine state
- uint8_t recvpin; // Pin connected to IR data from detector
- uint8_t blinkpin;
- uint8_t blinkflag; // true -> enable blinking of pin on IR processing
uint8_t rawlen; // counter of entries in rawbuf
unsigned int timer; // State timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; // raw data
@@ -63,56 +45,6 @@
#define STATE_STOP 5
#define STATE_OVERFLOW 6
-// Allow all parts of the code access to the ISR data
-// NB. The data can be changed by the ISR at any time, even mid-function
-// Therefore we declare it as "volatile" to stop the compiler/CPU caching it
-EXTERN volatile irparams_t irparams;
-
-//------------------------------------------------------------------------------
-// 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)
-
-#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
-
-//------------------------------------------------------------------------------
-// Defines for setting and clearing register bits
-//
-#ifndef cbi
-# define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
-#endif
-
-#ifndef sbi
-# define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
-#endif
-
//------------------------------------------------------------------------------
// Pulse parms are ((X*50)-100) for the Mark and ((X*50)+100) for the Space.
// First MARK is the one after the long gap
@@ -144,459 +76,4 @@
#define MARK 0
#define SPACE 1
-//------------------------------------------------------------------------------
-// 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.
-//
-
-// Arduino Mega
-#if 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__)
- #define IR_USE_TIMER_CMT // tx = pin 5
-
-// Teensy-LC
-#elif defined(__MKL26Z64__)
- #define IR_USE_TIMER_TPM1 // tx = pin 16
-
-// 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
-
-// Sanguino
-#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
- //#define IR_USE_TIMER1 // tx = pin 13
- #define IR_USE_TIMER2 // tx = pin 14
-
-// Atmega8
-#elif defined(__AVR_ATmega8P__) || 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
-
-// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
-#else
- //#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_ATmega644P__) || defined(__AVR_ATmega644__)
-# define TIMER_PWM_PIN 14 // Sanguino
-#else
-# define TIMER_PWM_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
-#endif
-
-//---------------------------------------------------------
-// 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_ATmega8P__) || defined(__AVR_ATmega8__)
-# 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_ATmega644P__) || defined(__AVR_ATmega644__)
-# define TIMER_PWM_PIN 13 // Sanguino
-#elif defined(__AVR_ATtiny84__)
-# define TIMER_PWM_PIN 6
-#else
-# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
-#endif
-
-//---------------------------------------------------------
-// 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__)
-# define TIMER_PWM_PIN 5 // Arduino Mega
-#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
-#define TIMER_ENABLE_PWM (TCCR4A |= _BV(COM4A1))
-#define TIMER_DISABLE_PWM (TCCR4A &= ~(_BV(COM4A1)))
-#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(__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 = 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)
-
-//-----------------
-#if (F_BUS == 48000000)
-# define CMT_PPS_VAL 5
-#else
-# define CMT_PPS_VAL 2
-#endif
-
-//-----------------
-#define TIMER_CONFIG_KHZ(val) ({ \
- SIM_SCGC4 |= SIM_SCGC4_CMT; \
- SIM_SOPT2 |= SIM_SOPT2_PTD7PAD; \
- CMT_PPS = CMT_PPS_VAL; \
- CMT_CGH1 = 2667 / val; \
- CMT_CGL1 = 5333 / 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_VAL; \
- CMT_CGH1 = 1; \
- CMT_CGL1 = 1; \
- CMT_CMD1 = 0; \
- CMT_CMD2 = 30 \
- CMT_CMD3 = 0; \
- CMT_CMD4 = 19; \
- 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 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 */
-
-//---------------------------------------------------------
-// Unknown Timer
-//
-#else
-# error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
-#endif
-#endif
--- a/irRecv.cpp Sat Jan 23 15:36:14 2016 +0900
+++ b/irRecv.cpp Sat Jan 23 15:09:34 2016 +0000
@@ -91,56 +91,30 @@
}
//+=============================================================================
-IRrecv::IRrecv (int recvpin)
+IRrecv::IRrecv (PinName recvpin) : _recvpin(recvpin)
{
- irparams.recvpin = recvpin;
- irparams.blinkflag = 0;
+ _recvpin.mode(PullNone);
}
-IRrecv::IRrecv (int recvpin, int blinkpin)
-{
- irparams.recvpin = recvpin;
- irparams.blinkpin = blinkpin;
- pinMode(blinkpin, OUTPUT);
- irparams.blinkflag = 0;
-}
-
-
-
//+=============================================================================
-// initialization
+// enable IR receive
//
void IRrecv::enableIRIn ( )
{
- cli();
- // Setup pulse clock timer interrupt
- // Prescale /8 (16M/8 = 0.5 microseconds per tick)
- // Therefore, the timer interval can range from 0.5 to 128 microseconds
- // Depending on the reset value (255 to 0)
- TIMER_CONFIG_NORMAL();
-
- // Timer2 Overflow Interrupt Enable
- TIMER_ENABLE_INTR;
-
- TIMER_RESET;
-
- sei(); // enable interrupts
+ _ticker.detach();
+ _ticker.attach_us(this, &IRrecv::timer_isr, USECPERTICK);
// Initialize state machine variables
irparams.rcvstate = STATE_IDLE;
irparams.rawlen = 0;
-
- // Set pin modes
- pinMode(irparams.recvpin, INPUT);
}
//+=============================================================================
-// Enable/disable blinking of pin 13 on IR processing
+// disable IR receive
//
-void IRrecv::blink13 (int blinkflag)
+void IRrecv::disableIRIn ( )
{
- irparams.blinkflag = blinkflag;
- if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
+ _ticker.detach();
}
//+=============================================================================
@@ -150,6 +124,7 @@
{
return (irparams.rcvstate == STATE_IDLE || irparams.rcvstate == STATE_STOP) ? true : false;
}
+
//+=============================================================================
// Restart the ISR state machine
//
--- a/irSend.cpp Sat Jan 23 15:36:14 2016 +0900
+++ b/irSend.cpp Sat Jan 23 15:09:34 2016 +0000
@@ -21,7 +21,7 @@
//
void IRsend::mark (unsigned int time)
{
- TIMER_ENABLE_PWM; // Enable pin 3 PWM output
+ _pwm.write(0.5); // Enable PWM output
if (time > 0) custom_delay_usec(time);
}
@@ -32,14 +32,10 @@
//
void IRsend::space (unsigned int time)
{
- TIMER_DISABLE_PWM; // Disable pin 3 PWM output
+ _pwm.write(0.0); // Disable PWM output
if (time > 0) IRsend::custom_delay_usec(time);
}
-
-
-
-
//+=============================================================================
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
// The IR output will be on pin 3 (OC2B).
@@ -54,18 +50,8 @@
//
void IRsend::enableIROut (int khz)
{
- // 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
-
- // COM2A = 00: disconnect OC2A
- // COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
- // WGM2 = 101: phase-correct PWM with OCRA as top
- // CS2 = 000: no prescaling
- // The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
- TIMER_CONFIG_KHZ(khz);
+ _pwm.write(0.0);
+ _pwm.period_us(1 / khz * 1000);
}
//+=============================================================================
@@ -73,15 +59,14 @@
void IRsend::custom_delay_usec(unsigned long uSecs) {
if (uSecs > 4) {
- unsigned long start = micros();
+ unsigned long start = us_ticker_read();
unsigned long endMicros = start + uSecs - 4;
if (endMicros < start) { // Check if overflow
- while ( micros() > start ) {} // wait until overflow
+ while ( us_ticker_read() > start ) {} // wait until overflow
}
- while ( micros() < endMicros ) {} // normal wait
+ while ( us_ticker_read() < endMicros ) {} // normal wait
}
//else {
// __asm__("nop\n\t"); // must have or compiler optimizes out
//}
}
-
--- a/ir_Sharp.cpp Sat Jan 23 15:36:14 2016 +0900 +++ b/ir_Sharp.cpp Sat Jan 23 15:09:34 2016 +0000 @@ -52,7 +52,7 @@ mark(SHARP_BIT_MARK); space(SHARP_ZERO_SPACE); - delay(40); + wait_ms(40); data = data ^ SHARP_TOGGLE_MASK; }