Skip to content

Commit 9b42d2d

Browse files
committed
Modifying Tone.cpp to use register-based (not CPU-based) #ifdefs.
1 parent 5e028ea commit 9b42d2d

File tree

1 file changed

+99
-20
lines changed

1 file changed

+99
-20
lines changed

hardware/arduino/cores/arduino/Tone.cpp

Lines changed: 99 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ Version Modified By Date Comments
2828
09/11/25 Changed pin toggle method to XOR
2929
09/11/25 Fixed timer0 from being excluded
3030
0006 D Mellis 09/12/29 Replaced objects with functions
31-
31+
0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register
3232
*************************************************/
3333

3434
#include <avr/interrupt.h>
3535
#include <avr/pgmspace.h>
3636
#include "wiring.h"
3737
#include "pins_arduino.h"
3838

39-
#if defined(__AVR_ATmega8__)
39+
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
4040
#define TCCR2A TCCR2
4141
#define TCCR2B TCCR2
4242
#define COM2A1 COM21
@@ -66,19 +66,26 @@ volatile long timer2_toggle_count;
6666
volatile uint8_t *timer2_pin_port;
6767
volatile uint8_t timer2_pin_mask;
6868

69-
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
69+
#if defined(TIMSK3)
7070
volatile long timer3_toggle_count;
7171
volatile uint8_t *timer3_pin_port;
7272
volatile uint8_t timer3_pin_mask;
73+
#endif
74+
75+
#if defined(TIMSK4)
7376
volatile long timer4_toggle_count;
7477
volatile uint8_t *timer4_pin_port;
7578
volatile uint8_t timer4_pin_mask;
79+
#endif
80+
81+
#if defined(TIMSK5)
7682
volatile long timer5_toggle_count;
7783
volatile uint8_t *timer5_pin_port;
7884
volatile uint8_t timer5_pin_mask;
7985
#endif
8086

8187

88+
// MLS: This does not make sense, the 3 options are the same
8289
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
8390

8491
#define AVAILABLE_TONE_PINS 1
@@ -133,7 +140,7 @@ static int8_t toneBegin(uint8_t _pin)
133140
// whereas 16 bit timers are set to either ck/1 or ck/64 prescalar
134141
switch (_timer)
135142
{
136-
#if !defined(__AVR_ATmega8__)
143+
#if defined(TCCR0A) && defined(TCCR0B)
137144
case 0:
138145
// 8 bit timer
139146
TCCR0A = 0;
@@ -143,8 +150,9 @@ static int8_t toneBegin(uint8_t _pin)
143150
timer0_pin_port = portOutputRegister(digitalPinToPort(_pin));
144151
timer0_pin_mask = digitalPinToBitMask(_pin);
145152
break;
146-
#endif
153+
#endif
147154

155+
#if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12)
148156
case 1:
149157
// 16 bit timer
150158
TCCR1A = 0;
@@ -154,6 +162,9 @@ static int8_t toneBegin(uint8_t _pin)
154162
timer1_pin_port = portOutputRegister(digitalPinToPort(_pin));
155163
timer1_pin_mask = digitalPinToBitMask(_pin);
156164
break;
165+
#endif
166+
167+
#if defined(TCCR2A) && defined(TCCR2B)
157168
case 2:
158169
// 8 bit timer
159170
TCCR2A = 0;
@@ -163,8 +174,9 @@ static int8_t toneBegin(uint8_t _pin)
163174
timer2_pin_port = portOutputRegister(digitalPinToPort(_pin));
164175
timer2_pin_mask = digitalPinToBitMask(_pin);
165176
break;
177+
#endif
166178

167-
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
179+
#if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3)
168180
case 3:
169181
// 16 bit timer
170182
TCCR3A = 0;
@@ -174,15 +186,27 @@ static int8_t toneBegin(uint8_t _pin)
174186
timer3_pin_port = portOutputRegister(digitalPinToPort(_pin));
175187
timer3_pin_mask = digitalPinToBitMask(_pin);
176188
break;
189+
#endif
190+
191+
#if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4)
177192
case 4:
178193
// 16 bit timer
179194
TCCR4A = 0;
180195
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
182203
bitWrite(TCCR4B, CS40, 1);
183204
timer4_pin_port = portOutputRegister(digitalPinToPort(_pin));
184205
timer4_pin_mask = digitalPinToBitMask(_pin);
185206
break;
207+
#endif
208+
209+
#if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5)
186210
case 5:
187211
// 16 bit timer
188212
TCCR5A = 0;
@@ -192,7 +216,7 @@ static int8_t toneBegin(uint8_t _pin)
192216
timer5_pin_port = portOutputRegister(digitalPinToPort(_pin));
193217
timer5_pin_mask = digitalPinToBitMask(_pin);
194218
break;
195-
#endif
219+
#endif
196220
}
197221
}
198222

@@ -258,12 +282,22 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
258282
}
259283
}
260284

261-
#if !defined(__AVR_ATmega8__)
285+
#if defined(TCCR0B)
262286
if (_timer == 0)
287+
{
263288
TCCR0B = prescalarbits;
289+
}
264290
else
265291
#endif
292+
#if defined(TCCR2B)
293+
{
266294
TCCR2B = prescalarbits;
295+
}
296+
#else
297+
{
298+
// dummy place holder to make the above ifdefs work
299+
}
300+
#endif
267301
}
268302
else
269303
{
@@ -278,12 +312,20 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
278312
}
279313

280314
if (_timer == 1)
315+
{
316+
#if defined(TCCR1B)
281317
TCCR1B = (TCCR1B & 0b11111000) | prescalarbits;
282-
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
318+
#endif
319+
}
320+
#if defined(TCCR3B)
283321
else if (_timer == 3)
284322
TCCR3B = (TCCR3B & 0b11111000) | prescalarbits;
323+
#endif
324+
#if defined(TCCR4B)
285325
else if (_timer == 4)
286326
TCCR4B = (TCCR4B & 0b11111000) | prescalarbits;
327+
#endif
328+
#if defined(TCCR5B)
287329
else if (_timer == 5)
288330
TCCR5B = (TCCR5B & 0b11111000) | prescalarbits;
289331
#endif
@@ -307,7 +349,7 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
307349
switch (_timer)
308350
{
309351

310-
#if !defined(__AVR_ATmega8__)
352+
#if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A)
311353
case 0:
312354
OCR0A = ocr;
313355
timer0_toggle_count = toggle_count;
@@ -316,27 +358,43 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
316358
#endif
317359

318360
case 1:
361+
#if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A)
319362
OCR1A = ocr;
320363
timer1_toggle_count = toggle_count;
321364
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
322371
break;
372+
373+
#if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A)
323374
case 2:
324375
OCR2A = ocr;
325376
timer2_toggle_count = toggle_count;
326377
bitWrite(TIMSK2, OCIE2A, 1);
327378
break;
379+
#endif
328380

329-
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
381+
#if defined(TIMSK3)
330382
case 3:
331383
OCR3A = ocr;
332384
timer3_toggle_count = toggle_count;
333385
bitWrite(TIMSK3, OCIE3A, 1);
334386
break;
387+
#endif
388+
389+
#if defined(TIMSK4)
335390
case 4:
336391
OCR4A = ocr;
337392
timer4_toggle_count = toggle_count;
338393
bitWrite(TIMSK4, OCIE4A, 1);
339394
break;
395+
#endif
396+
397+
#if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A)
340398
case 5:
341399
OCR5A = ocr;
342400
timer5_toggle_count = toggle_count;
@@ -356,27 +414,48 @@ void disableTimer(uint8_t _timer)
356414
{
357415
switch (_timer)
358416
{
359-
#if !defined(__AVR_ATmega8__)
360417
case 0:
361-
TIMSK0 = 0;
418+
#if defined(TIMSK0)
419+
TIMSK0 = 0;
420+
#elif defined(TIMSK)
421+
TIMSK = 0; // atmega32
422+
#endif
362423
break;
363-
#endif
424+
425+
#if defined(TIMSK1) && defined(OCIE1A)
364426
case 1:
365427
bitWrite(TIMSK1, OCIE1A, 0);
366428
break;
429+
#endif
430+
367431
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
372444
break;
373-
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
445+
446+
#if defined(TIMSK3)
374447
case 3:
375448
TIMSK3 = 0;
376449
break;
450+
#endif
451+
452+
#if defined(TIMSK4)
377453
case 4:
378454
TIMSK4 = 0;
379455
break;
456+
#endif
457+
458+
#if defined(TIMSK5)
380459
case 5:
381460
TIMSK5 = 0;
382461
break;

0 commit comments

Comments
 (0)