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

adnega

Свой
  • Постов

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

  • Посещение

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

    3

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


  1. Да, но 0.1% все же баг в компиляторе. У меня есть проект, который собирается и работает при O2 и не собирается при Os. Интересно? C:\Users\user\AppData\Local\Temp\ccShzzAY.s: Assembler messages: C:\Users\user\AppData\Local\Temp\ccShzzAY.s:3151: Error: value of 256 too large for field of 1 bytes at 000000000000103a make.EXE: *** [obj_sw/esp8266.o] Error 1 В asm .L276: .byte (.L274-.L276)/2 - переполнение Меняешь две строчки в Си-исходнике и проект начинает собираться.
  2. Допускаю, что есть эксклюзивные задачи, в которых одного таймера до 65 мс достаточно, но в общем случае вариант с 1мс-прерыванием гораздо универсальнее. В некоторых библиотеках я вообще пришел к двум/трем функциям on_init() - один раз при инициализации МК on_mainloop() - внутри mainloop`а on_timer() - внутри 10мс-таймера Решение гибкое, воспроизводимое на множестве камней и архитектур. Никаких дополнительный аппаратных требований, типа таймер с предделителем таким-то и т.п. Я не против исключений из правил, но их не стоит выдавать за правило. Я на atmega8 вообще без аппаратных таймеров делал программный UART-TX тупо nop-ами формировал задержку, и работало-ведь, но я же объявляю это нормой. Сделать софтовый 1мс таймер настолько просто, что грех от этого отказываться. И мне не понятно зачем? ТС говорил, что у него какие-то критические секции есть... думаю, больное место там.
  3. А если бы не отрубил прерывания, то что?
  4. Вы можете объяснить почему? Это вполне естественная вещь для МК, но вы категорически ее отвергаете. Вы бы поменьше секретничали, а то нам в соседних ветках достается, что за вас додумывают недосказанное.
  5. Среди профессионалов принято так: если есть наиболее вероятное и простое объяснение, то нужно пользоваться именно им. В противном случае один мой знакомый говорил: "а если инопланетяне прилетели и сделали {подставить нужное}". Если ТС-инопланетянин, пишет, вроде, по нашему, но по ихнему это совсем другой смысл, то jcxz должен посыпать голову пеплом раз не предположил, что такое возможно. Дальше смысл беседы в этом направлении теряется. Если по исходнику понятно, что источник шире 8 байт приведет к перемешиванию бит, а в приемнике в итоге получается только 16 значащих бит, то с уверенностью можно принять за факт их размеры 8 и 16 бит соответственно, и при необходимости заявлять "сам дурак", если ТС начнет добавлять противоречащие новые обстоятельства. В соседней ветке про таймеры ТС на третей станице пошел по второму кругу, хотя у меня была полная уверенность, что точка в вопросе поставлена. В этой связи, jcxz поддерживаю, т.к. без телепатии, а на одной только логике, не понять, что нужно ТС.
  6. Вы опять за старое. У него есть период, и за счет периода вы создадите 1 мс. С периодом 1 мс у вас будет шагать не таймер, а вызываться обработчик прерывания, в котором будет to_1ms++. Для этого подойдет любой таймер, но есть же специальный SysTick. Почему его не используют некоторые?
  7. Ага. Причем это объекты классов, а операторы [] и | перегружены. Бритва Оккама. Нет, не слышал. Если бы было нужно что-то из описанного вами, то код бы выглядел иначе.
  8. Это очевидно из строчки DataBuffer = (data_out[j++]<<8) | data_out[j++]; Если data_out будет больше 8 бит, то операция | будет перемешивать биты из двух соседних значений. (data_out[j++]<<8) | data_out[j++] имеет в этом случае не более 16 значащих бит. Соответственно DataBuffer не менее 16 бит. Какой смысл делать больше?
  9. Увидеть бы весь код. Есть мнение, что j легким движением превратиться в (i * 2 + 0) и (i * 2 + 1).
  10. К Pt1000 подключить подтяжку 1 кОм к 3.3В. При 100С имеем 1.9В, при 300С - 2.24В итого 422 LSB у 12-битного АЦП. Мощность на терморезисторе 3 мВт. Можно на время измерения подтяжку отключать.
  11. +1 Только сам программатор нужно чуть-чуть доработать, чтоб он выдавал RESET.
  12. Я не настаиваю, что термометр был именно из аптеки. Скажем так, был образцовый термометр, который неотличим от разработанного. Но смысл совсем в другом - есть довольно большая разрешающая способность, которая позволяет откалибровать изделие с необходимой точностью. Это не было средством измерения с соответствующим сертификатом, а просто хоббийная разработка в стиле "дешево и сердито".
  13. В термос с водой опустил два термометра: один из аптеки, второй - разрабатываемый. Плавно нагревал/охлаждал воду, а они показывали одни и те же цифры. Провел измерения при различном уровне питающего напряжения (2 часовых 1.5В батарейки) от 1.6В до 3.0В. При любом питании и любой температуре от 0 до 100С два градусника показывали одно и то же (+- 0.1С). Сделал вывод, что в данных условиях мой термометр не отличим от сертифицированно-поверенного аптечного. Провел аналогичные испытания еще на паре собственных термометров - аналогичная ситуация. Да, используются сложные таблицы поправок-калибровок, но они на три изделия получились одинаковые. В меню добавил лишь возможность смещения шкалы поправочным значением. Заказчик уже несколько лет производит изделие массово - никаких претензий и/или пожеланий в части метрологии. Да, добавил потом по просьбе эмулятор DS18B20, но это независимая история.
  14. Никаких ключей - резисторы напрямую к пинам МК. Никаких "выносится за пределы прибора" - ТС в первом посте указал применение и комплектную базу "дешево и сердито".
  15. А какой толк от этого АЦП если его динамический диапазон не покрывает динамический диапазон датчика от слова совсем. "Лишняя" деталь это конденсатор? Я предложил вариант, где несложно добиться огромного динамического диапазона, но нужен дополнительный конденсатор. Не нравиться - не используйте, но на АЦП у вас точно не получится. Или вы про компаратор? Дык, их по несколько штук можно обнаружить в дешевых STM32 (F051, L152, F3xx и т.п.). Какое сопротивление у датчика в диапазоне 100-300C ? Умножьте его на ток 100 мкА (честный источник тока тоже требует деталей). У PT100 у меня получилось от 14мВ до 23мВ, а это от 17 до 28 LSB 12-битного АЦП. Посмотрим как вы из 11 LSB получите как минимум 200 (в 18 раз больше). Берете RC цепочку из PT100 и конденсатора 2.2 мкФ. Тау при R=140 Ом => 308 мкс, при R=230 Ом => 506 мкс. На то чтобы отличить 140 от 230 у вас есть почти 10000 тиков таймера на частоте 48МГц: (506 - 308) * 48 = 9504. А это дискрет примерно 0.02C. Разумеется выташить из этого 1С не составит никакого труда. При этом работа схемы очень быстрая и импульсная (постоянный ток не течет, запускайте хоть раз в 10 секунд).
  16. Как вариант: забыть про АЦП. Делаете RC-цепочки - эталонную и измерительную, и смотрите за какое время сработает компаратор. По этому времени можно оценить Rx, а по нему рассчитать T. Делал такое на MSP430 на часовых батарейках. В диапазоне 0-100С получил точность 0.1C (при питании от 1.6 до 3.0В).
  17. Это ваши догадки или есть подтверждения. По-вашему это массовый характер, дык, найдите пару-тройку доказательств тому. Выше я приводил цены Компэла на резисторы - ничего не изменилось. Фантазия за фантазию: это вы так хотите объяснить повышение цен в своем магазине, убедив, что у всех так же. Т.е. до начала 2018 года о прибыли никто не думал? Бред какой-то. Чем выше и стабильнее спрос, тем продукт будет массовыми и цена на него будет ниже (на уровне себестоимости). Открыть новое производство для удовлетворения спроса гораздо выгоднее, чем закладывать какие-то кредиты в цену продукта. Потому как если кто-то это (новое производство) сделает (а это упомянутое вами развитие), то получит больше объемы, плюс объемы конкурентов, которые тупо повысили цену. В чем я не прав?
  18. Попробуйте C9 последовательно с R5 включить.
  19. Не внимательно изучаете документацию. Если прескалер APBx не равен 1, то частота на таймеры в два раза выше APBx.
  20. ТСу я ответил в сообщении #3, а про резисторы была пугалка в сообщении #55.
  21. Я как раз обратное утверждал: что сейчас, что три года назад - никакой разницы - покупай сколько унесешь.
  22. В 2015 году я покупал резисторы 0805 по 0.14 руб в партии 5 000 шт. Сейчас они стоят по 0.31 руб от 1 шт или 0.27 руб в партии от 10 000 шт. А резисторы 0805 6.81 кОм (1%) по акции в Компэле вообще по 0.08 руб. в партии 15 000 шт. В Компэле активно внедряют СДС. Я думаю в этом основная причина изменений на сайте. Кста, несколько месяцев назад цены на сайте тоже пропали, а потом появились. Нужно поменьше слушать директоров, подкидывающих панику.
  23. +1 Нужен аналог такого GPIOA->MODER = 0 | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN0) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN1) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN2) | (GPIO_MODE_ANALOG << GPIO_MODER_PIN5) | (GPIO_MODE_ANALOG << GPIO_MODER_PIN6) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN7) | (GPIO_MODE_OUTPUT << GPIO_MODER_PIN8) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN9) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN10) | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN13) // ! | (GPIO_MODE_ALTERNATE << GPIO_MODER_PIN14) // ! | (GPIO_MODE_OUTPUT << GPIO_MODER_PIN15); GPIOA->AFR[0] = 0 | (AF_PA0_TIM5_CH1 << GPIO_AFR0_PIN0) | (AF_PA1_ETH_RMII_REF_CLK << GPIO_AFR0_PIN1) | (AF_PA2_ETH_MDIO << GPIO_AFR0_PIN2) | (AF_PA7_ETH_RMII_CRS_DV << GPIO_AFR0_PIN7); GPIOA->AFR[1] = 0 | (AF_PA9_USART1_TX << GPIO_AFR1_PIN9) | (AF_PA10_USART1_RX << GPIO_AFR1_PIN10) | (AF_PA13_SWDIO << GPIO_AFR1_PIN13) // ! | (AF_PA14_SWCLK << GPIO_AFR1_PIN14); // !
  24. Дык, настраиваете SysTick на генерацию прерываний с интервалом 1 мс, а в обработчике прерывания делаете maintimer++; , где maintimer - 32-битная переменная, в которой будут лежать миллисекунды.
×
×
  • Создать...