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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
neiver
Родился
Сообщения: 4
Зарегистрирован: Пн апр 25, 2011 15:39:38

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

Сообщение neiver »

У меня есть два варианта решения задачи объединения группы пинов в один логический порт:
1 - на простом Си с использованием препроцессора. Используется так:

Код: Выделить всё

#define Group1 (Pa1), (Pa2), (Pa3), (Pb2), (Pb3), (Pb4)
GROUP_WRITE(0x55, Group1);
Найти можно тут: http://we.easyelectronics.ru/Soft/rabot ... yusov.html
2 - вариант на С++ с использованием шаблонов:

Код: Выделить всё

typedef PinList<Pa1, Pa2, Pa3, Pb2, Pb3, Pb4> Group1;
Group1::Write(0x55);
Описано тут: http://easyelectronics.ru/rabota-s-port ... na-si.html
Актуальная версия с примерами тут: https://github.com/KonstantinChizhov/Mcucpp
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

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

Что касается здешнего случая - я бы вообще взял что-то восьминогое, а светодиоды подключил бы через HC595.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Ну если 22 светодиода было бы мало, а скажем, нужно штук 100 подключить, тогда согласен, чтобы как расширители использовать несколько HC595, а так зачем лишние микросхемы, да и разводка платы получается сложнее.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

зачем лишние микросхемы
Можно взять более простой и дешевый МК. А насчет разводки - не думаю, что такой подход радикально ее усложнит.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Ну, скажем вариантов много, согласен. Мне вот интересно, у автора темы что нибудь сдвинулось, на каком этапе уже?
Реклама
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

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

Сообщение DJ_Kiridza »

А я обычно дефайню свои имена к пинам, согласно логике их использования, частенко прикручиваю макрос, который и разбрасывает скормелнный регистр по переназванным пинам.
Для удобства, макрос можно назвать почти_так_же, как оигинальные функции...
Вот только пишу я на асме.
И да, при сборке девайся - обычно стараюсь изначлаьно оценить, что проще в железе, а что програмно - чтоб не тратить время и место в контроллере на лишние участки кода, особенно актуально для контроллеров с малым объемом памяти программ.
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Реклама
Rondo
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт май 05, 2011 19:53:40
Откуда: Харьков
Контактная информация:

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

Сообщение Rondo »

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

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



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 раз.
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

Вот можно так управлять виртуальным портом.

Код: Выделить всё

#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;
}
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Rondo
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт май 05, 2011 19:53:40
Откуда: Харьков
Контактная информация:

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

Сообщение Rondo »

U235 спасибо, щас буду раскуривать Ваш код ! :)
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

Rondo писал(а):U235 спасибо, щас буду раскуривать Ваш код !
Пожалуйста. Хотя алгоритм мне кажется очевидным, наверняка могут возникнуть вопросы. Спрашивайте, если что.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

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

Сообщение phanis »

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

Код: Выделить всё

#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;

}
[/size]
Rondo
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт май 05, 2011 19:53:40
Откуда: Харьков
Контактная информация:

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

Сообщение Rondo »

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

phanis спасибо за Ваш пример, ща буду его ковырять)
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

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

Сообщение U235 »

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

Код: Выделить всё

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

Код: Выделить всё

{0b00010000, 0b00000000, 0b00000000}
означает, что некий виртуальный пин на самом деле - вывод 4 порта B. То есть первый байт - порт B, второй - порт C, третий - D. Массив должен содержать столько подобных строк, сколько нужно виртуальных пинов.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

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

Вернуться в «Микроконтроллеры и ПЛИС»