Cannot compile basic u8g2 sketch

I’m trying to compile a simple “hello world” sketch for the u8g2 library and am running into odd compiler errors.

The whole sketch

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, A5, A4);

// End of constructor list


void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();					// clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);	// choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");	// write something to the internal memory
  u8g2.sendBuffer();					// transfer internal memory to the display
  delay(1000);  
}

platformio.ini

[env:ATmega328P]

platform = atmelavr

board = ATmega328P

framework = arduino

lib_deps =

olikraus/U8g2@^2.34.22

The errors are numerous, but all about undefined references:

Processing ATmega328P (platform: atmelavr; board: ATmega328P; framework: arduino)
-------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/ATmega328P.html
PLATFORM: Atmel AVR (4.2.0) > ATmega328P/PA
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 32KB Flash
DEBUG: Current (avr-stub) External (avr-stub, simavr)
PACKAGES: 
 - framework-arduino-avr-minicore @ 2.2.2 
 - toolchain-atmelavr @ 1.70300.191015 (7.3.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 9 compatible libraries
Scanning dependencies...
Dependency Graph
|-- U8g2 @ 2.35.7
|-- SPI @ 1.0
|-- Wire @ 1.1
Building in release mode
Archiving .pio/build/ATmega328P/lib89f/libSPI.a
Indexing .pio/build/ATmega328P/lib89f/libSPI.a
Archiving .pio/build/ATmega328P/lib658/libWire.a
Compiling .pio/build/ATmega328P/lib72f/Wire1/Wire1.cpp.o
Compiling .pio/build/ATmega328P/lib72f/Wire1/utility/twi1.c.o
Indexing .pio/build/ATmega328P/lib658/libWire.a
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/mui.c.o
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/mui_u8g2.c.o
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/u8g2_bitmap.c.o
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/u8g2_box.c.o
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/u8g2_buffer.c.o
Compiling .pio/build/ATmega328P/libbc1/U8g2/clib/u8g2_button.c.o
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c: In function 'twi_init1':
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:89:16: error: 'SDA1' undeclared (first use in this function); did you mean 'SDA'?
   digitalWrite(SDA1, 1);
                ^~~~
                SDA
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:89:16: note: each undeclared identifier is reported only once for each function it appears in
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:90:16: error: 'SCL1' undeclared (first use in this function); did you mean 'SCL'?
   digitalWrite(SCL1, 1);
                ^~~~
                SCL
In file included from /Users/davidarthur/.platformio/packages/toolchain-atmelavr/avr/include/avr/io.h:99:0,
                 from /Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:26:
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:93:7: error: 'TWSR1' undeclared (first use in this function); did you mean 'TWSR'?
   cbi(TWSR1, TWPS0);
       ^
/Users/davidarthur/.platformio/packages/framework-arduino-avr-minicore/libraries/Wire1/src/utility/twi1.c:93:3: note: in expansion of macro 'cbi'
   cbi(TWSR1, TWPS0);

...

*** [.pio/build/ATmega328P/lib72f/Wire1/Wire1.cpp.o] Error 1

Works fine in Arduino IDE.

I figured out a fix for this. Best guess is some directive logic is not playing nice with minicore.

I changed the library I2C directive to

#ifdef U8X8_HAVE_HW_I2C
#  ifdef U8X8_HAVE_HW_I2C_TEENSY3
#    include <i2c_t3.h>
#  else
#    include <Wire.h>
#  endif
#endif /* U8X8_HAVE_HW_I2C */

and it works. Also posted over on Github Wire1 errors with 328P and minicore · Issue #2207 · olikraus/u8g2 · GitHub

1 Like