В: Можно ли привязать отдельные контакты другого порта микроконтроллера к регистру и изменить их значения при изменении значения регистра?
Сценарий: я использовал несколько выводов от каждого порта (8 бит) микроконтроллера. Теперь я хочу подключить устройство, которому нужна 8-битная шина (предположим, от D0 до D7 ПОСЛЕДОВАТЕЛЬНО), то есть мне нужно 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 );
Теперь, перейдя к основному вопросу, чтобы избежать этих индивидуальных вычислений для каждого бита на разных портах, можно ли сопоставить отдельные выводы разных портов микроконтроллера с регистром и изменить их значения при изменении значения регистра?
Ответы:
Похоже, ваш вопрос сводится к наличию 8-битного значения в прошивке и желанию прочитать и записать это из произвольной коллекции выводов портов.
Не существует прямого аппаратного способа сделать это. Вы должны написать две подпрограммы, одну для чтения 8-битного значения и одну для его записи. Другие упоминали об использовании профсоюзов, но это плохая идея. В случае союзов вам приходится иметь дело с каждым битом отдельно, и код становится зависимым от порядка бит микро. В любом случае, это может быть подходом, если все 8 бит разбросаны совершенно независимо друг от друга. Если это так, мало что можно сделать, кроме как создать специальный код для каждого бита.
Лучший способ сделать это, особенно если вы можете сгруппировать биты в несколько смежных кусков на физических портах, это использовать маскирование, сдвиг и ORing. Например, если младшие три бита внутреннего байта находятся в битах <6-4> порта, сдвиньте значение этого порта вправо на 4 и AND на 7, чтобы получить эти биты в их окончательном положении. Сдвиньте и замаскируйте (или замаскируйте и сдвиньте) биты с других портов на место и соберите последние 8-битные байты, ИЛИ результаты в него.
Такого рода низкоуровневое переключение битов легче выполнить в ассемблере, чем в C. Я бы, вероятно, поместил процедуры чтения и записи байтов в один модуль ассемблера и сделал бы интерфейс вызываемым из C.
источник
В общем, это невозможно. Насколько я знаю, это невозможно с PIC.
Я знаю только один микроконтроллер, который может это сделать, Cypress PSoC . Это настраиваемая система на чипе. Из многих вещей, которые он позволяет вам делать, это буквально определять свой собственный регистр (1-8 бит) и подключать его к любым выводам, которые вам нравятся, или даже к внутренним цепям.
Например, здесь я создал 6-битный регистр управления. 5 бит идут прямо на контакты, а 6-й бит я использую для XOR с входом от 7-го контакта.
На микросхеме я могу выбрать размещение этих выводов для любого из доступных выводов GPIO. (Это серые одно изображение)
источник
Вы можете попробовать следующее. Напишите свою собственную структуру, которая сопоставляется с соответствующими выводами 2 портов (которые будут использоваться). Теперь при обновлении значения в этом регистре устанавливаются / сбрасываются выводы этих 2 портов. Просто попробуйте и дайте нам знать, если это сработало !!
Я уверен, что это должно работать.
источник
Если я правильно понял вопрос, это достаточно просто в C:
Объявление общего типа, может быть повторно использовано для любого регистра:
Итак, чтобы определить порт, к которому мы хотим обратиться:
И непосредственно крутить булавку на этом порту:
В коде:
Весь регистр:
Стоит почитать о структурах, союзах, типах и перечислениях - все это делает жизнь во встроенном и в целом намного приятнее!
источник