@@ -303,36 +303,38 @@ static int phonemesToData(const char *textp, const PHONEME * phoneme)
303
303
/*
304
304
* A delay loop that doesn't change with different optimisation settings
305
305
*/
306
- #ifndef DACPIN
306
+ #ifdef __AVR__
307
307
static void loops (byte delays)
308
308
{
309
309
__asm__ volatile (" 1: dec %0" " \n\t " " brne 1b" :" =r" (delays)
310
310
:" 0" (delays));
311
311
}
312
- #endif
313
312
314
313
static void pause (byte delays)
315
314
{
316
- #ifdef DACPIN
317
- delayMicroseconds (delays*6 );
318
- #else
319
315
for (byte r = TIME_FACTOR; r > 0 ; r--)
320
316
loops (delays);
321
- #endif
322
317
}
323
318
324
319
static void delay2 (byte d)
325
320
{
326
- #ifdef DACPIN
327
- delayMicroseconds (d*3127 );
328
- #else
329
321
while (d--) {
330
- pause (0 ); // 256
331
- pause (0 ); // 256
322
+ pause (0 ); // 256
323
+ pause (0 ); // 256
332
324
}
333
- #endif
325
+ }
326
+ #else
327
+ static void pause (byte delays)
328
+ {
329
+ delayMicroseconds (delays*6 );
334
330
}
335
331
332
+ static void delay2 (byte d)
333
+ {
334
+ delayMicroseconds (d*3127 );
335
+ }
336
+ #endif
337
+
336
338
/*
337
339
* Generate a random number
338
340
*/
@@ -355,101 +357,110 @@ static int pin;
355
357
356
358
static void soundOff (void )
357
359
{
358
- #ifdef DACPIN
359
- analogWrite (DACPIN,0 );
360
- #else
361
- if (pin == 10 )
362
- TCCR1A &= ~(_BV (COM1B1)); // Disable PWM
363
- else if (pin == 9 )
364
- TCCR1A &= ~(_BV (COM1A1));
365
- #if defined(__AVR_ATmega32U4__)
366
- else if (pin == 5 )
367
- TCCR3A=0 ;// &= ~(_BV(COM3A1));
368
- #else
369
- // Arduino Leonardo doesn't have Timer2.
370
- else if (pin == 3 )
371
- TCCR2A &= ~(_BV (COM2B1));
360
+ switch (pin) {
361
+ #ifdef TCCR1A
362
+ case 10 :
363
+ TCCR1A &= ~(_BV (COM1B1)); // Disable PWM
364
+ break ;
365
+ case 9 :
366
+ TCCR1A &= ~(_BV (COM1A1));
367
+ break ;
372
368
#endif
373
- #if defined(__AVR_ATmega2560__)
374
- else if (pin == 46 )
375
- TCCR5A &= ~(_BV (COM5A1));
376
- else if (pin == 45 )
377
- TCCR5A &= ~(_BV (COM5B1));
378
- else if (pin == 44 )
379
- TCCR5A &= ~(_BV (COM5C1));
369
+ #ifdef TCCR2A
370
+ case 3 :
371
+ TCCR2A &= ~(_BV (COM2B1));
372
+ break ;
380
373
#endif
381
- else {
382
- // TODO
383
- }
384
- pinMode (pin, INPUT);
374
+ #ifdef TCCR3A
375
+ case 5 :
376
+ TCCR3A = 0 ;// &= ~(_BV(COM3A1));
377
+ break ;
378
+ #endif
379
+ #ifdef TCCR5A
380
+ case 46 :
381
+ TCCR5A &= ~(_BV (COM5A1));
382
+ break ;
383
+ case 45 :
384
+ TCCR5A &= ~(_BV (COM5B1));
385
+ break ;
386
+ case 44 :
387
+ TCCR5A &= ~(_BV (COM5C1));
388
+ break ;
385
389
#endif
390
+ default :
391
+ analogWrite (pin, 0 );
392
+ return ;
393
+ }
386
394
}
387
395
388
396
#define PWM_TOP (1200 /2 )
389
397
390
398
// https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
391
399
static void soundOn (void )
392
400
{
393
- #ifdef DACPIN
394
- analogWrite (DACPIN,0 );
395
- #else
396
- pinMode (pin, OUTPUT);
397
- if (pin == 10 ) {
398
- TCCR1A = 0 ; // disable PWM
399
- ICR1 = PWM_TOP;
400
- // Set the Timer1 to use for PWM sound control
401
- TCCR1B = ((1 << WGM13) | (1 << CS10));
402
- TCNT1 = 0 ;
403
- TCCR1A |= _BV (COM1B1); // ENABLE PWM ON B2 USING OC1B, OCR1B
404
- } else if (pin == 9 ) {
405
- TCCR1A = 0 ; // disable PWM
406
- ICR1 = PWM_TOP;
407
- TCCR1B = ((1 << WGM13) | (1 << CS10));
408
- TCNT1 = 0 ;
409
- TCCR1A |= _BV (COM1A1);
410
- }
411
- #if defined(__AVR_ATmega32U4__)
412
- else if (pin == 5 ) {
413
- TCCR3A = 0 ; // disable PWM
414
- ICR3 = PWM_TOP;
415
- TCCR3B = ((1 << WGM33) | (1 << CS30));
416
- TCNT3 = 0 ;
417
- TCCR3A |= _BV (COM3A1);
418
- }
419
- #else
420
- // Arduino Leonardo doesn't have Timer2.
421
- else if (pin == 3 ) {
422
- TCCR2A = _BV (COM2B1) | _BV (WGM20); // Non-inverted, PWM Phase Corrected
423
- TCCR2B = _BV (CS20) | _BV (WGM22); // No prescaling, ditto
424
- OCR2B = PWM_TOP;
425
- TCNT2 = 0 ;
426
- }
401
+ switch (pin) {
402
+ #ifdef TCCR1A
403
+ case 10 :
404
+ TCCR1A = 0 ; // disable PWM
405
+ ICR1 = PWM_TOP;
406
+ // Set the Timer1 to use for PWM sound control
407
+ TCCR1B = ((1 << WGM13) | (1 << CS10));
408
+ TCNT1 = 0 ;
409
+ TCCR1A |= _BV (COM1B1); // ENABLE PWM ON B2 USING OC1B, OCR1B
410
+ break ;
411
+ case 9 :
412
+ TCCR1A = 0 ; // disable PWM
413
+ ICR1 = PWM_TOP;
414
+ TCCR1B = ((1 << WGM13) | (1 << CS10));
415
+ TCNT1 = 0 ;
416
+ TCCR1A |= _BV (COM1A1);
417
+ break ;
427
418
#endif
428
- #if defined(__AVR_ATmega2560__)
429
- else if (pin == 46 ) {
430
- TCCR5A = 0 ; // disable PWM
431
- ICR5 = PWM_TOP;
432
- TCCR5B = ((1 << WGM13) | (1 << CS10));
433
- TCNT5 = 0 ;
434
- TCCR5A |= _BV (COM5A1);
435
- } else if (pin == 45 ) {
436
- TCCR5A = 0 ; // disable PWM
437
- ICR5 = PWM_TOP;
438
- TCCR5B = ((1 << WGM13) | (1 << CS10));
439
- TCNT5 = 0 ;
440
- TCCR5A |= _BV (COM5B1);
441
- } else if (pin == 44 ) {
442
- TCCR5A = 0 ; // disable PWM
443
- ICR5 = PWM_TOP;
444
- TCCR5B = ((1 << WGM13) | (1 << CS10));
445
- TCNT5 = 0 ;
446
- TCCR5A |= _BV (COM5C1);
447
- }
419
+ #ifdef TCCR2A
420
+ case 3 :
421
+ TCCR2A = _BV (COM2B1) | _BV (WGM20); // Non-inverted, PWM Phase Corrected
422
+ TCCR2B = _BV (CS20) | _BV (WGM22); // No prescaling, ditto
423
+ OCR2B = PWM_TOP;
424
+ TCNT2 = 0 ;
425
+ break ;
448
426
#endif
449
- else {
450
- // TODO
451
- }
427
+ #ifdef TCCR3A
428
+ case 5 :
429
+ TCCR3A = 0 ; // disable PWM
430
+ ICR3 = PWM_TOP;
431
+ TCCR3B = ((1 << WGM33) | (1 << CS30));
432
+ TCNT3 = 0 ;
433
+ TCCR3A |= _BV (COM3A1);
434
+ break ;
435
+ #endif
436
+ #ifdef TCCR5A
437
+ case 46 :
438
+ TCCR5A = 0 ; // disable PWM
439
+ ICR5 = PWM_TOP;
440
+ TCCR5B = ((1 << WGM13) | (1 << CS10));
441
+ TCNT5 = 0 ;
442
+ TCCR5A |= _BV (COM5A1);
443
+ break ;
444
+ case 45 :
445
+ TCCR5A = 0 ; // disable PWM
446
+ ICR5 = PWM_TOP;
447
+ TCCR5B = ((1 << WGM13) | (1 << CS10));
448
+ TCNT5 = 0 ;
449
+ TCCR5A |= _BV (COM5B1);
450
+ break ;
451
+ case 44 :
452
+ TCCR5A = 0 ; // disable PWM
453
+ ICR5 = PWM_TOP;
454
+ TCCR5B = ((1 << WGM13) | (1 << CS10));
455
+ TCNT5 = 0 ;
456
+ TCCR5A |= _BV (COM5C1);
457
+ break ;
452
458
#endif
459
+ default :
460
+ analogWrite (pin, 0 );
461
+ break ;
462
+ }
463
+
453
464
// initialise random number seed
454
465
seed0 = 0xecu ;
455
466
seed1 = 7 ;
@@ -469,62 +480,64 @@ static const int16_t PROGMEM Volume[8] =
469
480
470
481
static void sound (byte b)
471
482
{
472
- // Update PWM volume
483
+ // Update PWM volume
473
484
b = (b & 15 );
474
- #ifdef DACPIN
475
- analogWrite (DACPIN,b*8 );
476
- #else
477
- uint16_t duty = pgm_read_word (&Volume[b >> 1 ]); // get duty cycle
478
- if (pin == 10 ) {
479
- if (duty != OCR1B) {
480
- TCNT1 = 0 ;
481
- OCR1B = duty;
482
- }
483
- } else if (pin == 9 ) {
484
- if (duty != OCR1A) {
485
- TCNT1 = 0 ;
486
- OCR1A = duty;
487
- }
488
- }
489
- #if defined(__AVR_ATmega32U4__)
490
- else if (pin == 5 ) {
491
- if (duty != OCR3A) {
492
- TCNT3 = 0 ;
493
- OCR3A = duty;
494
- }
495
- }
496
- #else
497
- // Arduino Leonardo doesn't have Timer2.
498
- else if (pin == 3 ) {
499
- int8_t d = duty / 256 ;
500
- if (d != OCR2B) {
501
- TCNT2 = 0 ;
502
- OCR2B = d;
503
- }
504
- }
485
+ uint16_t duty = pgm_read_word (&Volume[b >> 1 ]); // get duty cycle
486
+
487
+ switch (pin) {
488
+ #ifdef TCCR1A:
489
+ case 10 :
490
+ if (duty != OCR1B) {
491
+ TCNT1 = 0 ;
492
+ OCR1B = duty;
493
+ }
494
+ break ;
495
+ case 9 :
496
+ if (duty != OCR1A) {
497
+ TCNT1 = 0 ;
498
+ OCR1A = duty;
499
+ }
500
+ break ;
505
501
#endif
506
- #if defined(__AVR_ATmega2560__)
507
- else if (pin == 46 ) {
508
- if (duty != OCR5B) {
509
- TCNT5 = 0 ;
510
- OCR5B = duty;
511
- }
512
- } else if (pin == 45 ) {
513
- if (duty != OCR5B) {
514
- TCNT5 = 0 ;
515
- OCR5B = duty;
516
- }
517
- } else if (pin == 44 ) {
518
- if (duty != OCR5B) {
519
- TCNT5 = 0 ;
520
- OCR5B = duty;
521
- }
522
- }
502
+ #ifdef TCCR2A:
503
+ case 3 :
504
+ if ((duty / 256 ) != OCR2B) {
505
+ TCNT2 = 0 ;
506
+ OCR2B = duty / 256 ;
507
+ }
508
+ break ;
523
509
#endif
524
- else {
525
- // TODO
526
- }
510
+ #ifdef TCCR3A:
511
+ case 5 :
512
+ if (duty != OCR3A) {
513
+ TCNT3 = 0 ;
514
+ OCR3A = duty;
515
+ }
516
+ break ;
517
+ #endif
518
+ #ifdef TCCR5A:
519
+ case 46 :
520
+ if (duty != OCR5B) {
521
+ TCNT5 = 0 ;
522
+ OCR5B = duty;
523
+ }
524
+ break ;
525
+ case 45 :
526
+ if (duty != OCR5B) {
527
+ TCNT5 = 0 ;
528
+ OCR5B = duty;
529
+ }
530
+ break ;
531
+ case 44 :
532
+ if (duty != OCR5B) {
533
+ TCNT5 = 0 ;
534
+ OCR5B = duty;
535
+ }
536
+ break ;
527
537
#endif
538
+ default :
539
+ analogWrite (pin, b*8 );
540
+ }
528
541
}
529
542
530
543
static byte playTone (byte soundNum, byte soundPos, char pitch1,
@@ -556,6 +569,9 @@ TTS::TTS(int pin)
556
569
{
557
570
::pin = pin;
558
571
defaultPitch = 7 ;
572
+ #ifdef __AVR__
573
+ pinMode (pin, OUTPUT);
574
+ #endif
559
575
}
560
576
561
577
/*
0 commit comments