Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 9 64

Шикарно! Попробую.

 

Ув picmaniac, "функциональной" записью в С используются по двум причинам - во-первых, это хорошо укладывается в идеологию С, а, во-вторых, в такой нотации программируются препроцессорые макросы. Можно реально получить переносимый (почти) код - просто под каждый микроконтроллер разработчиком этого микроконтроллера пишется свой *.h, а уж какие он там регистры вместо этого вызова подставит - на то пользователю наплевать. В таком варианте и с AVR на PIC можно без проблем переехать, а если у Вас явно расписаны присваивания регистрам, как Вы привели в примере, все это придется потом руками переписывать. Переносимость программ на С не возникает сама по себе, как пытаются уверить некоторые участники форума, для этого все-таки требуется соблюдение некоторых правил при написании программ. Во многих книгах по С присутствует раздел, посвященный тому, как правильно писать программы, от которых требуется переносимость. Использование препроцессорных макросов - одна из типовых рекомендаций.

 

chav1961: Можно реально получить переносимый (почти) код

Вот именно, что почти. Всё равно периферия у контроллеров разная, и с ней разбираться придётся.
Мне лично больше по душе запись TRISA=xxx, чем set_tris_a(xxx). По крайней мере, в первом случае для написания программы достаточно даташита на контроллер, а во втором - придётся изучать ещё и все эти set_...

 

АНТОХА, в том, что приходится разбираться с периферией и читать даташиты, по большому счету, сами производители микроконтроллеров и виноваты. В стандарте С для нормальных компьютеров ведь оговорены не только правила языка, но и набор стандартных функций. На любой платформе можно употребить malloc, printf, getc, strcmp (если она там вообще реализована) и получится именно то, что от них ожидают. Разработчикам же микроконтроллеров было просто влом собраться вместе и оговорить более-менее типичный набор функций, требуемых для работы с микроконтроллерами. Что, трудно было напридумывать функций навроде getPort(имя порта), setPort(имя порта,значение), startTimer(номер таймера) и тому подобные? Что, есть какие-то уникальные способы работы с портом, например, которые никакими силами невозможно унифицировать? Народ бы пользовался этим набором функций во всех программах для всех микроконтроллеров, и горя бы не знал ни с переносимостью, ни с пониманием смысла написанного. Одна из задач любого языка программирования высокого уровня как раз в том и заключается, чтобы по возможности абстрагироваться от конкретной вычислительной среды.

 

chav1961: Разработчикам же микроконтроллеров было просто влом собраться вместе и оговорить более-менее типичный набор функций, требуемых для работы с микроконтроллерами.

Видимо, они в этом не заинтересованы? Привязывают пользователя к своему продукту?

С другой стороны, если что-то можно решить не уходя от стандарта (а запись TRISA=xxx - стандарту соответствует), то наверное не надо городить что-то своё?

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

Объявляется нога:


#define SOME_PIN A, 2, L

(порт, номер бита в порту, активное состояние (L/H))

в программе пишем:


direct(SOME_PIN, O);

для настройки ноги как выхода, или

direct(SOME_PIN, I);

- как входа.

И потом работаем с ней:


on(SOME_PIN);
off(SOME_PIN);
if (signal(SOME_PIN)) ...

Этот набор макросов портирован для MSP, AVR, Fujitsu, x51...
Для ПИКов - не встречал, но возможно имеется.

файл для АВР прилагается

71987.h

 

От конкретики нам никуда не деться даже при написании проги на Си. Не стоит забывать что стартовый размер оперативы 128 байт и с памятью программ негусто. Вот пример:мне нужна была функция itoa, если кто не знает, это перевод IntegerToAscii. В хайтеке ее вообще сделать не потрудились, пришлось самому писать. Так вот, в стандартных библиотеках еще идет проверка на правильность значения основания. Поскольку мне нужно было переводить только десятичные числа, я проверку значения основания благополучно опустил чем выиграл бару байт и сократил время выполнения на несколько циклов. Не, ну если скорость в приложении не очень требуется то в принципе можно стандартной пользоваться. Ресурсов мало, поетому я считаю что лучше знать всю эту конкретику, чтобы расходовать ресурсы оптимально. По этому поводу есть рассказик на сахаре http://www.caxapa.ru/story/1byte.html

 

Ура! Корифеи подключились. Отлично, так держать!
Zandy, как успехи в борьбе против глюков? Если есть конкретные вопросы, пришлите почтой, я поразмыслю. Тут мне трудновато за всем уследить, захожу урывками.

 

Присоединяюсь Язык С действительно существует не как замена ассемблеру. На языки программирования высокого уровня перешли не потому, что всем вдруг захотелось писать медленные и жадные до ресурсов программы, а для того, чтобы не истекать кровью на разработке каждой новой системы, и не трястись в ней за каждый байт и каждую микросекунду. Зарплаты у зарубежных (да и у некоторых наших) программеров измеряются уже десятком килобаксов. Если такой программер потратит на систему хотя бы на полмесяца меньше, на сэкономленные пять килобаксов можно столько нормальных микроконтроллеров накупить... А на серьезных проектах таких людей не по одному человеку сидит.

 

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

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

 

Zаndy, а что за девайсик, если не секрет?