igorle
-
Постов
337 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные igorle
-
-
Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример)
Такой результат получится с любым исправным компилятором. Если есть под рукой GCC - посмотрите результат препроцессора. У меня под рукой нет. Поэтому сделаем препроцессинг вручную.
if (0) if (1) aaa();
превращается в
if (0) if (1) ; { printf("Good style saves you\n"); };
Или, после причесывания
if (0) if (1) ; { printf("Good style saves you\n"); };
А вывод один - обрамляйте любую макрофункцию, состоящую более чем из вызова одной функции, do {} while(0), и будет вам счастье.
я совершенно не представляю ситуацию когда не будет работать конструкция#define MacroName(параметры_если_есть) \ { /*комментарий0 если нужен */ \ оператор1; /*комментарий1 если нужен */ \ оператор2; /*комментарий2 если нужен */ \ }
Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно.
Ruslan1, выше был пример. Но я повторю его, так как выше смешал два случая:
#define aaa() { printf("XXX\n"); } if (1) aaa(); else printf("Yo are so wrong\n");
просто не скомпилируется.
-
Опубликовано · Изменено пользователем igorle · Пожаловаться
Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно?#define WDELAY_RESTART(); { \ TIM7->EGR = TIM_EGR_UG; \ TIM7->SR = 0; \ TIM7->CR1 |= TIM_CR1_CEN; \ }
Элементарно. Я исхожу из предположения, что точка с запятой здесь (WDELAY_RESTART(); ) поставлена умышленно:
#define aaa(); { printf("Good style saves you\n"); } int main() { int i = 0; if (0) if (1) aaa(); return 0; }
Будет напечаттано сообщение? Проверьте здесь
Теперь предположим, что точка с запятой стоят ошибочно (а это скорее всего так и есть)
Попытайтесь скомпилировать этот код:
#define aaa() { printf("XXX\n"); } int main() { if (0) if (1) aaa(); else printf("Yo are so wrong\n"); return 0; }
-
Нет, нельзя. Потому что по мере выполнения функции эта переменная может "блуждать" из регистра в регистр.
Хм. Логично. Во время выполнения регистр будет использоваться для разных нужд. Так что лучше "не искушать". Читать ассемблер даже полезно.
А как насчет первого вопроса? Как посмотреть - где я был, когда пришел интеррапт?
-
Кейл. STM32F1.
- Если я нахожусь в обработчике прерывания - могу ли я узнать, где мы находились в момент прерывания (куда вернемся из прерывания)
- Если для автоматической переменной в функции используется регистр, то в "call stack + locals" я эту переменную не вижу. Могу ли я узнать - какой регистр соответствует этой переменной, без того, чтобы дизассемблировать код?
-
Опубликовано · Изменено пользователем igorle · Пожаловаться
У меня использование операции "остаток от деления" значительно увеличивает размер скомпилированного кода. Я бы сдеалал как-то так:
#define CAPACITY 5 #define DIVIDER 10000 /* DIVIDER should be 10^(CAPACITY - 1) */ char b[CAPACITY] = {0}; int i; int divider = DIVIDER; for (i = 0; i < CAPACITY; i++) { while (v > divider) { v -= divider; b[i]++; } divider /= 10; }
-
рекомендую использовать функцию memcpy()
Она обычно оптимизирована для каждой платформы. В крайнем случае она сделает то же самое копирование байт за байтом, но в большинстве случаев она работает быстрее.
Функция принимает два указателя на void. Так что любой другой указатель приведется к типу (void *) без ворнинга.
-
У Winbond есть чипы рекордеров звука (ISDxxx). Но они не очень пригодны для "хомяка"...
А почему не пригодны? Я отложил в сторону ISD5100 - хочу поиграть с нею в долгие зимние вечера.... Мне казалось, что она для хомяка - самое то - не дорогая и, кажется, простая в управлении.
Какие с ней проблемы?
-
Можно использовать указатель буфера FIFO для управления по обратной связи частотой считывания из буфера и интерполяцией сигнала под местный клок.
для осуществления обратной связи используется протокол RTCP
-
Но это только домыслы. А хочется правды! :)
если часы в приемнике медленнее - по мере переполнения буфера пакет-другой выбрасывается.
Если часы в приемнике быстрее - то при опустошении буффера звук/картинка останавливается для буфферизации. Поскольку часы относительно точные - проблемы возникают не часто.
-
Пишу как сам поступаю, не считайте абсолютной истиной ниженаписанное...
Я согласен. Я не занимаюсь производством. Делаю прототипы разных решений для собственного удовольствия. Сейчас у меня в арсенале есть PLM - модем для передачи данных по сети. И мне не нравится то, что имея 220 на борту, я рядом размещаю еще один адаптер. 220AC/5DC. Это при том, что плата с PLM не перегружена. (платы 5х5 см.)
Занятие мое совершенно иррационально. Возможно, я просто перенесу детали с USB адаптера к себе. Все-равно при цене 80 центов за адаптер детали обойдутся дороже.
-
Опубликовано · Изменено пользователем igorle · Пожаловаться
Спасибо.
Пошел смотреть.
На всякий случай поясню - я знаю принцип работы импульсного блока питания. Меня интересует именно обратная связь, которая выполнена с использованием оптрона. Я разломал с десяток блоков питания разных производителей (мне коллеги приносят свои, когда они перестают работать), и вижу, что все они отличаются или серьезностью фильтров на входе, или выпрямителем на выходе. Но загадочный оптрон есть у всех. Вопрос был про обратную связь через оптрон.
По поводу напряжений - я знаю и умею. Мой Power Line Modem (через 220) работает отлично. Я как раз к нему и собираюсь добавить блок питания.
-
Во многих блоках питания вижу оптрон рядом с небольшим трансформатором. Похоже, что это стандарт на сегодня. Я купил по 80 центов маленьких адаптеров для USB и сую в свои самоделки.
Теперь, для экономии места, хочу встроить схему в печатку. В связи с этим вопросы:
- Как называется такая схема блока питания? (чтобы знать что искать)
- Можете ли посоветовать книгу (желательно - pdf) или хорошую статью, объясняющую принцип действия?
- Где берут трансформаторы для таких блоков? Речь идет о нескольких десятках штук.
PS. К сожалению, поиском по этому форуму ничего не нашел. Хотя наверняка эта тема здесь обсуждалась. Если кто помнит подходящую ветку - дайте линк, пожалуйста.
-
геркон- не уверен, что подойдет по скорости. Наверное, вернее датчик холла. Или к АЦП его подключать или на прерывание.
Боюсь представить, с какой скоростью у вас наматывается шнур, если геркон не успеет сработать. Ну и концевой датчик в любом случае надо делать для дублирования. Завяжите устричный узел на шнуре, пропустите сквозь петлю на концевике и отключайте питание железно (без CPU) по срабатыванию.
-
Ну я так понял по контексту, что речь идет не о металлическом тросе. Поскольку магнит вплетают. А о синтетическом шнуре.
-
А геркон не годится для этих целей?
-
Нет, нормально и 50мА получится.
Ну, раз вы даете "добро" - попробую так.
Только, сдаётся мне, MSP430 для этой цели слабоват. Надо бы не меньше 32-разрядного ARM закладывать.Сарказм виден, но не оправдан. На двух элементах, полученных бесплатно из TI, можно сделать все устройство. Я любитель, а не профи. Но что-то мне подсказывает, что даже в небольшой серии это не дорого (90 центов MSP и 40 центов LDO).
Кстати, вот апп. ноут от Атмел со схемой:Спасибо. Посчитаю - проверю себя еще раз.
-
Речь идет о проекте "выходного дня"
Друг попросил сделать таймер для розетки. Чтобы включать тостер на короткое время.
Я нашел "двойник", у которого можно оставить одну розетку, а во вторую втиснуть электронику.
Имеем реле на 12 вольт (коммутация до 10 ампер), MSP430, две кнопки и леды.
Есть LDO, с входным напряжнием до 28 вольт
Планирую по кнопкам выбирать время включения. Например - 1 минута, 2, 3,5,10,15
Вопрос, как запитать схему. Надо 12 вольт 10 мА. Стабильность - не критична. Что этому реле сделается?
Если сделать делитель напряжения на двух конденсаторах 0.47 и 4.7 микрофарад, затем однополупериодный выпрямитель на одном диоде, сглаживающий конденсатор. От этого напряжения питать реле и LDO. Должно работать? Я ничего не упускаю?
-
Спасибо. Эти выходные буду изучать тему по Вашим ссылкам.
Кстати, у меня большая радость. Оказалось что в нашем здании и даже на нашем этаже есть представительство ST. И люди что сидят там - как раз и занимаются поддержкой разработчиков. Так что я договорился о встрече на следующей неделе. Обещали не только дать ссылки, но и совместно скомпилировать то что мне надо и проверить результат на моем борде.
-
Задача весьма своеобразная. Я делал на ARM9 дивайс, который при подключении по USB к машине представлялся для нее флэшкой, а носителем там служила SD - карточка....
Я когда нашел для себя (год назад) MSP430 и пищал от восторга (сделал несколько проектов для себя и друзей), то слышал от "теоретиков", мол брось ты его. Осваивай АРМ, например STM32. Для АРМа, говорят, есть масса библиотек и готовых проектов. Практически любую задачу уже решили и выложили код. Костяк любого разумного проекта, мол, будешь брать готовый прямо с сайта ST.
А сейчас я не могу найти даже готовый проект "Diskonkey". Чтобы PC видел стандартное USB устройство, а накопителем работала SD карточка. :(
А ведь и USB, SPI и файловая система - стандартные вещи.
То-ли все не так радужно, то-ли пока не разобрался, как искать.
Вопрос. Машина должна только читать данные с вашего дивайса, или может также и писать данные ?Желательно чтобы машина (PC) могла удалять файлы. Но в крайнем случае от этого можно и отказаться. В принципе, контроллер может сам удалять старые файлы.
Единственно, я хотел бы иметь возможность форматировать SD c PC, но и от этого можно отказаться. Вынимать карточку, ставить ее в адаптер и форматировать отдельно.
Я могу сообщить контроллеру, что сейчас идет форматирование и писать ничего не надо. Но читать надо "на лету".
-
От идеи USB хоста я уже отказался. SD карта выглядит более реальным вариантом. А вот то, что таких проектов нет готовых - не ожидал. Надеялся что задача тривиальная и многократно решенная, в том числе и в открытых проектах.
Жаль. Спасибо.
Я все-же попытаюсь. Я видел на сайте ST несколько пакетов для работы с USB. Кто-нибудь делал/видел обзор? Кто-нибудь их использует и может порекомендовать?
-
Мне надо компактно и из имеющихся материалов. А имею STM32F103C8
Странно, но я не нашел готового примера с USB "стика" для моего чипа. Есть один старый 2009 года. Но он с моим кейлом уже не совместим. Не в смысле формата проекта, а в смысле используемых инклюдов. Старый проект использует stm32f10x_lib.h. Сейчас вместо него Кейл определяет stm32f10x.h. И просто замена одного файла другим не работает :(
-
А можно подробности?
Вот здесь есть подробности. И сто с лишним комментариев.
-
Возникла потребность, для рабочих нужд, сделать на скорую руку накопитель информации на флэшке.
В идеале результат вижу так:
- Подключаем к устройству Diskonkey
- Подключаем устройство к PC (USB)
PC должен видеть флэшку, как будто она подключена к нему напрямую (или через хаб)
Устройство должно иметь возможность записывать файлы в файловую систему.
Цель - устройство пишет файлы на флэш, с компьютера данные считываются и стираются из флэшки.
Устройство нужно для собственных нужд, пользоваться буду я сам и коллеги. Так что можно пережить отдельные неудобства. Например, я могу не трогать текущий файл, открытый на запись устройством.
По сути, надо реализовать USB хост, USB устройство и файловую систему.
Что-то подсказывает мне, что идея не нова, и есть готовые проекты для этого.
Кто-то видел подобное и может дать ссылки? Чтобы не изобретать велосипед.
По силам это, например STM32F1?
PS. Я вот тут пораскинул мозгами. Может быть проще SD карточку приспособить, в качестве накопителя? Не надо будет USB хост городить...
-
Я вот здесь зарегистрировался специально чтобы выложить материал. Там есть и проект, и файлы для производства. Срого не судите и сильно не доверяйте. Я его проверил, работает. Но оптимальность не гарантирую. Это мой учебный борд. Я на нем учусь не только прогаммировать STM32F1, но и разводить под него печатку.
Можно ли в keil разбить #define на несколько строк ?
в Keil
Опубликовано · Пожаловаться
Поддерживаю предыдущего оратора.
И еще.
"функции" без точки с запятой в конце, сбивают механизм автоматической индентации. Например, я сейчас напечатал в виме код, и он выровнял мне его так:
А это некрасиво. И это уже достаточный повод не делать этого.