|
Компилятор С for PIC |
|
|
|
 |
Ответов
|
Dec 14 2007, 13:10
|

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

|
MPLAB - он вообще по жизни бесплатный. Под какое семейство-то компилер нужен? PIC16 - альтернативы Hi-Tech-у нет, есть на местном фтп в папке у Иваныча. PIC18 - в общем-то тоже хай-тек рулит, хотя есть люди, успешно пользующиеся родным MCC18 - если нужен программный стек и реентерабельность (хай тек этого не умеет) PIC24/dsPIC - только родный C30, без вариантов. PIC32 - родной C32, GreenHills-а пока в сети нет Как вариант под PIC16 и PIC18 - CCS (не путать с тексасовской средой =) - на фтп есть http://www.ccsinfo.com/SDCC - кроме того что он бесплатный ничего про него хорошего не слышал =)
|
|
|
|
|
Dec 17 2007, 06:08
|

Частый гость
 
Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344

|
Цитата(Сергей Борщ @ Dec 14 2007, 15:50)  Сравнивал с MCC18. Препроцессор MCC18 не смог правильно обработать макросы, за что и был забракован. Нормально работают макросы, препроц. великолепно все отрабатывает. Работал достаточно долго. Даже подумываю купить "честную" лицензию у МЕЛКОЧИПА  .
--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть" "Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
|
|
|
|
|
Dec 17 2007, 11:18
|

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

|
Цитата(volodya @ Dec 17 2007, 08:08)  Нормально работают макросы, Код #define LED A, 1, H #define _setH(port,bit) LAT##port |= (1 << bit) #define _clrH(port,bit) LAT##port &= ~(1 << bit) #define _set(port,bit,val) _set##val(port,bit) #define on(x) _set (x) #define _clr(port,bit,val) _clr##val(port,bit) #define off(x) _clr (x)
void Test() { on(LED); off(LED); } Не компилится. Путается в количестве аргументов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 18 2007, 07:16
|

Частый гость
 
Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344

|
Цитата(Сергей Борщ @ Dec 17 2007, 13:18)  void Test() { on(LED); off(LED); }[/code]Не компилится. Путается в количестве аргументов. Действительно! К сожалению для МСС Вы правы! Сам таких вложений не использовал. = Особенности системы.
Сообщение отредактировал volodya - Dec 18 2007, 07:20
--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть" "Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
|
|
|
|
|
Dec 20 2007, 11:25
|

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

|
Цитата(Сергей Борщ @ Dec 18 2007, 17:25)  А у меня это основной макрос доступа к портам. Поэтому более глубоко MCC тестировать не стал, хотя по описанию он действительно мощный. Обертка функций в макросы вообще нехорошо с микрочипом. Просто потому, что и симулятор и дебаггер MPLAB не умеют в них входить (то же относится к инлайновым функциям) - несмотря на компилер. Цитата А ИАР для дсПИКов? Такой ацтой, что и упоминать не стоит? Кто нить пробовал? Просто забыл. Вполне хороший и быстрый код. До кучи EC++, чего ни один другой компилер для микрочипа пока не имеет. НО! Без плагина к MPLAB-у использовать IAR нет смысла, потому как с железными отладчиками его среда не работатет, да и симулятор там откровенно поганый. А плагин есть только к старой версии IAR (1.20), которая знает только о старых контроллерах. Нового плагина к 1.30 я не нашел, поэтому =(((
|
|
|
|
|
Dec 20 2007, 14:50
|

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

|
Цитата(Сергей Борщ @ Dec 20 2007, 16:28)  ...объявить ногу в одном месте, и потом при необходимости в одном месте ее изменить - это гораздо удобнее и ошибкоустойчивее, чем во всем исходнике явно указывать порт и ногу. тогда в *.h файле просто запишите (MCC30): Код #define MyPin PORTB4 // (например) и потом везде где вам нужно обращаться к PORTB4, будете писать MyPin. Если нужно изменить, будете менять только в хедере.
--------------------
УЭР
|
|
|
|
|
Dec 20 2007, 15:31
|

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

|
Цитата(evc @ Dec 20 2007, 16:50)  Код #define MyPin PORTB4 // (например) Заманчиво, не знал.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 20 2007, 19:11
|

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

|
Цитата(Alex B._ @ Dec 20 2007, 20:20)  это шутка? Нет, просто не обратил внимания, что он умеет работать с битовыми переменными и что ноги портов объявлены как битовые переменные. Поскольку я пользуюсь компиляторами, в которых нет такого расширения, и часто приходится таскать код между разными платформами - привык пользоваться стандартными конструкциями типа port |= (1 << bit); В случае с битовыми переменными-выводами портов переносимости можно добиться, обернув их в макросы #define on(pin) pin = 1. Возьму на заметку. Но МСС18 использовать все равно не буду - этот проект уже закончен в SDCC, а новых на пиках, надеюсь, не будет. А если и будут - SDCC уже освоен и к эклипсе прикручен.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 21 2007, 15:50
|

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

|
Цитата(Сергей Борщ @ Dec 20 2007, 22:11)  Нет, просто не обратил внимания, что он умеет работать с битовыми переменными и что ноги портов объявлены как битовые переменные... Знаете, это не совсем так... Это особенность адресации в майкрочиповских контроллерах - у них каждый пин (вообще бит SFR) имеет свой адрес, как регистр (напр. адрес PORTB4 = @PORTB + 4). Вот поэтому, объявляя "#define MyPin PORTB4", указываете препроцессору, что значение этикетки MyPin будет равно адресу пина PORTB4. Это все равно записать Код unsigned char* MyPin; MyPin = @PORTB4;// = @PORTB + 4 (только это уже будет переменная в памяти процессора) Пользуясь подобными выражениями (#define ...), можете не только выставлять или обнулять данного пина, но и читать его состояние. Направление пина не можете менять, поскольку в ПИК-е этим обязан совсем другой регистр (TRIS).
--------------------
УЭР
|
|
|
|
|
Dec 21 2007, 17:25
|

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

|
Цитата(evc @ Dec 21 2007, 17:50)  Это особенность адресации в майкрочиповских контроллерах - у них каждый пин (вообще бит SFR) имеет свой адрес, Это что-то новенькое. С х51 не путаете? А существо вопроса в том, что в макросе я указываю не конкретный регистр (PORTx, TRISx, LATx), а имя порта (A, B, C) и уже внутри макроса из него получается имя нужного регистра в зависимости от необходимого действия. При использовании битовых полей такое невозможно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 21 2007, 20:40
|

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

|
Цитата(Сергей Борщ @ Dec 21 2007, 20:25)  Это что-то новенькое. С х51 не путаете?... Нет не новенькое (наверно я не очень, так, объяснил). У х51 немножко по-другому. У них регистр направления порта нет. Что бы настроит на вход нужно просто на порт выставить 1. В ПИК-ах есть регистр направления - именно TRIS (конечно, это вам хорошо известно). Дело в том, что вы о макросах говорите, а та конструкция, о которой я - обыкновенная директива препроцессора. Объявление константы "MyPin" со значением "адрес PORTB4". Мне, в принципе, макросы не нравятся, потому что они съедают програмную память. Но это стоит учитывать только на маленьких процессорах. Зато код выполняется (если пользуетесь макросами) быстрее.
--------------------
УЭР
|
|
|
|
|
Dec 21 2007, 21:52
|

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

|
Цитата(evc @ Dec 21 2007, 22:40)  Нет не новенькое (наверно я не очень, так, объяснил). У х51 немножко по-другому. У них регистр направления порта нет. Это-то понятно. С каких пор у ПИКов каждый бит порта имеет свой адрес? Цитата(evc @ Dec 21 2007, 22:40)  Мне, в принципе, макросы не нравятся, потому что они съедают програмную память. Тоже чудеса рассказываете. Используемый мной (приведенный выше) макрос on(LED) преобразуется препроцессором(!) в С-выражение LATx |= ( 1<< bit), что, в свою очередь, компилируется в команду BSF LATx, bit. Где съедание памяти?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
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 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". Может быть и удивитесь ... Что еще сказать? С наступающим праздником!
--------------------
УЭР
|
|
|
|
Сообщений в этой теме
phantom Компилятор С for PIC Dec 14 2007, 10:39 Сергей Борщ sdcc можно глянуть. Слегка глючный, но бесплатный. Dec 14 2007, 10:55 phantom А MPLAB полный случаем нигде не пробегал? Dec 14 2007, 11:52 vanner MPLAB - полнее не бывает . Сейчас с ней поставляет... Dec 14 2007, 13:02                Alex B._ Цитата(Сергей Борщ @ Dec 22 2007, 00:52) ... Dec 21 2007, 22:21                     Сергей Борщ Цитата(evc @ Dec 28 2007, 17:08) Вот вам ... Dec 28 2007, 18:34                      evc Цитата(Сергей Борщ @ Dec 28 2007, 21:34) ... Dec 29 2007, 06:10                 Alex B._ Цитата(evc @ Dec 24 2007, 15:08) Насчет а... Dec 26 2007, 20:55              DL36 Цитата(Сергей Борщ @ Dec 21 2007, 20:25) ... Mar 1 2009, 16:20               Baser Цитата(DL36 @ Mar 1 2009, 18:20) Действит... Mar 1 2009, 21:20                DL36 Цитата(Baser @ Mar 2 2009, 01:20) Этот па... Mar 2 2009, 06:10                 DL36 Атомарная работа с портами в С30 статья
и откоррек... Mar 3 2009, 15:56                  _Pasha Цитата(DL36 @ Mar 3 2009, 19:56) Атомарна... Mar 26 2010, 16:02                   DL36 Цитата(_Pasha @ Mar 26 2010, 19:02) Я вот... Mar 26 2010, 17:36          Baser Цитата(Сергей Борщ @ Dec 20 2007, 17:31) ... Dec 20 2007, 20:06           Сергей Борщ Цитата(Baser @ Dec 20 2007, 22:06) И в ИА... Dec 20 2007, 20:20            Baser Цитата(Сергей Борщ @ Dec 20 2007, 22:20) ... Dec 21 2007, 11:53             Сергей Борщ Цитата(Baser @ Dec 21 2007, 13:53) Да, к ... Dec 21 2007, 12:58              Baser Цитата(Сергей Борщ @ Dec 21 2007, 14:58) ... Dec 21 2007, 13:59    andron86 Цитата(Сергей Борщ @ Dec 17 2007, 12:18) ... Feb 26 2011, 16:44     zltigo QUOTE (andron86 @ Feb 26 2011, 19:44) Даа... Feb 26 2011, 17:03      andron86 Цитата(zltigo @ Feb 26 2011, 18:03) Незаб... Feb 27 2011, 17:02       zltigo QUOTE (andron86 @ Feb 27 2011, 20:02) Про... Feb 27 2011, 17:14        andron86 Цитата(zltigo @ Feb 27 2011, 18:14) именн... Feb 27 2011, 17:25         Сергей Борщ QUOTE (andron86 @ Feb 27 2011, 19:25) Как... Feb 27 2011, 18:19        andron86 Цитата(zltigo @ Feb 27 2011, 18:14) интер... Feb 27 2011, 18:29         Сергей Борщ QUOTE (andron86 @ Feb 27 2011, 20:29) мож... Feb 28 2011, 10:06 oran-be Цитата(Alex B._ @ Dec 14 2007, 17:10) MPL... Dec 19 2007, 11:58 phantom Надо под PIC16 - PIC18. Посмотрел на ФТП там в раз... Dec 17 2007, 12:25 DL36 Цитата(phantom @ Dec 17 2007, 16:25) Надо... Dec 17 2007, 14:01 Baser Цитата(evc @ Dec 21 2007, 17:50) Это особ... Dec 21 2007, 22:47 _Макс Что можно использовать для PIC10? IAR и MPLAB его ... Feb 26 2011, 15:56 testerplus Цитата(_Макс @ Feb 26 2011, 19:56) Что мо... Mar 5 2011, 05:56 loghir Подскажите ПЛЗ простейший исходник для тестировани... Mar 13 2011, 18:46 Ruslan1 Цитата(loghir @ Mar 13 2011, 20:46) Подск... Mar 13 2011, 20:52 loghir Ruslan1, спасибо!
МК - PIC16F628
В MPLAB IDE... Mar 14 2011, 09:41 Ruslan1 Цитата(loghir @ Mar 14 2011, 11:41) Rusla... Mar 14 2011, 21:19  Bronislav Цитата(Ruslan1 @ Mar 15 2011, 01:19) 4. А... Mar 15 2011, 00:46   Ruslan1 Цитата(Bronislav @ Mar 15 2011, 02:46) Во... Mar 15 2011, 07:56 loghir Поставил MPLAB IDE v8.30. (перезагрузил комп)
В ок... Mar 14 2011, 11:18 xemul Цитата(loghir @ Mar 14 2011, 14:18) Созда... Mar 14 2011, 13:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|