![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
adnega
-
Постов
3 594 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Сообщения, опубликованные adnega
-
-
-
Как ему указать что из union заполнять?
Не уверен, но кажется это фича gcc, а не языка C.
-
Как правильно записать, чтобы компилятор понял, что я от него хочу?
В gcc делаю так:
//----------------------------------------------------------------------------- // typedef struct sPARAM //----------------------------------------------------------------------------- typedef struct sPARAM { int delta; DWORD act_datetime; BYTE park_mask; BYTE wait_on; BYTE wait_period; BYTE pre_on; BYTE pre_period; BYTE fin_on; BYTE fin_period; BYTE to_pre; BYTE to_fin; BYTE to_done; BYTE l_pre; BYTE l_fin; BYTE to_btn_press; BYTE to_btn_release; union { DWORD flags; struct { union { WORD ev_msk; struct { WORD ev_msk_total:1; WORD ev_msk_restart:1; WORD ev_msk_power_fail:1; WORD ev_msk_enter:1; WORD ev_msk_start:1; WORD ev_msk_release:1; WORD ev_msk_enable:1; WORD ev_msk_disable:1; WORD ev_msk_reserv:8; }; }; WORD btn_inv:1; WORD box_led_inv:1; WORD flags_reserv:14; }; }; } sPARAM; //----------------------------------------------------------------------------- // const sPARAM param_default //----------------------------------------------------------------------------- const sPARAM param_default = { delta: 0, // delta act_datetime: ACT_ALWAYS,// ACT_NEVER, park_mask: 0, wait_on: RED_TIME(0.2), wait_period: RED_TIME(3.0), pre_on: RED_TIME(0.2), pre_period: RED_TIME(0.5), fin_on: RED_TIME(1.0), fin_period: RED_TIME(1.0), to_pre: TO_TIME(1.0), to_fin: TO_TIME(10.0), to_done: TO_TIME(2.0), l_pre: DISTANCE(1.0), l_fin: DISTANCE(0.4), to_btn_press: TO_BTN(1.0), to_btn_release: TO_BTN(1.0), ev_msk: 0, btn_inv: 0, box_led_inv: 0, };
-
Добрый день, уважаемые форумчане.
Купил плату STM32F4DISCOVERY
Установил Keil uVision4, написал helloworld в виде мигания светодиодами, получил hex файл(осталось только прошить), для этого скачал драйвер st-link usb driver v.2 и тут полный провал: драйвер вроде устанавливается, однако комп начинает искать драйвер, я указываю путь туда куда он сам должен был установиться(путь он сам указывал), в итоге этого драйвера там не обнаруживается. удалил драйвер, перезагрузил комп, заново поставил - теперь вообще плату не видит. виртуальные порты отключены. Помогите кто сталкивался с подобной проблемой, может это как то связано с вистой, уже 3 дня убил на это. в гугле ничего адекватного не нашел
Как-то на поведение влияет уровень прав в системе, антивирус и эмуляторы дисков...
-
Экономия места на плате. Прицепить внешнюю физику конечно не проблема. Например ksz8041rnl ( корпус 32 MLF) в габаритах всего 5мм*5мм. Но иногда и такую площадь выкроить трудно.
А KSZ8021/8031 и того меньше: 24 ноги в корпусе 4 * 4 мм.
Плюс фичи: встроенные резисторы-терминаторы, проверка статуса линии с измерением расстояния до проблемного места и т.п.
-
Ввод цифр от 0 до 9 при помощи энкодера (по типу сейфового замка: "5 по часовой, 3 против часовой").
Может, идея Вам поможет.
pos = TIM3->CNT; // считываем положение энкодера if((pos > (encoder_position + (1<<ENCODER_SENCE) - 1)) &&((pos - encoder_position)<((ENCODER_MAX<<ENCODER_SENCE)>>1))) { //pos if(enc_dir == -1) { #ifdef ENCODER_DEBUG tx0_push('#'); tx0_push(' '); #endif //ENCODER_DEBUG tx0_dec(enc_num); #ifdef ENCODER_DEBUG tx0_push(' '); tx0_push('#'); #endif //ENCODER_DEBUG tx0_start(); enc_num = 0; } enc_time = 0; enc_dir = 1; enc_num += (pos - encoder_position)>>ENCODER_SENCE; if(enc_num >= 10) { enc_num = 0; } #ifdef ENCODER_DEBUG tx0_push('['); tx0_dec(enc_num); tx0_push(']'); tx0_start(); #endif //ENCODER_DEBUG encoder_position = pos; }else if((pos < (encoder_position - (1<<ENCODER_SENCE) + 1)) &&((encoder_position - pos)>((ENCODER_MAX<<ENCODER_SENCE)>>1))) { //pos if(enc_dir == -1) { #ifdef ENCODER_DEBUG tx0_push('#'); tx0_push(' '); #endif //ENCODER_DEBUG tx0_dec(enc_num); #ifdef ENCODER_DEBUG tx0_push(' '); tx0_push('#'); #endif //ENCODER_DEBUG tx0_start(); enc_num = 0; } enc_time = 0; enc_dir = 1; enc_num += (pos + (ENCODER_MAX<<ENCODER_SENCE) - encoder_position)>>ENCODER_SENCE; if(enc_num >= 10) { enc_num = 0; } #ifdef ENCODER_DEBUG tx0_push('<'); tx0_dec(enc_num); tx0_push('>'); tx0_start(); #endif //ENCODER_DEBUG encoder_position = pos; }else if((pos < (encoder_position - (1<<ENCODER_SENCE) + 1)) &&((encoder_position - pos)<((ENCODER_MAX<<ENCODER_SENCE)>>1))) { //neg if(enc_dir == 1) { #ifdef ENCODER_DEBUG tx0_push('#'); tx0_push(' '); #endif //ENCODER_DEBUG tx0_dec(enc_num); #ifdef ENCODER_DEBUG tx0_push(' '); tx0_push('#'); #endif //ENCODER_DEBUG tx0_start(); enc_num = 0; } enc_time = 0; enc_dir = -1; enc_num += (encoder_position - pos)>>ENCODER_SENCE; if(enc_num >= 10) { enc_num = 0; } #ifdef ENCODER_DEBUG tx0_push('('); tx0_dec(enc_num); tx0_push(')'); tx0_start(); #endif //ENCODER_DEBUG encoder_position = pos; }else if((pos < (encoder_position + (ENCODER_MAX<<ENCODER_SENCE) - (1<<ENCODER_SENCE) + 1)) &&((pos - encoder_position)>((ENCODER_MAX<<ENCODER_SENCE)>>1))) { //neg if(enc_dir == 1) { #ifdef ENCODER_DEBUG tx0_push('#'); tx0_push(' '); #endif //ENCODER_DEBUG tx0_dec(enc_num); #ifdef ENCODER_DEBUG tx0_push(' '); tx0_push('#'); #endif //ENCODER_DEBUG tx0_start(); enc_num = 0; } enc_time = 0; enc_dir = -1; enc_num += (encoder_position + (ENCODER_MAX<<ENCODER_SENCE) - pos)>>ENCODER_SENCE; if(enc_num >= 10) { enc_num = 0; } #ifdef ENCODER_DEBUG tx0_push('{'); tx0_dec(enc_num); tx0_push('}'); tx0_start(); #endif //ENCODER_DEBUG encoder_position = pos; } if(enc_time < (TO_SEC * 2)) { enc_time++; if(enc_time == ((TO_SEC * 2))) { #ifdef ENCODER_DEBUG tx0_push('#'); tx0_push(' '); #endif //ENCODER_DEBUG tx0_dec(enc_num); #ifdef ENCODER_DEBUG tx0_push(' '); tx0_push('#'); #endif //ENCODER_DEBUG tx0_str("\n\r"); tx0_start(); enc_dir = 0; enc_num = 0; } }
-
И будет правильно.
И шину данных не забыть сделать...
-
Вопрос: Каково поведение токов и напряжений цепи, приведенной на рисунке 2 в начальный момент времени?
Буду очень признателен за пояснение )
Вам показалось, что в начальный момент между верхним контактом батарейки и верхним контактом конденсатора будет разность потенциалов; вы их соединяете и должен побежать ток? От этого замешательство?
На самом деле будет примерно так:
- вы подключаете провод к верхней обкладке конденсатора;
- затем перемещаете этот провод (проводник) в поле верхнего контакта батарейки. при этом поверхность проводника эквипотенциальна;
- когда проводник окажется в сколь угодно маленькой области верхнего контакта батарейки их потенциалы практически выровняются;
- затем касание одного проводника другим с одинаковым потенциалом - тока нет!
Вероятно, при перемещении проводника в поле верхнего контакта батарейки Вы совершаете какую-то работу.
Если я не прав, то можно получать ток над поверхностью Земли (напряженность, вроде 200 Вольт на метр).
-
Еще можно обратить внимание на регистры NVIC->IP, NVIC->IPR.
Они отвечают за приоритет прерываний.
-
Главное, что не будет одновременного подключения силовухи и измериловки ни при каких обстоятельствах
Как вариант первая группа еще на силовой части схемы, через ТЭН силовая часть соединяется со второй группой
реле, которая подключена к измерительной части схемы. В данный момент времени через первую группу реле подавалась
фаза, а минус измерительной части соединен с землей (заземлен).
Допустим первая группа контактов реле пригорела при предыдущем переключении. Ведь может такое быть?
-
Хорошая идея использовать реле. Например с двумя контактами на переключение, ТЭН в сеть 220 или к измерительному мосту.
При этом не забываем, что группы реле переключаются не одновременно.
-
Так и есть, надо использовать мерный стаканчик при засыпке стирального порошка в лоток.
А научившись взвешивать белье, можно от мерного стаканчика отказаться.
Видеокамера определит степень загрязнения белья, а машинка возьмет из Интернета коэффициент
"стирабельности" данного моющего средства - и автоматическая доза порошка будет готова.
А, поскольку мы умеем определять норму порошка в автоматическом режиме, можно сэкономить
не только на мерном стаканчике, но и на дисплее и других элементах управления. Одной красной
кнопки "Стирать" по-моему достаточно.
-
А с глючащим энкодером - если дело не вылечивается прошивкой, то (как крайний вариант) можно смастерить кондиционер импульсов (на чем-нибудь мелком 6...8-ногом). До такой степени мое недовольство пока не доросло ;)
Прошивка последняя.
Думаю, вскрыть и поприжать корпус энкодера будет достаточно (компьютерной мышке это помогало).
Но нарушать пломбы пока не хотелось бы.
-
А чего с энкодерами не так ?
Возможно это проблема только моего экземпляра (хотя в инете встречал замечания на эту тему), но
при изменении масштаба (что по осям, что по синхронизации) переключит то вверх, то вниз пару раз, то еще вниз.
Скорость, угол давления на ручку несколько исправляют ситуацию, но все равно не удобно.
Хотя жить можно)
По сравнению с моим старым PDS-5022s - день и ночь)
-
Мне не нравятся только тугие кнопки вокруг экрана и отстутствие крышки, закрывающей экран и кнопки (но есть сумка, докупаемая отдельно).
А еще глючащие энкодеры и иногда гудящий вентилятор))
-
Так у Вас проблемы были с 16В танталовыми конденсаторами установленными на номинал до 13.5В?
Или с другими?
И да, и нет.
В нормальных условиях 16В танталовые конденсаторы работают сколь угодно долго при напряжении 13.5В.
Но блок питания не простой: если по двух каналам 12В одновременно устроить КЗ, то блок сначала будет потреблять
максимальный ток (т.к. каналы переходят в режим стабилизации тока), а затем через таймаут выключатся, т.е.
блок начнет потреблять минимальный ток. При таком переходе появляется выброс превышающий 16В. Некоторые
танталовые конденсаторы этого не переживают.
Хотя если быть абсолютно точным, то при таких перепадах у нас не взорвался ни один конденсатор.
Как правило, они взрывались при первом включении, но насколько я понимаю переходный процесс той же природы.
-
Это же какого высочайшего уровня должен быть разработчик, чтобы в устройство с питанием 13.5 В ставить 16-вольтовые конденсаторы.....
"Разработчик выяснил...." Вычесть из зарплаты у того, кто схему разработчика проверял, а самого разработчика направить доучивать материал, который он прогулял во время учебы.
Посоветуйте разработчику еще почитать про переходные процессы, разброс параметров элементов и температурные зависимости, а также (до кучи, раз уж он DC/DC разрабатывает) и про изменение емкости от приложенного напряжения у керамических многослойных конденсатов, может быть он еще что-то новое для себя откроет...
Вы слишком вспыльчивы, как будто Вас это конкретных разработчик чем-то обидел.
Квалификация разработчика более чем достаточна. Перед макетированием практически
все режимы проверялись моделированием. На первой партии (считай первой итерации)
был замечен описанный выше эффект. Когда воспроизвели ситуацию в модельке стало ясно
о величине напряжений при переходном процессе. После этого я (программист) поправил
софт, так чтобы потребители не отключались от БП одновременно (большой скачок тока)
стало уже во много раз лучше, поправили номиналы в цепи обратной связи эффект вообще пропал,
но на всякий случай расширили номенклатуру (что я считаю отрицательной операцией) - подняли
напряжение конденсатора до 35В.
По поводу зарплат: это не такая большая контора, где над одним разработчиком два проверяющих и пять начальников.
По квалификации данный разработчик самый компетентный специалист в данной области в данной организации.
Проверять некому))
Повторюсь: дело было практически на прототипах. В наличии были только 16В конденсаторы - первые образцы
работали как часы во всех режимах. Пришли конденсаторы из новой партии - поимели проблем.
Рано или поздно недостаток все равно бы нашли, наблюдая переходные процессы на осциллографе.
В общих чертах требования к блоку питания:
- входное напряжение от 9В до 40В;
- выходное напряжение 5В+-10% 1А;
- два канала по 12В+-20% с ограничением по току 400мА (при токе > 450 мА канал отключается);
- каналы 12В работают независимо. При аварии напряжение с канала снимается, выдерживается таймаут,
напряжение подается снова, если в течении таймаута напряжение на выходе не достигнет определенного
уровня процесс повторяется;
- без гальваноизоляции;
- минимальная цена, минимальный габарит, доставабельная комплектуха (срок поставки 2 недели),
минимум моточных, без калибровок/настроек и т.п.;
- минимальное время разработки!
Тут обычной квалификации понимаете ли не хватает))
Эти контролеры по сей день выпускаются серийно. Блок питания приблизительно 1/6 часть всей начинки.
-
Может, просто FPU забыли включить перед употреблением?
LDR.W R0, =0xE000ED88 LDR R1, [R0] ORR R1, R1, #(0xF << 20) STR R1, [R0]
-
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1;
Так делать нельзя! Обсуждалось уже не раз. Подробности есть в документации))
Bits 26:24 SWJ_CFG[2:0]: Serial wire JTAG configurationThese bits are write-only (when read, the value is undefined).
-
В чем может быть причина такого поведения st-link-ов?
Может программа отключает SWD?
Попробуйте с ST-LINK v2 завести еще и сигнал RESET на контроллер (на плате SB11 придется выпаять).
-
Был один случай когда на вход без резистора подали +16в. :)
Кристалл накрылся целиком, дорожки 0.35 на 18 мкм поперегорали..
Не далее чем вчера поимел неприятностей с STM32F373CBT6.
Вывод PA3 по непонятной мне причине "поджарился" и начал давать утечку на 3В.
На выход работал исправно. Заменил - все сразу заработало.
-
что если подать напряжение на вход ацп последовательно через резистор Rain=300к (точность мне не важна
Без конденсатора на этом же выводе с АЦП будет приходить все что угодно, но не данные о напряжении.
И, вроде, там смещение в сторону VDD/2 идет (правда не знаю каким током)...
А бы не стал рисковать - входы у STM32 очень нежные: чуть что не так - КЗ по питанию. Какая тут экономия?
-
Только объясните мне, почему если месяц меньше 3-х, то необходимо год уменьшить на 1, а количество месяцев увеличить на 12?
Видимо, чтобы "изменчивый" февраль был в конце.
-
Время ведь понятие человеческое, людям свойственно менять отношение к собственным понятиям.
Все просто: приведенные формулы годятся для существующего сейчас календаря.
Когда календарь поменяют, тогда поменяем и формулы.
Привязываться к астрономической точности в рамках решаемой задачи явный перебор.
Эдак можно задачу и не решить... ведь в сутках не ровно 24 часа... да и вращается Земля вокруг
собственной оси с небольшим снижением оборотов...
А если два события происходят в разных точках пространства... или по разные стороны "линии перемены дат"...
Условностей много, и это еще без привлечения религий))
Изучение модуля USB
в ARM
Опубликовано · Пожаловаться
Думаю, что в define.h должно быть так: