Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Re: Объединение разных PINов в один PORT

Ср июл 11, 2012 17:51:47

У меня есть два варианта решения задачи объединения группы пинов в один логический порт:
1 - на простом Си с использованием препроцессора. Используется так:
Код:
#define Group1 (Pa1), (Pa2), (Pa3), (Pb2), (Pb3), (Pb4)
GROUP_WRITE(0x55, Group1);

Найти можно тут: http://we.easyelectronics.ru/Soft/rabota-s-gruppami-liniy-vvoda-vyvoda-na-si-bez-plyusov.html
2 - вариант на С++ с использованием шаблонов:
Код:
typedef PinList<Pa1, Pa2, Pa3, Pb2, Pb3, Pb4> Group1;
Group1::Write(0x55);

Описано тут: http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html
Актуальная версия с примерами тут: https://github.com/KonstantinChizhov/Mcucpp

Re: Объединение разных PINов в один PORT

Ср июл 11, 2012 18:23:12

сначала развожу плату, как мне удобнее, а потом под железо пишу код, а не наоборот.


А я обычно пытаюсь прикинуть сразу, что проще решить в железе, а что - в софте, и ищу компромисс.

Что касается здешнего случая - я бы вообще взял что-то восьминогое, а светодиоды подключил бы через HC595.

Re: Объединение разных PINов в один PORT

Ср июл 11, 2012 18:42:53

Ну если 22 светодиода было бы мало, а скажем, нужно штук 100 подключить, тогда согласен, чтобы как расширители использовать несколько HC595, а так зачем лишние микросхемы, да и разводка платы получается сложнее.

Re: Объединение разных PINов в один PORT

Ср июл 11, 2012 21:54:50

зачем лишние микросхемы


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

Re: Объединение разных PINов в один PORT

Ср июл 11, 2012 23:07:06

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

Re: Объединение разных PINов в один PORT

Чт июл 12, 2012 16:33:25

А я обычно дефайню свои имена к пинам, согласно логике их использования, частенко прикручиваю макрос, который и разбрасывает скормелнный регистр по переназванным пинам.
Для удобства, макрос можно назвать почти_так_же, как оигинальные функции...
Вот только пишу я на асме.
И да, при сборке девайся - обычно стараюсь изначлаьно оценить, что проще в железе, а что програмно - чтоб не тратить время и место в контроллере на лишние участки кода, особенно актуально для контроллеров с малым объемом памяти программ.

Re: Объединение разных PINов в один PORT

Чт июл 12, 2012 18:52:09

По поводу сдвиговых регистров: нет места =\ я ограничительные резисторы ели втулил для диодов, вообщем места мало.
И как я понял мне надо общаться как с ПОРТОМ а не с каждым пином по отдельности

Спасибо всем отписавшимся ... буду усваивать полученную от Вас информацию)



PS кстати уже много раз перечитываю пост DiHalt'a ... очень интересное решение ... может ктото обьяснить принцип или запилить на Си ?

И еще вопрос :) я ж смогу к АСМовскому файлу обращатся в Си омпиляторе ? А то тут вроде бы удобно все так ... если это всеже возможно - смогбы ктото запилить (переделать немного) из того что выложил Ди, под мои нужды ?

А именно
Слева: PD0, PD1, PD2, PD3, PD4PB6, PB7, PD5, PD6, PD7, PB0
Cправа: PC5, PC4, PC3, PC2, PC1, PC0, PB5, PB4, PB3, PB2, PB1


Или там только до 8 пинов получится ?
Короче жду помощи от Вас :) а то сроки поджимают ... не хочу быдлокодить мигалку на ~500 cтрок дергая пинами через делей вручную, да и данный метод считаю очень полезным

Спасибо
Последний раз редактировалось Rondo Чт июл 12, 2012 19:57:23, всего редактировалось 1 раз.

Re: Объединение разных PINов в один PORT

Чт июл 12, 2012 19:48:47

Вот можно так управлять виртуальным портом.
Код:
#define PIN_COUNT   11  // Количество виртуальных пинов

// Массив соответствия виртуальных пинов
unsigned char ptable[PIN_COUNT,3]{
    // Порт B      Порт C      Порт D
    {0b00010000, 0b00000000, 0b00000000},   // виртуальный пин 0: порт B, бит 4
    {0b00000000, 0b00100000, 0b00000000},
    {0b00000000, 0b10000000, 0b00000000},
    {0b00001000, 0b00000000, 0b00100000},
    {0b00000000, 0b00000100, 0b00000000},
    {0b00000100, 0b00000000, 0b00000000},
    {0b00000000, 0b00000000, 0b00000000},
    {0b00000000, 0b00000001, 0b00000000},   // виртуальный пин 7: порт C, бит 0
    {0b00000000, 0b00000000, 0b00001000},
    {0b00000000, 0b00000000, 0b00000010},
    {0b10000000, 0b00000000, 0b00000000}    // виртуальный пин 10: порт B, бит 7
}

// Сброс виртуального пина
// Если виртуальный порт должен вмещать больше 16 пинов,
// то надо (unsigned int val) исправить на (unsigned long int val)
void outVirtual(unsigned int val)
{
    unsigned char tempB, tempC, tempD, i;

    tempB=PORTB;
    tempC=PORTC;
    tempD=PORTD;
   
    for (i=0; i < PIN_COUNT; i++)
    {
        if (val & 0x0001)
        {
            tempB|=ptable[i, 0];
            tempC|=ptable[i, 1];
            tempD|=ptable[i, 2];
        }
        else
        {
            tempB&=(~ptable[i, 0]);
            tempC&=(~ptable[i, 1]);
            tempD&=(~ptable[i, 2]);
        }
       
        val=val>>1;
    }

    PORTB=tempB;
    PORTC=tempC;
    PORTD=tempD;
}

Re: Объединение разных PINов в один PORT

Чт июл 12, 2012 19:58:07

U235 спасибо, щас буду раскуривать Ваш код ! :)

Re: Объединение разных PINов в один PORT

Чт июл 12, 2012 21:53:37

Rondo писал(а):U235 спасибо, щас буду раскуривать Ваш код !

Пожалуйста. Хотя алгоритм мне кажется очевидным, наверняка могут возникнуть вопросы. Спрашивайте, если что.

Re: Объединение разных PINов в один PORT

Пт июл 13, 2012 10:29:32

Когда пришлось подключить семисегментник к разным пинам я сделал так.

Код:
#define seg_A  PORTB_Bit3
#define seg_B  PORTB_Bit6
#define seg_C  PORTC_Bit1
#define seg_D  PORTD_Bit7
#define seg_E  PORTB_Bit1
#define seg_F  PORTD_Bit1
#define seg_G  PORTD_Bit5
#define seg_DP PORTB_Bit5

#define seg_1  PORTC_Bit0
#define seg_2  PORTB_Bit4
#define seg_3  PORTB_Bit2
#define seg_4  PORTB_Bit0
#define seg_5  PORTD_Bit6
#define seg_6  PORTB_Bit7
#define seg_7  PORTD_Bit2
#define seg_8  PORTD_Bit0

void LED_DRIVER(unsigned char num,unsigned char data)
{

seg_A  = 0;
seg_B  = 0;
seg_C  = 0;
seg_D  = 0;
seg_E  = 0;
seg_F  = 0;
seg_G  = 0;
seg_DP = 0;

num ^= 0xFF;

seg_1 = num;
num>>=1;
seg_2 = num;
num>>=1;
seg_3 = num;
num>>=1;
seg_4 = num;
num>>=1;
seg_5 = num;
num>>=1;
seg_6 = num;
num>>=1;
seg_7 = num;
num>>=1;
seg_8 = num;


seg_A = data;
data>>=1;
seg_B = data;
data>>=1;
seg_C = data;
data>>=1;
seg_D = data;
data>>=1;
seg_E = data;
data>>=1;
seg_F= data;
data>>=1;
seg_G = data;
data>>=1;
seg_DP = data;

}

Re: Объединение разных PINов в один PORT

Сб июл 14, 2012 17:35:21

U235 можно по подробней о массиве соответствия виртуальных пинов ? я чтото не понял зачем он =\
И я чтото не понял как мне из вашего примера "собрать в кучу" разные пины в один порт? если не сложно - обьясните по пальцам :)

phanis спасибо за Ваш пример, ща буду его ковырять)

Re: Объединение разных PINов в один PORT

Сб июл 14, 2012 21:28:35

Rondo писал(а):U235 можно по подробней о массиве соответствия виртуальных пинов ? я что то не понял зачем он =\
И я что то не понял, как мне из вашего примера "собрать в кучу" разные пины в один порт? если не сложно - обьясните по пальцам :)

Массив и нужен для сборки в кучу разных пинов. Обычно мы управляем выводами портов просто записывая в него какое то число. Примерно так
Код:
PORTB=value;

В случае с виртуальным портом в моём примере для этой цели служит функция outVirtual. Если передать ей значение 0x0021, то она установит в единицу виртуальные пины 0 и 5. Остальные - сбросит в ноль.
Каждому виртуальному пину сопоставлена строка массива. Строка
Код:
{0b00010000, 0b00000000, 0b00000000}

означает, что некий виртуальный пин на самом деле - вывод 4 порта B. То есть первый байт - порт B, второй - порт C, третий - D. Массив должен содержать столько подобных строк, сколько нужно виртуальных пинов.

Re: Объединение разных PINов в один PORT

Вс июл 15, 2012 10:40:18

Только это, сей массив, конечно, надо объявить как лежащий во флеше, чтобы он не отжирал оперативку. Для этого перед ним пишем модификатор flash. Ну и можно еще const написать для верности.
Тема закрыта