Микрочип XC16: Можем ли мы получить доступ к порту, используя его адрес?? например: &PortA?

Как говорится в моем вопросе, чтобы получить доступ к порту по его адресу, можем ли мы написать его как "&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)


person skg    schedule 09.02.2017    source источник
comment
Каково значение &rwCoil_0000 или &rwCoil_0001? Он привязан к какому-то порту?   -  person Swanand    schedule 09.02.2017
comment
@Swanand, &rwCoil_000x - это 16-битный регистр. Он еще не сопоставлен с портом. Я не понимаю, как сопоставить его с портом, так как значение rwCoil_000x будет обновляться случайным образом.   -  person skg    schedule 09.02.2017
comment
Опять же, каково значение &rwCoil_0000 или &rwCoil_0001?   -  person Swanand    schedule 09.02.2017
comment
@Swanand, учтите, что rwCoil_0000 = 0x55 и rwCoil_0001 = 0xAA   -  person skg    schedule 09.02.2017
comment
И я предполагаю, что вы объявили rwCoil_0000 как переменную uint16_t   -  person Swanand    schedule 09.02.2017
comment
Да. изменчивый uint16_t rwCoil_0000.   -  person skg    schedule 09.02.2017


Ответы (2)


PORTx уже сопоставлен с содержимым регистра PORTx, вам не нужен его адрес. Для чтения из порта используйте регистр PORTx. Для записи используйте регистр LATx.

Итак, если вы хотите, чтобы значение rwCoil_000x отображалось на порту (A), просто напишите:

LATA = rwCoil_000x; 

И если вы хотите прочитать из порта в ту же переменную, напишите:

rwCoil_000x = PORTA;

Конечно, это предполагает, что PORTA настроен как выход общего назначения.

person Ed King    schedule 11.02.2017
comment
Я не знаю, когда значение rwCoil_000x будет изменено из HMI. Итак, как я могу написать: ** LATA = rwCoil_000x ** ?? Я должен знать, когда это делать ?? Можете ли вы рассказать немного больше об этом ??? HMI отправляет пакет запроса на чтение/запись случайным образом для каждого регистра. - person skg; 13.02.2017
comment
Я не понимаю проблемы. Даже если вы не знаете, когда ЧМИ выполнит запись, он выполнит запись, поэтому именно тогда вы обновите выходное значение через регистр LATx. Если это не имеет смысла, то я неправильно предполагаю настройку вашего оборудования, и вам нужно это объяснить. - person Ed King; 13.02.2017

Если вы хотите обобщить множество различных портов, вы можете создать массив изменчивых ссылок на *PORT.

Я сделал это один раз по-другому, выходы, регистры LAT, см. Использование массива LAT для переключать выходы. тип (байтового) указателя на широту

person Marco van de Voort    schedule 11.02.2017
comment
Я просмотрел вашу ссылку. Только одно... сработало ли в вашем случае &LATA??? Средства Как массив структуры, если я запишу его как { 1, &LATA }, он должен быть записан в PortA всякий раз, когда запрос был отправлен из HMI ?? - person skg; 13.02.2017
comment
Нет, вам нужна система битовой маски. битовые числа не работают, это то, что я изначально пробовал с подпрограммой asm, и это не быстро. PORTA предназначена для чтения, кстати. - person Marco van de Voort; 13.02.2017