Jump to content

    

Alt.F4

Свой
  • Content Count

    1516
  • Joined

  • Last visited

Everything posted by Alt.F4


  1. SSerge, земля шумит +/-100мВ (такое же значение без подачи питания), иногда проскакивает 150мВ, интересные дела. Закоротил экран щупа лезвием ножа непосредственно на GND платы и шум уменьшился до +/-4мВ, однако в питании те же иголки, я бы сказал даже их значения еще ухудшились (или стали ближе к реальным), с керамикой 4,7uF и bypass 10nF словили 2,78В. Интересно, какой ток утечки у X5R 100nF и зависти ли он от температуры?
  2. У LP2985 Bypass 10nF используется. Поигравшись с разными вариантами емкости на выходе LP2985 имеем следующее: Емкость - худшее значение на выходе (nom 3V) Ceramic 4,7uF - 2,82V Ceramic 10uF - 2,82V Ceramic 4,7uF + Ceramic 10uF - 2,82V Tantal 10uF - 2,86V Ceramic 4,7uF + Tantal 10uF - 2,88V Ceramic 10uF+Tantal 10uF - 2,9V У LP5907 много хуже (хотя у нее PSRR и скорость реакции выше, странно): Ceramic 10uF+Tantal 10uF - 2,46V Ceramic 4,7uF - 2,64V Ceramic 10uF - 2,76V Добавлено: Шутка ли, увеличив Bypass LP2985 до 100nF, с керамикой 4,7uF получился результат 2,88V. А в Datasheet про такой номинал ни слова...
  3. Наверное сам отвечу: у керамики сильно падает емкость от приложенного напряжения, плюс заводской допуск 15% как правило в меньшую сторону и добавим температурный коэффициент, в итоге получаем примерно половину от установленной емкости.
  4. Здравствуйте. Наблюдаю тенденцию у производителей совмещать под одной крышкой GSM модем и Bluetooth или GPS/GLONASS. А есть ли решение с WiFi, или может планируется появление в будущем?
  5. ЦитатаПользуюсь связкой SIM800L + ESP8266 или M590 + ESP8266 А GSM антенну выносную используете? Волнует влияние мощного сигнала GSM на ESP8266, не отваливается ли сеть у последнего. В комбо-модуле по идее передача обоих RF-частей была бы синхронизирована...
  6. Здравствуйте. В очередной раз начитался про volatile + чудные компиляторы и насмотревшись "глупых" примеров родился вопрос: стоит ли указывать переменные и/или кольцевые буферы, используемые в прерывании, как volatile, если ни одна из переменных при объявлении не принимает значение, все необходимые начальные значения прописываются в отдельной функции (все изменения таких переменных в любом случае делаются атомарно, с запретом прерываний)? Т.е. компилятор при работе с такими переменными (например, байтом флагов) в принципе не располагает информацией о их значениях, чтобы как-то вырезать условия с их проверкой, как изображается в примерах с неиспользованием volatile. Спасибо.
  7. Грубо говоря, дроссель необходим для, того чтобы диод успел открыться при превышении допустимого напряжения. Но выходит, когда диод открывается, он делает КЗ и дроссель выгорает. Если учитывать, что напряжение в сети более менее современных автомобилях не должно повышаться более 15В, может дроссель вообще не нужен? А диод будет служить больше защитой от переполюсовки? Спасибо.
  8. Вопрос по volatile

    ЦитатаОчевидно что Вы и читать исходники не умеете.А Вы убеждать не умеете. Использование одного и того же байта-флага в разных прерываниях описали, хорошо, но конкретной причины для дальнейшего сбоя по прежнему нет. Цитата1) если переменная используется в двух потоках (читай - в основном цикле и прерывании). Компилятор обязан при каждом обращении на чтение вычитывать ее из ОЗУ и при каждом обращении на запись класть обратно.По идее так должно быть, но не обязательно же? Просто скорость реакции уменьшится (обновленные данные внешней операцией будут получены при повторном чтении переменной). Я не против volatile, просто хочется понять, когда без него ну совсем не обойтись и код точно не будет работать.
  9. Вопрос по volatile

    jcxz, а мне Ваши примеры напоминают троллинг, повторение описанного ранее. Я не вижу причин для сбоя в Вашем коде. В описанной ситуации функция не увидит возведение флажка, при втором входе в функцию все будет Ок. Повторюсь: где проблема? Да и пример я бы назвал "странным" (читай так делать нельзя), т.к. оба прерывания используют один и тот же байт-флаг и если они сработают друг за другом, то Вы не будете знать, что сработало первое. ЦитатаЕсли записи нет, а есть только чтения, то компилятор заменит все чтения этой переменной загрузкой константы в регистр. А потом компоновщик увидит, что к этой переменной нет ни одного обращения и удалит её за ненадобностью.Какой еще константы, если она переменная? Как это нет обращения, Вы же ее читаете. ЦитатаИ функция при выходе результат работы прерывания затирает.Если переменная изменяется в функции, то это делать надо атомарно, и тогда не будет описанной Вами проблемы. Если что, то volatile не спасет от написанного Вами. ЦитатаВот еще пример - иногда требуется только сам факт чтения/записи переменной (без реальных значений) для выполнения какого либо действия в периферии. Без volatile такое "бессмысленное расточительство" режется на корню "слишком умным" компилятором.Хороший пример, добавляем в копилку. Хотя можно объявить переменную глобально или extern, тоже будет работать. Цитата"Споры" нужны для того, чтобы понять при каких ситуациях "сюрпризы возможны". Пока имеем следующие ситуации требущие объявления volatile: 1) Переменные в блокирующих операций (ожидание определенного значения в цикле) 2) Все системные регистры, в том числе ввода/вывода (хотя они де-факто volatile) 3) Переменные в которые "просто читаем" из какого-либо регистра (как вариант, используем глобальную или extern переменную) Еще пару примеров и можно делать мини-FAQ по теме вопроса
  10. Вопрос по volatile

    RobFPGA, думаю, если буфер объявлен глобально, то компилятор не вырежет код, даже если "НИГДЕ в Вашей программе нет ЗАПИСИ в этот буфер/переменную". Имхо, компилятор работает исключительно локально, относительно кода функции, и не проверяет, в каком месте и пишутся ли вообще данные в глобальные переменные. ЦитатаА вот если прерывание тоже изменяет это значение, то это значение пропадет, так как функция при выходе сохранит в эту переменную свое значение.Ну как бы изменения делаем атомарно, это уже обсудили.
  11. Вопрос не по теме топика: а есть ли прирост в скорости написания кода на C++ в отличие от С? И имеет ли смысл изучать "плюсы" для работы с микроконтроллерами? Спасибо.
  12. Вопрос по volatile

    jcxz, читаю "на входе в эту функцию, компилятор вполне может переместить значение переменной в регистр" И каким боком из-за этого переменная может не изменяться вообще? В текущий момент пусть функция не видит изменения, при следующем входе снова прочитает по адресу и все увидит. Где проблема? RobFPGA, об этом речи и не идет, атомарность делает сам программист, конечно. Ок, добавляем еще одну ситуацию, кроме блокирующих - чтение регистров ввода/вывода, хотя они уже по умолчанию идут как volatile, и программисту об этом не надо заботиться.
  13. Вопрос по volatile

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

    jcxz, вот именное такие: "например можете в цикле ждать когда установится некий флажок" (цитирую Вас же). RobFPGA, по идее вообще без разницы, где эта переменная будет изменяться, что-то мы ходим по кругу... Проблема: компилятор оптимизируя вырезает кусок кода считая его лишним. На основании чего он это делает? Он знает, что некая переменная имеет в текущий момент определенное состояние. Значит, если на входе функции мы не присваиваем ей какое либо значение и затем не проверяем эту переменную на другие значения (что для компилятора кажется безумным и он это режет), то и volatile не нужен.
  15. Вопрос по volatile

    Цитата... Дальше например можете в цикле ждать когда установится некий флажок ... Если не использовать блокирующие операции, то и проблемы не будет.
  16. Здравствуйте. Необходимо в устройстве реализовать доступ в Сеть и запустить HTTP-сервер. Уважаемые инженеры, как по Вашему, каким путем лучше пойти с учетом перспективности/скорости реализации/минимальной себестоимости: - ставить MCU с Ethernet MAC + софтовый TCP/IP-стек; - искать WiFi-модуль со встроенным стеком и общаться по средством UART/SPI? Спасибо.
  17. Вопрос по volatile

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

    Если вообще смотреть на проблемы в примерах, то они возникают из-за ситуации, когда компилятор на старте выполнения кода функции располагает инфой о значении переменных и уже исходя из этого исключает определенные участки кода. Поэтому, если сперва читаем, а уже выходя из функции пишем, то по идее volatile не нужен. Кстати, обращение к переменным volatile компилятор может произвольно перемещать относительно переменных не-volatile и, я думаю, в определенных ситуациях на этом можно словить не мало приколов.
  19. Здравствуйте. Наткнулся на ситуацию: если входящий вызов попадает в момент ожидания ответа на AT+CIICR, то ответить или сбросить вызов невозможно. Модем не отвечает ни на какие команды... [16:04:34] Recv: AT+CIICR [16:04:37] Recv: [16:04:37] Recv: RING [16:04:37] Recv: [16:04:37] Recv: +CLIP: "+ххххххххххх",145,"",0,"",0 [16:04:37] Recv: [16:04:37] Recv: ATA - и тишина пока вызов не окончится (прилетают только URC)... P.S. Согласен, что ситуация редкая, однако в SIM900 URC в таком месте никогда не прилетало, сперва был ответ на саму команду AT+CIICR
  20. Здравствуйте. Есть библиотека, которая использует структуру с настройками TableSets и массу функций возвращающих адрес на строки таким образом: char *addr=TableSets.XXX.yyy; return addr; Задача: перенести TableSets во внешнюю FLASH-память не переписывая библиотеку (поэтому offsetof использовать не получится). Для обращения к внешней памяти надо знать смещение элемента в структуре относительно нулевого адреса. Т.е. надо как-то определить структуру TableSets по нулевому адресу и в тоже время не размещать ее в ОЗУ МК. Подскажите, пожалуйста, возможно ли это как-то сделать? Спасибо. з.ы. ОЗУ МК также начинается с нулевого адреса.
  21. jcxz, Сергей Борщ, мы можем понимать друг друга без слов! Глубоко извиняюсь, что не смог в первом посте правильно описать задачу... jcxz, грубо говоря, как Вы и написали, ПО читает настройки через вызов ReadSet08(dst, &TableSets.XXX.yyy) и именно из-за такой передачи адреса я не могу заюзать offsetof()... Сергей Борщ, круто, то что надо!!! Спасибо!
  22. desh, не подошло, в библиотеке часто юзают передачу адреса из настроек в функции Func(&TableSets.XXX.yyy) ЦитатаИменно это и делает offsetof(). Чем именно она не подходит?offset использует запись TableSets->XXX;, а в библиотеке используется TableSets.XXX;... jcxz, почему не надо, как тогда прочитать одно значение, а не всю структуру? ------------------------------ Добавлено: Похоже нашел как реализовать задуманное, не особо красиво, но все же: Определяю структуру настроек по адресу обозначенной в Memory map МК как Reserved: __no_init TABLE_SETS_STRUCT TableSets @ 0x1100; А смещение буду вычислять путем вычитания из переданного библиотекой адреса данное значение 0x1100.
  23. CADiLO, надо поиграться, хорошая команда. AT+CHLD=<n>, где <n> 0: разъединить все удерживаемые вызовы или установить UDUB (User Determined User Busy) для ожидающего вызова. 1:разъединить все активные вызовы (если они есть) и принять другой (удерживаемый или ожидающий) вызов. 1X:разъединить вызов X (активный, удерживаемый или ожидающий) 2:перевести все активные вызовы (если они есть) в режим удержания и принять другой (удерживаемый или ожидающий) вызов. 2X:перевести в режим удержания все активные вызовы, кроме вызова Х, с которым поддерживается связь. 3:добавить в конференцию удерживаемый вызов 4:соединить два вызова и отсоединить абонента от обоих вызовов (пря-мая пересылка вызова)
  24. Здравствуйте. Подскажите, пожалуйста, существует ли команда для сброса вызова "второй линии", при активной первой? Покурил документацию, но что-то ничего похожего не нашел (ATH сбрасывает оба вызова)... Спасибо. З.Ы. Речь идет о ситуации, когда во время активного голосового вызова приходит другой входящий вызов.
  25. Здравствуйте. Натолкнулся на проблему: при вызове с SIM-карты МТС на карту МТС, которая недоступна и в ней есть голосовой ящик, модем перезагружается! (Питание не просаживается, пробовал на разных железках и с разными антеннами, ПО обновлял до 1418B06SIM800C32_BT_EAT.) Во всех других ситуациях все Ок: - при вызове на другую недоступную карту МТС без ящика - все Ок - делаю карту с ящиком доступной, но вызов сбрасываю (переключаюсь на ящик) - все Ок - вставляю в SIM800C карту другого оператора и звоню на недоступную карту МТС с ящиком - все Ок Что интересно, карта МТС очень быстро (сразу после регистрации) выдает SMS Ready, карта другого опсоса выдает SMS Ready только через 40-50сек после регистрации. Ради эксперимента все тоже самое проделал на SIM900R - никаких проблем. Подскажите, пожалуйста, сталкивался ли кто-нибудь с подобной проблемой? Спасибо. Код[11:23:57] Recv: ATD+37533XXXXXXX; [11:23:57] Recv: [11:23:57] Recv: OK [11:24:00] Recv: AT+CLCC [11:24:00] Recv: [11:24:00] Recv: +CLCC: 1,0,2,0,0,"+37533XXXXXXX",145,"" [11:24:00] Recv: [11:24:00] Recv: OK [11:24:01] Recv: AT+CLCC [11:24:03] Recv: [11:24:03] Recv: RDY    <--- ПРИЕХАЛИ [11:24:03] Recv: [11:24:03] Recv: +CFUN: 1 [11:24:04] Recv: [11:24:04] Recv: +CPIN: READY [11:24:07] Recv: [11:24:07] Recv: Call Ready [11:24:08] Recv: [11:24:08] Recv: SMS Ready