2017-02-09 67 views
0

正如我的問題所述,要通過其地址訪問端口,我們可以將它寫爲「& PORTA」 ??Microchip XC16:我們可以使用其地址訪問端口嗎?例如:&PortA?

在我的問題,我想從/到HMI讀/寫端口值,使用Modbus協議

我有結構的陣列:

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系列)

+0

什麼是'&rwCoil_0000'或'&rwCoil_0001'的價值?它映射到某個端口嗎? – Swanand

+0

@Swanand,&rwCoil_000x是一個16位寄存器。它尚未與Port進行映射。我沒有找到將它與Port進行映射的方式,因爲rwCoil_000x的值將隨機更新。 – skg

+0

再次,&rwCoil_0000或&rwCoil_0001的值是多少? – Swanand

回答

1

PORTx已被映射到的PORTx寄存器的內容,你不需要它的地址。要從端口讀取,請使用PORTx寄存器。要寫入,請使用LATx寄存器。

所以,如果你想要的值rwCoil_000x到端口(A)上反映,簡單的寫:

LATA = rwCoil_000x; 

如果你想從港口到相同的變量進行讀,寫:

rwCoil_000x = PORTA; 

當然,這裏假設PORTA被設置爲通用輸出。

+0

我不知道什麼時候rwCoil_000x值會從HMI改變。那麼,我該怎麼寫:** LATA = rwCoil_000x ** ??我應該知道什麼時候這樣做?你能指導一下這個嗎?在每個寄存器的情況下,HMI發送請求包隨機讀/寫。 – skg

+0

我不明白這個問題。即使您不知道*何時HMI將執行寫操作,它將執行寫操作,因此當您通過LATx寄存器更新輸出值時。如果這沒有意義,那麼我錯誤地假設你的硬件設置,你需要解釋它。 –

0

如果你想泛化許多不同的端口,你可以建立一個數組的揮發性參考*端口。

我這樣做一次,其他的方式,輸出,LAT寄存器,請Using an array of LATs to toggle outputs. type of (byte) pointer to lat

+0

我查看了你的鏈接。只是一件事...... **和LATA **在你的情況下工作?手段作爲一個結構數組,如果我將它寫爲** {1,&LATA} **,那麼只要從HMI發出請求,它就應該寫入到PortA中? – skg

+0

不,您需要位掩碼系統。位數不起作用,這就是我最初使用asm例程嘗試的內容,並且速度並不快。 PORTA是爲了閱讀順便說一句。 –

相關問題