Jump to content

Recommended Posts

Posted (edited)
2 часа назад, ARV сказал:

А ведь вопрос надо ставить иначе: нахера вам такие постановщики задач, которые не в состоянии определиться заранее с частотой семплирования?

Какие претензии к эмбеддеру, если вы поменяли ТЗ?! Или в нем было оговорено, что частота семплов может варьироваться на порядок, да еще в большую сторону?! Кто сам себе злобный буратина?!

Даладна, милейший, Вы так шутите? Вы вообще понимаете смысл слова "эмбеддер"? :crazy:

ТЗ, в данном случае, - это радиочастотная противокражная система. От начала до конца. И выбор ВСЕХ решений - от общего алгоритма до размещения последнего резистора на п/п - это задача инженера-эмбеддера.

В ТЗ не оговаривают частоту семплирования, как не оговаривают схемотехнику и алгоритмы. Он тупо просрал тему. В результате изделие к оговоренному сроку не вышло. Человека уволили и теперь я подтираю за ним финансовые потери компании.

Добрый Вы наш, буратина... :rolleyes:

2 часа назад, ARV сказал:

Да ну?! Вы наизусть знаете, в какой код компилируется каждая конструкция Си

Для этого не надо ничего знать наизусть. Просто нужно понять смысл инструкций процессора. Почему система команд такая, а не другая. И тогда с вероятностью практически 100% вы поймете как синтаксические конструкции Си превращаются в машинный код. Там нет ничего сакрального. И оптимизация тут совершенно не причем. Компилятор при оптимизации не изменяет последовательности исполнения в Си. Оптимизация устраняет лишние регистровые пересылки и ветвления, которые позволяют производит отладку кода в пошаговом режиме.

=========================

ЗЫ. Для ВАШЕЙ эрудиции. ТЗ никогда не пишет заказчик. Заказчик пишет ИСХОДНЫЕ ДАННЫЕ. А по этим исходным данным ПОДРЯДЧИК пишет ТЗ. Которое затем утверждает представитель Заказчика. И по завершении НИОКР на базе ТЗ подрядчик пишет ТУ. В состав которых входят методики испытаний по этому ТУ.

Заказчик вообще может ничего не понимать в технике. В исходных данных пишутся ВНЕШНИЕ требования к изделию. Дальность обнаружения, допустимые уровни помех,, типы целей, потребляемая мощность, габаритные размеры, условия эксплуатации. Заказчик строительства дома не знает ничего про типы гидроизоляции фундамента... :bye:

Edited by my504

Share this post


Link to post
Share on other sites
Posted (edited)
36 минут назад, my504 сказал:

это задача инженера-эмбеддера

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

36 минут назад, my504 сказал:

вы поймете как синтаксические конструкции Си превращаются в машинный код

Ох и буйная у вас фантазия... Синтаксические конструкции Си закладывались в те времена, когда даже конвейер в процессоре был фантастикой, что уж говорить о том, как сегодня изменились процессоры. И машинный код для разных платформ совершенно по-разному генерируется компилятором. Например, аккумулятор-ориентированные системы команд и системы с регистровым файлом - они что, одинаково ложатся на синтаксические конструкции Си?! Системы с аппаратным стеком вызовов и "обычные" - они тоже одинаково превращаются в машинный код?! Даже передача параметров в функции и то реализуется по-разному для разных платформ! Чего там и говорить про то, что строя конструкцию из операторов Си можно что-то там предположить на счет оптимальности полученного кода... Помнится, в 90-е годы среди программистов ходили байки о том, что быстрее - for или while или do для одинаковых алгоритмов... А сегодня все три варианта пратически в 99% случаев дают абсолютно идентичный код! Не так давно (лет 15 назад) читал статью о вреде оптимизации... Дескать, все сталкивались с ситуацией, когда отладочная версия работает, а релизная, т.е. для которой оптимизации все активируются, лажает - это потому, что оптимизация вредит... А что теперь?

А вы всё несете ахинею о прямой свзи между оператором Си и полученным кодом...

Edited by ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
Posted (edited)
29 минут назад, ARV сказал:

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

А что такое "нормальный штат разработчиков"?  :crazy: 

Я например, за то время, которое этот "эмбеддер" профукал тему, выпустил ЧЕТЫРЕ разных серийных изделия аналогичной сложности и одно из них успел модернизировать по опыту эксплуатации. Даже и не представляю себе зачем нужен второй или третий человек в теме?  Я знаю как организована работа у конкурентов, в том числе и за границей. Совершенно так же. Если конторе хочется содержать бездельников за копейки, то она может и десяток человек нанять.... :crazy:

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

Edited by my504

Share this post


Link to post
Share on other sites

Вебинар «Каждому ключу — свой драйвер» (13.08.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре, который будет посвящен теме драйверов управления транзисторами компании Infineon. Мы рассмотрим четыре различных технологии изготовления микросхем драйверов, в чём их отличия и особенности.

Подробнее

37 минут назад, ARV сказал:

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

Лажает она на 99,99% по причинам ошибок в коде. Причем не синтаксических, естественно, а алгоритмических. Это тот самый клоунский подход, когда изящности кода приносят в жертву все остальное.

Share this post


Link to post
Share on other sites

Меньше не бывает: неизолированные микро-DC/DC нового поколения R4 от Mornsun

Компания Mornsun разработала серию R4 неизолированных импульсных стабилизаторов напряжения в новом миниатюрном конструктивном исполнении. Уменьшение коснулось не только размеров, на 80% меньше существующих преобразователей, но и стоимости.

Подробнее

Просто удивительно, как вас несёт из-за простого нежелания делать по-вашему! Говорил же: вам придётся смириться с тем, что не все поголовно с вами согласны. С вашим самомнением это сложно, я понимаю, но для вас нет иного варианта, кроме как смириться с этим!

 

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


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites

Сетевой источник питания с расширенным диапазоном входных напряжений на основе VIPER26xK

Питание стационарных устройств чаще осуществляется напряжением 220 В, получаемым от одной фазы трехфазной промышленной сети. Однако существует ряд приложений, которым необходима энергия из всех трех фаз, в т.ч. и в аварийных режимах. Решение этой задачи обычно требует введение в модули питания дополнительных узлов, увеличивающих как их размеры, так и стоимость. Упростить схемы источников питания от трехфазной сети переменного тока либо от других высоковольтных источников, позволяет использование преобразователей с расширенным диапазоном входного напряжения.

Подробнее

Цитата

my504  - понять что генерит компилятор можно без труда

Если бы "компилятор" - это была бы фамилия одного человека, то была бы ваша правда. Но, увы, так уж сложилось, что компиляторы (даже тот же , но уже другой версии) компилируют, данный вами текст, не совсем одинаково. И я даже не говорю про полученный код из разных языков и опять же их версий. Посему преклоняюсь перед вашими экстрасенсорными возможностями. :)

Цитата

my504  -Это тот самый клоунский подход, когда изящности кода приносят в жертву все остальное.

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

Цитата

my504 - пПатамушта пишу и на АСМе

(1) Бывает ещё, что оптимизация требуется коду, который возник с не совсем "изящно" написанной программы в языке. (2) Или используемый вами компилятор, писала "клюшница", как и тот "оптимизатор", который нуждается в оптимизации. :)

P.S. Забежал сюда случайно и мне продолжение данного диалога не интересно. Но промолчать не смог. Удачи всем. :bye:

Share this post


Link to post
Share on other sites
6 часов назад, ARV сказал:

Просто удивительно, как вас несёт из-за простого нежелания делать по-вашему!

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

А историю про свою работу я вам поведал лишь потому, что она совсем свежая и очень в тему. Про то, что называется "говнокод". :bye:

6 часов назад, valentinovich сказал:

Если бы "компилятор"...

Удачи всем. :bye:

Компилятор используют тот, который доступен для данной платформы и с теми недостатками, которые в нем есть. Речь не шла о свойствах самого компилятора. Речь шла о том, что нет смысла ПОСТОЯННО смотреть в дизасм. И речь шла исключительно про Си.Поэтому - НЕ В ТЕМУ. 

И Вам удачи. :bye:

Share this post


Link to post
Share on other sites
Posted (edited)
8 часов назад, ARV сказал:

Думаю, вам давно пора

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

Итого. в сухом остатке по трем совершенно разным вопросам:

1. Частный случай - двойная инверсия vs явное приведение типа.  Можно так, как нравится. Но читабельность и доступность выше тогда, когда не требуется объяснять  "почему так". Иначе зачем вообще тут было объяснять очевидное?

2. Стиль написания - лишь бы работало и влезло. Аргумент из совсем свежей практики привел. От вас аргументов не услышал.

3. Методы и организация разработки. Ну тут совсем все плохо. Видимо у вас есть только фрилансерский опыт...

 

Edited by my504

Share this post


Link to post
Share on other sites

Итого в сухом остатке:

1 час назад, my504 сказал:

Но читабельность и доступность выше тогда, когда не требуется объяснять  "почему так". Иначе зачем вообще тут было объяснять очевидное?

Несовместимость типа bool с различными стандартами Си даёт преимущество двойному отрицанию. Объяснять нужно только начинающему, а настощий профессионал это понимает без вопросов. Именно настоящий профессионал в своё время мне и показал этот пример.

1 час назад, my504 сказал:

Стиль написания - лишь бы работало и влезло

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

1 час назад, my504 сказал:

Методы и организация разработки.

Я могу путаться в названиях должностей, т.к. за модой в этой области не слежу, но нормальная разработка ведется примерно следующим образом: есть менеджер проекта, который следит за тем, чтобы заказчик был удовлетворен, есть архитектор проекта, который намечает ключевые аспекты решения задачи, определяет инструментарий и общую архитектуру (в том числе методы аналитических преобразований) - короче, формирует задачу программисту и контролирует её выполнение, есть программист, который по заданию архитектора пишет и отлаживает программу, есть тестировщик, который обязан покрыть код текстами (опять же по архитекторским планам) и доказать архитектору его корректность ... Где-то параллельно существует аналогичная линия аппаратной разработки, которая отпочковывается от общей где-то на уровне архитектора... В общем, как-то так. Разумеется, по разным причинам можно объединять обязанности, например, программист может быть паралельно и электронщиком или тестировщиком, архитектор - менеджером и/или программистом... Но когда один человек объединяет в себе все эти функции, он все их выполняет плохо. Вариант свергениальности, когда некто српавляется со всеми обязанностями без лажания постоянно и длительно, можно отбросить, поскольку это редкое явление - Линус Товальд один, а остальные "серости" делают 99% работы уже много лет с завидным успехом. Потому что в бизнесе методология решает больше, чем гениальность.

У вас,@my504 , в конторе явные проблемы с менеджментом и персоналом, а так же со стратегией решения поставленных задач. Думаю, с вашим выходом на пенсию контора ваша развалится, ибо найти второго такого гения, который может 100 дел делать с нереальным качеством, не найти. Вы можете и дальше гнуть свою линию - мне все равно. Можете оставить последнее слово за собой, это льстит вашему самолюбию - я тоже не буду возражать.


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
1 час назад, ARV сказал:

У вас,@my504 , в конторе явные проблемы с менеджментом и персоналом, а так же со стратегией решения поставленных задач. Думаю, с вашим выходом на пенсию...

Если наша контора решала свои задачи теми же способами, которыми решают задачи в  каком нибудь Боинге или Самсунге, то нашей конторы не существовало бы уже лет 20 как.

Опыт разделения функций разработки по описанному Вами сценарию у нас был. Догадайтесь с одного раза о каком изделии идет речь? :crazy:  Угадали. О том самом. Которое было благополучно слито.

На самом деле, способы разработки определяются сложностью изделия. Изделие состоящее из двух плат общей площадью в 4 кв. дм и общей себестоимостью порядка 200 долларов грамотно сделать может ТОЛЬКО ОДИН ЧЕЛОВЕК.  Тот самый "эмбеддер". Специалист по встраиваемым системам. На жаргоне спецов по персоналу - электронщик. А по факту - обычный радиоинженер.

ЗЫ. По поводу моей пенсии. В любой конторе с любой структурой есть незаменимые люди. Они незаменимы здесь и сейчас. Но если они уходят, то появляются другие незаменимые люди. И задача того, кто уходит, держать свое хозяйство всегда готовым к передаче другому. Документацию читаемой, код масштабируемым, идеи оформленными на бумаге. Это все возможно тогда и только тогда, когда человек работает как часть компании, а не для того, чтобы намыть бабла и свинтить.

2 часа назад, ARV сказал:

Итого в сухом остатке:Несовместимость типа bool с различными стандартами Си даёт преимущество двойному отрицанию.

Можно подумать, что в радиотехнических изделиях нужна совместимость "с разными стандартами Си"? Вы вообще о каком сферическом коне тут вещаете? В пределах жизни одного изделия ему суждено быть в пределах одной, максимум двух платформ МК и точно только ОДНОГО стандарта Си. В данном случае С99. И bool  в нем имеется.

Share this post


Link to post
Share on other sites
01.07.2020 в 12:39, my504 сказал:

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

такое бывает не всегда.

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

я лично вижу, что есть полезные, рациональные, "зерна" и у одного оппонента и у другого.

но мы наблюдаем несовместимость "стандартов" у оппонентов ...


Мудрость приходит вместе с импотенцией...

Share this post


Link to post
Share on other sites
9 часов назад, Starichok сказал:

я сам был свидетелем

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

У нас, несмотря на правило - один проект - один разработчик, все проекты двигаются коллегиально. То есть периодически на совещаниях разбирают проблемы, которые возникают у отдельных разработчиков. Причем к проблеме подключают и все заинтересованные подразделения компании. Таким образом все знают обо всех. 

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

Share this post


Link to post
Share on other sites
Posted (edited)
28.06.2020 в 22:26, pndbr сказал:

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

if((0 != (PINB & (1<<PINBO)) & (0 == (PINB & (1<<PINB1)))

я смотрю вам тут очень долго пудрили мозги по поводу преобразования типов...

Проблема этой конструкции в том что порт читается ДВА раза, это обычно приводит к непредсказуемому поведению кода которое очень трудно диагностировать!

Решением является чтение значения порта в переменную и использование уже этого сохраненного значения столько раз сколько вам надо:

char tmp = PINB;//это принципиально должно быть отдельной инструкцией чтения
if((0 != (tmp & (1<<PINBO)) & (0 == (tmp & (1<<PINB1)))// и тогда тут как вам нравится с использованием tmp!!!
    ...

Когда вы читаете порт второй раз вы можете прочитать уже изменившееся значение и вы наверняка не заметили и не продумали такую возможность - это очень не очевидно!

А оно будет прочитано ИМЕННО 2 РАЗА в вашем исходном варианте, потому что порты объявлены volаtile , и значит к ним не применяется оптимизация!

Edited by ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
Posted (edited)
18 часов назад, ruhi сказал:

я смотрю вам тут очень долго...

Может я чего то не понял, но зачем весь этот вычурный перфоманс?

Может просто маску на порт?

if ((PINB&0b11) == 0b01)
  {
// bla-bla-bla
  }

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

Edited by my504

Share this post


Link to post
Share on other sites
29 минут назад, my504 сказал:

Может просто маску на порт?

Может и просто. Но речь шла совсем не об этом, потому этот аспект и не рассматривался.

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


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
Только что, ARV сказал:

как писать сложные

Прежде всего нужно избегать писать сложные выражения, а если это неизбежно, то стараться их логично и читабельно структурировать (например через дефайны).

И  сложность к пониманию различия между &  и  && никакого отношения не имеет. 

Share this post


Link to post
Share on other sites
Только что, my504 сказал:

то стараться их логично и читабельно структурировать (например через дефайны)

Именно об этом речь и шла.

Только что, my504 сказал:

никакого отношения не имеет

Отмотайте пару страниц назад и ознакомьтесь с началом обсуждения - проблема у начинающего (одна из) была как раз в том, что он применил & для сравнения результатов наложения масок на биты порта. Хотел логически, а сделал битово. Так что все имеет значение, если мало опыта.


Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Share this post


Link to post
Share on other sites
Только что, ARV сказал:

Отмотайте

Зачем мне мотать назад, если я комментировал КОНКРЕТНОЕ предложение для ТС? Я писал лишь о том, что буфер тут ни к чему. И если советовать, то отдефайненную маску, а не пытаться странным образом один выкрутас заменять на другой, даже если это решает проблему атомарности.

Share this post


Link to post
Share on other sites
52 минуты назад, my504 сказал:

Может просто маску на порт?


if ((PINB&0b11) == 0b01)

А может кто либо  объяснить почему на порт я маску могу наложить, а на переменную не могу? 

Share this post


Link to post
Share on other sites
28 минут назад, dasZebra сказал:

кто либо 

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

Share this post


Link to post
Share on other sites
1 час назад, my504 сказал:

А кто утверждал, что на переменную маску наложить нельзя?

Никто. Я просто спросил: "почему на порт я маску могу наложить, а на переменную не могу?"  Буферизация была нужна для того, что бы сравнивать текущее состояние порта  с предидущим. Красиво сделать не получилось, пришлось делать как обычно, но вот осадочек остался.

Share this post


Link to post
Share on other sites
19 минут назад, dasZebra сказал:

на переменную не могу

Ну это вопрос к Вам. Вероятно есть причины почему ВЫ не можете, а я, например, могу.. :)

Share this post


Link to post
Share on other sites
2 часа назад, my504 сказал:

Вероятно есть причины почему ВЫ не можете,

Таки Вы правы.

Share this post


Link to post
Share on other sites

Плавный пуск стоп от одной кнопки. Так будет работать? Если в обработчика таймера ISR

if(button==1)
    {
    if(f_button==0)
        {
        f_button=1;
        while(OCR1A<=200)OCR1A=OCR1A+5
      if(f_button==1)
          {
          f_button=0;
          while(OCR1A=0) OCR1A=OCR1A-5
          }
    }

Share this post


Link to post
Share on other sites
Плавный пуск стоп от одной кнопки. Так будет работать? Если в обработчика таймера ISR
if(button==1)
    {
    if(f_button==0)
        {
        f_button=1;
        while(OCR1A       if(f_button==1)
          {
          f_button=0;
          while(OCR1A=0) OCR1A=OCR1A-5
          }
    }

Delay добавьте. Мк до 40 сосчитает очень быстро.

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...

  • Сообщения

  • Similar Content

    • By Rad TV
      Скетч простой и кислий. Сделан автором RadTV канал:https://www.youtube.com/channel/UC1k5elIKErFnmwTzIsRgQrA?view_as=subscriber
      Буду рад рокомендациях и помощи!Сделал сам проект должен бить простим и  что би влезло в ATtini85!
      Есть защита акб и просто парения (!!!Кнопка на розмикания!!!)
      Обновления будут!!!!
       
       
      RadMOD ver1.0.txt
    • By Стас73
      Доброй ночи, уважаемые.
      Прошу Вашего совета по следующей куче проблем для меня, т.к. не соображаю в электронике, схемах, резисторах и подобному, но дружу с компом и есть желание сделать определенный механизм, но пока нет наставления на путь истинный от специалистов)
      Задача состоит в следующем - хочу мотор стеклоочистителя подключить к Ардуино, но управлять им необходимо с кнопки. Шилд, например, который обрабатывает сигнал нажатия на кнопку (допустим кнопка записи), при ее активации, нажимаю на другую кнопку, которая дает команду движку вращаться по часовой стрелке. Отпускают ее, моторчик останавливается. Другая кнопка, вращение в противоположную сторону. Т.е. записал последовательность и продолжительность вращений,  нажимаю вновь на кнопку запись и мои действия сохраняются. Далее на 4 кнопку жму и моя игра с моторчиком автоматически воспроизводится. Если такое выполнимо с помощью плат и шилдов без доп программирования логики, то буду ОЧЕНЬ  признателен если расскажете как вкратце это осуществить или кинете ссылки к примеру на Али с нужными товарами. Если легковыполнимо, то в будущем наверное уже разберусь,  как обойтись без нажатия на 4 кнопку (воспроизведения записанных действий) и запускать этот процесс, подключив датчик движения или звука.
      Если необходимо описывать логику или создавать типа какого-то протокола, что шилд (?) умел понимать, что я от него хочу, то подскажите среду разработки для неба, что б там по минимуму было наворотов) В принципе с основами c++ для Ардуино скорее всего придется ознакомиться. 
      Заранее спасибо!
    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
    • By MirVsem
      Добрый день.
      Есть интересные модули ибп для слаботочки до 1А.
      m.aliexpress.ru/item/4000109380893.html
       По цене идеально подходит для зоопарка роутеров, IoT устройств... Переключение на резерв (туда-обратно) без просадки. Зарядка литиевой банки как положено, всякие защиты от перегрузки и прочее. Казалось бы все замечательно. 
      НО как всегда не без ложки дёгтя.
       Защита от переразрядки работает неадекватно. Хотя возможно это не сама защита, а повышающий модуль. На пороге ~3в у него срабатывает циклический перезапуск и так пока банка не просядет ниже 3в. Точно померять нечем.
      Из наблюдений. Проверил напряжение переключается с 12в на 9в и щелчки. Естественно нагрузка в это время дико насилуется (роутер свистит минут 5 пока полностю не отключится)
      Вопрос к гуру. Возможно ли что-то доработать в даном модуле чтобы исправить этот досадный баг?
    • By Юлия Михайлова
      Требуються люди умеющие работать с микроконтролерами esp 32 и stm32 , так же будет плюсом опыт работы с raspberry , требования опыт работы не мение 1,5 года , возраст не старше 35 лет , готовы взять на удаленную работу просьба отправлять резюме , и звонить по номеру +380 (68) 227 82 52
×
×
  • Create New...