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

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

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

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

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

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


 
Опции темы

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

Непрочитано 18.10.2012, 10:33  
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Yurkin2007, вот это пост так пост! Это именно то что нужно! Спасибо!
Реклама:
JekaKey вне форума  
Непрочитано 18.10.2012, 22:01  
JekaKey
Частый гость
 
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
JekaKey на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Yurkin2007, если будет не трудно, не могли бы вы дать некоторые пояснения по приведенному вами коду, для более тщательного понимания происходящих процессов.
Вопрос 1:
Почему мы должны производить define именно таким способом:
Код:
#define _RA1 (unsigned char)&PORTA*8+1
Почему нельзя использовать RA1_bit, который объявлен как
Код:
#define                                 RA1_bit             BANKMASK(PORTA), 1
или RA1 который объявлен как
Код:
extern volatile __bit  RA1 @ (((unsigned) &PORTA)*8) + 1;
Что в итоге мы получаем в _RA1?

Вопрос 2:
Скорее всего его ответ будет понятен из первого вопроса, но я спрошу на всякий случай. Почему в функции UpdateBit мы извлекаем адрес порта сдвигом вправо на 3 бита?
Код:
tmpport = (unsigned char *)(tmp››3);
и почему вычисляем номер бита умножая на 0x07?
Код:
tmp &= 0x07;  // номер бита
Ваш код заработал с первого раза, я уже успешно его применил и испытал =) Однако хотелось бы более детально понять почему нужно делать так.

Заранее спасибо за ответы!
JekaKey вне форума  
Непрочитано 19.10.2012, 01:43  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Создание псевдонима для работы с портом (Pic, XC8)

Сообщение от JekaKey Посмотреть сообщение
Что в итоге мы получаем в _RA1?
Получаем число, беззнаковый один байт, конкретно для _RA1 = 41.

Тут дело в следующем. Нужна была формализация обращения к портам как к элементам массива.
Вот порт PORTA, объявлен как переменная типа беззнаковый байт с фиксированным адресом 0x005. Аналогично для остальных портов.
Код:
static volatile       unsigned char	PORTA	@ 0x005;
static volatile       unsigned char	PORTB	@ 0x006;
static volatile       unsigned char	PORTC	@ 0x007;
static volatile       unsigned char	PORTD	@ 0x008;
static volatile       unsigned char	PORTE	@ 0x009;
То есть адреса 5, 6, 7, 8 и 9 легко укладываются в 1 байт и остаётся ещё куча места в байте.
Самая главная идея заключается в том, что обращаться к порту можно двояко
Код:
PORTA = 0x85;// просто записали 0x85 в переменную
или так
*(unsigned char *)0x05 = 0x85; // из числа 5 сделали 
                          // указатель на байт и 
                         // положили в этот байт 0x85
В обоих случаях компилятор HI-TECH выдаёт одинаковый результат.
Код:
MOVLW 0x85
MOVWF 0x5
Ну и всё. Теперь вместо конкретного числа 0х05 можно ставить элемент массива байтов arr[i]. Этот массив сначала заполнили адресами всех портов в нужном количестве и порядке. Потом по индексу массива где-нибудь в цикле можно писать и читать порты вторым способом, через указатель. Уже не вспоминая слова PORTx, а просто пользуя элементы массивы arr[i].
Далее. Обращение к битам портов. Биты объявлены, как переменные типа bit, например, для RA1
Код:
static volatile  bit  RA1  @ ((unsigned)&PORTA * 8)+1;
Специфическая переменная типа bit, к сожалению её адрес нельзя присвоить указателю, нельзя объявить указатель на bit. То есть, как в случае с портом, адреса битов в массив не засунуть.
Поэтому предложен был такой способ. В массиве адресов arr[i] адреса подвинуть влево на 3, освободив 3 младших бита под номер бита в порте от 0 до 7. Имея ввиду, что сдвиг на 3 есть умножение на 8, получаем
Код:
#define _RA1 (unsigned char)&PORTA*8+1
При компиляции _RA1 будет заменено на 41, т.к адрес порта &PORTA = 5 и 5*8+1 = 41. Таким образом определив все возможные биты всех портов от RA0 до RE7 как числа от 40 до 79, заполняем массив нужных нам битов в начале программы.
Затем при обращении к битам через элемент массива, в спец.функции сначала восстанавливаем адрес порта, сдвигая значение элемента массива обратно вправо на 3. Делаем из результата сдвига указатель на байт (второй способ обращения к порту). Потом выделяем 3 младших бита с помощью операции AND 0x07, и сдвигаем единичку 0х01 на полученное число шагов. Попадаем на нужный бит в полученном байте.
Обращение к биту таким образом получается, конечно, гораздо дольше.
Можно сравнить тот же HI-TECH компилятор.
Ассемблер в результате компиляции для установки бита через RA1 занимает 3 строчки
Код:
// RA1 = 1;
BCF 0x3, 0x5
BCF 0x3, 0x6
BSF 0x5, 0x1
а установка через функцию UpdateBit(0,1) - около сотни строк.

Последний раз редактировалось Yurkin2007; 19.10.2012 в 01:50.
Yurkin2007 вне форума  
Эти 3 пользователя(ей) сказали Спасибо Yurkin2007 за это сообщение:
JekaKey (19.10.2012), lisergin (13.04.2015), rsrg (14.12.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, время: 10:47.


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