Skip to content
This repository was archived by the owner on Jan 29, 2023. It is now read-only.

Commit 8038b88

Browse files
authored
v1.9.0 to add more Timers to SAMD21
### Releases v1.9.0 1. Add TC4, TC5, TCC1 and TCC2 Timers to SAMD21 2. Add example [SAMD21_MultiTimers](examples/SAMD21_MultiTimers) to demo the how to use all 6 SAMD21 timers simultaneously. 3. Add functions `attachInterruptInterval_MS()` and `setInterval_MS()` 4. Rewrite examples to take advantage of new functions and timers
1 parent 73f17d1 commit 8038b88

File tree

25 files changed

+802
-306
lines changed

25 files changed

+802
-306
lines changed

changelog.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
## Table of Contents
1313

1414
* [Changelog](#changelog)
15+
* [Releases v1.9.0](#releases-v190)
1516
* [Releases v1.8.0](#releases-v180)
1617
* [Releases v1.7.0](#releases-v170)
1718
* [Releases v1.6.0](#releases-v160)
@@ -30,6 +31,13 @@
3031

3132
## Changelog
3233

34+
### Releases v1.9.0
35+
36+
1. Add TC4, TC5, TCC1 and TCC2 Timers to SAMD21
37+
2. Add example [SAMD21_MultiTimers](examples/SAMD21_MultiTimers) to demo the how to use all 6 SAMD21 timers simultaneously.
38+
3. Add functions `attachInterruptInterval_MS()` and `setInterval_MS()`
39+
4. Rewrite examples to take advantage of new functions and timers
40+
3341
### Releases v1.8.0
3442

3543
1. Fix bug introduced in v1.7.0 to SAMD21 TC3. Check [Do I have a brick? I'm unable to upload sketches after using this library! #21](https://github.com/khoih-prog/SAMD_TimerInterrupt/discussions/21)

examples/Argument_None/Argument_None.ino

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@
6262

6363
volatile uint32_t preMillisTimer0 = 0;
6464

65-
// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
66-
// SAMD21 Hardware Timer from TC3 or TCC
65+
// Depending on the board, you can select SAMD21 Hardware Timer from TC3, TC4, TC5, TCC, TCC1 or TCC2
6766
// SAMD51 Hardware Timer only TC3
6867

6968
// Init SAMD timer TIMER_TC3
7069
SAMDTimer ITimer0(TIMER_TC3);
71-
70+
71+
//////////////////////////////////////////////
72+
7273
void TimerHandler0()
7374
{
7475
static bool toggle0 = false;
@@ -99,14 +100,22 @@ void TimerHandler0()
99100
toggle0 = !toggle0;
100101
}
101102

103+
//////////////////////////////////////////////
104+
102105
#if (TIMER_INTERRUPT_USING_SAMD21)
103106

104107
#define TIMER1_INTERVAL_MS 2000
105108

106109
volatile uint32_t preMillisTimer1 = 0;
107110

108111
// Init SAMD timer TIMER_TCC
112+
//SAMDTimer ITimer1(TIMER_TC4);
113+
//SAMDTimer ITimer1(TIMER_TC5);
109114
SAMDTimer ITimer1(TIMER_TCC);
115+
//SAMDTimer ITimer1(TIMER_TCC1);
116+
//SAMDTimer ITimer1(TIMER_TCC2);
117+
118+
//////////////////////////////////////////////
110119

111120
void TimerHandler1()
112121
{
@@ -139,21 +148,23 @@ void TimerHandler1()
139148
}
140149
#endif
141150

151+
//////////////////////////////////////////////
152+
142153
void setup()
143154
{
144155
pinMode(LED_BUILTIN, OUTPUT);
145156

146157
Serial.begin(115200);
147-
while (!Serial);
158+
while (!Serial && millis() < 5000);
148159

149160
delay(100);
150161

151162
Serial.print(F("\nStarting Argument_None on ")); Serial.println(BOARD_NAME);
152163
Serial.println(SAMD_TIMER_INTERRUPT_VERSION);
153164
Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz"));
154165

155-
// Interval in microsecs
156-
if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 1000, TimerHandler0))
166+
// Interval in millisecs
167+
if (ITimer0.attachInterruptInterval_MS(TIMER0_INTERVAL_MS, TimerHandler0))
157168
{
158169
preMillisTimer0 = millis();
159170
Serial.print(F("Starting ITimer0 OK, millis() = ")); Serial.println(preMillisTimer0);
@@ -162,8 +173,8 @@ void setup()
162173
Serial.println(F("Can't set ITimer0. Select another freq. or timer"));
163174

164175
#if (TIMER_INTERRUPT_USING_SAMD21)
165-
// Interval in microsecs
166-
if (ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS * 1000, TimerHandler1))
176+
// Interval in millisecs
177+
if (ITimer1.attachInterruptInterval_MS(TIMER1_INTERVAL_MS, TimerHandler1))
167178
{
168179
preMillisTimer1 = millis();
169180
Serial.print(F("Starting ITimer1 OK, millis() = ")); Serial.println(preMillisTimer1);
@@ -173,7 +184,8 @@ void setup()
173184
#endif
174185
}
175186

187+
//////////////////////////////////////////////
188+
176189
void loop()
177190
{
178-
179191
}

examples/Argument_None_uS/Argument_None_uS.ino

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,14 @@
6363

6464
volatile uint32_t preMillisTimer0 = 0;
6565

66-
// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
67-
// SAMD21 Hardware Timer from TC3 or TCC
66+
// Depending on the board, you can select SAMD21 Hardware Timer from TC3, TC4, TC5, TCC, TCC1 or TCC2
6867
// SAMD51 Hardware Timer only TC3
6968

7069
// Init SAMD timer TIMER_TC3
7170
SAMDTimer ITimer0(TIMER_TC3);
72-
71+
72+
//////////////////////////////////////////////
73+
7374
void TimerHandler0()
7475
{
7576
static bool toggle0 = false;
@@ -93,14 +94,22 @@ void TimerHandler0()
9394
toggle0 = !toggle0;
9495
}
9596

97+
//////////////////////////////////////////////
98+
9699
#if (TIMER_INTERRUPT_USING_SAMD21)
97100

98101
#define TIMER1_INTERVAL_MS 2000
99102

100103
volatile uint32_t preMillisTimer1 = 0;
101104

102105
// Init SAMD timer TIMER_TCC
106+
//SAMDTimer ITimer1(TIMER_TC4);
107+
//SAMDTimer ITimer1(TIMER_TC5);
103108
SAMDTimer ITimer1(TIMER_TCC);
109+
//SAMDTimer ITimer1(TIMER_TCC1);
110+
//SAMDTimer ITimer1(TIMER_TCC2);
111+
112+
//////////////////////////////////////////////
104113

105114
void TimerHandler1()
106115
{
@@ -126,22 +135,24 @@ void TimerHandler1()
126135
}
127136
#endif
128137

138+
//////////////////////////////////////////////
139+
129140
void setup()
130141
{
131142
pinMode(LED_BUILTIN, OUTPUT);
132143
pinMode(LED_BLUE, OUTPUT);
133144

134145
Serial.begin(115200);
135-
while (!Serial);
146+
while (!Serial && millis() < 5000);
136147

137148
delay(100);
138149

139150
Serial.print(F("\nStarting Argument_None_uS on ")); Serial.println(BOARD_NAME);
140151
Serial.println(SAMD_TIMER_INTERRUPT_VERSION);
141152
Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz"));
142153

143-
// Interval in microsecs
144-
//if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_MS * 1000, TimerHandler0))
154+
// Interval in millisecs
155+
//if (ITimer0.attachInterruptInterval_MS(TIMER0_INTERVAL_MS, TimerHandler0))
145156
if (ITimer0.attachInterruptInterval(TIMER0_INTERVAL_US, TimerHandler0))
146157
{
147158
preMillisTimer0 = millis();
@@ -151,8 +162,8 @@ void setup()
151162
Serial.println(F("Can't set ITimer0. Select another freq. or timer"));
152163

153164
#if (TIMER_INTERRUPT_USING_SAMD21)
154-
// Interval in microsecs
155-
if (ITimer1.attachInterruptInterval(TIMER1_INTERVAL_MS * 1000, TimerHandler1))
165+
// Interval in millisecs
166+
if (ITimer1.attachInterruptInterval_MS(TIMER1_INTERVAL_MS, TimerHandler1))
156167
{
157168
preMillisTimer1 = millis();
158169
Serial.print(F("Starting ITimer1 OK, millis() = ")); Serial.println(preMillisTimer1);
@@ -162,7 +173,8 @@ void setup()
162173
#endif
163174
}
164175

176+
//////////////////////////////////////////////
177+
165178
void loop()
166179
{
167-
168180
}

examples/Change_Interval/Change_Interval.ino

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,31 @@
5454

5555
volatile uint32_t TimerCount = 0;
5656

57-
// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
58-
// SAMD21 Hardware Timer from TC3 or TCC
57+
// Depending on the board, you can select SAMD21 Hardware Timer from TC3, TC4, TC5, TCC, TCC1 or TCC2
5958
// SAMD51 Hardware Timer only TC3
6059

6160
// Init SAMD timer TIMER_TC3
6261
SAMDTimer ITimer(TIMER_TC3);
6362

63+
#if (TIMER_INTERRUPT_USING_SAMD21)
64+
// Init SAMD timer TIMER_TCC
65+
//SAMDTimer ITimer(TIMER_TC4);
66+
//SAMDTimer ITimer(TIMER_TC5);
67+
//SAMDTimer ITimer(TIMER_TCC);
68+
//SAMDTimer ITimer(TIMER_TCC1);
69+
//SAMDTimer ITimer(TIMER_TCC2);
70+
#endif
71+
72+
//////////////////////////////////////////////
73+
6474
void printResult(uint32_t currTime)
6575
{
6676
Serial.print(F("Time = ")); Serial.print(currTime);
6777
Serial.print(F(", TimerCount = ")); Serial.println(TimerCount);
6878
}
6979

80+
//////////////////////////////////////////////
81+
7082
void TimerHandler()
7183
{
7284
static bool toggle = false;
@@ -79,31 +91,37 @@ void TimerHandler()
7991
toggle = !toggle;
8092
}
8193

94+
//////////////////////////////////////////////
95+
8296
void setup()
8397
{
8498
pinMode(LED_BUILTIN, OUTPUT);
8599

86100
Serial.begin(115200);
87-
while (!Serial);
101+
while (!Serial && millis() < 5000);
88102

89103
delay(100);
90104

91105
Serial.print(F("\nStarting Change_Interval on ")); Serial.println(BOARD_NAME);
92106
Serial.println(SAMD_TIMER_INTERRUPT_VERSION);
93107
Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz"));
94108

95-
// Interval in microsecs
96-
if (ITimer.attachInterruptInterval(TIMER_INTERVAL_MS * 1000, TimerHandler))
109+
// Interval in millisecs
110+
if (ITimer.attachInterruptInterval_MS(TIMER_INTERVAL_MS, TimerHandler))
97111
{
98112
Serial.print(F("Starting ITimer OK, millis() = ")); Serial.println(millis());
99113
}
100114
else
101115
Serial.println(F("Can't set ITimer. Select another freq. or timer"));
102116
}
103117

118+
//////////////////////////////////////////////
119+
104120
#define CHECK_INTERVAL_MS 10000L
105121
#define CHANGE_INTERVAL_MS 20000L
106122

123+
//////////////////////////////////////////////
124+
107125
void loop()
108126
{
109127
static uint32_t lastTime = 0;
@@ -123,7 +141,7 @@ void loop()
123141
//setInterval(unsigned long interval, timerCallback callback)
124142
multFactor = (multFactor + 1) % 2;
125143

126-
ITimer.setInterval(TIMER_INTERVAL_MS * 1000 * (multFactor + 1), TimerHandler);
144+
ITimer.setInterval_MS(TIMER_INTERVAL_MS * (multFactor + 1), TimerHandler);
127145

128146
Serial.print(F("Changing Interval, Timer = ")); Serial.println(TIMER_INTERVAL_MS * (multFactor + 1));
129147

examples/ISR_16_Timers_Array/ISR_16_Timers_Array.ino

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,19 @@ volatile uint32_t startMillis = 0;
8585

8686
// You can select SAMD Hardware Timer from SAMD_TIMER_1 or SAMD_TIMER_3
8787

88-
// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
89-
// SAMD21 Hardware Timer from TC3 or TCC
88+
// Depending on the board, you can select SAMD21 Hardware Timer from TC3, TC4, TC5, TCC, TCC1 or TCC2
9089
// SAMD51 Hardware Timer only TC3
9190

9291
// Init SAMD timer TIMER_TC3
9392
SAMDTimer ITimer(TIMER_TC3);
9493

9594
#if (TIMER_INTERRUPT_USING_SAMD21)
9695
// Init SAMD timer TIMER_TCC
96+
//SAMDTimer ITimer(TIMER_TC4);
97+
//SAMDTimer ITimer(TIMER_TC5);
9798
//SAMDTimer ITimer(TIMER_TCC);
99+
//SAMDTimer ITimer(TIMER_TCC1);
100+
//SAMDTimer ITimer(TIMER_TCC2);
98101
#endif
99102

100103
// Init SAMD_ISR_Timer
@@ -411,16 +414,16 @@ void simpleTimerDoingSomething2s()
411414
void setup()
412415
{
413416
Serial.begin(115200);
414-
while (!Serial);
417+
while (!Serial && millis() < 5000);
415418

416419
delay(100);
417420

418421
Serial.print(F("\nStarting ISR_16_Timers_Array on ")); Serial.println(BOARD_NAME);
419422
Serial.println(SAMD_TIMER_INTERRUPT_VERSION);
420423
Serial.print(F("CPU Frequency = ")); Serial.print(F_CPU / 1000000); Serial.println(F(" MHz"));
421424

422-
// Interval in microsecs
423-
if (ITimer.attachInterruptInterval(HW_TIMER_INTERVAL_MS * 1000, TimerHandler))
425+
// Interval in millisecs
426+
if (ITimer.attachInterruptInterval_MS(HW_TIMER_INTERVAL_MS, TimerHandler))
424427
{
425428
startMillis = millis();
426429
Serial.print(F("Starting ITimer OK, millis() = ")); Serial.println(startMillis);

examples/ISR_16_Timers_Array_Complex/ISR_16_Timers_Array_Complex.ino

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,19 @@ volatile uint32_t startMillis = 0;
7676

7777
// You can select SAMD Hardware Timer from SAMD_TIMER_1 or SAMD_TIMER_3
7878

79-
// Depending on the board, you can select SAMD21 Hardware Timer from TC3-TCC
80-
// SAMD21 Hardware Timer from TC3 or TCC
79+
// Depending on the board, you can select SAMD21 Hardware Timer from TC3, TC4, TC5, TCC, TCC1 or TCC2
8180
// SAMD51 Hardware Timer only TC3
8281

8382
// Init SAMD timer TIMER_TC3
8483
SAMDTimer ITimer(TIMER_TC3);
8584

8685
#if (TIMER_INTERRUPT_USING_SAMD21)
8786
// Init SAMD timer TIMER_TCC
87+
//SAMDTimer ITimer(TIMER_TC4);
88+
//SAMDTimer ITimer(TIMER_TC5);
8889
//SAMDTimer ITimer(TIMER_TCC);
90+
//SAMDTimer ITimer(TIMER_TCC1);
91+
//SAMDTimer ITimer(TIMER_TCC2);
8992
#endif
9093

9194
// Init SAMD_ISR_Timer
@@ -328,7 +331,7 @@ void setup()
328331
pinMode(LED_BUILTIN, OUTPUT);
329332

330333
Serial.begin(115200);
331-
while (!Serial);
334+
while (!Serial && millis() < 5000);
332335

333336
delay(100);
334337

0 commit comments

Comments
 (0)