Merge branch 'master' of https://git.itsblue.de/dorian/speedclock
This commit is contained in:
commit
75a395349c
11 changed files with 955 additions and 0 deletions
33
Arduino_Libs/TimerOne-master/README.md
Normal file
33
Arduino_Libs/TimerOne-master/README.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#TimerOne Library#
|
||||||
|
|
||||||
|
Paul Stoffregen's modified TimerOne. This version provides 2 main benefits:
|
||||||
|
|
||||||
|
1: Optimized inline functions - much faster for the most common usage
|
||||||
|
2: Support for more boards (including ATTiny85 except for the PWM functionality)
|
||||||
|
|
||||||
|
http://www.pjrc.com/teensy/td_libs_TimerOne.html
|
||||||
|
|
||||||
|
https://github.com/PaulStoffregen/TimerOne
|
||||||
|
|
||||||
|
Original code
|
||||||
|
|
||||||
|
http://playground.arduino.cc/Code/Timer1
|
||||||
|
|
||||||
|
Open Source License
|
||||||
|
|
||||||
|
TimerOne is free software. You can redistribute it and/or modify it under
|
||||||
|
the terms of Creative Commons Attribution 3.0 United States License.
|
||||||
|
To view a copy of this license, visit
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/us/
|
||||||
|
|
||||||
|
Paul Stoffregen forked this version from an early copy of TimerOne/TimerThree
|
||||||
|
which was licensed "Creative Commons Attribution 3.0" and has maintained
|
||||||
|
the original "CC BY 3.0 US" license terms.
|
||||||
|
|
||||||
|
Other, separately developed updates to TimerOne have been released by other
|
||||||
|
authors under the GNU GPLv2 license. Multiple copies of this library, bearing
|
||||||
|
the same name but distributed under different license terms, is unfortunately
|
||||||
|
confusing. This copy, with nearly all the code redesigned as inline functions,
|
||||||
|
is provided under the "CC BY 3.0 US" license terms.
|
||||||
|
|
54
Arduino_Libs/TimerOne-master/TimerOne.cpp
Normal file
54
Arduino_Libs/TimerOne-master/TimerOne.cpp
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Interrupt and PWM utilities for 16 bit Timer1 on ATmega168/328
|
||||||
|
* Original code by Jesse Tane for http://labs.ideo.com August 2008
|
||||||
|
* Modified March 2009 by Jérôme Despatis and Jesse Tane for ATmega328 support
|
||||||
|
* Modified June 2009 by Michael Polli and Jesse Tane to fix a bug in setPeriod() which caused the timer to stop
|
||||||
|
* Modified Oct 2009 by Dan Clemens to work with timer1 of the ATMega1280 or Arduino Mega
|
||||||
|
* Modified April 2012 by Paul Stoffregen
|
||||||
|
* Modified again, June 2014 by Paul Stoffregen
|
||||||
|
* Modified July 2017 by Stoyko Dimitrov - added support for ATTiny85 except for the PWM functionality
|
||||||
|
*
|
||||||
|
* This is free software. You can redistribute it and/or modify it under
|
||||||
|
* the terms of Creative Commons Attribution 3.0 United States License.
|
||||||
|
* To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/
|
||||||
|
* or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "TimerOne.h"
|
||||||
|
|
||||||
|
TimerOne Timer1; // preinstatiate
|
||||||
|
|
||||||
|
unsigned short TimerOne::pwmPeriod = 0;
|
||||||
|
unsigned char TimerOne::clockSelectBits = 0;
|
||||||
|
void (*TimerOne::isrCallback)() = TimerOne::isrDefaultUnused;
|
||||||
|
|
||||||
|
// interrupt service routine that wraps a user defined function supplied by attachInterrupt
|
||||||
|
#if defined (__AVR_ATtiny85__)
|
||||||
|
ISR(TIMER1_COMPA_vect)
|
||||||
|
{
|
||||||
|
Timer1.isrCallback();
|
||||||
|
}
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
ISR(TIMER1_OVF_vect)
|
||||||
|
{
|
||||||
|
Timer1.isrCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__arm__) && defined(CORE_TEENSY)
|
||||||
|
void ftm1_isr(void)
|
||||||
|
{
|
||||||
|
uint32_t sc = FTM1_SC;
|
||||||
|
#ifdef KINETISL
|
||||||
|
if (sc & 0x80) FTM1_SC = sc;
|
||||||
|
#else
|
||||||
|
if (sc & 0x80) FTM1_SC = sc & 0x7F;
|
||||||
|
#endif
|
||||||
|
Timer1.isrCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void TimerOne::isrDefaultUnused()
|
||||||
|
{
|
||||||
|
}
|
493
Arduino_Libs/TimerOne-master/TimerOne.h
Normal file
493
Arduino_Libs/TimerOne-master/TimerOne.h
Normal file
|
@ -0,0 +1,493 @@
|
||||||
|
/*
|
||||||
|
* Interrupt and PWM utilities for 16 bit Timer1 on ATmega168/328
|
||||||
|
* Original code by Jesse Tane for http://labs.ideo.com August 2008
|
||||||
|
* Modified March 2009 by Jérôme Despatis and Jesse Tane for ATmega328 support
|
||||||
|
* Modified June 2009 by Michael Polli and Jesse Tane to fix a bug in setPeriod() which caused the timer to stop
|
||||||
|
* Modified April 2012 by Paul Stoffregen - portable to other AVR chips, use inline functions
|
||||||
|
* Modified again, June 2014 by Paul Stoffregen - support Teensy 3.x & even more AVR chips
|
||||||
|
* Modified July 2017 by Stoyko Dimitrov - added support for ATTiny85 except for the PWM functionality
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This is free software. You can redistribute it and/or modify it under
|
||||||
|
* the terms of Creative Commons Attribution 3.0 United States License.
|
||||||
|
* To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/
|
||||||
|
* or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TimerOne_h_
|
||||||
|
#define TimerOne_h_
|
||||||
|
|
||||||
|
#if defined(ARDUINO) && ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "config/known_16bit_timers.h"
|
||||||
|
#if defined (__AVR_ATtiny85__)
|
||||||
|
#define TIMER1_RESOLUTION 256UL // Timer1 is 8 bit
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
#define TIMER1_RESOLUTION 65536UL // Timer1 is 16 bit
|
||||||
|
#else
|
||||||
|
#define TIMER1_RESOLUTION 65536UL // assume 16 bits for non-AVR chips
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Placing nearly all the code in this .h file allows the functions to be
|
||||||
|
// inlined by the compiler. In the very common case with constant values
|
||||||
|
// the compiler will perform all calculations and simply write constants
|
||||||
|
// to the hardware registers (for example, setPeriod).
|
||||||
|
|
||||||
|
|
||||||
|
class TimerOne
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined (__AVR_ATtiny85__)
|
||||||
|
public:
|
||||||
|
//****************************
|
||||||
|
// Configuration
|
||||||
|
//****************************
|
||||||
|
void initialize(unsigned long microseconds=1000000) __attribute__((always_inline)) {
|
||||||
|
TCCR1 = _BV(CTC1); //clear timer1 when it matches the value in OCR1C
|
||||||
|
TIMSK |= _BV(OCIE1A); //enable interrupt when OCR1A matches the timer value
|
||||||
|
setPeriod(microseconds);
|
||||||
|
}
|
||||||
|
void setPeriod(unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
const unsigned long cycles = microseconds * ratio;
|
||||||
|
if (cycles < TIMER1_RESOLUTION) {
|
||||||
|
clockSelectBits = _BV(CS10);
|
||||||
|
pwmPeriod = cycles;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 2UL) {
|
||||||
|
clockSelectBits = _BV(CS11);
|
||||||
|
pwmPeriod = cycles / 2;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 4UL) {
|
||||||
|
clockSelectBits = _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 4;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 8UL) {
|
||||||
|
clockSelectBits = _BV(CS12);
|
||||||
|
pwmPeriod = cycles / 8;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 16UL) {
|
||||||
|
clockSelectBits = _BV(CS12) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 16;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 32UL) {
|
||||||
|
clockSelectBits = _BV(CS12) | _BV(CS11);
|
||||||
|
pwmPeriod = cycles / 32;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 64UL) {
|
||||||
|
clockSelectBits = _BV(CS12) | _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 64UL;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 128UL) {
|
||||||
|
clockSelectBits = _BV(CS13);
|
||||||
|
pwmPeriod = cycles / 128;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 256UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 256;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 512UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS11);
|
||||||
|
pwmPeriod = cycles / 512;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 1024UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 1024;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 2048UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS12);
|
||||||
|
pwmPeriod = cycles / 2048;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 4096UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS12) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 4096;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 8192UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS12) | _BV(CS11);
|
||||||
|
pwmPeriod = cycles / 8192;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 16384UL) {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS12) | _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 16384;
|
||||||
|
} else {
|
||||||
|
clockSelectBits = _BV(CS13) | _BV(CS12) | _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = TIMER1_RESOLUTION - 1;
|
||||||
|
}
|
||||||
|
OCR1A = pwmPeriod;
|
||||||
|
OCR1C = pwmPeriod;
|
||||||
|
TCCR1 = _BV(CTC1) | clockSelectBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Run Control
|
||||||
|
//****************************
|
||||||
|
void start() __attribute__((always_inline)) {
|
||||||
|
TCCR1 = 0;
|
||||||
|
TCNT1 = 0;
|
||||||
|
resume();
|
||||||
|
}
|
||||||
|
void stop() __attribute__((always_inline)) {
|
||||||
|
TCCR1 = _BV(CTC1);
|
||||||
|
}
|
||||||
|
void restart() __attribute__((always_inline)) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
void resume() __attribute__((always_inline)) {
|
||||||
|
TCCR1 = _BV(CTC1) | clockSelectBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// PWM outputs
|
||||||
|
//****************************
|
||||||
|
//Not implemented yet for ATTiny85
|
||||||
|
//TO DO
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Interrupt Function
|
||||||
|
//****************************
|
||||||
|
void attachInterrupt(void (*isr)()) __attribute__((always_inline)) {
|
||||||
|
isrCallback = isr;
|
||||||
|
TIMSK |= _BV(OCIE1A);
|
||||||
|
}
|
||||||
|
void attachInterrupt(void (*isr)(), unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
if(microseconds > 0) setPeriod(microseconds);
|
||||||
|
attachInterrupt(isr);
|
||||||
|
}
|
||||||
|
void detachInterrupt() __attribute__((always_inline)) {
|
||||||
|
//TIMSK = 0; // Timer 0 and Timer 1 both use TIMSK register so setting it to 0 will override settings for Timer1 as well
|
||||||
|
TIMSK &= ~_BV(OCIE1A);
|
||||||
|
}
|
||||||
|
static void (*isrCallback)();
|
||||||
|
static void isrDefaultUnused();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static unsigned short pwmPeriod;
|
||||||
|
static unsigned char clockSelectBits;
|
||||||
|
static const byte ratio = (F_CPU)/ ( 1000000 );
|
||||||
|
|
||||||
|
#elif defined(__AVR__)
|
||||||
|
public:
|
||||||
|
//****************************
|
||||||
|
// Configuration
|
||||||
|
//****************************
|
||||||
|
void initialize(unsigned long microseconds=1000000) __attribute__((always_inline)) {
|
||||||
|
TCCR1B = _BV(WGM13); // set mode as phase and frequency correct pwm, stop the timer
|
||||||
|
TCCR1A = 0; // clear control register A
|
||||||
|
setPeriod(microseconds);
|
||||||
|
}
|
||||||
|
void setPeriod(unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
const unsigned long cycles = (F_CPU / 2000000) * microseconds;
|
||||||
|
if (cycles < TIMER1_RESOLUTION) {
|
||||||
|
clockSelectBits = _BV(CS10);
|
||||||
|
pwmPeriod = cycles;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 8) {
|
||||||
|
clockSelectBits = _BV(CS11);
|
||||||
|
pwmPeriod = cycles / 8;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 64) {
|
||||||
|
clockSelectBits = _BV(CS11) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 64;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 256) {
|
||||||
|
clockSelectBits = _BV(CS12);
|
||||||
|
pwmPeriod = cycles / 256;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 1024) {
|
||||||
|
clockSelectBits = _BV(CS12) | _BV(CS10);
|
||||||
|
pwmPeriod = cycles / 1024;
|
||||||
|
} else {
|
||||||
|
clockSelectBits = _BV(CS12) | _BV(CS10);
|
||||||
|
pwmPeriod = TIMER1_RESOLUTION - 1;
|
||||||
|
}
|
||||||
|
ICR1 = pwmPeriod;
|
||||||
|
TCCR1B = _BV(WGM13) | clockSelectBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Run Control
|
||||||
|
//****************************
|
||||||
|
void start() __attribute__((always_inline)) {
|
||||||
|
TCCR1B = 0;
|
||||||
|
TCNT1 = 0; // TODO: does this cause an undesired interrupt?
|
||||||
|
resume();
|
||||||
|
}
|
||||||
|
void stop() __attribute__((always_inline)) {
|
||||||
|
TCCR1B = _BV(WGM13);
|
||||||
|
}
|
||||||
|
void restart() __attribute__((always_inline)) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
void resume() __attribute__((always_inline)) {
|
||||||
|
TCCR1B = _BV(WGM13) | clockSelectBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// PWM outputs
|
||||||
|
//****************************
|
||||||
|
void setPwmDuty(char pin, unsigned int duty) __attribute__((always_inline)) {
|
||||||
|
unsigned long dutyCycle = pwmPeriod;
|
||||||
|
dutyCycle *= duty;
|
||||||
|
dutyCycle >>= 10;
|
||||||
|
if (pin == TIMER1_A_PIN) OCR1A = dutyCycle;
|
||||||
|
#ifdef TIMER1_B_PIN
|
||||||
|
else if (pin == TIMER1_B_PIN) OCR1B = dutyCycle;
|
||||||
|
#endif
|
||||||
|
#ifdef TIMER1_C_PIN
|
||||||
|
else if (pin == TIMER1_C_PIN) OCR1C = dutyCycle;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void pwm(char pin, unsigned int duty) __attribute__((always_inline)) {
|
||||||
|
if (pin == TIMER1_A_PIN) { pinMode(TIMER1_A_PIN, OUTPUT); TCCR1A |= _BV(COM1A1); }
|
||||||
|
#ifdef TIMER1_B_PIN
|
||||||
|
else if (pin == TIMER1_B_PIN) { pinMode(TIMER1_B_PIN, OUTPUT); TCCR1A |= _BV(COM1B1); }
|
||||||
|
#endif
|
||||||
|
#ifdef TIMER1_C_PIN
|
||||||
|
else if (pin == TIMER1_C_PIN) { pinMode(TIMER1_C_PIN, OUTPUT); TCCR1A |= _BV(COM1C1); }
|
||||||
|
#endif
|
||||||
|
setPwmDuty(pin, duty);
|
||||||
|
TCCR1B = _BV(WGM13) | clockSelectBits;
|
||||||
|
}
|
||||||
|
void pwm(char pin, unsigned int duty, unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
if (microseconds > 0) setPeriod(microseconds);
|
||||||
|
pwm(pin, duty);
|
||||||
|
}
|
||||||
|
void disablePwm(char pin) __attribute__((always_inline)) {
|
||||||
|
if (pin == TIMER1_A_PIN) TCCR1A &= ~_BV(COM1A1);
|
||||||
|
#ifdef TIMER1_B_PIN
|
||||||
|
else if (pin == TIMER1_B_PIN) TCCR1A &= ~_BV(COM1B1);
|
||||||
|
#endif
|
||||||
|
#ifdef TIMER1_C_PIN
|
||||||
|
else if (pin == TIMER1_C_PIN) TCCR1A &= ~_BV(COM1C1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Interrupt Function
|
||||||
|
//****************************
|
||||||
|
void attachInterrupt(void (*isr)()) __attribute__((always_inline)) {
|
||||||
|
isrCallback = isr;
|
||||||
|
TIMSK1 = _BV(TOIE1);
|
||||||
|
}
|
||||||
|
void attachInterrupt(void (*isr)(), unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
if(microseconds > 0) setPeriod(microseconds);
|
||||||
|
attachInterrupt(isr);
|
||||||
|
}
|
||||||
|
void detachInterrupt() __attribute__((always_inline)) {
|
||||||
|
TIMSK1 = 0;
|
||||||
|
}
|
||||||
|
static void (*isrCallback)();
|
||||||
|
static void isrDefaultUnused();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// properties
|
||||||
|
static unsigned short pwmPeriod;
|
||||||
|
static unsigned char clockSelectBits;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined(__arm__) && defined(CORE_TEENSY)
|
||||||
|
|
||||||
|
#if defined(KINETISK)
|
||||||
|
#define F_TIMER F_BUS
|
||||||
|
#elif defined(KINETISL)
|
||||||
|
#define F_TIMER (F_PLL/2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Use only 15 bit resolution. From K66 reference manual, 45.5.7 page 1200:
|
||||||
|
// The CPWM pulse width (duty cycle) is determined by 2 x (CnV - CNTIN) and the
|
||||||
|
// period is determined by 2 x (MOD - CNTIN). See the following figure. MOD must be
|
||||||
|
// kept in the range of 0x0001 to 0x7FFF because values outside this range can produce
|
||||||
|
// ambiguous results.
|
||||||
|
#undef TIMER1_RESOLUTION
|
||||||
|
#define TIMER1_RESOLUTION 32768
|
||||||
|
|
||||||
|
public:
|
||||||
|
//****************************
|
||||||
|
// Configuration
|
||||||
|
//****************************
|
||||||
|
void initialize(unsigned long microseconds=1000000) __attribute__((always_inline)) {
|
||||||
|
setPeriod(microseconds);
|
||||||
|
}
|
||||||
|
void setPeriod(unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
const unsigned long cycles = (F_TIMER / 2000000) * microseconds;
|
||||||
|
// A much faster if-else
|
||||||
|
// This is like a binary serch tree and no more than 3 conditions are evaluated.
|
||||||
|
// I haven't checked if this becomes significantly longer ASM than the simple ladder.
|
||||||
|
// It looks very similar to the ladder tho: same # of if's and else's
|
||||||
|
|
||||||
|
/*
|
||||||
|
// This code does not work properly in all cases :(
|
||||||
|
// https://github.com/PaulStoffregen/TimerOne/issues/17
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 16) {
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 4) {
|
||||||
|
if (cycles < TIMER1_RESOLUTION) {
|
||||||
|
clockSelectBits = 0;
|
||||||
|
pwmPeriod = cycles;
|
||||||
|
}else{
|
||||||
|
clockSelectBits = 1;
|
||||||
|
pwmPeriod = cycles >> 1;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 8) {
|
||||||
|
clockSelectBits = 3;
|
||||||
|
pwmPeriod = cycles >> 3;
|
||||||
|
}else{
|
||||||
|
clockSelectBits = 4;
|
||||||
|
pwmPeriod = cycles >> 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if (cycles > TIMER1_RESOLUTION * 64) {
|
||||||
|
if (cycles > TIMER1_RESOLUTION * 128) {
|
||||||
|
clockSelectBits = 7;
|
||||||
|
pwmPeriod = TIMER1_RESOLUTION - 1;
|
||||||
|
}else{
|
||||||
|
clockSelectBits = 7;
|
||||||
|
pwmPeriod = cycles >> 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (cycles > TIMER1_RESOLUTION * 32) {
|
||||||
|
clockSelectBits = 6;
|
||||||
|
pwmPeriod = cycles >> 6;
|
||||||
|
}else{
|
||||||
|
clockSelectBits = 5;
|
||||||
|
pwmPeriod = cycles >> 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if (cycles < TIMER1_RESOLUTION) {
|
||||||
|
clockSelectBits = 0;
|
||||||
|
pwmPeriod = cycles;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 2) {
|
||||||
|
clockSelectBits = 1;
|
||||||
|
pwmPeriod = cycles >> 1;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 4) {
|
||||||
|
clockSelectBits = 2;
|
||||||
|
pwmPeriod = cycles >> 2;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 8) {
|
||||||
|
clockSelectBits = 3;
|
||||||
|
pwmPeriod = cycles >> 3;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 16) {
|
||||||
|
clockSelectBits = 4;
|
||||||
|
pwmPeriod = cycles >> 4;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 32) {
|
||||||
|
clockSelectBits = 5;
|
||||||
|
pwmPeriod = cycles >> 5;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 64) {
|
||||||
|
clockSelectBits = 6;
|
||||||
|
pwmPeriod = cycles >> 6;
|
||||||
|
} else
|
||||||
|
if (cycles < TIMER1_RESOLUTION * 128) {
|
||||||
|
clockSelectBits = 7;
|
||||||
|
pwmPeriod = cycles >> 7;
|
||||||
|
} else {
|
||||||
|
clockSelectBits = 7;
|
||||||
|
pwmPeriod = TIMER1_RESOLUTION - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sc = FTM1_SC;
|
||||||
|
FTM1_SC = 0;
|
||||||
|
FTM1_MOD = pwmPeriod;
|
||||||
|
FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_CPWMS | clockSelectBits | (sc & FTM_SC_TOIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Run Control
|
||||||
|
//****************************
|
||||||
|
void start() __attribute__((always_inline)) {
|
||||||
|
stop();
|
||||||
|
FTM1_CNT = 0;
|
||||||
|
resume();
|
||||||
|
}
|
||||||
|
void stop() __attribute__((always_inline)) {
|
||||||
|
FTM1_SC = FTM1_SC & (FTM_SC_TOIE | FTM_SC_CPWMS | FTM_SC_PS(7));
|
||||||
|
}
|
||||||
|
void restart() __attribute__((always_inline)) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
void resume() __attribute__((always_inline)) {
|
||||||
|
FTM1_SC = (FTM1_SC & (FTM_SC_TOIE | FTM_SC_PS(7))) | FTM_SC_CPWMS | FTM_SC_CLKS(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// PWM outputs
|
||||||
|
//****************************
|
||||||
|
void setPwmDuty(char pin, unsigned int duty) __attribute__((always_inline)) {
|
||||||
|
unsigned long dutyCycle = pwmPeriod;
|
||||||
|
dutyCycle *= duty;
|
||||||
|
dutyCycle >>= 10;
|
||||||
|
if (pin == TIMER1_A_PIN) {
|
||||||
|
FTM1_C0V = dutyCycle;
|
||||||
|
} else if (pin == TIMER1_B_PIN) {
|
||||||
|
FTM1_C1V = dutyCycle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void pwm(char pin, unsigned int duty) __attribute__((always_inline)) {
|
||||||
|
setPwmDuty(pin, duty);
|
||||||
|
if (pin == TIMER1_A_PIN) {
|
||||||
|
*portConfigRegister(TIMER1_A_PIN) = PORT_PCR_MUX(3) | PORT_PCR_DSE | PORT_PCR_SRE;
|
||||||
|
} else if (pin == TIMER1_B_PIN) {
|
||||||
|
*portConfigRegister(TIMER1_B_PIN) = PORT_PCR_MUX(3) | PORT_PCR_DSE | PORT_PCR_SRE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void pwm(char pin, unsigned int duty, unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
if (microseconds > 0) setPeriod(microseconds);
|
||||||
|
pwm(pin, duty);
|
||||||
|
}
|
||||||
|
void disablePwm(char pin) __attribute__((always_inline)) {
|
||||||
|
if (pin == TIMER1_A_PIN) {
|
||||||
|
*portConfigRegister(TIMER1_A_PIN) = 0;
|
||||||
|
} else if (pin == TIMER1_B_PIN) {
|
||||||
|
*portConfigRegister(TIMER1_B_PIN) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//****************************
|
||||||
|
// Interrupt Function
|
||||||
|
//****************************
|
||||||
|
void attachInterrupt(void (*isr)()) __attribute__((always_inline)) {
|
||||||
|
isrCallback = isr;
|
||||||
|
FTM1_SC |= FTM_SC_TOIE;
|
||||||
|
NVIC_ENABLE_IRQ(IRQ_FTM1);
|
||||||
|
}
|
||||||
|
void attachInterrupt(void (*isr)(), unsigned long microseconds) __attribute__((always_inline)) {
|
||||||
|
if(microseconds > 0) setPeriod(microseconds);
|
||||||
|
attachInterrupt(isr);
|
||||||
|
}
|
||||||
|
void detachInterrupt() __attribute__((always_inline)) {
|
||||||
|
FTM1_SC &= ~FTM_SC_TOIE;
|
||||||
|
NVIC_DISABLE_IRQ(IRQ_FTM1);
|
||||||
|
}
|
||||||
|
static void (*isrCallback)();
|
||||||
|
static void isrDefaultUnused();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// properties
|
||||||
|
static unsigned short pwmPeriod;
|
||||||
|
static unsigned char clockSelectBits;
|
||||||
|
|
||||||
|
#undef F_TIMER
|
||||||
|
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
extern TimerOne Timer1;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
161
Arduino_Libs/TimerOne-master/config/known_16bit_timers.h
Normal file
161
Arduino_Libs/TimerOne-master/config/known_16bit_timers.h
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
#ifndef known_16bit_timers_header_
|
||||||
|
#define known_16bit_timers_header_
|
||||||
|
|
||||||
|
// Wiring-S
|
||||||
|
//
|
||||||
|
#if defined(__AVR_ATmega644P__) && defined(WIRING)
|
||||||
|
#define TIMER1_A_PIN 5
|
||||||
|
#define TIMER1_B_PIN 4
|
||||||
|
#define TIMER1_ICP_PIN 6
|
||||||
|
|
||||||
|
// Teensy 2.0
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega32U4__) && defined(CORE_TEENSY)
|
||||||
|
#define TIMER1_A_PIN 14
|
||||||
|
#define TIMER1_B_PIN 15
|
||||||
|
#define TIMER1_C_PIN 4
|
||||||
|
#define TIMER1_ICP_PIN 22
|
||||||
|
#define TIMER1_CLK_PIN 11
|
||||||
|
#define TIMER3_A_PIN 9
|
||||||
|
#define TIMER3_ICP_PIN 10
|
||||||
|
|
||||||
|
// Teensy++ 2.0
|
||||||
|
#elif defined(__AVR_AT90USB1286__) && defined(CORE_TEENSY)
|
||||||
|
#define TIMER1_A_PIN 25
|
||||||
|
#define TIMER1_B_PIN 26
|
||||||
|
#define TIMER1_C_PIN 27
|
||||||
|
#define TIMER1_ICP_PIN 4
|
||||||
|
#define TIMER1_CLK_PIN 6
|
||||||
|
#define TIMER3_A_PIN 16
|
||||||
|
#define TIMER3_B_PIN 15
|
||||||
|
#define TIMER3_C_PIN 14
|
||||||
|
#define TIMER3_ICP_PIN 17
|
||||||
|
#define TIMER3_CLK_PIN 13
|
||||||
|
|
||||||
|
// Teensy 3.0
|
||||||
|
//
|
||||||
|
#elif defined(__MK20DX128__)
|
||||||
|
#define TIMER1_A_PIN 3
|
||||||
|
#define TIMER1_B_PIN 4
|
||||||
|
#define TIMER1_ICP_PIN 4
|
||||||
|
|
||||||
|
// Teensy 3.1 / Teensy 3.2
|
||||||
|
//
|
||||||
|
#elif defined(__MK20DX256__)
|
||||||
|
#define TIMER1_A_PIN 3
|
||||||
|
#define TIMER1_B_PIN 4
|
||||||
|
#define TIMER1_ICP_PIN 4
|
||||||
|
#define TIMER3_A_PIN 32
|
||||||
|
#define TIMER3_B_PIN 25
|
||||||
|
#define TIMER3_ICP_PIN 32
|
||||||
|
|
||||||
|
// Teensy 3.5 / Teensy 3.6
|
||||||
|
//
|
||||||
|
#elif defined(__MK64FX512__) || defined(__MK66FX1M0__)
|
||||||
|
#define TIMER1_A_PIN 3
|
||||||
|
#define TIMER1_B_PIN 4
|
||||||
|
#define TIMER1_ICP_PIN 4
|
||||||
|
#define TIMER3_A_PIN 29
|
||||||
|
#define TIMER3_B_PIN 30
|
||||||
|
#define TIMER3_ICP_PIN 29
|
||||||
|
|
||||||
|
// Teensy-LC
|
||||||
|
//
|
||||||
|
#elif defined(__MKL26Z64__)
|
||||||
|
#define TIMER1_A_PIN 16
|
||||||
|
#define TIMER1_B_PIN 17
|
||||||
|
#define TIMER1_ICP_PIN 17
|
||||||
|
#define TIMER3_A_PIN 3
|
||||||
|
#define TIMER3_B_PIN 4
|
||||||
|
#define TIMER3_ICP_PIN 4
|
||||||
|
|
||||||
|
// Arduino Mega
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
|
#define TIMER1_A_PIN 11
|
||||||
|
#define TIMER1_B_PIN 12
|
||||||
|
#define TIMER1_C_PIN 13
|
||||||
|
#define TIMER3_A_PIN 5
|
||||||
|
#define TIMER3_B_PIN 2
|
||||||
|
#define TIMER3_C_PIN 3
|
||||||
|
#define TIMER4_A_PIN 6
|
||||||
|
#define TIMER4_B_PIN 7
|
||||||
|
#define TIMER4_C_PIN 8
|
||||||
|
#define TIMER4_ICP_PIN 49
|
||||||
|
#define TIMER5_A_PIN 46
|
||||||
|
#define TIMER5_B_PIN 45
|
||||||
|
#define TIMER5_C_PIN 44
|
||||||
|
#define TIMER3_ICP_PIN 48
|
||||||
|
#define TIMER3_CLK_PIN 47
|
||||||
|
|
||||||
|
// Arduino Leonardo, Yun, etc
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega32U4__)
|
||||||
|
#define TIMER1_A_PIN 9
|
||||||
|
#define TIMER1_B_PIN 10
|
||||||
|
#define TIMER1_C_PIN 11
|
||||||
|
#define TIMER1_ICP_PIN 4
|
||||||
|
#define TIMER1_CLK_PIN 12
|
||||||
|
#define TIMER3_A_PIN 5
|
||||||
|
#define TIMER3_ICP_PIN 13
|
||||||
|
|
||||||
|
// Uno, Duemilanove, LilyPad, etc
|
||||||
|
//
|
||||||
|
#elif defined (__AVR_ATmega168__) || defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
|
||||||
|
#define TIMER1_A_PIN 9
|
||||||
|
#define TIMER1_B_PIN 10
|
||||||
|
#define TIMER1_ICP_PIN 8
|
||||||
|
#define TIMER1_CLK_PIN 5
|
||||||
|
|
||||||
|
// attiny167
|
||||||
|
//
|
||||||
|
#elif defined (__AVR_ATtiny167__)
|
||||||
|
#define TIMER1_A_PIN 14
|
||||||
|
#define TIMER1_B_PIN 11
|
||||||
|
//#define TIMER1_ICP_PIN 8
|
||||||
|
//#define TIMER1_CLK_PIN 5
|
||||||
|
|
||||||
|
// Sanguino
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||||
|
#define TIMER1_A_PIN 13
|
||||||
|
#define TIMER1_B_PIN 12
|
||||||
|
#define TIMER1_ICP_PIN 14
|
||||||
|
#define TIMER1_CLK_PIN 1
|
||||||
|
|
||||||
|
// Wildfire - Wicked Devices
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega1284P__) && defined(WILDFIRE_VERSION) && WILDFIRE_VERSION >= 3
|
||||||
|
#define TIMER1_A_PIN 5 // PD5
|
||||||
|
#define TIMER1_B_PIN 8 // PD4
|
||||||
|
#define TIMER1_ICP_PIN 6 // PD6
|
||||||
|
#define TIMER1_CLK_PIN 23 // PB1
|
||||||
|
#define TIMER3_A_PIN 12 // PB6
|
||||||
|
#define TIMER3_B_PIN 13 // PB7
|
||||||
|
#define TIMER3_ICP_PIN 9 // PB5
|
||||||
|
#define TIMER3_CLK_PIN 0 // PD0
|
||||||
|
#elif defined(__AVR_ATmega1284P__) && defined(WILDFIRE_VERSION) && WILDFIRE_VERSION < 3
|
||||||
|
#define TIMER1_A_PIN 5 // PD5
|
||||||
|
#define TIMER1_B_PIN 4 // PD4
|
||||||
|
#define TIMER1_ICP_PIN 6 // PD6
|
||||||
|
#define TIMER1_CLK_PIN 15 // PB1
|
||||||
|
#define TIMER3_A_PIN 12 // PB6
|
||||||
|
#define TIMER3_B_PIN 13 // PB7
|
||||||
|
#define TIMER3_ICP_PIN 11 // PB5
|
||||||
|
#define TIMER3_CLK_PIN 0 // PD0
|
||||||
|
|
||||||
|
// Mighty-1284 - Maniacbug
|
||||||
|
//
|
||||||
|
#elif defined(__AVR_ATmega1284P__)
|
||||||
|
#define TIMER1_A_PIN 12 // PD5
|
||||||
|
#define TIMER1_B_PIN 13 // PD4
|
||||||
|
#define TIMER1_ICP_PIN 14 // PD6
|
||||||
|
#define TIMER1_CLK_PIN 1 // PB1
|
||||||
|
#define TIMER3_A_PIN 6 // PB6
|
||||||
|
#define TIMER3_B_PIN 7 // PB7
|
||||||
|
#define TIMER3_ICP_PIN 5 // PB5
|
||||||
|
#define TIMER3_CLK_PIN 8 // PD0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
64
Arduino_Libs/TimerOne-master/docs/issue_template.md
Normal file
64
Arduino_Libs/TimerOne-master/docs/issue_template.md
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
Please use this form only to report code defects or bugs.
|
||||||
|
|
||||||
|
For any question, even questions directly pertaining to this code, post your question on the forums related to the board you are using.
|
||||||
|
|
||||||
|
Arduino: forum.arduino.cc
|
||||||
|
Teensy: forum.pjrc.com
|
||||||
|
ESP8266: www.esp8266.com
|
||||||
|
ESP32: www.esp32.com
|
||||||
|
Adafruit Feather/Metro/Trinket: forums.adafruit.com
|
||||||
|
Particle Photon: community.particle.io
|
||||||
|
|
||||||
|
If you are experiencing trouble but not certain of the cause, or need help using this code, ask on the appropriate forum. This is not the place to ask for support or help, even directly related to this code. Only use this form you are certain you have discovered a defect in this code!
|
||||||
|
|
||||||
|
Please verify the problem occurs when using the very latest version, using the newest version of Arduino and any other related software.
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------- Remove above -----------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Description
|
||||||
|
|
||||||
|
Describe your problem.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Steps To Reproduce Problem
|
||||||
|
|
||||||
|
Please give detailed instructions needed for anyone to attempt to reproduce the problem.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Hardware & Software
|
||||||
|
|
||||||
|
Board
|
||||||
|
Shields / modules used
|
||||||
|
Arduino IDE version
|
||||||
|
Teensyduino version (if using Teensy)
|
||||||
|
Version info & package name (from Tools > Boards > Board Manager)
|
||||||
|
Operating system & version
|
||||||
|
Any other software or hardware?
|
||||||
|
|
||||||
|
|
||||||
|
### Arduino Sketch
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// Change the code below by your sketch (please try to give the smallest code which demonstrates the problem)
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
// libraries: give links/details so anyone can compile your code for the same result
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Errors or Incorrect Output
|
||||||
|
|
||||||
|
If you see any errors or incorrect output, please show it here. Please use copy & paste to give an exact copy of the message. Details matter, so please show (not merely describe) the actual message or error exactly as it appears.
|
||||||
|
|
||||||
|
|
19
Arduino_Libs/TimerOne-master/examples/ATTiny85/ATTiny85.ino
Normal file
19
Arduino_Libs/TimerOne-master/examples/ATTiny85/ATTiny85.ino
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#include <TimerOne.h>
|
||||||
|
#define ledPin 4
|
||||||
|
int ledState = LOW;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(ledPin, OUTPUT);
|
||||||
|
Timer1.initialize(500000); //The led will blink in a half second time interval
|
||||||
|
Timer1.attachInterrupt(blinkLed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void blinkLed(){
|
||||||
|
ledState = !ledState;
|
||||||
|
digitalWrite(ledPin, ledState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
37
Arduino_Libs/TimerOne-master/examples/FanSpeed/FanSpeed.pde
Normal file
37
Arduino_Libs/TimerOne-master/examples/FanSpeed/FanSpeed.pde
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#include <TimerOne.h>
|
||||||
|
|
||||||
|
// This example creates a PWM signal with 25 kHz carrier.
|
||||||
|
//
|
||||||
|
// Arduino's analogWrite() gives you PWM output, but no control over the
|
||||||
|
// carrier frequency. The default frequency is low, typically 490 or
|
||||||
|
// 3920 Hz. Sometimes you may need a faster carrier frequency.
|
||||||
|
//
|
||||||
|
// The specification for 4-wire PWM fans recommends a 25 kHz frequency
|
||||||
|
// and allows 21 to 28 kHz. The default from analogWrite() might work
|
||||||
|
// with some fans, but to follow the specification we need 25 kHz.
|
||||||
|
//
|
||||||
|
// http://www.formfactors.org/developer/specs/REV1_2_Public.pdf
|
||||||
|
//
|
||||||
|
// Connect the PWM pin to the fan's control wire (usually blue). The
|
||||||
|
// board's ground must be connected to the fan's ground, and the fan
|
||||||
|
// needs +12 volt power from the computer or a separate power supply.
|
||||||
|
|
||||||
|
const int fanPin = 4;
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
Timer1.initialize(40); // 40 us = 25 kHz
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
// slowly increase the PWM fan speed
|
||||||
|
//
|
||||||
|
for (float dutyCycle = 30.0; dutyCycle < 100.0; dutyCycle++) {
|
||||||
|
Serial.print("PWM Fan, Duty Cycle = ");
|
||||||
|
Serial.println(dutyCycle);
|
||||||
|
Timer1.pwm(fanPin, (dutyCycle / 100) * 1023);
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include <TimerOne.h>
|
||||||
|
|
||||||
|
// This example uses the timer interrupt to blink an LED
|
||||||
|
// and also demonstrates how to share a variable between
|
||||||
|
// the interrupt and the main program.
|
||||||
|
|
||||||
|
|
||||||
|
const int led = LED_BUILTIN; // the pin with a LED
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
pinMode(led, OUTPUT);
|
||||||
|
Timer1.initialize(150000);
|
||||||
|
Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.15 seconds
|
||||||
|
Serial.begin(9600);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The interrupt will blink the LED, and keep
|
||||||
|
// track of how many times it has blinked.
|
||||||
|
int ledState = LOW;
|
||||||
|
volatile unsigned long blinkCount = 0; // use volatile for shared variables
|
||||||
|
|
||||||
|
void blinkLED(void)
|
||||||
|
{
|
||||||
|
if (ledState == LOW) {
|
||||||
|
ledState = HIGH;
|
||||||
|
blinkCount = blinkCount + 1; // increase when LED turns on
|
||||||
|
} else {
|
||||||
|
ledState = LOW;
|
||||||
|
}
|
||||||
|
digitalWrite(led, ledState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The main program will print the blink count
|
||||||
|
// to the Arduino Serial Monitor
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
unsigned long blinkCopy; // holds a copy of the blinkCount
|
||||||
|
|
||||||
|
// to read a variable which the interrupt code writes, we
|
||||||
|
// must temporarily disable interrupts, to be sure it will
|
||||||
|
// not change while we are reading. To minimize the time
|
||||||
|
// with interrupts off, just quickly make a copy, and then
|
||||||
|
// use the copy while allowing the interrupt to keep working.
|
||||||
|
noInterrupts();
|
||||||
|
blinkCopy = blinkCount;
|
||||||
|
interrupts();
|
||||||
|
|
||||||
|
Serial.print("blinkCount = ");
|
||||||
|
Serial.println(blinkCopy);
|
||||||
|
delay(100);
|
||||||
|
}
|
14
Arduino_Libs/TimerOne-master/keywords.txt
Normal file
14
Arduino_Libs/TimerOne-master/keywords.txt
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
Timer1 KEYWORD2
|
||||||
|
TimerOne KEYWORD1
|
||||||
|
initialize KEYWORD2
|
||||||
|
start KEYWORD2
|
||||||
|
stop KEYWORD2
|
||||||
|
restart KEYWORD2
|
||||||
|
resume KEYWORD2
|
||||||
|
pwm KEYWORD2
|
||||||
|
disablePwm KEYWORD2
|
||||||
|
attachInterrupt KEYWORD2
|
||||||
|
detachInterrupt KEYWORD2
|
||||||
|
setPeriod KEYWORD2
|
||||||
|
setPwmDuty KEYWORD2
|
||||||
|
isrCallback KEYWORD2
|
16
Arduino_Libs/TimerOne-master/library.json
Normal file
16
Arduino_Libs/TimerOne-master/library.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "TimerOne",
|
||||||
|
"keywords": "timer",
|
||||||
|
"description": "Allow to use the built-in Timer1",
|
||||||
|
"repository":
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/PaulStoffregen/TimerOne.git"
|
||||||
|
},
|
||||||
|
"frameworks": "arduino",
|
||||||
|
"platforms":
|
||||||
|
[
|
||||||
|
"atmelavr",
|
||||||
|
"teensy"
|
||||||
|
]
|
||||||
|
}
|
10
Arduino_Libs/TimerOne-master/library.properties
Normal file
10
Arduino_Libs/TimerOne-master/library.properties
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
name=TimerOne
|
||||||
|
version=1.1
|
||||||
|
author=Stoyko Dimitrov, Jesse Tane, Jérôme Despatis, Michael Polli, Dan Clemens, Paul Stoffregen
|
||||||
|
maintainer=Paul Stoffregen
|
||||||
|
sentence=Use hardware Timer1 for finer PWM control and/or running an periodic interrupt function
|
||||||
|
paragraph=
|
||||||
|
category=Timing
|
||||||
|
url=http://playground.arduino.cc/Code/Timer1
|
||||||
|
architectures=avr
|
||||||
|
|
Reference in a new issue