Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


Ответ
Опции темы

Создание псевдонима для работы с портом (Pic, XC8)

Непрочитано 17.10.2012, 19:03   #1
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
Сообщение Создание псевдонима для работы с портом (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.
JekaKey вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 21:21   #2
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

JekaKey, Тратить на хранение 1 бита в char - расточительство.
IMHO, дешевле завести переменную 16 бит и с нее вручную копировать состояние бит.
Часом, не ШИМ на светодиодах изобретаете ?
__________________
Осторожно , злой кот
dosikus вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 21:31   #3
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Нет, не шим, опрашиваю матрицу кнопок.
Да, я понимаю что расточительно, но пока у меня и так не работает. Тем более что мне нужно не считывать состояние, а наоборот - задавать. То есть это строки матрицы, где я должен по очереди потушить пин и считать состояние кнопок в столбцах.
JekaKey вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 21:32   #4
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

А матрица 6х5 ?

Дык, снова так же -все телодвижения делать с переменной буфером , а далее копировать состояние соответствующих бит .

ЗЫ. Кстати недавно с подобным боролся .
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 17.10.2012 в 21:36.
dosikus вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 22:01   #5
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Нет, матрица немного побольше - 22х8. На 88 клавиш в миди контроллер, по 2 на клавишу. Итого получается 8 общих пинов (которые как раз входа), и по 11 на первый и второй датчик (для расчета velocity). Вот и возникает у меня проблема, как им задавать в цикле состояния в то время как они раскиданы по разным портам... Поэтому и заморачиваюсь с матрицей, что бы можно было всех уложить и переназначить в любое время.
JekaKey вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 22:13   #6
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Сообщение от JekaKey Посмотреть сообщение
что бы можно было всех уложить и переназначить в любое время.
Все так же .
В любом случае придется двигать столбцы и считывать строки.
"Красивое" решение на Си один хрен обернется побитовыми операциями.
Более менее все это упростить поможет распределение по портам ,естественно усложняя разводку . В вашем случае 3+1 порт.
Кстати что за контроллер ?
__________________
Осторожно , злой кот
dosikus вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 22:20   #7
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

МК PIC16F887.
Дело в том что разводку я сделать не могу, так как пихаю МК в готовое устройство с готовой схемотехникой... Поэтому как видно из первого сообщения, пины получаются весьма раскиданы...
JekaKey вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 22:30   #8
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

JekaKey, Сочувствую.
Пишите, поможем...
__________________
Осторожно , злой кот
dosikus вне форума   Ответить с цитированием
Непрочитано 17.10.2012, 23:38   #9
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Сообщение от dosikus Посмотреть сообщение
JekaKey, Сочувствую.
Пишите, поможем...
Мне кажется, только дефайновыми определениями. Там можно и поизгаляться. Тогда можно будет и переназначать более оперативно. Неудобно, что дефайны не любят вложенности. Но само обращение в любом случае останется попиново (во слово придумал )
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума   Ответить с цитированием
Непрочитано 18.10.2012, 03:27   #10
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию 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 вне форума   Ответить с цитированием
Сказали "Спасибо" Yurkin2007
JekaKey (18.10.2012)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание озонатора для авто - реальность? Alexmed_irk Электроника средств транспорта 30 19.03.2010 08:35
Создание модели для Proteus k000858 Proteus 1 04.02.2010 14:33
Создание 3-д модели для компонентов Proteus Noble_heart Proteus 10 22.01.2010 23:18
PIC+7-сегментники и HD44770. Прога для работы с шрифтами rremix Микроконтроллеры, АЦП, память и т.д 0 17.01.2007 02:28
Создание компонент для PROTEUS HakMax Proteus 16 21.11.2006 18:59


Часовой пояс GMT +4, время: 00:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.