Могут ли индивидуальные контакты разных портов микроконтроллера сопоставляться с регистром, а их значения изменяются при изменении значения регистра?

В: Можно ли сопоставить отдельные контакты разных портов микроконтроллера с регистром и изменить их значения при изменении значения регистра?

Сценарий: я использовал несколько контактов из каждого порта (8 бит) микроконтроллера. Теперь я хочу взаимодействовать с устройством, которому требуется 8-битная шина (предположим, что от D0 до D7 IN SEQUENCE), то есть мне нужно 8 контактов от контроллера, чтобы я мог подключать их один к одному.

portx0  -> D0 // x is the name of port followed by bit location on that port
portx1  -> D1
...
portx7  -> D7

, но у меня нет целого порта из 8 контактов, с которым я могу подключиться к этому устройству, вместо этого у меня есть несколько контактов из portx, некоторые из porty и некоторые контакты из portz. Новый сценарий подключения - как (подключение от микроконтроллера к устройству соответственно)

portx0  -> D0
portx1  -> D1
portx2  -> D2
porty4  -> D3
porty5  -> D4
porty6  -> D5
porty7  -> D6
portz1  -> D7

В этом условии, если я хочу отправить значение, скажите

unsigned char dataReg = 0xFA;

к моему устройству от контроллера. Мне нужно выполнить битватные операции над значением, которое нужно отправить, и установить каждый вывод в соответствии со значением в регистре отдельно. Например

portx0 = ((dataReg & 0x01) >> 0 );  // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );

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

12 голосов | спросил Osaid 22 FebruaryEurope/MoscowbFri, 22 Feb 2013 14:03:20 +0400000000pmFri, 22 Feb 2013 14:03:20 +040013 2013, 14:03:20

4 ответа


6

Похоже, ваш вопрос сводится к 8-битовому значению в прошивке и желанию читать и записывать это из произвольной коллекции портов и произвольной коллекции портов.

Не существует прямого аппаратного способа для этого. Вы должны написать две процедуры, одну для чтения 8-битного значения и одну для ее записи. Другие упомянули об использовании профсоюзов, но это плохая идея. С профсоюзами вам приходится иметь дело с каждым битом отдельно, а код становится зависимым от битового порядка микро. Это может быть способ пойти в любом случае, если все 8 бит будут разбросаны полностью независимо. Если это так, вы можете немного сделать, но сделать специальный код для каждого бита.

Лучший способ сделать это, особенно если вы можете группировать биты в нескольких смежных кусках на физических портах, это использовать маскирование, перемещение и ORing. Например, если нижние три бита внутреннего байта находятся в битах <6-4> порт, сдвиньте правое значение порта на 4 и И с 7, чтобы получить эти бит в их конечную позицию. Сдвиг и маска (или маска и сдвиг) с других портов на место и сбор окончательного 8-битного байта путем ORing результатов в него.

Этот вид низкоуровневого бит-тренда проще делать в ассемблере, чем C. Я бы, вероятно, поместил байтовые процедуры чтения и записи в один модуль ассемблера и сделал интерфейс вызываемым из C.

ответил Olin Lathrop 22 FebruaryEurope/MoscowbFri, 22 Feb 2013 17:18:07 +0400000000pmFri, 22 Feb 2013 17:18:07 +040013 2013, 17:18:07
4

В общем, это невозможно. Насколько я знаю, это невозможно с ПОС.

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

PSoC Wiring

Например, здесь я создал 6-битный регистр управления. 5 бит идут прямо к контактам, а 6-й бит я использую для XOR с входом от 7-го вывода.

PSoC Pins

На чипе я могу выбрать выделение этих контактов для любого из доступных контактов GPIO. (Это серое изображение)

ответил Rocketmagnet 22 FebruaryEurope/MoscowbFri, 22 Feb 2013 14:56:39 +0400000000pmFri, 22 Feb 2013 14:56:39 +040013 2013, 14:56:39
-1

Вы можете попробовать следующее. Напишите собственную структуру, которая сопоставляется с соответствующими контактами двух портов (которые должны использоваться). Теперь обновление значения в этом регистре должно установить /сбросить контакты этих двух портов. Просто попробуйте и сообщите нам, если это сработало.

Я уверен, что это должно сработать.

ответил Rahul Ranjan 22 FebruaryEurope/MoscowbFri, 22 Feb 2013 15:25:27 +0400000000pmFri, 22 Feb 2013 15:25:27 +040013 2013, 15:25:27
-1

Если я правильно понял вопрос, это достаточно легко в C:

Объявление универсального типа может быть повторно использовано для любого регистра:

typedef union    // Generic 8-bit register Type
{
  uint8 reg; // Whole register
  struct
  {
    unsigned  bit7     : 1;  // Bit 7 
    unsigned  bit6     : 1;  // Bit 6 
    unsigned  bit5     : 1;  // Bit 5 
    unsigned  bit4     : 1;  // Bit 4 
    unsigned  bit3     : 1;  // Bit 3 
    unsigned  bit2     : 1;  // Bit 2 
    unsigned  bit1     : 1;  // Bit 1 
    unsigned  bit0     : 1;  // Bit 0 
  } bit;
} typ_GENERIC_REG8;

Итак, чтобы определить порт, который мы хотим адресовать:

#define MCU_GPO_PORTx   (*(volatile typ_GENERIC_REG8 *)(0x12345678)) // Number is address

И для прямого поворота булавки на этом порту:

#define MCU_PORTx_PINn  (MCU_GPO_PORTx.bit.bit0)

В коде:

MCU_PORTx_PINn = 1; // Set pin high

Весь регистр:

MCU_GPO_PORTx.reg = 0xF; // All pins high

Хорошо стоит читать структуры, союзы, typedefs и enums - все это делает жизнь намного лучше во встроенных & в целом!

ответил John U 22 FebruaryEurope/MoscowbFri, 22 Feb 2013 16:37:30 +0400000000pmFri, 22 Feb 2013 16:37:30 +040013 2013, 16:37:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132