Перейти к содержанию

Несколько Вопросов: Выбор Компилятора, Использование Си


Рекомендуемые сообщения

Итак, после прочтения вводной документации и изучения архитектуры PIC-контроллеров среднего уровня, пришел к выводу, что для применения в радиолюбительской среде и для штучного изготовления устройств, ассемблер имеет мало смысла, т.к. достаточно сложен и запустан по сравнению с Си. У Си есть свои недостатки: это более громоздкая и соответственно более медленная программа, в сравнении с ассемблером, но как я уже сказал, любительское штучное изготовления устройств - это не массовый выпуск, где надо экономить на всем. Не хватило памяти? - не беда, возьмем контроллер побольше, да потолще biggrin.gif В общем, решил я, что на Си писать проще, быстрее и комфортнее.

В качестве компилятора выбрал ccs (ну просто в книге на его примере рассказывалось о Си). Попробовал сделать на базе контроллера 16F84A свою первую программу типа "hello world", по традиции мигание светодиодами (зеленый горит 2 сек, гаснет, мигает три раза красный и так по кругу), все получилось, с некоторыми оговорками (подробности ниже).

Теперь к вопросам.

1. Правильно ли я выбрал компилятор или есть что-то более религиозно верное?

2. Стоит ли использовать специфические конкретно для этого компилятора фичи, вроде #byte, #bit и т.д.? Т.к. многие, как я понял, ругают за использование этого функционала. Сам из минусов я вижу только отсутствие переносимости Си программ между компиляторами, в которых нет таких директив.

3. Как я понял, при написании своей первой программы, Си в контроллерах "не полноценный"? Конкретно столкнулся со следующей проблемой: компилятор ругался на цикл for, говорил, что эта часть кода не будет иметь эффекта, и действительно, после прошивки красный светодиод не моргал, см. скриншот. Т.е. получается чиклы for не поддерживаются? Т.к. после того как заменил его на цикл while - все заработало:

#include <main.h>


void main()
{

while(true)
{
output_high(LED_GREEN);
delay_ms(2000);
output_low(LED_GREEN);

int i = 3;
delay_ms(500);
while(i > 0){
output_high(LED_RED);
delay_ms(500);
output_low(LED_RED);
delay_ms(500);
i--;
}

}

}

4. И последний вопрос. Все же для общего развития хотел попробовать написать эту же программу на асме, пытаюсь создать проект в мплаб, указываю компилятор стандартный (см. 2 скрин) и получаю ошибку как на третьем скрине, что я делаю не так?

post-156072-0-70976200-1344768975_thumb.png

post-156072-0-78342100-1344769370_thumb.png

post-156072-0-48268400-1344769376_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

@metallic, и снова привет (usb 4550, если забыл) :)

Идем по порядку...

ассемблер имеет мало смысла, т.к. достаточно сложен и запустан по сравнению с Си
Заблуждение первое - ассемблер намного более логичен и прост, но это вырастает в огромную массу простейших конструкций, из-за чего и становится запутанным...
У Си есть свои недостатки: это более громоздкая и соответственно более медленная
Это имеет значение только в случае с очень профи программистом ассемблера под конкретную платформу, любую прошивку новичка на асме любой си компилятор сделает куда эффективней (еще пример - миф о быстродействии операционных систем реального времени - из-за эффективности приемов применяемых проф. программистами при написании RTOS, она кажется быстрей медленных алгоритмов новичков даже несмотря на отъём ресурсов на нужды самой RTOS)...
выбрал ccs ... 1. Правильно ли я выбрал компилятор или есть что-то более религиозно верное?
У меня тоже он, полностью си-совместимый, за исключением особенностей платформы, код делает хороший и т.д. ...

Стоит ли использовать специфические конкретно для этого компилятора фичи, вроде #byte, #bit и т.д.
Пока нет, в дальнейшем - по необходимости...
Си в контроллерах "не полноценный"
В контроллерах вообще нет Си, в них даже ассемблера нет, если на то пошло :) И именно в этом задача компилятора - сделать из легко-понятной человеку структуры список машинных команд...
компилятор ругался на цикл for, говорил, что эта часть кода не будет иметь эффекта
Вероятно следствие объявления переменной в самом цикле, либо неверное написание ++i сказалось...
Т.е. получается чиклы for не поддерживаются?
Куда-ж без них :D
int i = 3;
Весьма плохая привычка - объявлять переменные в теле функций, путаницы значительно больше в итоге. Это оправдывается только разве что в условиях ограниченной памяти и когда надо её динамично распределять в алгоритмах ветвления...
и получаю ошибку как на третьем скрине, что я делаю не так?
Кривой MPLAB, ругается на недостачу файлов...

___

Тьфу блин... Ты перепутал второй и третий аргумент для for... (int8 i=0;i<9;++i) {}...

Изменено пользователем NebsteR

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

что для применения в радиолюбительской среде и для штучного изготовления устройств, ассемблер имеет мало смысла, т.к. достаточно сложен и запустан по сравнению с Си. У Си есть свои недостатки: это более громоздкая и соответственно более медленная программа, в сравнении с ассемблером, но как я уже сказал, любительское штучное изготовления устройств - это не массовый выпуск, где надо экономить на всем. Не хватило памяти? - не беда, возьмем контроллер побольше, да потолще :D В общем, решил я, что на Си писать проще, быстрее и комфортнее

это заблуждение... именно для радиолюбительской среды лучше асм , помогает очень хорошо усвоить архитектуру МК. практически все команды асма это сокращения:

addwf REG,d

add = сложить

w = аккумулятор и

f = регистр где

REG = адрес регистра

d = указатель куда помещается результат в регистр или аккулулятор

на этом его преимущества перед Си заканчиваются...

а вот программы надо учится писать правильно...

то что вы написали иначе как быдлокод не назовешь: вогнать МК в ступор на две секунды командой delay_ms(2000) это в среднем два миллиона команд потерянных в пустую :( если так будите продолжать дальше, то большего как помигать СД вы от МК не добьетесь ;)

сходите на сайт Тимофеева там очень полезные статьи по написанию прог...

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Да ладно, кто вначале никогда не использовал delay? :D

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@metallic, и снова привет (usb 4550, если забыл) :)

Помню, как же :)

Заблуждение первое - ассемблер намного более логичен и прост, но это вырастает в огромную массу простейших конструкций, из-за чего и становится запутанным...

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

У меня тоже он, полностью си-совместимый, за исключением особенностей платформы, код делает хороший и т.д. ...

Ну и хорошо, на нем и остановлюсь

Си в контроллерах "не полноценный"
В контроллерах вообще нет Си, в них даже ассемблера нет, если на то пошло :) И именно в этом задача компилятора - сделать из легко-понятной человеку структуры список машинных команд...

Ну строго говоря да, это я просто абстрактно выразился.

Т.е. получается чиклы for не поддерживаются?
Куда-ж без них :D

Ясно, значит где-то сам накосячил.

int i = 3;
Весьма плохая привычка - объявлять переменные в теле функций, путаницы значительно больше в итоге. Это оправдывается только разве что в условиях ограниченной памяти и когда надо её динамично распределять в алгоритмах ветвления...

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

и получаю ошибку как на третьем скрине, что я делаю не так?
Кривой MPLAB, ругается на недостачу файлов...

Попробую переинсталить

Тьфу блин... Ты перепутал второй и третий аргумент для for... (int8 i=0;i<9;++i) {}...

Точно :) Давно на Си не писал просто, все на python последнее время :)

это заблуждение... именно для радиолюбительской среды лучше асм , помогает очень хорошо усвоить архитектуру МК. практически все команды асма это сокращения:

addwf REG,d

add = сложить

w = аккумулятор и

f = регистр где

REG = адрес регистра

d = указатель куда помещается результат в регистр или аккулулятор

Я это все прекрасно понял, в книге, по которой учил архитектуру 18f84a, как раз все примеры на асме и его идею я понял, все делается через рабочий регистр с плясками с бубном :) А если мне так глубоко архитектуру знать не надо, как раз на Си будет кодить проще

а вот программы надо учится писать правильно...

то что вы написали иначе как быдлокод не назовешь: вогнать МК в ступор на две секунды командой delay_ms(2000) это в среднем два миллиона команд потерянных в пустую :( если так будите продолжать дальше, то большего как помигать СД вы от МК не добьетесь ;)

сходите на сайт Тимофеева там очень полезные статьи по написанию прог...

У меня задача была впервые самостоятельно запустить любую программу на МК, попутно освоив компилятор, программатор и прочие средства, а идеологическая верность программы - это не так важно на данном этапе.

Теперь когда я основил инструментарий, можно писать более правильные программы.

Вообще меня очень интересует ethernet/gsm для МК, если у кого есть что-то на эту тему - просьба поделиться. Для сетки у меня уже есть PIC18F67J60-I/PT и сетевой разьем с трансформатором встроенным, также есть в хозяйстве pic18f4550, было бы неплохо собрать какой-нибудь рабочий пример, чтобы по сети можно было заставить контроллер зажечь/потушить светодиод.

Изменено пользователем metallic
Ссылка на комментарий
Поделиться на другие сайты

Ну не вижу смысла временную переменную, которая используется только в этом участке кода, выносить в глобальную секцию.
Не в глобальную, в локальную, но в самом начале функции...

void main()
{
  int8 x=0,y=5;
  ...
  код
  ...
}

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

о уже пошли первые проблемы нежелания учить асм и архитектуру МК :D

то ли еще будет , когда до прерываний добиретесь :ph34r:

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

Изначально они все на вход, высокоомные. Непосредственно сконфигурировать можно, манипулируя регистрами TRIS, но в общем случае на это можно забить, соответствующие операторы сами это сделают... Т.е. можно либо напрямую записывать/читать регистры, либо использовать Set_TRIS_x(), Get_TRIS_x();

ЗЫ: все это легко ищется в хелпе компилятора и в даташите на мк, если что :)

то ли еще будет , когда до прерываний добиретесь ph34r.gif
Аплодирую! :D

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

Изначально они все на вход, высокоомные. Непосредственно сконфигурировать можно, манипулируя регистрами TRIS, но в общем случае на это можно забить, соответствующие операторы сами это сделают... Т.е. можно либо напрямую записывать/читать регистры, либо использовать Set_TRIS_x(), Get_TRIS_x();

Я почему спросил, я тоже где-то в доке встречал, что например output_hight(PORT) сам переведет порт в режим выход.

Я попробовал запустить пример http://we.easyelectronics.ru/PIC/programmirovanie-pic-na-s-ccs-pic-c-compiler.html

Там вот такой простой код:

while(1)  
      {   
       while(input(PIN_A0))     
        {   
         output_high(PIN_A1);   
         delay_ms(500);         
         output_low(PIN_A1);  
         delay_ms(500);                
        }   
       output_low(PIN_A1);     
      }   

Ключевая строка сдесь while(input(PIN_A0)), как я понимаю, порт ф-ией input переводит в режим "вход" и пока на входе высокий уровень - моргает светодиод. Как только нажимается кнопка (вход замыкается на землю) - на входе получается низкий уровень и светодиод перестает моргать.

Собрал я этот макет, все работает. Но осталось куча не понятностей.

Во-первых, как я думал, на входе А0 высокий уровень появляется от плюса питания, т.е. согласно схеме, ко входу А0 подключен плюс питания через резистор 10кОм, поэтому там высокий уровень, когда кнопка нажимается, вход замыкается на землю и там получается низкий уровень. Насколько я понимаю, не обязательно нажимать кнопку, чтобы получить низкий уровень на А0, достаточно разорвать цепь А0 -> резистор -> +5В, но не тут то было, светодиод продолжает моргать, а на входе присутствует 2-3В напряжение, при этом кнопка продолжает работать, т.е. получается соединять А0 с питанием не обязательно. Но если все же соединить через резистор, на А0, как я и ожидал, напряжение 5В.

В общем сейчас я в небольшом ступоре, т.к. я думал, что все понял про работу портов, а оказалось, что они работают не так, как я думал. Конкретно мне не понятно, откуда высокий уровень(2.2В) на входном порту А0, если к нему ничего не подключено? Или 2.2В - это не высокий уровень?

d1ab56.jpg

о уже пошли первые проблемы нежелания учить асм и архитектуру МК :D

то ли еще будет , когда до прерываний добиретесь :ph34r:

Да я более-менее разобрался в архитектуре и как сделать это на асме знаю. По прерываниям у меня, вроде, есть примеры и на асме и на си.

Кстати что такое прерывания на физическом уровне? Допустим есть порт INT у контроллера, чтобы создать прерывание на нем что нужно, дать импульс на этот порт? Замкнуть его на землю или что?

Ссылка на комментарий
Поделиться на другие сайты

В общем сейчас я в небольшом ступоре, т.к. я думал, что все понял про работу портов, а оказалось, что они работают не так, как я думал.

как говорится если все методы испробованы и метод научного така не сработал - попробуйте прочитать инструкцию

ЗЫ вы еще больше удивитесь когда все это соберете в железе

если непосредственно для INT, то переход с лог1 в лог0 или наоборот в зависимости от настроек

для RBI(GPI) - изменение уровня

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

откуда высокий уровень(2.2В) на входном порту А0, если к нему ничего не подключено
Из воздуха... Что я говорил в той теме про чушь на свободных ногах АЦП? Наводки... Если разорвать цепь с подтяжкой к питанию, на входе будет неизвестно что... Следовательно надо искусственно создать ситуацию, когда нога либо гарантированно подключена к питанию, либо к земле, что и реализовано...

А вообще, если честно, с такими вопросами... Скажем так, рано думать даже о чем-нибудь простом, не говоря про ethernet... PC программирование имеет с программированием мк общего только то, что и то и другое выполняется посредством PC компиляторов и клавиатуры, и на этом сходство заканчивается...

> Правила форума <

...из древних времен доходят до нас слухи о колдунах и волшебниках... - кто бы мог подумать, что так может начинаться дипломная работа по радиотехнике...

...это не дым от канифоли, нет... это души умерших транзисторов....

Первый закон Ома: никому не рассказывать про Ома!

Ну вот, а ты говорил ноль...

Ссылка на комментарий
Поделиться на другие сайты

ЗЫ вы еще больше удивитесь когда все это соберете в железе

Я и так все собираю, за сегодня 16ф84а уже раз 10 прошил :)

если непосредственно для INT, то переход с лог1 в лог0 или наоборот в зависимости от настроек

для RBI - изменение уровня

Точно, припоминаю что-то. Только не понятно, изменение уровня должно быть кратковременным или постоянным? Т.е. импульс? И какой он должен быть по времени, имеет значение?

откуда высокий уровень(2.2В) на входном порту А0, если к нему ничего не подключено
Из воздуха... Что я говорил в той теме про чушь на свободных ногах АЦП? Наводки... Если разорвать цепь с подтяжкой к питанию, на входе будет неизвестно что... Следовательно надо искусственно создать ситуацию, когда нога либо гарантированно подключена к питанию, либо к земле, что и реализовано...

Понял, теперь в голове более-мение уложилось.

А вообще, если честно, с такими вопросами... Скажем так, рано думать даже о чем-нибудь простом, не говоря про ethernet... PC программирование имеет с программированием мк общего только то, что и то и другое выполняется посредством PC компиляторов и клавиатуры, и на этом сходство заканчивается...

Я и не говорю, что уже завтра возьмусь сетку кодить, я и начинаю с простого, чтобы понять всю эту систему изнутри. Ну и опыт программирования на PC и знание TCP/IP тут лишними не будут

Ссылка на комментарий
Поделиться на другие сайты

Да я более-менее разобрался в архитектуре

вы в ней еще долго разбираться будите...

как по вашему сколько регистров отвечают за работу порта?

даю подсказку:

post-124881-0-85371100-1344793667_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Сделал некоторый обзор компиляторов и заглянул немного в будущее, т.е. посмотрел про pic + ethernet. Так вот, как я понял, есть свободно распространяемый tcp/ip стек от конторы микрочип, написан он под компилятор с18 и использовать его вместе с компилятором ccs не получится (поправьте меня, если не прав).

Также выяснил, что у конторы разработчика ccs есть свой сетевой стек под свой компилятор, но он(стек) не первой свежести и уже давно не обновлялся(поправьте меня, если не прав).

Соответственно, если меня интересует езернет, то на текущем этапе, когда я толком не освоил еще ни одного компилятора, мне лучше сразу начать с того, под который есть интересующий меня софт, т.е. с18

По первым субъективным ощущениям с18 немножко посложнее, хотя и ближе к асемблеру, это плюс :)

Также вопрос по 18F4550 еще: его можно запускать без юсб? Т.е. просто на VSS и VDD подать 5 вольт, и MCLR через 10кОм замкнуть на плюс(при этом не задействуя ноги 23 и 24)?

А то боюсь спалить :)

Ссылка на комментарий
Поделиться на другие сайты

Также вопрос по 18F4550 еще: его можно запускать без юсб?
Можно. Но зачем? Зашить туда бутлоадер и оперативно менять прошивки через тот же USB.

Все можно наладить, если вертеть в руках достаточно долго!

Если ничто другое не помогает, прочтите, наконец, инструкцию!

Ссылка на комментарий
Поделиться на другие сайты

Также вопрос по 18F4550 еще: его можно запускать без юсб?
Можно. Но зачем? Зашить туда бутлоадер и оперативно менять прошивки через тот же USB.

Для этого специальный прошивальщик нужен или winpic подойдет?

Ссылка на комментарий
Поделиться на другие сайты

Конечно подойдет Winpic! Один раз прошить бутлоадер, а дальше специальной программой MCHPFSUSB (которую можно взять на сайте Микрочип) зашивать и стирать прошивки через ЮСВ. НЕХ бутлоадера находится там же.

Все можно наладить, если вертеть в руках достаточно долго!

Если ничто другое не помогает, прочтите, наконец, инструкцию!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...