Arduino Mega PortH +上的_SFR_IO_ADDR()

时间:2014-12-14 15:29:42

标签: arduino avr avr-gcc

我尝试使用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()的问题是什么?

1 个答案:

答案 0 :(得分:1)

约束"I"需要一个从0到63的常量。如果选择其中一个较高端口,则地址(_SFR_IO_ADDR())将高于63。

您可以尝试将修改器更改为"M",这需要8位的常量拟合。我不知道这是否有效,或者作者为何选择使用"I"

如果有效,您可以向作者发送错误报告。