Не работает FM24I2C

Наверно нет. Но, если честно, я сам так иногда делаю. К примеру, некая внешняя программулина создаёт массив, типа, const unsigned char bin[2048] в файле bin.cpp. Вот я его и включаю через include из основной программы. Потому что размер этого массива, как и содержимое, может часто меняться и мне просто лень делать дополнительные телодвижения, что то там дописывать/удалять. В принципе, этот файл можно обозвать как угодно, но где у нас должны находиться переменные?)

Сами переменные должны находиться в файле bin.cpp:
const unsigned char bin[2048];
а в bin.h файле должна быть ссылка на него:
external const unsigned char bin[2048];
в текст любого файла, где используется массив bin, следует вставлять
#include "bin.h"
По-хорошему, и вместо 2048 следовало бы использовать именованную константу, определяемую в bin.h.

Да понятно. Я бы мог просто включить константы из другого файла, обозвав его как хош, типа:

const unsigned char bin[] PROGMEM = {
  #include "bin.dat"
};

И тогда неважно какого он размера. Только этот bin.dat формирует другая exe на ПК, которая уже записывает наименование и размер массива. А т.к., этот bin[] приходится создавать по 100 раз на день, мне просто лень что либо менять.)

Я предпочитаю в подобном случае, чтобы эта “другая ехе” сразу вставляла в файл const unsigned char bin[] PROGMEM = { и остальную обвязку, таким образом полностью формируя cpp файл с нужным именем.
Но речь была о другом: помещать код методов в *.h или в *.cpp - это не вопрос вкуса либо хорошего/плохого стиля программирования, а средство добиться от компилятора нужного результата.