_SFR_IO_ADDR() на Arduino Mega PortH+

Я пытался использовать библиотеку 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()?


person xandy    schedule 14.12.2014    source источник


Ответы (1)


Ограничение "I" требует константы от 0 до 63. Если выбрать один из старших портов, то адрес (_SFR_IO_ADDR()) будет выше 63.

Вы можете попробовать изменить модификатор на "M", что требует постоянной подгонки в 8 бит. Я не знаю, сработает ли это или почему автор решил использовать "I".

Если это сработает, вы можете отправить автору отчет об ошибке.

person uncleO    schedule 14.12.2014
comment
Привет! Большое спасибо за ваш ответ. Я меняю I на M, и эта часть работает, но получается: cbi %[SDADDR],%[SDAPIN]; будут проблемы, так как cbi ограничен 0 ~ 31 - person xandy; 15.12.2014