Перейти к содержанию
    

adnega

Свой
  • Постов

    3 603
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент adnega


  1. Не стартует Atmega644P

    Неинициализированная переменная?
  2. Использую FGK-320. Отлично накатывает фоторезист (пользую ПФ-ВЩ), а перевод тонера с "правильной" бумаги вообще шокировал... простотой и качеством))
  3. Я-то боюсь, что "умный" оптимизатор вообще вправе выкинуть финт: если к некоторому числу прибавить положительную константу, то результат (чисто в математическом смысле) будет БОЛЬШЕ исходного числа - поэтому условие всегда истинное. А если программисту нужна такая "платформенная вещь" как "переполнение", то либо врукопашную оптимизируй, либо научись грамотно указать оптимизатору свои намеренья. Вывод для себя делаю такой: если переполняется какая-то переменная, то алгоритм можно считать плохим. На этапе проектирования не нужно допускать неограниченного инкремента "тикающих" переменных (справедливо для всех случаев, кроме измерителя uptime, но тут нужно наращивать разрядность, либо вводить масштаб). Для битовых полей написать специальный макрос/функцию для выполнения этой конкретной задачи. Вообще, это скорее проблема программиста (моя), а не инструмента: хочется чтобы программа сама себя писала, но для решения данной проблемы есть ДРУГИЕ инструменты, которыми и нужно пользоваться.
  4. Не пойдет( Это для каждого счетчика нужно "придумывать" свое ограничение. Причем изменив разрядность (тип) счетчика придется ручками по всему коду править ограничения - а это источник ошибок. Хотелось на автомате... Но за неумением "объяснить" свои намеренья оптимизирующему компилятору придется вводить единый тип для всех "тикалок". Кста, Ваша идея мне нравится и везде я стараюсь пользоваться конструкциями TICK(timeout); if(timeout >= TO_TIMEOUT) { state = NEW_STATE; timeout = 0; } или if(timeout < TO_TIMEOUT) TICK(timeout); Что так или иначе ограничивает увеличение timeout, но второй вариант можно использовать только если ограничение какое-то одно (фиксированное), а сам таймер предназначен для ожидания какого-то одного события. Если это не так, то использую вариант 1.
  5. Пока сделаю так: typedef volatile unsigned long tTIMER; void __inline tick(tTIMER *t) { tTIMER temp; temp = *t; temp += TO_TICK; if(temp > (*t)) *t = temp; } tTIMER test_ttimer; // тестовая переменная tick(&test_ttimer); // вызов функции тика Причем "тикать" строго из одного потока. Читать таймер из любого множества потоков. Потому что чистый C.
  6. Не работает при вызове TICK2 в SysTick при оптимизации Os, хотя при использовании во вложенных функциях, вызываемых из SysTick - работает. Блин... Сделаю выделенный "тикающий тип" и заведу функцию для контроля передаваемого типа.
  7. А то! Раньше было много, сейчас, видимо, придется переходить на одну. В целях экономии памяти использую различную разрядность "тикающих типов", в идеале вплоть до битовых полей.
  8. Чтобы работало для разных типов на автомате.
  9. Имеем gcc, пишем на C. Задача: нужно написать некоторый макрос TICK(x), который бы при каждом вызове увеличивал переменную x на константу TO_TICK, но с учетом переполнения. Т.е. в случае если добавление TO_TICK вызовет переполнение, переменную x не изменять. Тип переменной x может быть любой целый (в том числе битовое поле). Вариант 1: #define TICK(x) do{if((x + TO_TICK) > x) x += TO_TICK;}while(0) не помогает, в случае знакового x и беззнакового TO_TICK. Видимо, (x + TO_TICK) считается беззнаковым и сравнивается с беззнаковым x. Вариант 2: #define TICK2(x) do{typedef typeof(x) _tx; _tx _x = x; _x += TO_TICK; if(_x > x) x = _x;}while(0) в принципе устраивает, но не работает с битовыми полями. Параллельно узнал, что char без указания знаковости в "gcc version 4.8.0 20121121 (experimental) (Klen's GNU package (KGP) for ARM/elf platform)" является unsigned, хотя везде указывается диапазон char от -128 до 127. В "gcc версия 4.4.3 (GCC)" под Linux char знаковый. Где нужно читать о типах данных C/GCC и приведении типов в арифметических операциях и операциях сравнения? Кстати, при различных уровнях оптимизации результат тоже получаю различный. Хочется большей строгости... Спасет ли переход на C++/GCC ?
  10. Зачем измерять емкость с преобразованием в частоту, а затем в напряжение, когда можно собрать просто резистивный делитель из резистора и пальца? Или обкладки сенсора покрыты непроводящем слоем? Модель касания, по-моему, это не только емкость, но и сопротивление утечки и генератор 50Гц через еще одну емкость. Разве нет? Может схема просто на выходе имеет меандр 50Гц, который сглаживается и сравнивается с порогом? Смотрели осциллографом, как выглядит сигнал до и после касания?
  11. В регистре LPC_SYSCON->SYSAHBCLKCTRL включен битик для IOCON (по умолчанию выключен)?
  12. Если Мега8 не принципиально и места хочется сэкономить, то может лучше LPC11C24FBD48 (с набортной CAN-Phy)?
  13. #define PER_BASE 0x40000000 #define PER_BB_BASE 0x42000000 #define PER_BIT_ADDR(VarAddr,BitNumber) \ (*(vu32 *)(PER_BB_BASE|((VarAddr-PER_BASE)<<5)|((BitNumber)<<2))) #define WORKLED (8) //!< PA8 - Светодиод "РАБОТА". #define WORKLED_bit PER_BIT_ADDR(((DWORD)&GPIOA->ODR), WORKLED) #define ON WORKLED_bit = 1 #define OFF WORKLED_bit = 0 В программе используем ON; OFF; WORKLED_bit = 0; // сброс WORKLED_bit = 1; // установка WORKLED_bit ^= 1; // инверсия На Cortex-M3 работать будет, на C-M0 - нет)
  14. Может, он в децибелах кажет?!
  15. STM32F103 + Encoder

    Задействовать TIM_SelectHallSensor.
  16. Это не нормально. Это выход! Может есть другой способ получения негативного фотошаблона из KiCAD?!
  17. Смысл расчета: узнать, можно ли по запаху определить взрывоопасную концентрацию. Ответ: да. Если от 20 мл, необходимых для проведения работ, запах уже резкий, то от 1200 мл (при равномерной концентрации) даже трудно себе представить. Можно понять, почему от лопнувшего пузыречка ацетона вылетела дверь и окно, но никто не пострадал - люди в таком помещении находиться не смогли бы (из-за запаха). По концентрации, думаю, вопрос снят. Но остаются "перекись натрия или хромовый ангидрид". Кто это такие и как они могут попасть в бутылку с ацетоном? Или это предупреждение, чтоб ВВ целенаправленно не изготавливали?
  18. Но с другой стороны... Для достижения 2% (по объему) концентрации нужно в помещении (лоджия) с объемом 22 м3 иметь 440 литров газообразного ацетона (20 моль). При молярной массе 58 г/моль это порядка 1 кг ацетона. Масса ацетона в бутылке 440 г. Так вот: для взрывоопасной концентрации нужно разлить минимум две таких бутылки и дать им испарится в непроветриваемой обстановке. Не реально)) PS. Пойду высплюсь... PS2. Надеюсь, ошибок в расчетах нет...
  19. Ацетон используется для увеличения контраста фотошаблона, полученного при печати на лазерном принтере. В блюдце наливается 5 мм слой ацетона. Поверх (тонером над ацетоном) герметично укладывается фотошаблон. Думаю, чтобы взорвалось концентрация (читай запах) должны быть сильными. По окончании остатки ацетона собираются. Смывать фоторезист (я использую ПФ-ВЩ-50) можно "Кротом".
  20. Ламинатор на минимальном нагреве. Фотошаблон на пленке, печать лазерным принтером. Усилить контраст при помощи ацетона (около 6 минут). Кста, если в ЛУТ У заменить на ламинатор (+бумага от некоторых журналов), то результат тоже впечатляет! Просто мочишь теплой водой, бумага отваливается, а весь тонер на меди. Ничего натирать пальцем не надо.
  21. Для более равномерного покрытия в неоднородностях (края, переходные отверстия и т.п.)
×
×
  • Создать...