Как я могу использовать макросы C для определения имен выводов микроконтроллера PIC? - PullRequest
0 голосов
/ 15 октября 2018

Микроконтроллеры PIC имеют 3 основных регистра для установки состояния выводов GPIO (общего назначения ввода / вывода).Это: TRIS (Три-статус, регистр направления. Устанавливает вывод как на вход, так и на выход). PORT (Входной буфер) LAT (Latch, выходной буфер).

Порты могут быть A, B, C... и т. д. Таким образом, регистр TRIS для порта A - это TRISA.

Тогда, наконец, есть номер пина.Например, TRISA1.

TRISA1 определяется как:

// TRISA<TRISA1>
extern volatile __bit                   TRISA1              __at(0x461);    // @ (0x8C * 8 + 1)
#define                                 TRISA1_bit          BANKMASK(TRISA), 1

Я хотел бы определить макрос, чтобы легко называть контакты как:

#define _DATA_OUTPUT A2

Так что яможет сделать код, подобный:

LAT_DATA_OUTPUT = 1;
PORT_DATA_OUTPUT = 0;

и преобразовать его препроцессором в:

LATA2 = 1;
PORTA2 = 0;

, чтобы впоследствии я мог расширить его на другие регистры выводов, такие как ANSEL, WPU и т. д., безпереписать макросы или добавить специальные случаи.

Возможно ли это?Или что самое близкое, что я могу сделать, чтобы подражать этому?

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вы можете сделать это, создав такой макрос:

#define _DATA_OUTPUT A2
#define LAT_DATA(X) LAT##X
#define LAT_DATA_OUTPUT    LAT_DATA(_DATA_OUTPUT)

#define PORT_DATA(X) PORT##X
#define PORT_DATA_OUTPUT PORT_DATA(_DATA_OUTPUT)

Вы можете использовать его в качестве примера.

0 голосов
/ 15 октября 2018

Вы уже можете сделать это.Вы не заметили свою модель PIC, версию IDE или набор инструментов, который вы используете, но при условии, что вы используете MPLAB X с компилятором XC, эта функция уже есть.Убедитесь, что вы включили <xc.h>, и он должен прочитать, какой чип у вас есть, из конфигурации проекта и уже подготовлены макросы для вас.

Затем вы можете установить целые регистры (используя TRISA в качестве примера):

TRISA = 0x0000;    //All A pins outputs

Или установить отдельные контакты в этом регистре:

TRISAbits.TRISA0 = 0;
TRISAbits.TRISA8 = 0;

Вы также можете определить свои собственные макросы:

#define TRISA0 TRISAbits.TRISA0
#define SET_TRISA0_IN TRISAbits.TRISA0 = 1
...