реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Компилятор С for PIC
evc
сообщение Dec 24 2007, 12:08
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(Сергей Борщ @ Dec 22 2007, 00:52) *
...С каких пор у ПИКов каждый бит порта имеет свой адрес?...


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

Цитата(Alex. B_ @ Dec 20 2007, 21:20) *
это шутка?

Цитата(Alex. B_ @ Dec 22 2007, 01:21) *
чего-то он путает конечно =)

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

Сообщение отредактировал evc - Dec 24 2007, 12:10


--------------------
УЭР
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2007, 18:43
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(evc @ Dec 24 2007, 14:08) *
Адрес каждого бита получается, как комбинация из адреса байта и номер бита. А номер бита это и есть его адрес в рамках байта. Вот поэтому, думаю, вполне справедливо сказать, что у каждого бита есть собственный, уникальный адрес.
Сказать-то так можно, но точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный. Более того, он самый обычный, ибо команды bcf, bsf являются read-modify-write для всего байта, т.е. происходит чтение-запись всех битов регистра. С этим связана их особенность, когда такая команда, выполненная для одного из битов PORTx может изменить содержимое битов, выводы которых настроены на ввод. Т.е. фактически команда реализуется тремя действиями - чтение, наложение маски по И/ИЛИ, запись результата. То, что это выполняется одной командой, а не тремя - в контексте "адресуемости" несущественно.
Цитата(evc @ Dec 24 2007, 14:08) *
Что нельзя сказать, например, о х51-ых, т.к. у них нельзя выше определенного адреса обращаться напрямую к битам.
Можно точно также делать чтение-наложение маски-запись. Зато до этого адреса можно обращаться действительно к конкретному биту, никоим образом не "задевая" соседние. Вот именно это (насколько я понимаю) называется "каждый бит имеет собственный адрес".
Цитата(evc @ Dec 24 2007, 14:08) *
Насчет макросов, если ваш компилятор такой "умный", то да, вы правы. Но я видел как не настолько "умный" компилятор транслирует setPin(Port, pin) = Port |= (1<<pin) как movlw 4; iorwf PORTB,f, а это уже две инструкции.
Я обычно смотрю в листинг. Такое поведение тоже встречал, но в довольно старых компиляторах и при отключенной оптимизации. При включении оптимизации все опробованные в последнее время компиляторы делают все как надо, а я всегда компилирую с включенной оптимизацией.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Dec 26 2007, 20:55
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(evc @ Dec 24 2007, 15:08) *
Насчет адреса у каждого бита - конечно есть. Вся память ПИК-ов побитово адресируемая.

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

Вот вам другой пример - Cortex-M3. Тут уже можно сказать, что у каждого бита есть свой адрес, потому как есть адресуемые "bit-bang" области. Запись по выровненному адресу 1 устанавливает соответствующий бит, запись 0 - сбрасывает, аналогично чтение. И это фича архитектуры а не компилятора, которая позволяет с битами работать атомарно
Цитата(evc @ Dec 24 2007, 15:08) *
Это вы зря Alex B._, к людям так, с пренебрежением относитесь ...

угу... смайлика crying.gif только не хватает...
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 27 2007, 16:36
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(Сергей Борщ @ Dec 26 2007, 21:43) *
...точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный...


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

Цитата(Alex B._ @ Dec 26 2007, 23:55) *
...Это чисто фича хай-тека, за счет которой первые версии компилятора при использовании битовых переменных уделали старинный микрочиповский компилер, о котором сейчас никто не помнит...

Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича".
О, и Алекс, а м.п.ф! laughing.gif (вот и смайлик, должно хватить уже!)


--------------------
УЭР
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Dec 28 2007, 08:54
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(evc @ Dec 27 2007, 19:36) *
Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича".

еще раз - наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина. Это именно инструкции работы с битами и ничего больше.
Я вам привел хороший пример с Cortex-ом - вот там биты адресуются
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 28 2007, 15:08
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(Alex B._ @ Dec 28 2007, 11:54) *
...наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина...


Выходит у вас не читать внимательно это рецидив. smile.gif
Вот вам объяснение этого "несуществующего" термина:
Цитата
Дефиниция за: Адресуемость
Достижимость. Когда что-то бывает адресуемое, его можно распознать и манипулировать, не трогая его окружения. Например, пикселы экрана и РАМ память адресуемые. Каждого элемента картинки на экране можно включать/выключать (засветит/затемнить), и каждую ячейку (каждого байта) памяти тоже можно записать и читать независимо от остальных.

Оригинал на английском здесь.
А если еще сомневаетесь в (не)существованием этого термина, напишите в поисковике "bit-addressable". Может быть и удивитесь ...
Что еще сказать? С наступающим праздником! beer.gif


--------------------
УЭР
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 28 2007, 18:34
Сообщение #37


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(evc @ Dec 28 2007, 17:08) *
Вот вам объяснение этого "несуществующего" термина:
Термин существует. Но то, что есть у ПИКов - не битово-адресуемая память. Я вам уже приводил пример, когда доступ к такому "битово-адресуемому" биту приводит к порче соседних. Именно потому, что память - байтово-адресуемая. Попробую еще такой аргумент: раз каждый бит имеет адрес, значит можно завести указатель на бит и работать с конкретным битом через такой указатель?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
evc
сообщение Dec 29 2007, 06:10
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(Сергей Борщ @ Dec 28 2007, 21:34) *
...


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


--------------------
УЭР
Go to the top of the page
 
+Quote Post
DL36
сообщение Mar 1 2009, 16:20
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(Сергей Борщ @ Dec 21 2007, 20:25) *
А существо вопроса в том, что в макросе я указываю не конкретный регистр (PORTx, TRISx, LATx), а имя порта (A, B, C) и уже внутри макроса из него получается имя нужного регистра в зависимости от необходимого действия. При использовании битовых полей такое невозможно.

Действительно очень удобно, и С30 прекрасно все понимает.
Вопрос такого плана третий параметр в #define LED A, 1, H определяет направление передачи вход/выход я правильно понял? Или это способ коммутации выхода с помощью LATx или TRISx
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 1 2009, 21:20
Сообщение #40


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(DL36 @ Mar 1 2009, 18:20) *
Действительно очень удобно, и С30 прекрасно все понимает.
Вопрос такого плана третий параметр в #define LED A, 1, H определяет направление передачи вход/выход я правильно понял? Или это способ коммутации выхода с помощью LATx или TRISx

Этот параметр определяет активный уровень сигнала
H - активный уровень высокий,
L - активный уровень низкий.

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

Пример:
Код
#define  LED    A, 1, L

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


Вот вам для примера мой файл макросов для AVR-ок. Переделать под ПИКи не сложно.
Авторство не мое, я только под свои пристрастия кое-что изменил. Авторы указаны в шапке, народ их должен знать a14.gif
Прикрепленный файл  portmacros.txt ( 3.72 килобайт ) Кол-во скачиваний: 1347

(расширение поменяйте на portmacros.h)
Go to the top of the page
 
+Quote Post
DL36
сообщение Mar 2 2009, 06:10
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(Baser @ Mar 2 2009, 01:20) *
Этот параметр определяет активный уровень сигнала
H - активный уровень высокий,
L - активный уровень низкий.

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

Пример:
Код
#define  LED    A, 1, L

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


Вот вам для примера мой файл макросов для AVR-ок. Переделать под ПИКи не сложно.
Авторство не мое, я только под свои пристрастия кое-что изменил. Авторы указаны в шапке, народ их должен знать
Конечно должен, спасибо.

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

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

А вообще спасибо, давно искал нечто подобное но не мог определится с тем, что нужно.
Мой вариант добавил работу с открытым стоком и аналоговыми входами.
Go to the top of the page
 
+Quote Post
DL36
сообщение Mar 3 2009, 15:56
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



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

Тема началась тут.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 26 2010, 16:02
Сообщение #43


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(DL36 @ Mar 3 2009, 19:56) *
Атомарная работа с портами в С30

Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения. smile.gif
Go to the top of the page
 
+Quote Post
DL36
сообщение Mar 26 2010, 17:36
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



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

Попробуйте.
Хотя макросы Алекса и мои тоже не самоделка, и вполне прилично работают. Если интересно на сахаре год назад бурное обсуждение было.
Go to the top of the page
 
+Quote Post
_Макс
сообщение Feb 26 2011, 15:56
Сообщение #45


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Что можно использовать для PIC10? IAR и MPLAB его не поддерживают sad.gif
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 20:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01519 секунд с 7
ELECTRONIX ©2004-2016