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

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

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

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

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

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


 
Опции темы
Непрочитано 17.10.2012, 19:03  
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  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

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

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

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

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

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

Последний раз редактировалось dosikus; 17.10.2012 в 21:36.
dosikus вне форума  
Непрочитано 17.10.2012, 22:01  
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  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

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

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

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

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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot