Перейти к содержанию
    

...С каких пор у ПИКов каждый бит порта имеет свой адрес?...

 

Сергей, сразу хочу уточнить, что я с вами не спорю. Вы нашли себе способ делать "переносимые" программы, вот и хорошо! Я просто хотел вам напомнить, что есть и другие способы обращаться к битам в ПИК-ах. Мне кажется, что так легче "общаться" с ними, но это только (одно) мнение.

Насчет адреса у каждого бита - конечно есть. Вся память ПИК-ов побитово адресируемая. Каждому биту можно присвоит этикетку. Адрес каждого бита получается, как комбинация из адреса байта и номер бита. А номер бита это и есть его адрес в рамках байта. Вот поэтому, думаю, вполне справедливо сказать, что у каждого бита есть собственный, уникальный адрес. Что нельзя сказать, например, о х51-ых, т.к. у них нельзя выше определенного адреса обращаться напрямую к битам.

Насчет макросов, если ваш компилятор такой "умный", то да, вы правы. Но я видел как не настолько "умный" компилятор транслирует setPin(Port, pin) = Port |= (1<<pin) как movlw 4; iorwf PORTB,f, а это уже две инструкции.

 

это шутка?

чего-то он путает конечно =)

Это вы зря Alex B._, к людям так, с пренебрежением относитесь ...

Изменено пользователем evc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Адрес каждого бита получается, как комбинация из адреса байта и номер бита. А номер бита это и есть его адрес в рамках байта. Вот поэтому, думаю, вполне справедливо сказать, что у каждого бита есть собственный, уникальный адрес.
Сказать-то так можно, но точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный. Более того, он самый обычный, ибо команды bcf, bsf являются read-modify-write для всего байта, т.е. происходит чтение-запись всех битов регистра. С этим связана их особенность, когда такая команда, выполненная для одного из битов PORTx может изменить содержимое битов, выводы которых настроены на ввод. Т.е. фактически команда реализуется тремя действиями - чтение, наложение маски по И/ИЛИ, запись результата. То, что это выполняется одной командой, а не тремя - в контексте "адресуемости" несущественно.

Что нельзя сказать, например, о х51-ых, т.к. у них нельзя выше определенного адреса обращаться напрямую к битам.
Можно точно также делать чтение-наложение маски-запись. Зато до этого адреса можно обращаться действительно к конкретному биту, никоим образом не "задевая" соседние. Вот именно это (насколько я понимаю) называется "каждый бит имеет собственный адрес".

Насчет макросов, если ваш компилятор такой "умный", то да, вы правы. Но я видел как не настолько "умный" компилятор транслирует setPin(Port, pin) = Port |= (1<<pin) как movlw 4; iorwf PORTB,f, а это уже две инструкции.
Я обычно смотрю в листинг. Такое поведение тоже встречал, но в довольно старых компиляторах и при отключенной оптимизации. При включении оптимизации все опробованные в последнее время компиляторы делают все как надо, а я всегда компилирую с включенной оптимизацией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет адреса у каждого бита - конечно есть. Вся память ПИК-ов побитово адресируемая.

Что за бред? Память пиков не адресуема побитово, шина адреса - 8 бит + переключение банков. Это чисто фича хай-тека, за счет которой первые версии компилятора при использовании битовых переменных уделали старинный микрочиповский компилер, о котором сейчас никто не помнит. Обращение к битовой переменной компилируется в bsf/bcf/btfss/btfsc, вот и все. Хай-тек просто облегчил себе задачу, усложнив жизнь программистам, которые сейчас потихоньку перетаскивают код на более современные архитектуры.

С точки зрения хай-тека у каждого микрочиповского бита адрес есть, но говорить так нельзя. Некоторые и MCC18 и IAR-ом пользуются.

 

Вот вам другой пример - Cortex-M3. Тут уже можно сказать, что у каждого бита есть свой адрес, потому как есть адресуемые "bit-bang" области. Запись по выровненному адресу 1 устанавливает соответствующий бит, запись 0 - сбрасывает, аналогично чтение. И это фича архитектуры а не компилятора, которая позволяет с битами работать атомарно

Это вы зря Alex B._, к людям так, с пренебрежением относитесь ...

угу... смайлика :crying: только не хватает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный...

 

В том то и дело, что нельзя (одной инструкцией). Не смотря на то, что у него инструкция выполняется за 12(и до 48) тактов, в 89C52 нельзя написать: SETB register.3 (например), если register находится за адрес 0х2F. Можно, конечно, организовать что-то подобное RMW, но это уже будут как минимум 3 инструкции. В связи с этим я могу получить на выходе ПИК-а 5МГц при 10МГц такт (системный), но это невыполнимо у АРМ-ах, например...

 

...Это чисто фича хай-тека, за счет которой первые версии компилятора при использовании битовых переменных уделали старинный микрочиповский компилер, о котором сейчас никто не помнит...

Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича".

О, и Алекс, а м.п.ф! :laughing: (вот и смайлик, должно хватить уже!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича".

еще раз - наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина. Это именно инструкции работы с битами и ничего больше.

Я вам привел хороший пример с Cortex-ом - вот там биты адресуются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина...

 

Выходит у вас не читать внимательно это рецидив. :)

Вот вам объяснение этого "несуществующего" термина:

Дефиниция за: Адресуемость

Достижимость. Когда что-то бывает адресуемое, его можно распознать и манипулировать, не трогая его окружения. Например, пикселы экрана и РАМ память адресуемые. Каждого элемента картинки на экране можно включать/выключать (засветит/затемнить), и каждую ячейку (каждого байта) памяти тоже можно записать и читать независимо от остальных.

Оригинал на английском здесь.

А если еще сомневаетесь в (не)существованием этого термина, напишите в поисковике "bit-addressable". Может быть и удивитесь ...

Что еще сказать? С наступающим праздником! :beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот вам объяснение этого "несуществующего" термина:
Термин существует. Но то, что есть у ПИКов - не битово-адресуемая память. Я вам уже приводил пример, когда доступ к такому "битово-адресуемому" биту приводит к порче соседних. Именно потому, что память - байтово-адресуемая. Попробую еще такой аргумент: раз каждый бит имеет адрес, значит можно завести указатель на бит и работать с конкретным битом через такой указатель?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

 

Да, я согласен, что они это криво сделали. Скорее всего отмазались...

И да, я согласен, что в других процессорах это сделано по-настоящему. Но в сравнение с х51-ой серии, для меня доступность каждого бита - плюс. Будь осторожным при работе с портами и все!

Вот поэтому (и не только, но с большим сожалением!) в свое время и перешел на ПИК-ах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость DL36
А существо вопроса в том, что в макросе я указываю не конкретный регистр (PORTx, TRISx, LATx), а имя порта (A, B, C) и уже внутри макроса из него получается имя нужного регистра в зависимости от необходимого действия. При использовании битовых полей такое невозможно.

Действительно очень удобно, и С30 прекрасно все понимает.

Вопрос такого плана третий параметр в #define LED A, 1, H определяет направление передачи вход/выход я правильно понял? Или это способ коммутации выхода с помощью LATx или TRISx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно очень удобно, и С30 прекрасно все понимает.

Вопрос такого плана третий параметр в #define LED A, 1, H определяет направление передачи вход/выход я правильно понял? Или это способ коммутации выхода с помощью LATx или TRISx

Этот параметр определяет активный уровень сигнала

H - активный уровень высокий,

L - активный уровень низкий.

 

Соответственно макросы, которые оперируют АКТИВНЫМ или ПАССИВНЫМ уровнями порта, будут ориентироваться на этот параметр.

 

Пример:

#define  LED    A, 1, L

On(LED); // Установить порт RA1 в НИЗКИЙ уровень (перевести в АКТИВНЫЙ уровень).

 

Вот вам для примера мой файл макросов для AVR-ок. Переделать под ПИКи не сложно.

Авторство не мое, я только под свои пристрастия кое-что изменил. Авторы указаны в шапке, народ их должен знать :a14:

portmacros.txt

(расширение поменяйте на portmacros.h)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость DL36
Этот параметр определяет активный уровень сигнала

H - активный уровень высокий,

L - активный уровень низкий.

 

Соответственно макросы, которые оперируют АКТИВНЫМ или ПАССИВНЫМ уровнями порта, будут ориентироваться на этот параметр.

 

Пример:

#define  LED    A, 1, L

On(LED); // Установить порт RA1 в НИЗКИЙ уровень (перевести в АКТИВНЫЙ уровень).

 

Вот вам для примера мой файл макросов для AVR-ок. Переделать под ПИКи не сложно.

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

Конечно должен, спасибо.

 

Вот ... сразу не догадался что Н это высокий.

 

Я еще использую режим работы по типу открытого стока записав в защелку порта 0 и переключая его с выхода на вход и обратно. Букву тогда надо написать наверно OD.

 

А вообще спасибо, давно искал нечто подобное но не мог определится с тем, что нужно.

Мой вариант добавил работу с открытым стоком и аналоговыми входами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость DL36

Атомарная работа с портами в С30 статья

и откорректированный макрос для атомарной работы с портами в С30

 

Тема началась тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Атомарная работа с портами в С30

Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость DL36
Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения. :)

Попробуйте.

Хотя макросы Алекса и мои тоже не самоделка, и вполне прилично работают. Если интересно на сахаре год назад бурное обсуждение было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...