17.10.2012, 19:03
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Создание псевдонима для работы с портом (Pic, XC8)
Всем привет!
Возникла такая задача, с коротой не удается никак разобраться.
Ситуация такая, хочу сделать alias массив для работы с пинами.
Что то вроде:
Код:
|
char *matrixRest[11];
matrixRest[0] = RD6;
matrixRest[1] = RA0;
matrixRest[2] = RA2;
matrixRest[3] = RA4;
matrixRest[4] = RE2;
matrixRest[5] = RE1;
matrixRest[6] = RC1;
matrixRest[7] = RC6;
matrixRest[8] = RD0;
matrixRest[9] = RD2;
matrixRest[10] = RD4; |
Однако такой способ не срабатывает. Я пробовал так же передавать порты через & matrixRest[0] = RD6, все равно никак.
Я решил топорным методом, сделал функцию, в которую пихнул switch case, и для всех 11 вариантов прописал варианты, однако чувствую что ссылку все же как то можно сделать, поэтому прошу наставить на путь истиный и помочь в решении этой задачи.
Язык С, компилятор XC8.
Спасибо!
Последний раз редактировалось JekaKey; 17.10.2012 в 19:07.
|
|
|
|
17.10.2012, 21:21
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
JekaKey, Тратить на хранение 1 бита в char - расточительство.
IMHO, дешевле завести переменную 16 бит и с нее вручную копировать состояние бит.
Часом, не ШИМ на светодиодах изобретаете ?
__________________
Осторожно , злой кот
|
|
|
|
17.10.2012, 21:31
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
Нет, не шим, опрашиваю матрицу кнопок.
Да, я понимаю что расточительно, но пока у меня и так не работает. Тем более что мне нужно не считывать состояние, а наоборот - задавать. То есть это строки матрицы, где я должен по очереди потушить пин и считать состояние кнопок в столбцах.
|
|
|
|
17.10.2012, 21:32
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
А матрица 6х5 ?
Дык, снова так же -все телодвижения делать с переменной буфером , а далее копировать состояние соответствующих бит .
ЗЫ. Кстати недавно с подобным боролся .
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 17.10.2012 в 21:36.
|
|
|
|
17.10.2012, 22:01
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
Нет, матрица немного побольше - 22х8. На 88 клавиш в миди контроллер, по 2 на клавишу. Итого получается 8 общих пинов (которые как раз входа), и по 11 на первый и второй датчик (для расчета velocity). Вот и возникает у меня проблема, как им задавать в цикле состояния в то время как они раскиданы по разным портам... Поэтому и заморачиваюсь с матрицей, что бы можно было всех уложить и переназначить в любое время.
|
|
|
|
17.10.2012, 22:13
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
Сообщение от JekaKey
|
что бы можно было всех уложить и переназначить в любое время.
|
Все так же .
В любом случае придется двигать столбцы и считывать строки.
"Красивое" решение на Си один хрен обернется побитовыми операциями.
Более менее все это упростить поможет распределение по портам ,естественно усложняя разводку . В вашем случае 3+1 порт.
Кстати что за контроллер ?
__________________
Осторожно , злой кот
|
|
|
|
17.10.2012, 22:20
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
МК PIC16F887.
Дело в том что разводку я сделать не могу, так как пихаю МК в готовое устройство с готовой схемотехникой... Поэтому как видно из первого сообщения, пины получаются весьма раскиданы...
|
|
|
|
17.10.2012, 22:30
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
JekaKey, Сочувствую.
Пишите, поможем...
__________________
Осторожно , злой кот
|
|
|
|
17.10.2012, 23:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
Сообщение от dosikus
|
JekaKey, Сочувствую.
Пишите, поможем...
|
Мне кажется, только дефайновыми определениями. Там можно и поизгаляться. Тогда можно будет и переназначать более оперативно. Неудобно, что дефайны не любят вложенности. Но само обращение в любом случае останется попиново (во слово придумал )
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
18.10.2012, 03:27
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Создание псевдонима для работы с портом (Pic, XC8)
Просто так в массив не запихнуть matrixRest[1] = RA0;
Можно запихнуть комбинацию из адреса порта и номера бита. А потом в функции извлекать адрес и пользовать бит.
В принципе, так у Вас и сделано, только вместо switch будет простое вычисление адреса порта.
В Вашем случае можно, например, сделать так:
Код:
|
#define _RA0 (unsigned char)&PORTA*8+0
#define _RA1 (unsigned char)&PORTA*8+1
#define _RA2 (unsigned char)&PORTA*8+2
#define _RA3 (unsigned char)&PORTA*8+3
#define _RA4 (unsigned char)&PORTA*8+4
#define _RA5 (unsigned char)&PORTA*8+5
#define _RA6 (unsigned char)&PORTA*8+6
#define _RA7 (unsigned char)&PORTA*8+7
#define _RB0 (unsigned char)&PORTB*8+0
.....
#define _RE7 (unsigned char)&PORTE*8+7
unsigned char BitArr[40];// Массив для всех нужных битов
//=================================================
// Установка бита порта в нужное состояние
void UpdateBit(int i, unsigned char val)
{
unsigned char *tmpport;
unsigned char tmp = BitArr[i];
tmpport = (unsigned char *)(tmp››3); // восстановили адрес порта
tmp &= 0x07; // номер бита
if(val)tmp = *tmpport | (0x01 ‹‹ tmp); // прочитали порт и установили бит в 1
else tmp = *tmpport & ~(0x01 ‹‹ tmp); // прочитали порт и сбросили бит в 0
*tmpport = tmp; // записали результат обратно в порт
}
//=================================================
int i;
int main()
{
// Заполнение массива нужными битами
BitArr[0]=_RD6;
BitArr[1]=_RA0;
BitArr[2]=_RA2;
BitArr[3]=_RA4;
BitArr[4]=_RE2;
BitArr[5]=_RE1;
BitArr[6]=_RC1;
BitArr[7]=_RC6;
BitArr[8]=_RD0;
BitArr[9]=_RD2;
BitArr[10]=_RD4;
// Пользуем. Например, установка все битов в 1
for(i=0;i‹11;i++) UpdateBit(i,1);
} |
Последний раз редактировалось Yurkin2007; 18.10.2012 в 03:35.
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:59.
|
|