【问题标题】:Microchip XC16 : Can we access Port using its address ?? for ex : &PortA?Microchip XC16:我们可以使用它的地址访问端口吗?例如:&PortA?
【发布时间】:2017-02-09 09:11:48
【问题描述】:

正如我的问题所说,要通过其地址访问端口,我们可以将其写为 "&PORTA" 吗??

在我的问题中,我想使用 Modbus 协议从/向 HMI 读取/写入端口值。

我有一个结构数组:

typedef struct func_code_reg {
    volatile uint16_t addr;
    volatile uint16_t *data;
}RW_REG_DATA;

// described as
RW_REG_DATA rwCoilStatusTbl[] = {
    //      Addr        Data_Register
    {       0,           &rwCoil_0000      },
    {       1,           &rwCoil_0001      },
};

HMI 每次读取数据时,都会读取寄存器&rwCoil_000x

的当前值

每当 HMI 写入数据时,寄存器 &rwCoil_000x 都会更新。

相反,我想使用 &PORTA 来读取端口状态或更新端口状态。

有可能吗?? &如果可能的话,它是更新端口状态的正确方法吗??

或者任何更好的方法,请指导我。

(我用的是dsPic33E系列)

【问题讨论】:

  • &rwCoil_0000&rwCoil_0001 的值是多少?它是否映射到某个端口?
  • @Swanand,&rwCoil_000x 是一个 16 位寄存器。它尚未与端口映射。我没有办法用 Port 映射它,因为 rwCoil_000x 的值将随机更新。
  • 再次,&rwCoil_0000 或 &rwCoil_0001 的值是多少?
  • @Swanand,考虑 rwCoil_0000 = 0x55 & rwCoil_0001 = 0xAA
  • 我假设您已将 rwCoil_0000 声明为 uint16_t 变量

标签: microcontroller microchip mplab xc16


【解决方案1】:

PORTx 已经映射到 PORTx 寄存器的内容,你不需要它的地址。要从端口读取,请使用 PORTx 寄存器。要写入,请使用 LATx 寄存器。

因此,如果您希望值 rwCoil_000x 反映在端口 (A) 上,只需编写:

LATA = rwCoil_000x; 

如果你想从端口读取到同一个变量,写:

rwCoil_000x = PORTA;

当然,这假设 PORTA 设置为通用输出。

【讨论】:

  • 我不知道 rwCoil_000x 值何时会从 HMI 更改。那么,我该怎么写:** LATA = rwCoil_000x ** ??我应该知道什么时候做这个??你能指导更多吗??? HMI 发送请求包以随机读取/写入每个寄存器。
  • 我不明白这个问题。即使您不知道何时 HMI 会执行写入操作,但它执行写入操作,因此您可以通过LATx 寄存器更新输出值。如果这没有意义,那么我错误地假设您的硬件设置并且您需要解释它。
【解决方案2】:

如果您想对许多不同的端口进行泛化,您可以构建一个对 *PORT 的易失性引用数组。

我用另一种方式做了一次,输出,LAT 寄存器,见Using an array of LATs to toggle outputs. type of (byte) pointer to lat

【讨论】:

  • 我查看了您的链接。只有一件事...... &LATA 对你的情况有用吗???意思是作为一个结构数组,如果我把它写成 { 1, &LATA },它应该在 HMI 发送请求时写入 PortA ??
  • 不,您需要位掩码系统。位数不起作用,这就是我最初使用 asm 例程尝试的方法,而且速度不快。 PORTA 是用来阅读的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2013-08-03
  • 2020-11-02
相关资源
最近更新 更多