|
|
  |
Компилятор С for PIC |
|
|
|
Dec 24 2007, 12:08
|

Местный
  
Группа: Свой
Сообщений: 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
--------------------
УЭР
|
|
|
|
|
Dec 26 2007, 18:43
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 26 2007, 20:55
|

Знающий
   
Группа: Свой
Сообщений: 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._, к людям так, с пренебрежением относитесь ... угу... смайлика  только не хватает...
|
|
|
|
|
Dec 27 2007, 16:36
|

Местный
  
Группа: Свой
Сообщений: 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 здесь ни при чем и это именно архитектурная "фича". О, и Алекс, а м.п.ф!  (вот и смайлик, должно хватить уже!)
--------------------
УЭР
|
|
|
|
|
Dec 28 2007, 15:08
|

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

|
Цитата(Alex B._ @ Dec 28 2007, 11:54)  ...наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина... Выходит у вас не читать внимательно это рецидив. Вот вам объяснение этого "несуществующего" термина: Цитата Дефиниция за: Адресуемость Достижимость. Когда что-то бывает адресуемое, его можно распознать и манипулировать, не трогая его окружения. Например, пикселы экрана и РАМ память адресуемые. Каждого элемента картинки на экране можно включать/выключать (засветит/затемнить), и каждую ячейку (каждого байта) памяти тоже можно записать и читать независимо от остальных. Оригинал на английском здесь. А если еще сомневаетесь в (не)существованием этого термина, напишите в поисковике "bit-addressable". Может быть и удивитесь ... Что еще сказать? С наступающим праздником!
--------------------
УЭР
|
|
|
|
|
Dec 29 2007, 06:10
|

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

|
Цитата(Сергей Борщ @ Dec 28 2007, 21:34)  ... Да, я согласен, что они это криво сделали. Скорее всего отмазались... И да, я согласен, что в других процессорах это сделано по-настоящему. Но в сравнение с х51-ой серии, для меня доступность каждого бита - плюс. Будь осторожным при работе с портами и все! Вот поэтому (и не только, но с большим сожалением!) в свое время и перешел на ПИК-ах.
--------------------
УЭР
|
|
|
|
|
Mar 1 2009, 16:20
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 1 2009, 21:20
|

Просто 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-ок. Переделать под ПИКи не сложно. Авторство не мое, я только под свои пристрастия кое-что изменил. Авторы указаны в шапке, народ их должен знать
portmacros.txt ( 3.72 килобайт )
Кол-во скачиваний: 1347(расширение поменяйте на portmacros.h)
|
|
|
|
|
Mar 2 2009, 06:10
|
Местный
  
Группа: Свой
Сообщений: 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. А вообще спасибо, давно искал нечто подобное но не мог определится с тем, что нужно. Мой вариант добавил работу с открытым стоком и аналоговыми входами.
|
|
|
|
|
Mar 3 2009, 15:56
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Атомарная работа с портами в С30 статьяи откорректированный макрос для атомарной работы с портами в С30 Тема началась тут.
|
|
|
|
|
Mar 26 2010, 17:36
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(_Pasha @ Mar 26 2010, 19:02)  Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения.  Попробуйте. Хотя макросы Алекса и мои тоже не самоделка, и вполне прилично работают. Если интересно на сахаре год назад бурное обсуждение было.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|