Я пытался использовать библиотеку SoftI2CMaster [http://playground.arduino.cc/Main/SoftwareI2CLibrary], в большинстве случаев библиотека отлично работает, но не работает на портах с H по L, компилятор выдает следующее сообщение:
/SoftI2CMaster.h: In function 'boolean i2c_init()':
/SoftI2CMaster.h:265: error: impossible constraint in 'asm'
В основном код, вызвавший проблему, представляет собой некоторую сборку:
__asm__ __volatile__
(
...
: :
[SCLDDR] "I" (SCL_DDR), [SCLPIN] "I" (SCL_PIN),
[SCLIN] "I" (SCL_IN), [SCLOUT] "I" (SCL_OUT));
После некоторых тестов, проб и ошибок я почти уверен, что проблема связана с SCL_DDR и этими связанными переменными, вот как они определены:
#define SDA_DDR (_SFR_IO_ADDR(SDA_PORT) - 1)
#define SCL_DDR (_SFR_IO_ADDR(SCL_PORT) - 1)
#define SDA_OUT _SFR_IO_ADDR(SDA_PORT)
#define SCL_OUT _SFR_IO_ADDR(SCL_PORT)
#define SDA_IN (_SFR_IO_ADDR(SDA_PORT) - 2)
#define SCL_IN (_SFR_IO_ADDR(SCL_PORT) - 2)
Для SXX_PORT, если я укажу что-нибудь, PORTA-PORTG будет в порядке, программа скомпилируется и запустится без проблем, но затем, если я укажу PORTH-PORTK, появится ошибка. Может ли кто-нибудь указать, в чем проблема? Проблема связана с _SFR_IO_ADDR()?