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

esaulenka

Свой
  • Постов

    1 462
  • Зарегистрирован

  • Посещение

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

    2

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


  1. Мне кажется, это какие-то проблемы с flash breakpoints. Попробуйте выключить их в настройках отладчика.

    У меня подобное ни разу не проявлялось.

     

    И вообще, JTAG - штука тёмная. Периодически приходится брать бубен, подбирать версии утилит или по разному расставлять галочки...

  2. Ситуации разные бывают.

    У нас приборы офисные, и производственных процессов поблизости быть не должно. А вот всяких дешёвых линолеумов, шерстяных вещей и прочей "искрящей" гадости вокруг - сколько угодно.

     

    И в связи со спецификой корпуса пластиковые, а не цельно-чугуниевые, намертво прикрученные к штырю заземления.

    И более-менее быстрые интерфейсы типа USB наружу торчат.

  3. Итого, моё имхо.

    Методика aaarrr самая правильная. Заодно и код не загаживается постоянными #if #endif. Почему я про неё забыл, непонятно :-)

     

    Добавлять в каждый файл #ifndef .. #error лениво. Если я забыл сделать #include "global.h", то и эту проверку вставить забуду.

     

    И надо будет ещё раз полистать руководство от кейла на предмет аналога ключа -Wundef. В каких-то ранних версиях это было поведением по умолчанию, было удобно.

     

    Ну или подумать над выносом глобальных дефайнов в настройки среды.

    Правда, в одном из проектов у меня уже три таргета, различающиеся парой констант. Если туда же добавить отладку, получится шесть...

  4. Хочется заметить, что установкой NXP-шных аналогов этого SMBJ мы порешали очень много проблем со статикой на наших устройствах.

    Массовых "окачуриваний" процессоров не было, но перезагружались от статических разрядов они регулярно.

     

    Да, корпус можно меньший ставить, если защищаться от статики - импульс в 4 кВт - это ооочень много, нам хватает 300 ваттных в SOT-23, сжечь их разрядами статики не удаётся.

  5. Столкнулся с такой... проблемой:

     

    Для контроля за выполнением программы в коде широко использую конструкции

    #if DEBUG_MODE
    printf ("10 секунд, полёт нормальный!\n");
    #endif

    при этом дефайн DEBUG_MODE объявлен в глобальном файле-хидере.

     

    Сегодня потратил пол-дня, выясняя, почему один из модулей не шлёт отладочную информацию (грешил на то, что не вызываю его в нужном месте). Выяснилось, что из того модуля банально не видно дефайн DEBUG_MODE, и компилятор повыкидывал все printf'ы.

     

    Собственно, вопрос: каким образом оформить условие, чтобы компилятор сообщал об ошибке "не знаю такого символа" ?

    Можно завернуть в обычный if(), но вдруг компилятору не хватит мозгов выкинуть его в релизной ветке?

  6. Зависит от того, что такое КЗ.

    Вот, например, график на четвёртой странице: http://www.bourns.com/pdfs/mfr.pdf

     

    Как-то делал тестовый стенд, 16 каналов, на каждый выводилось питание (потребители мелкие, по 20-30 мА). Поставил эти MF-R005, так они нифига не срабатывали, работала отсечка на общем источнике питания (подробности не помню, но, вероятно, 0.5 А).

    Впрочем, всё это так и не пригодилось - защиту от неверного включения сделали орг.мерами - приклеили шлейфики к испытуемым устройствам в нужном положении :-)

  7. мысли верные? задумался сейчас о порядке байт в архитектурах...

    И о pragma pack (оно же - атрибут __packed на других компиляторах) подумайте.

     

    И о том, что будет, если в ПК и Вашей прошивке окажутся разные версии структур.

     

     

    У нас в изделиях тоже хранятся развесистые настроечные таблицы в EEPROM. К ним есть доступ как командой по протоколу "прочитай настройку номер 27".

    Делали команду прямого доступа к EEPROM и графический конфигуратор для ПК по считанному дампу. Проект быстро загнулся, т.к. строгого выдерживания структуры полей на всех n-цати разновидностях изделий (и версий изделий) не было, и поддерживать это в двух местах - в прошивке и в ПК было некому. Но работает, в принципе...

  8. К 1769 внешняя память по-человечески не подключается ввиду отсутствия контроллера внешней памяти у самого камня.

     

    Варианты:

    - найти SPI SRAM (где-то что-то было)

    - подключить обычную SRAM на "ногодрыге"

    - взять камень "потолще", из серии 178x, и подключить туда что угодно - хоть SRAM, хоть SDRAM.

     

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

  9. У меня знакомые пользуются парой дешёвых радиостанций (Midland'ы, кажется) диапазона 433 МГц.

    На одной настраивается VOX (есть уже почти в каждой китайской поделке), вторая вешается маме на шею. "Анализом спектра определённого диапазона частот" мама занимается самостоятельно. Работает очень хорошо. Хотя... может это ребёнок такой догадливый: хочешь что-то - кричи! :-)

     

    Почему такие штуки не продаются в каждом "Детском мире" - для меня загадка.

  10. Личкой пользуюсь ооочень нечасто, поэтому проблема переполнения ящика меня не волнует.

    Зато терять письма из-за этой галки жалко...

     

    Предлагаю или сохранять её состояние, или просто включить по умолчанию, на усмотрение администрации.

  11. 1) За return должно следовать выражение в скобках, которое может выполняться и переноситься в необходимый участок схемы. В данном случае в скобки берётся не все выражение, а только часть. Т.е. скобки ставить не обязательно и так можно делать?

    За return должно следовать выражение того же типа, которое должна возвращать функция.

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

    Про скобки - это такая рекомендация для удобочитаемости. Необязательная, и лично я пишу без скобок.

     

    2) Знак << 8 означает поразрядный сдвиг влево на 8 разрядов. Для чего это делать. Затем эти два разряда складывают. Зачем это делать?

    Знак <<1 означает сдвиг влево на один разряд. Результат этого действия - значение умножается на 2. Подобная методика умножения используется в "мелких" контроллерах, которые не имеют аппаратного умножителя вовсе (или этот умножитель работает очень медленно). Аналогично можно делить (аппаратное деление - штука вообще редкая).

    Выяснить, что получается при сдвиге на 8 разрядов, предлагаю самостоятельно.

    Также самостоятельно предлагаю разобраться, как АЦП раскладывает результаты своей работы по регистрам ADRESL и ADRESH, и что надо сделать, чтобы собрать его в одну переменную.

     

    Если вкратце, читать, читать и ещё раз читать.

  12. Слесарь, ну не надо вредительства!

    Схема защиты от сильного перезаряда/переразряда не является нормальным зарядным устройством.

    Вероятность того, что "рванёт", она снижает, но долговечность этой конструкции оставляет желать лучшего.

  13. "широкую" ногу к выводу МК, а "узкую" через сопротивление на землю.

    ...

    на красных светодиодах так и есть, а на желтых и зеленых с точностью до наоборот!

     

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

     

    UPDATE. Пардон, сообразил. Если самому додумать, что один светодиод зелёный ("неправильный"), второй красный, то логика какая-то прослеживается. Я с чего-то решил, что они одинаковые.

  14. и о ЦАПах, которые на самом деле очень даже АЦП

     

    при работе ЦАП необходимо опорное напряжение, относительно которого будет производиться измерение напряжения.

    VREF+ (21 ножка МК) - не задействована и не подключена. Микросхема в корпусе 64-Pin TQFP. Шаг ножек очень мелкий, припаять провод проблематично. VREF- (22 ножка МК) задействована в качестве выхода под дешифратор D4.

    Ну и ладно. Эти входы являются опциональными, о чём написано на второй же станице даташита в разделе АЦП. По умолчанию опорными являются AVDD и AVSS.

    Точности в сотую вольта, с таким подходом добиться будет сложно (какая там у Вас точность опорного? 2%? а мерять-то хочется с точностью в 10 раз больше!) , ну да не с профессиональными же вольтметрами конкурировать :)

     

    Вывода AVDD и AVSS (ножки 19 и 20) не подключены -

    Ну это явная ошибка разработчика. Если я правильно помню микрочиповские даташиты (крайний раз работал с пиками в студенчестве), где-то была специальная схема "какие ноги минимально необходимо соединить". В их число входят ВСЕ ноги питания, т.е. в данном случае по 4 ноги VSS / VDD, а также AVSS/AVDD.

     

    подпаяться тоже проблематично.

    Вопрос привычки. При наличии нормальной паяльной станции (надо разводить на деньги начальство! хотя бы на 100$, потом очень пригодится) работы на пару минут вместе с подбором тоненькой проволочки, нагревом паяльника и протиркой результатов спиртом :)

  15. Маленький совет: при написании комментариев забыть про буфер обмена. Вообще совсем.

    Тогда вот это

    #define ADDR_HL1 0x3    // определяю адрес первого индикатора HL1 0x03, как переменную ADDR_HL1
    #define ADDR_HL2 0x4    // определяю адрес второго индикатора HL2 0x04, как переменную ADDR_HL2

    пишется как

    // определяю адреса индикаторов
    #define ADDR_HL1 0x3    // первый индикатор
    #define ADDR_HL2 0x4    // второй индикатор

    Пожалейте глаза того, кто это читать будет - полезной информации в первом примере куда меньше половины.

     

     

    И также присоединяюсь к предложению почитать книжки. Классика жанра - Керниган-Ричи, но можно и полистать более "упрощённый" вариант с упором в микроконтроллеры.

  16. Когда на нашем микроскопе сдохла лампа, наш умелец выпилил кусок текстолита по форме лампы и напаял туда штук 20 светодиодов. Светит очень хорошо, моментально включается, не моргает и не ломается. Рекомендую.

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

     

    Ну и блок питания, разумеется, пришлось поменять.

  17. Ток потребления - порядка 1А. Изначально использовал диодный мост RS204. Для него допустимы ток 2А.

    При испытании обнаружил, что ощутимо греется.

    Ну а что б ему не греться-то? Там на каждом диоде по 0.8В падает...

    Если верить графику из даташита, при резистивной нагрузке 1А этот мостик будет греться на 40 градусов. Это очень даже ощутимо.

  18. Если у Вас ток потребления меняется с частотой единицы (а, тем более, сотни) килогерц,

    Единицы килогерц от источника питания - это с бааальшим запасом.

    А сотни кГц - это отпаять один конец дросселя в импульснике, и заглянуть, какой ток бегает через него. Я любопытен :)

     

     

    почитать... хоть у тех же ХиХ.

    Спасибо, загляну.

     

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

    Хочется сделать универсальный инструмент.

    К тому же нехорошо землю рвать: земля устройства связана с заземляющим контактом сетевой вилки (напрямую, авторами китайского сетевого адаптера). Также земля связана с компьютером (кабелем RS232 или USB). Какие там токи бегают при включении шунта - не очень очевидно.

     

     

    Правда, сомневаюсь, чтобы в Маськву их возить отказывались...

    Лучше чуток подумать, чем напрягать людей запросами "а закажи мне вооон ту экзотику".

    Техасовские операционники в Компеле (пардон, Терре) лежат, могут продать хоть одну штуку. А вот Аналог (из тех что я искал) - только под заказ. Ну и зачем месяц ждать?

  19. (соседней темой навеяло)

     

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

     

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

    Значения токов - от десятков-сотен мА до 5 А, напряжения - до 30 вольт.

     

    Заглядывал в гугл, народ собирает трансформаторы тока (простейший).

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

     

    Более того, я уже пробовал - резистор 0.2 Ом в разрыв минуса питания (где-то далеко связан с землёй осциллографа), с него два щупа осциллографа. Шумит оооочень хорошо.

     

    Операционник воткнуть? А какой (попроще - подоступней)? Хочется, всё-таки, довольно большие напряжения и полосу побольше...

    У токоизмерительных TI (Burr-Brown, точнее) как-то с полосой не густо, на мой дилетантский взгляд; Analog'овских current sense amplifiers к нам не возят (а с заказом 5 штук мало кто возиться будет). Не выпендриваться и взять что-то общего применения?

  20. Самое простое - ввести понятие логического канала и отделить промежуточной функцией этот логический канал от физических пинов.

     

    Как-то так:

    void Channel_Set (char ch)
    {
    switch (ch)
    {
    1: PORTB.4 = 1; break;
    2: PORTB.7 = 1; break;
    3: PORTC.1 = 1; break;
    }
    }
    
    void Channel_Clr (char ch)
    {
    // тут аналогично
    }

     

    Тогда в эту вашу zamer() надо передавать не номер пина, а номер канала.

  21. А если ещё и хочется хранить сначала первые строки всех символов, потом все вторые, ...,

    Вопрос не в тему: а с чем связано такое желание?

    Это оптимизация под 8-бит арифметику, чтобы индексы поменьше были?

  22. Там формула для "среднего по больнице" напряжения БЕЗ использования сглаживающего конденсатора.

     

    Что будет, если повесить 1000 мкФ, нарисовано чуть ниже. Формулы готовой нет, но по картинке всё предельно понятно - конденсатор заряжается практически до значения "пиков" синусоиды.

  23. Конденсатор зарядится до амплитудного напряжения, т.е. 24.6 * sqrt(2), а вольтметр показывает (должен, во всяком случае) действующее.

    Только ещё падение на диодах надо б учесть.

     

    Короче говоря, вольтметру теорию опровергнуть не удалось - расхождение в вольт-полтора будем считать его погрешностью.

  24. Нарыл пример от NXP. Да, что-то они замороченное написали, для демонстрации всего-всего.

     

    На самом деле, всё крайне просто:

    void SPI_Init(void)
    {
    LPC_SSP0->CR1 = 0x0000;			// Запрет работы SPI0
    
    // SPI_SCR + 1 = Дополнительное (после SSP0CLKDIV и после SSP0CPSR) деление частоты = 1, 
    //  Режим SPI = 0 (CPHA = 0, CPOL = 0), Формат кадра SPI, Кадр = 8 бит
    LPC_SSP0->CR0 = 0x0007;
    
    // Clock prescale, even values: 2..254
    LPC_SSP0->CPSR = 0x0002;		// Минимальное значение; 18 МГц при частоте контроллера 36 МГц
    
    LPC_SSP0->IMSC = 0x0000;		// Запрет все возможных источников прерывания от SPI0
    
    // Включаем SPI0
    LPC_SSP0->CR1 = 0x0002;
    
    // Очистка FIFO
    while( LPC_SSP0->SR & BIT(2) )	// Receive FIFO Not Empty
    	LPC_SSP0->DR;
    
    // На всякий случай сбросим м/с памяти
    ACTIVE_SPI();
    DEACTIVE_SPI();
    
    return;
    }
    
    // Передает и в это же время принимает байт
    uint8_t SendByteSPI (uint8_t data)
    {
    LPC_SSP0->DR = data;
    while( LPC_SSP0->SR & BIT(4) )	// SPI0 busy
    	;
    return LPC_SSP0->DR;
    }
    

     

    Это писано под LPC1111, но модуль SSP у него точно такой же - тут просто коллега комментариев красиво понаписал :-)

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