Jump to content
Sign in to follow this  
metallic

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

Recommended Posts

Итак, после прочтения вводной документации и изучения архитектуры 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

Share this post


Link to post
Share on other sites

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

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

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

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

___

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

Edited by NebsteR

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

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

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

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

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

Share this post


Link to post
Share on other sites

Вебинар «МЭМС-датчики ST для работы со звуком – новые возможности» (28.10.2020)

28 октября все желающие приглашаются для участия в вебинаре, посвященном семейству МЭМС-датчиков STMicroelectronics для акустических приложений. Предметом детального рассмотрения на вебинаре станут микрофоны, их топологии применения и возможности. Вы услышите о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием.

Подробнее

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

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

addwf REG,d

add = сложить

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

STM32L562E-DK – первая отладочная платформа ST на ядре ARM Cortex-M33

STMicroelectronics представляет демонстрационно-отладочную платформу на базе ядра Cortex-M33 – STM32L562E-DK. Данная платформа основана на микроконтроллере нового семейства – STM32L5. STM32L562E-DK позволяет разработчику в полной мере раскрыть и опробовать новые возможности микроконтроллеров STM32L5 с тщательно проработанным функционалом для обеспечения высокого уровня безопасности и защиты.

Подробнее

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


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

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

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

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

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

Share this post


Link to post
Share on other sites

Тест уровня кондуктивной помехи электронного устройства

Электромагнитная совместимость (ЭМС) является важным параметром электронных устройств, особенно это актуально в современном мире, насыщенном разнообразными гаджетами. Специалисты компании Mornsun подготовили видеоролик по тестированию одной из составляющих ЭМС – кондуктивной помехи.

Подробнее

@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, было бы неплохо собрать какой-нибудь рабочий пример, чтобы по сети можно было заставить контроллер зажечь/потушить светодиод.

Edited by metallic

Share this post


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

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


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

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

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

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

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

Share this post


Link to post
Share on other sites
Вообще меня очень интересует ethernet/gsm для МК, если у кого есть что-то на эту тему - просьба поделиться.

блин ну дал же ссылку

Share this post


Link to post
Share on other sites

Что-то с ходу в доках не нашел, как в Си(ccs) сконфигурировать порты как входные или выходные?

Share this post


Link to post
Share on other sites

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

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

Edited by IMXO

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Изначально они все на вход, высокоомные. Непосредственно сконфигурировать можно, манипулируя регистрами 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 у контроллера, чтобы создать прерывание на нем что нужно, дать импульс на этот порт? Замкнуть его на землю или что?

Share this post


Link to post
Share on other sites
В общем сейчас я в небольшом ступоре, т.к. я думал, что все понял про работу портов, а оказалось, что они работают не так, как я думал.

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

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

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

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

Edited by IMXO

Share this post


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

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


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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Да я более-менее разобрался в архитектуре

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


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

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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


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

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

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения


  • Блок питания 12В для светодиодных лент, 18-100 Вт

  • Similar Content

    • By For the North !
      Подскажите, как подключить электретный микрофон к отладочной плате stm32f0discovery. Выбрал микрофон VS4011S36, 4,5 В, 4 мм. Нужно знать конкретно какие провода к каким входам подключать. Заранее спасибо!


      https://static.chipdip.ru/lib/735/DOC000735976.pdf   --- Datasheet на плату
    • Guest Влад
      By Guest Влад
      в этой схеме необходимо заменить микроконтроллер PIC на микроконтроллер AtMega8
    • By Александр Шилин
      Помогите, пожалуйста, со схемой подключения ПЗС-линейки к микроконтроллеру. Задача заключается в том, чтобы определить координату падения светового пятна, сформированного линзой, в пределах линейки.
      Модель линейки TCD132D на 1024 пикселя.
      Согласно даташиту необходимо три управляющих частоты - M, CCD, SH, питающее напряжение 12 В и опорное 5 В. Все эти условия были выполнены. Данные считываются.
      Выход данных с линейки пока просто выведен на осциллограф (красный канал). 
      Я плохо понимаю физические основы работы ПЗС-линейки, но ее работа кажется мне очень странной и нелогичной.
      1) При равномерной фоновой засветке при считывании получается равномерное низкое напряжение на всех пикселях. (Рисунок 1).
      2) При закрытии части линейки чем-либо напряжение на закрытых пикселях возрастает (Рисунок 2).
      3) При включении фонарика или лазерной указки все пиксели зашкаливают, определить максимум не удается (Рисунок 3).
      Если поместить линейку в темное место и светить очень тусклым лазером, то общий уровень напряжения на пикселях высокий, а в месте попадания света наблюдается едва заметный минимум. Возможно так и должно быть и нужно просто инвертировать и усилить сигнал?
      В чем может заключаться проблема? Как грамотно снимать выходной сигнал с линейки и заводить его на АЦП МК?
      Даташит приложен снизу.




      tcd132d.pdf
    • By Alan247
      Представляю на ваш суд:    https://thisismyhobby.ru/AVR_PAL_W.php   Ваше мнение?
       

    • By Rad TV
      Скетч простой и кислий. Сделан автором RadTV канал:https://www.youtube.com/channel/UC1k5elIKErFnmwTzIsRgQrA?view_as=subscriber
      Буду рад рокомендациях и помощи!Сделал сам проект должен бить простим и  что би влезло в ATtini85!
      Есть защита акб и просто парения (!!!Кнопка на розмикания!!!)
      Обновления будут!!!!
       
       
      RadMOD ver1.0.txt
×
×
  • Create New...