@@ -28,15 +28,15 @@ Version Modified By Date Comments
28
28
09/11/25 Changed pin toggle method to XOR
29
29
09/11/25 Fixed timer0 from being excluded
30
30
0006 D Mellis 09/12/29 Replaced objects with functions
31
-
31
+ 0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register
32
32
*************************************************/
33
33
34
34
#include < avr/interrupt.h>
35
35
#include < avr/pgmspace.h>
36
36
#include " wiring.h"
37
37
#include " pins_arduino.h"
38
38
39
- #if defined(__AVR_ATmega8__)
39
+ #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
40
40
#define TCCR2A TCCR2
41
41
#define TCCR2B TCCR2
42
42
#define COM2A1 COM21
@@ -66,19 +66,26 @@ volatile long timer2_toggle_count;
66
66
volatile uint8_t *timer2_pin_port;
67
67
volatile uint8_t timer2_pin_mask;
68
68
69
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__ )
69
+ #if defined(TIMSK3 )
70
70
volatile long timer3_toggle_count;
71
71
volatile uint8_t *timer3_pin_port;
72
72
volatile uint8_t timer3_pin_mask;
73
+ #endif
74
+
75
+ #if defined(TIMSK4)
73
76
volatile long timer4_toggle_count;
74
77
volatile uint8_t *timer4_pin_port;
75
78
volatile uint8_t timer4_pin_mask;
79
+ #endif
80
+
81
+ #if defined(TIMSK5)
76
82
volatile long timer5_toggle_count;
77
83
volatile uint8_t *timer5_pin_port;
78
84
volatile uint8_t timer5_pin_mask;
79
85
#endif
80
86
81
87
88
+ // MLS: This does not make sense, the 3 options are the same
82
89
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
83
90
84
91
#define AVAILABLE_TONE_PINS 1
@@ -133,7 +140,7 @@ static int8_t toneBegin(uint8_t _pin)
133
140
// whereas 16 bit timers are set to either ck/1 or ck/64 prescalar
134
141
switch (_timer)
135
142
{
136
- #if ! defined(__AVR_ATmega8__ )
143
+ #if defined(TCCR0A) && defined(TCCR0B )
137
144
case 0 :
138
145
// 8 bit timer
139
146
TCCR0A = 0 ;
@@ -143,8 +150,9 @@ static int8_t toneBegin(uint8_t _pin)
143
150
timer0_pin_port = portOutputRegister (digitalPinToPort (_pin));
144
151
timer0_pin_mask = digitalPinToBitMask (_pin);
145
152
break ;
146
- #endif
153
+ #endif
147
154
155
+ #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12)
148
156
case 1 :
149
157
// 16 bit timer
150
158
TCCR1A = 0 ;
@@ -154,6 +162,9 @@ static int8_t toneBegin(uint8_t _pin)
154
162
timer1_pin_port = portOutputRegister (digitalPinToPort (_pin));
155
163
timer1_pin_mask = digitalPinToBitMask (_pin);
156
164
break ;
165
+ #endif
166
+
167
+ #if defined(TCCR2A) && defined(TCCR2B)
157
168
case 2 :
158
169
// 8 bit timer
159
170
TCCR2A = 0 ;
@@ -163,8 +174,9 @@ static int8_t toneBegin(uint8_t _pin)
163
174
timer2_pin_port = portOutputRegister (digitalPinToPort (_pin));
164
175
timer2_pin_mask = digitalPinToBitMask (_pin);
165
176
break ;
177
+ #endif
166
178
167
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__ )
179
+ #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3 )
168
180
case 3 :
169
181
// 16 bit timer
170
182
TCCR3A = 0 ;
@@ -174,15 +186,27 @@ static int8_t toneBegin(uint8_t _pin)
174
186
timer3_pin_port = portOutputRegister (digitalPinToPort (_pin));
175
187
timer3_pin_mask = digitalPinToBitMask (_pin);
176
188
break ;
189
+ #endif
190
+
191
+ #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4)
177
192
case 4 :
178
193
// 16 bit timer
179
194
TCCR4A = 0 ;
180
195
TCCR4B = 0 ;
181
- bitWrite (TCCR4B, WGM42, 1 );
196
+ #if defined(WGM42)
197
+ bitWrite (TCCR4B, WGM42, 1 );
198
+ #elif defined(CS43)
199
+ #warning this may not be correct
200
+ // atmega32u4
201
+ bitWrite (TCCR4B, CS43, 1 );
202
+ #endif
182
203
bitWrite (TCCR4B, CS40, 1 );
183
204
timer4_pin_port = portOutputRegister (digitalPinToPort (_pin));
184
205
timer4_pin_mask = digitalPinToBitMask (_pin);
185
206
break ;
207
+ #endif
208
+
209
+ #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5)
186
210
case 5 :
187
211
// 16 bit timer
188
212
TCCR5A = 0 ;
@@ -192,7 +216,7 @@ static int8_t toneBegin(uint8_t _pin)
192
216
timer5_pin_port = portOutputRegister (digitalPinToPort (_pin));
193
217
timer5_pin_mask = digitalPinToBitMask (_pin);
194
218
break ;
195
- #endif
219
+ #endif
196
220
}
197
221
}
198
222
@@ -258,12 +282,22 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
258
282
}
259
283
}
260
284
261
- #if ! defined(__AVR_ATmega8__ )
285
+ #if defined(TCCR0B )
262
286
if (_timer == 0 )
287
+ {
263
288
TCCR0B = prescalarbits;
289
+ }
264
290
else
265
291
#endif
292
+ #if defined(TCCR2B)
293
+ {
266
294
TCCR2B = prescalarbits;
295
+ }
296
+ #else
297
+ {
298
+ // dummy place holder to make the above ifdefs work
299
+ }
300
+ #endif
267
301
}
268
302
else
269
303
{
@@ -278,12 +312,20 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
278
312
}
279
313
280
314
if (_timer == 1 )
315
+ {
316
+ #if defined(TCCR1B)
281
317
TCCR1B = (TCCR1B & 0b11111000 ) | prescalarbits;
282
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
318
+ #endif
319
+ }
320
+ #if defined(TCCR3B)
283
321
else if (_timer == 3 )
284
322
TCCR3B = (TCCR3B & 0b11111000 ) | prescalarbits;
323
+ #endif
324
+ #if defined(TCCR4B)
285
325
else if (_timer == 4 )
286
326
TCCR4B = (TCCR4B & 0b11111000 ) | prescalarbits;
327
+ #endif
328
+ #if defined(TCCR5B)
287
329
else if (_timer == 5 )
288
330
TCCR5B = (TCCR5B & 0b11111000 ) | prescalarbits;
289
331
#endif
@@ -307,7 +349,7 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
307
349
switch (_timer)
308
350
{
309
351
310
- #if ! defined(__AVR_ATmega8__ )
352
+ #if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A )
311
353
case 0 :
312
354
OCR0A = ocr;
313
355
timer0_toggle_count = toggle_count;
@@ -316,27 +358,43 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
316
358
#endif
317
359
318
360
case 1 :
361
+ #if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A)
319
362
OCR1A = ocr;
320
363
timer1_toggle_count = toggle_count;
321
364
bitWrite (TIMSK1, OCIE1A, 1 );
365
+ #elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A)
366
+ // this combination is for at least the ATmega32
367
+ OCR1A = ocr;
368
+ timer1_toggle_count = toggle_count;
369
+ bitWrite (TIMSK, OCIE1A, 1 );
370
+ #endif
322
371
break ;
372
+
373
+ #if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A)
323
374
case 2 :
324
375
OCR2A = ocr;
325
376
timer2_toggle_count = toggle_count;
326
377
bitWrite (TIMSK2, OCIE2A, 1 );
327
378
break ;
379
+ #endif
328
380
329
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__ )
381
+ #if defined(TIMSK3 )
330
382
case 3 :
331
383
OCR3A = ocr;
332
384
timer3_toggle_count = toggle_count;
333
385
bitWrite (TIMSK3, OCIE3A, 1 );
334
386
break ;
387
+ #endif
388
+
389
+ #if defined(TIMSK4)
335
390
case 4 :
336
391
OCR4A = ocr;
337
392
timer4_toggle_count = toggle_count;
338
393
bitWrite (TIMSK4, OCIE4A, 1 );
339
394
break ;
395
+ #endif
396
+
397
+ #if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A)
340
398
case 5 :
341
399
OCR5A = ocr;
342
400
timer5_toggle_count = toggle_count;
@@ -356,27 +414,48 @@ void disableTimer(uint8_t _timer)
356
414
{
357
415
switch (_timer)
358
416
{
359
- #if !defined(__AVR_ATmega8__)
360
417
case 0 :
361
- TIMSK0 = 0 ;
418
+ #if defined(TIMSK0)
419
+ TIMSK0 = 0 ;
420
+ #elif defined(TIMSK)
421
+ TIMSK = 0 ; // atmega32
422
+ #endif
362
423
break ;
363
- #endif
424
+
425
+ #if defined(TIMSK1) && defined(OCIE1A)
364
426
case 1 :
365
427
bitWrite (TIMSK1, OCIE1A, 0 );
366
428
break ;
429
+ #endif
430
+
367
431
case 2 :
368
- bitWrite (TIMSK2, OCIE2A, 0 ); // disable interrupt
369
- TCCR2A = (1 << WGM20);
370
- TCCR2B = (TCCR2B & 0b11111000 ) | (1 << CS22);
371
- OCR2A = 0 ;
432
+ #if defined(TIMSK2) && defined(OCIE2A)
433
+ bitWrite (TIMSK2, OCIE2A, 0 ); // disable interrupt
434
+ #endif
435
+ #if defined(TCCR2A) && defined(WGM20)
436
+ TCCR2A = (1 << WGM20);
437
+ #endif
438
+ #if defined(TCCR2B) && defined(CS22)
439
+ TCCR2B = (TCCR2B & 0b11111000 ) | (1 << CS22);
440
+ #endif
441
+ #if defined(OCR2A)
442
+ OCR2A = 0 ;
443
+ #endif
372
444
break ;
373
- #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
445
+
446
+ #if defined(TIMSK3)
374
447
case 3 :
375
448
TIMSK3 = 0 ;
376
449
break ;
450
+ #endif
451
+
452
+ #if defined(TIMSK4)
377
453
case 4 :
378
454
TIMSK4 = 0 ;
379
455
break ;
456
+ #endif
457
+
458
+ #if defined(TIMSK5)
380
459
case 5 :
381
460
TIMSK5 = 0 ;
382
461
break ;
0 commit comments