Compilation error between 328P and 328PB with Mozzi library

Hello :slight_smile:

I have an issue when trying to compile a sketch.
This sketch is using the Mozzi library and is uploaded on a board using an Atmega328P programmed with an USBASP programmer. It's working fine like this.

I want to switch to Atmega328PB and I have errors.
The errors are related to timer definition in the mozzi library
I'm using MiniCore board definition for the Atmega and Mozzi version 1.1.2

In file included from C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts_impl_AVR.hpp:14:0,

                 from C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts.cpp:35:

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h: In member function 'void TimerOne::setPwmDuty(char, unsigned int)':

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:157:14: error: 'TIMER1_A_PIN' was not declared in this scope

   if (pin == TIMER1_A_PIN)

              ^~~~~~~~~~~~

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:157:14: note: suggested alternative: 'TIMER1A'

   if (pin == TIMER1_A_PIN)

              ^~~~~~~~~~~~

              TIMER1A

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h: In member function 'void TimerOne::pwm(char, unsigned int)':

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:175:14: error: 'TIMER1_A_PIN' was not declared in this scope

   if (pin == TIMER1_A_PIN)

              ^~~~~~~~~~~~

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:175:14: note: suggested alternative: 'TIMER1A'

   if (pin == TIMER1_A_PIN)

              ^~~~~~~~~~~~

              TIMER1A

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h: In member function 'void TimerOne::disablePwm(char)':

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:208:14: error: 'TIMER1_A_PIN' was not declared in this scope

   if (pin == TIMER1_A_PIN) {

              ^~~~~~~~~~~~

C:\Users\User\Documents\Arduino\libraries\Mozzi\utility/TimerOne.h:208:14: note: suggested alternative: 'TIMER1A'

   if (pin == TIMER1_A_PIN) {

              ^~~~~~~~~~~~

              TIMER1A

In file included from C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts.h:224:0,

                 from C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts.cpp:15:

C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts_impl_AVR.hpp: In function 'void startAudio()':

C:\Users\User\Documents\Arduino\libraries\Mozzi\AudioConfigStandardPlus.h:23:29: error: 'TIMER1_A_PIN' was not declared in this scope

 #define AUDIO_CHANNEL_1_PIN TIMER1_A_PIN // defined in TimerOne/config/known_16bit_timers.h

                             ^

C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts_impl_AVR.hpp:201:11: note: in expansion of macro 'AUDIO_CHANNEL_1_PIN'

   pinMode(AUDIO_CHANNEL_1_PIN, OUTPUT); // set pin to output for audio

           ^~~~~~~~~~~~~~~~~~~

C:\Users\User\Documents\Arduino\libraries\Mozzi\AudioConfigStandardPlus.h:23:29: note: suggested alternative: 'TIMER1A'

 #define AUDIO_CHANNEL_1_PIN TIMER1_A_PIN // defined in TimerOne/config/known_16bit_timers.h

                             ^

C:\Users\User\Documents\Arduino\libraries\Mozzi\MozziGuts_impl_AVR.hpp:201:11: note: in expansion of macro 'AUDIO_CHANNEL_1_PIN'

   pinMode(AUDIO_CHANNEL_1_PIN, OUTPUT); // set pin to output for audio

           ^~~~~~~~~~~~~~~~~~~

It seems there is some changes in the timers definition for the 328PB compared to 328P.
Do you know any workaround ?

Also notice I'm using Arduino IDE 1.8.1, when trying to compile this project with Arduino IDE 2.3.2 there is lots of new errors even for the working version.

Thanks for your help, let me know if you need more information.

What is the Mozzi library, do you have a link?

It's a library used to generate audio stream :slight_smile:

no.
It seems that the library just know nothing about 328PB.

The workaround could be to add your AVR_ATmega328PB to PIN definition in the library config file Mozzi/config/known_16bit_timers.h

// Arduino Uno, Duemilanove, LilyPad, etc
//
#elif defined (__AVR_ATmega168__) || defined (__AVR_ATmega328P__)
  #define TIMER1_A_PIN   9
  #define TIMER1_B_PIN   10
  #define TIMER1_ICP_PIN 8
  #define TIMER1_CLK_PIN 5
2 Likes

You're right !

It works with this easy fix.

Thanks a lot

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.