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

adnega

Свой
  • Постов

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

  • Посещение

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

    3

Сообщения, опубликованные adnega


  1. Имеем 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 ?

  2. P.S Схема работает проверено, интересует надёжность схемы и возможность ложного срабатывания.

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

    Или обкладки сенсора покрыты непроводящем слоем?

    Модель касания, по-моему, это не только емкость, но и сопротивление утечки и генератор 50Гц через еще одну емкость. Разве нет?

    Может схема просто на выходе имеет меандр 50Гц, который сглаживается и сравнивается с порогом?

    Смотрели осциллографом, как выглядит сигнал до и после касания?

  3. Привет ребята.

     

    Может кто нибудь можете помочь с кодом эмуляции CAN'а на Си для ATmega8? Что-то похоже есть здесь,но там все на асемблере....

    Знаю что можно с mcp2515, но в каробке выключятеля мало место, то хочется чтобы было меньше деталей. Спасибо.

    Если Мега8 не принципиально и места хочется сэкономить, то может лучше LPC11C24FBD48 (с набортной CAN-Phy)?

  4. Господа, есть библиотека, написанная на ногодрыге под AVR.

    В ней полно строк типа CS=1;CS=0; DOUT=1; DOUT=0;

     

    Я хочу ее переделать под STM32F103.

    Допустим я хочу прилепить CS на PA0;

     

    Как мне дописать строку #define CS чтобы CS=1; включало единичку на PA0 ?

     

    Спасибо

    #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 - нет)

  5. Это, наверное, если считать что пары ацетона равномерно распределятся по всему объему помещения. Подозреваю что при разной плотности воздуха и паров ацетона, а также в отстуствии сильных движений водуха (вентиляция, сквозняк и прочая естественная конвекция) испарения могут сконцентрироваться в небольшой обасти и 2% там будут достигнуты очень быстро.

    Бытовой газ же когда взрывается он не обязательно весь дом от пола до потолка заполняет.

    Смысл расчета: узнать, можно ли по запаху определить взрывоопасную концентрацию.

    Ответ: да.

    Если от 20 мл, необходимых для проведения работ, запах уже резкий, то от 1200 мл (при равномерной концентрации) даже трудно себе представить.

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

    По концентрации, думаю, вопрос снят. Но остаются "перекись натрия или хромовый ангидрид". Кто это такие и как они могут попасть в бутылку с ацетоном? Или это предупреждение, чтоб ВВ целенаправленно не изготавливали?

  6. Меньше знаешь - крепче спишь (((

    Но с другой стороны...

    Для достижения 2% (по объему) концентрации нужно в помещении (лоджия) с объемом 22 м3 иметь 440 литров газообразного ацетона (20 моль). При молярной массе 58 г/моль это порядка 1 кг ацетона. Масса ацетона в бутылке 440 г. Так вот: для взрывоопасной концентрации нужно разлить минимум две таких бутылки и дать им испарится в непроветриваемой обстановке. Не реально))

     

    PS. Пойду высплюсь...

    PS2. Надеюсь, ошибок в расчетах нет...

  7. Напрасно Вы так думаете.

    Воздушные смеси, содержащие от 2,5 % до 12,8 % (по объёму) взрывоопасны. С этим необходимо считаться, так как ацетон быстро испаряется, и образующееся облако может распространиться до места воспламенения (нагрев или искра) вдали от места работы с ним.

    Меньше знаешь - крепче спишь (((

    Ни при каких обстоятельствах не давайте ацетону взаимодействовать с перекисью натрия или хромовым ангидридом. Дело в том, что при взаимодействии с этими веществами ацетон не только воспламеняется, но и порождает взрыв.
  8. По рекомендациям производителя фоторезиста, смывка производится нашатырным спиртом. Бросаете платку с фоторезистом в этот раствор и ожидаете минут 10. Затем вынимаете. Незасвеченый фоторезист растворяется, засвеченный - отстаёт от платы в виде мягкой плёнки. Кому пришла идея не читать рекомендации изготовителя и растворять фоторезист в ацетоне до сих пор неизвестно.

    Он, конечно, в ацетоне растворяется. Но зачем это делать? Смывку необходимо производить тщательно, многократно протирая одни и те же места новым и чистым тампоном. А в раствор нашатырного спирта бросил, подождал несколько минут и вынимаешь абсолютно чистую платку.

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

    В блюдце наливается 5 мм слой ацетона. Поверх (тонером над ацетоном) герметично укладывается фотошаблон.

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

    Смывать фоторезист (я использую ПФ-ВЩ-50) можно "Кротом".

  9. Ламинатор на минимальном нагреве.

    Фотошаблон на пленке, печать лазерным принтером.

    Усилить контраст при помощи ацетона (около 6 минут).

    Кста, если в ЛУТ У заменить на ламинатор (+бумага от некоторых журналов), то результат тоже впечатляет!

    Просто мочишь теплой водой, бумага отваливается, а весь тонер на меди. Ничего натирать пальцем не надо.

  10. А зачем использовать импульсы отрицательной полярности?... :wub:

    Для более равномерного покрытия в неоднородностях (края, переходные отверстия и т.п.)

  11. тут такое дело: нет, период не важен. Он всегда будет одинаковый. Но ширина пульса разная может быть. Например пока ширина входного пульса меньше 1.5мс я не хочу чтобы срабатывало прерывание, но если вдруг ширина превысит скажем 1.5мс, мне нужно чтобы сработало прерывание.

     

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

     

     

    понятно, тогда покопаюсь дальше, напишу. а так если есть еще какие идеи будет интерестно узнать.

    Для тактовой 168МГц 1.5мс это аж 252000 тактов.

    Если процедура обработки займет 100 тактов, то проц будет нагружен на 0.04%.

    Можно не заморачиваться и сделать обработку в прерывании.

    Хотя есть одна уязвимость. Если на вход подать меандр с частотой мегагерц 10, то скорее всего все умрет.

    Я бы сделал так:

    1. У Вас уже есть механизим получения длительности и периода импульса аппаратно на таймере (правда, прерывания по первому и второму каналу нужно отключить).

    2. Добавляете еще один (третий) канал сравнения на 1.5мс (и включаете ему прерывания).

    3. При возникновении события по третьему каналу входим в прерывание и анализируем флаги в статусном регистре. Если флаг второго канала установлен, то спад от импульса пришел ранее 1.5мс и это короткий имульс - отбрасываем. Если флаг второго канала НЕ установлен, то спада импульса еще не было, и получается импульс шире 1.5мс - интересующий нас случай.

    4. Можно показать, что сигналы короче 1.5мс (частота выше 666Гц) не будут вызывать прерывания. В самом хужшем случае прерывания будут каждые 1.5мс с указанной выше нагрузкой (порядка 0.04%).

     

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

     

    Но теперь мне нужно чтобы прерывание срабатывало только тогда когда скажем ширина пульса имеет определенное значение (или выше/ниже определенного значения).

     

    Период импульса не важен?

    Если нужна аппаратная реализация с генерацией прерывания при поступлении импулься широной от T1 до T2 без участия CPU, то самое простое что мне видится:

    - нстроить таймер на запуск по фронту с входа;

    - настроить первый канал на время T1 с генерацией DMA-запроса;

    - настроить второй канал на время T2 с генерацией DMA-запроса;

    - DMA-запрос от первого канала настроить на запись управляющего слова в регистр РАЗРЕШЕНИЯ прерывания от внешнего входа по спаду импульса;

    - DMA-запрос от второго канала настроить на запись управляющего слова в регистр ЗАПРЕЩЕНИЯ прерывания от внешнего входа по спаду импульса;

    - иметь ввиду, что DMA имеет "приличное" время отклика на событие (порядка 12 тактов), поэтому очень короткие импульсы (с точность 100нс) отловить не получится.

     

    Читать TIMER, DMA, EXTI.

    Надеюсь, ясно описал)

     

    PS. Кстати, может и не получится(

    Чисто аппаратная реализация (без участия CPU) не всегда возможна.

    Почему нельзя использовать прерывания?

  13. При температуре ниже примерно +10 градусов перестают работать часы. Причем при считывании счетчика RTC возвращает 0.

    В свое время морозили STM32F103RET6 до минус 65C. До минус 50C все работало, при минус 60C начинало отказывать (скорее всего логика и ключи, т.к. проц по интерфейсу работал исправно), при прогреве до минус 55C работоспособность восстанавливалась. Часовой кварц такой: KX-327ST.

  14. Есть кусочек кода

     

    tI2C->I2CLK = (u32divider & ~0xFF)? 0xFF:((u32divider & ~0x03)? u32divider: 4);

     

    взят из библиотеки под МК. Собственно вопрос что означает этот код, а конкретно что делает оператор"?" и ":"?

     

    Упрощенная запись оператора if

    if(cond) x=val1;
    else x=val2;
    
    может быть записано так
    
    x = (cond)? val1 : val2;

  15. Из плюсов "дёшево и просто" следует исключить, ибо моточные изделия никогда дешёвыми не были. Это в одном экземпляре Вы можете намотать колечко самостоятельно.

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

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

    Есть готовые трансформаторы 1:1 по 9 руб./шт. Поэтому все же "дешево".

    По поводу наводок. Самая распространенная 50Гц и гармоники. Поскольку на входе индуктивность (причем маленькая, около 100мкГн), то для такого низкочастотного сигнала трансформатор превращается в "гвоздь". Моделирование показывает, что практически прямое (через 10 Ом) попадание 220В 50Гц на вторичку трансформатора не оказывает ни какого влияния на работу схемы (правда, моделька с линейной индуктивностью и не учитывает насыщение). К тому же ток под 30А легко расплавит предохранитель на выходе устройства.

    И наоборот, высокочастотный 5МГц сигнал (так же 220В через 10 Ом) с учетом индуктивности проводов и входной емкости 560пФ практически полностью шунтируется емкостью. На первичной стороне конечно наблюдается модуляция, но около 10%.

    Все становится плохо только в районе 200кГц. Схема в указанных выше условиях не то что не работает, а может и "пыхнуть первичкой" (на коллекторе транзистора порядка 80В).

×
×
  • Создать...