evc 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 (изменено) · Жалоба ...С каких пор у ПИКов каждый бит порта имеет свой адрес?... Сергей, сразу хочу уточнить, что я с вами не спорю. Вы нашли себе способ делать "переносимые" программы, вот и хорошо! Я просто хотел вам напомнить, что есть и другие способы обращаться к битам в ПИК-ах. Мне кажется, что так легче "общаться" с ними, но это только (одно) мнение. Насчет адреса у каждого бита - конечно есть. Вся память ПИК-ов побитово адресируемая. Каждому биту можно присвоит этикетку. Адрес каждого бита получается, как комбинация из адреса байта и номер бита. А номер бита это и есть его адрес в рамках байта. Вот поэтому, думаю, вполне справедливо сказать, что у каждого бита есть собственный, уникальный адрес. Что нельзя сказать, например, о х51-ых, т.к. у них нельзя выше определенного адреса обращаться напрямую к битам. Насчет макросов, если ваш компилятор такой "умный", то да, вы правы. Но я видел как не настолько "умный" компилятор транслирует setPin(Port, pin) = Port |= (1<<pin) как movlw 4; iorwf PORTB,f, а это уже две инструкции. это шутка? чего-то он путает конечно =) Это вы зря Alex B._, к людям так, с пренебрежением относитесь ... Изменено 24 декабря, 2007 пользователем evc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 декабря, 2007 Опубликовано 26 декабря, 2007 · Жалоба Адрес каждого бита получается, как комбинация из адреса байта и номер бита. А номер бита это и есть его адрес в рамках байта. Вот поэтому, думаю, вполне справедливо сказать, что у каждого бита есть собственный, уникальный адрес.Сказать-то так можно, но точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный. Более того, он самый обычный, ибо команды bcf, bsf являются read-modify-write для всего байта, т.е. происходит чтение-запись всех битов регистра. С этим связана их особенность, когда такая команда, выполненная для одного из битов PORTx может изменить содержимое битов, выводы которых настроены на ввод. Т.е. фактически команда реализуется тремя действиями - чтение, наложение маски по И/ИЛИ, запись результата. То, что это выполняется одной командой, а не тремя - в контексте "адресуемости" несущественно. Что нельзя сказать, например, о х51-ых, т.к. у них нельзя выше определенного адреса обращаться напрямую к битам.Можно точно также делать чтение-наложение маски-запись. Зато до этого адреса можно обращаться действительно к конкретному биту, никоим образом не "задевая" соседние. Вот именно это (насколько я понимаю) называется "каждый бит имеет собственный адрес". Насчет макросов, если ваш компилятор такой "умный", то да, вы правы. Но я видел как не настолько "умный" компилятор транслирует setPin(Port, pin) = Port |= (1<<pin) как movlw 4; iorwf PORTB,f, а это уже две инструкции.Я обычно смотрю в листинг. Такое поведение тоже встречал, но в довольно старых компиляторах и при отключенной оптимизации. При включении оптимизации все опробованные в последнее время компиляторы делают все как надо, а я всегда компилирую с включенной оптимизацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex B._ 0 26 декабря, 2007 Опубликовано 26 декабря, 2007 · Жалоба Насчет адреса у каждого бита - конечно есть. Вся память ПИК-ов побитово адресируемая. Что за бред? Память пиков не адресуема побитово, шина адреса - 8 бит + переключение банков. Это чисто фича хай-тека, за счет которой первые версии компилятора при использовании битовых переменных уделали старинный микрочиповский компилер, о котором сейчас никто не помнит. Обращение к битовой переменной компилируется в bsf/bcf/btfss/btfsc, вот и все. Хай-тек просто облегчил себе задачу, усложнив жизнь программистам, которые сейчас потихоньку перетаскивают код на более современные архитектуры. С точки зрения хай-тека у каждого микрочиповского бита адрес есть, но говорить так нельзя. Некоторые и MCC18 и IAR-ом пользуются. Вот вам другой пример - Cortex-M3. Тут уже можно сказать, что у каждого бита есть свой адрес, потому как есть адресуемые "bit-bang" области. Запись по выровненному адресу 1 устанавливает соответствующий бит, запись 0 - сбрасывает, аналогично чтение. И это фича архитектуры а не компилятора, которая позволяет с битами работать атомарно Это вы зря Alex B._, к людям так, с пренебрежением относитесь ... угу... смайлика :crying: только не хватает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 27 декабря, 2007 Опубликовано 27 декабря, 2007 · Жалоба ...точно так же через пару {адрес байта, номер бита} можно обратиться к любому отраженному на память биту любого контроллера, и микрочип здесь никакой не особенный... В том то и дело, что нельзя (одной инструкцией). Не смотря на то, что у него инструкция выполняется за 12(и до 48) тактов, в 89C52 нельзя написать: SETB register.3 (например), если register находится за адрес 0х2F. Можно, конечно, организовать что-то подобное RMW, но это уже будут как минимум 3 инструкции. В связи с этим я могу получить на выходе ПИК-а 5МГц при 10МГц такт (системный), но это невыполнимо у АРМ-ах, например... ...Это чисто фича хай-тека, за счет которой первые версии компилятора при использовании битовых переменных уделали старинный микрочиповский компилер, о котором сейчас никто не помнит... Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича". О, и Алекс, а м.п.ф! :laughing: (вот и смайлик, должно хватить уже!) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex B._ 0 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба Читайте внимательнее, HI-TECH здесь ни при чем и это именно архитектурная "фича". еще раз - наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина. Это именно инструкции работы с битами и ничего больше. Я вам привел хороший пример с Cortex-ом - вот там биты адресуются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба ...наличие битовых операций во всей адресуемой памяти нельзя называть "побитовой адресуемостью", нет такого термина... Выходит у вас не читать внимательно это рецидив. :) Вот вам объяснение этого "несуществующего" термина: Дефиниция за: Адресуемость Достижимость. Когда что-то бывает адресуемое, его можно распознать и манипулировать, не трогая его окружения. Например, пикселы экрана и РАМ память адресуемые. Каждого элемента картинки на экране можно включать/выключать (засветит/затемнить), и каждую ячейку (каждого байта) памяти тоже можно записать и читать независимо от остальных. Оригинал на английском здесь. А если еще сомневаетесь в (не)существованием этого термина, напишите в поисковике "bit-addressable". Может быть и удивитесь ... Что еще сказать? С наступающим праздником! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 28 декабря, 2007 Опубликовано 28 декабря, 2007 · Жалоба Вот вам объяснение этого "несуществующего" термина:Термин существует. Но то, что есть у ПИКов - не битово-адресуемая память. Я вам уже приводил пример, когда доступ к такому "битово-адресуемому" биту приводит к порче соседних. Именно потому, что память - байтово-адресуемая. Попробую еще такой аргумент: раз каждый бит имеет адрес, значит можно завести указатель на бит и работать с конкретным битом через такой указатель? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 29 декабря, 2007 Опубликовано 29 декабря, 2007 · Жалоба ... Да, я согласен, что они это криво сделали. Скорее всего отмазались... И да, я согласен, что в других процессорах это сделано по-настоящему. Но в сравнение с х51-ой серии, для меня доступность каждого бита - плюс. Будь осторожным при работе с портами и все! Вот поэтому (и не только, но с большим сожалением!) в свое время и перешел на ПИК-ах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость DL36 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба А существо вопроса в том, что в макросе я указываю не конкретный регистр (PORTx, TRISx, LATx), а имя порта (A, B, C) и уже внутри макроса из него получается имя нужного регистра в зависимости от необходимого действия. При использовании битовых полей такое невозможно. Действительно очень удобно, и С30 прекрасно все понимает. Вопрос такого плана третий параметр в #define LED A, 1, H определяет направление передачи вход/выход я правильно понял? Или это способ коммутации выхода с помощью LATx или TRISx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 1 марта, 2009 Опубликовано 1 марта, 2009 · Жалоба Действительно очень удобно, и С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 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Этот параметр определяет активный уровень сигнала H - активный уровень высокий, L - активный уровень низкий. Соответственно макросы, которые оперируют АКТИВНЫМ или ПАССИВНЫМ уровнями порта, будут ориентироваться на этот параметр. Пример: #define LED A, 1, L On(LED); // Установить порт RA1 в НИЗКИЙ уровень (перевести в АКТИВНЫЙ уровень). Вот вам для примера мой файл макросов для AVR-ок. Переделать под ПИКи не сложно. Авторство не мое, я только под свои пристрастия кое-что изменил. Авторы указаны в шапке, народ их должен знать Конечно должен, спасибо. Вот ... сразу не догадался что Н это высокий. Я еще использую режим работы по типу открытого стока записав в защелку порта 0 и переключая его с выхода на вход и обратно. Букву тогда надо написать наверно OD. А вообще спасибо, давно искал нечто подобное но не мог определится с тем, что нужно. Мой вариант добавил работу с открытым стоком и аналоговыми входами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость DL36 3 марта, 2009 Опубликовано 3 марта, 2009 · Жалоба Атомарная работа с портами в С30 статья и откорректированный макрос для атомарной работы с портами в С30 Тема началась тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Атомарная работа с портами в С30 Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость DL36 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Я вот подумал, раз С30 по своей природе ГЦЦ-шный, можно туда притянуть конструкции атомарного доступа из WinAVR (atomic.h) - как образец самого элегантного решения. :) Попробуйте. Хотя макросы Алекса и мои тоже не самоделка, и вполне прилично работают. Если интересно на сахаре год назад бурное обсуждение было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Maks 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Что можно использовать для PIC10? IAR и MPLAB его не поддерживают :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться