Rcf метр на msp430 и nokia1202

MSP430, учимся программировать и отлаживать железо (часть 2)

Здравствуй, уважаемый хабрапользователь.

В предыдущей статье мы начали рассматривать программирование под MSP430.

Материал, описанный в данной статье, позволит в общих чертах ознакомиться с прерываниями и понять некоторые тонкости MSP430.

Введение

Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события.

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

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

Прерывания

Начнём с небольшого примера. В данном примере по нажатию на кнопку (P1.2) происходит прерывание, которое меняет состояние двух светодиодов (P1.0 и P1.1). Давайте разберёмся как же это происходит.

PxIE разрешает прерывания для пинов порта Px. Значение «1», записанное в определенный разряд позволяет получать прерывания от определенного пина.

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

Напомню, что кнопка в данном примере «подтянута» до единицы, это означает что нажатая кнопка имеет значение ноль.
На схеме подключения резистор R1 нарисован показательно, на самом деле он находится внутри микроконтроллера и включается регистром P1REN.

PxIFG и есть флаг прерывания. В случае возникновения события нажатия кнопки он будет установлен в единицу, что и вызовет обработчик прерывания (__interrupt void P1INT()). Соответственно, сразу после обработки события флаг необходимо сбросить.
Попробуйте убрать из примера строчку 32 в конце обработчика, и тогда, сразу после первого нажатия кнопки, лампочки будут переключаться так, как будто вы постоянно нажимаете на кнопку.

__bis_SR_register(GIE) устанавливает флаг глобального разрешения прерываний (Global Interrupt Enable) в status register. Фактически это эквивалентно записи SR |= GIE, но мы можем обращаться к регистру SR только по средствам функций __bis_SR_register и __get_SR_register.

Ниже приведена схема битов в SR регистре.
0, 1, 2 и 8 биты — это биты математических операций.
4, 5, 6, 7 — биты управления уровнями энергопотребления, за счёт уменьшения частоты или отключения АЛУ.

Ну и собственно бит 3 — это глобальное разрешение прерываний. Пока этот бит не установлен в единицу, никакие прерывания обрабатываться не будут.

#pragma vector — директива, которая определяет что нижеследующая функция является обработчиком указанного прерывания.

Список всех доступных векторов прерываний можно посмотреть в заголовочном файле для Вашего контроллера. В данном случае это msp430f2274.h.

Дребезг контактов

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

В данном примере этого удалось избежать следующим образом:

  1. Сразу после вызова обработчика устанавливается запрет прерываний (строка 25);
  2. после переключения состояний светодиодов делается задержка (строка 30);
  3. снова устанавливается разрешение прерываний (строка 31).

Директива volatile в 30 строке кода означает, что переменная i не будет оптимизироваться при компиляции. Если её убрать, то задержки не будет.

Заключение

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

Однако это значительно увеличило объем информации. В следующий раз я постараюсь рассмотреть передачу данных с контроллера на персональный компьютер по средствам программатора и, в зависимости от полученного объема, watchdog.

Я надеюсь, что эта статья оказалась полезна тебе, читатель.

Источник: https://habr.com/post/137431/

В чем разница между nokia 5 и nokia 6?

В начале текущего года Nokia объявила о выходе трех Android-устройств в рамках Mobile World Congress, два из которых, Nokia 5 и Nokia 6, мы и сравниваем.

Какую же модель выбрать? Более дорогой Nokia 6, но с лучшими показателями производительности и фотографирования, или Nokia 5, более доступный, но не с таким ярким экраном.

Nokia 5: плюсы и минусы

Плюсы:

  • удобная эксплуатация;
  • эффектный дисплей;
  • регулярное обновление ОС.

Минусы:

  • качество фотосъемки;
  • длительный процесс восполнения заряда;
  • “бедное” оснащение.

Nokia 5

Nokia 6: плюсы и минусы

Плюсы:

  • “долгоиграющий” аккумулятор;
  • фотосъемка;
  • многозадачность;
  • качество звука.

Минусы:

  • гибридный слот для второй сим-карты;
  • отсутствие стабилизации во время видеосъемки;
  • процессор не для игр.

Nokia 6

А теперь непосредственно к сравнению двух моделей.

Цена

Когда устройства были анонсированы в рамках MWC 2017, они не только получили должное внимание, но и удивили поклонников бренда своей ценой. С учетом высокой производительности цена смартфонов оказалась вполне приемлемой.

На дату анонса стоимость Nokia 5 составила €190, а Nokia 6 €230, исключением “дешевизны” стала специальная модель под названием “Arte Black”, цена которой составила €300. HMD Global хотела произвести впечатление, для чего и был выпущен данный смартфон, ориентированный на мировой рынок.

Arte Black отличается усоврешенствованными характеристиками (ОЗУ и ПЗУ), но более существенное отличие от двух других моделей состоит в покрытии задней части корпуса глянцевым стеклянным материалом, на котором “красуется” массивный сканер отпечатков пальцев.

Что касается цен на сегодняшний день, то на Яндекс-маркете средняя цена Nokia 5 составляет 12 990 рублей, Nokia 6 стоит порядка 16 000 рублей.

Конечно, можно найти устройства с похожими техническими характеристиками и аналогичными ценами, но зачастую это no-name бренды, которые не отличаются стильным дизайном и качеством дисплея.

Дисплей

Nokia 6 получила 5,5-дюймовый IPS-дисплей с Full HD разрешением (1920 x 1080).

Nokia укомплектована 5-дюймовым дисплеем 720p (1280х720).

Оба экрана имеют закругленные края 2.5D. Кроме того, экраны покрыты защитным стеклом Gorilla Glass. Nokia 5 имеет поляризованный слой, обеспечивающий лучший контраст, когда смартфон подвергается воздействию прямых солнечных лучей.

Максимальная яркость дисплея Nokia 5 составляет 500 нит, в то время как у Nokia 6, у которой нет поляризованного слоя, яркость дисплея составляет 450 нит. Именно поэтому экран Nokia 6 темнее в условиях дневной освещенности, однако он обладает более высоким контрастом.

Аппаратная часть

Nokia 6 и Nokia 5 поставляются с процессором производства Qualcomm, разработанным для устройств среднего класса: Snapdragon 430 с восемью ядрами Cortex-A53, тактовой частотой 1,4 ГГц и графическим процессором Adreno 505.

Nokia 5 наделили лишь 2 Гб оперативной памяти и 16 Гб постоянной памяти. Nokia 6 получил 3 Гб оперативной памяти и 32 Гб встроенной памяти, а модель Arte Black поставляется с 4 Гб/64 Гб памяти.

Оба устройства демонстрируют неплохие результаты в синтетических тестах. А с учетом того, что они поставляются с “чистым” Android, их производительность является стандартной для устройств в данной ценовой категории.

Источник: https://Hype.ru/@id27/v-chem-raznica-mezhdu-nokia-5-i-nokia-6-njmgco3d

Микроконтроллеры MSP430: первое знакомство

УДК 621.31 ББК 32.96-04 С 30

Б. Ю. Семенов

— М.:

СОЛОН-ПРЕСС, 2006. — 128 е.: ил. — (Серия «Библиотека

инженера»)

ISBN 5-98003-265-7

Книга посвящена микроконтроллерам серии MSP430, которые произво­дятся фирмой Texas Instruments. Едва ли удастся найти конкурента этим мик­роконтроллерам по величине потребляемого тока и производительности, если речь идет о разработке автономных малогабаритных приборов с низ|Саволь- тным батарейным питанием.

Книга в доступной форме поможет разобраться с архитектурой и системой команд MSP430, сориентирует читателя в м1^гооб- разии «софта» для разработки программного обеспечения, расскажет о спосо­бах «прошивки» памяти MSP430, о существующих программаторах.

Прицр- денные схемы, печатные платы и сборочные рисунки позволят собрать’неско­лько несложных профамматоров flash-памяти MSP430 самостоятельно.

<\p>

Книга адресована инженерам, начинающим работать с микроконтр|^ер^- ми, студентам радиотехнических специальностей вузов, специалистам, (^име­ющимся обслуживанием и ремонтом электронной аппаратуры, радиолюбите­лям, а также всем тем, кто интересуется перспективной электронной техникой.

Авторский сайт в Интернете находится по адресу http://www radioland.mrezha ru. После выхода этой книги из печати на нем по­явятся рисунки печатных плат в формате Spnnt Layout 3.0 и другие дополни­тельные материалы но MSP430

Предисловие

Сегодня вести разговор об использовании современных микро­контроллеров очень просто — этому способствует их широкое рас­пространение на отечественном рынке электронных компонентов, обилие книг и тематических публикаций, невероятно большое ко­личество материалов в Интернете, общение с коллегами на элект­ронных форумах. Но, как это ни покажется странным, в то же время разговор о микроконтроллерах невероятно сложен. Причи­ны те же — чрезвычайная распространенность как самих микро­схем, так и тематических материалов о них. Парадоксально? Ни­чуть! Давайте разберемся, почему так происходит сегодня.

Еще недавно эта тема была уделом лишь узкого круга специали­стов, на которых с завистью поглядывали многие радиолюбители.

Впрочем, и особого разнообразия типов микроконтроллеров тоже не наблюдалось: существовали громоздкие решения на базе микро­процессорных комплектов серий Z80, 580, 1810, 588… Из всего это­го набора «выкристаллизовалась» чрезвычайно популярная микро­контроллерная архитектура MCS-51, разработанная фирмой Intel, а также архитектура Z86, появившаяся благодаря работам фирмы Zilog. Сегодня архитектуру MCS-51 можно считать «живой класси­кой» — она во многом потеряла актуальность, но поскольку в целом является открытой, многие фирмы-производители продолжают ее поддерживать, выпуская модификации микросхем с разными встроенными устройствами. Не теряет она высокого положения и среди профессиональных разработчиков исключительно из-за вы­работанной привычки работать со знакомым «железом».

Тема практического использования микроконтроллеров 8-раз­рядной структуры MCS-51 освещена достаточно: имеется ряд пуб­ликаций в журнале «Схемотехника» под названием «Микроконт­роллер — это просто», вышел трехтомник [1] с одноименным на­званием, который сегодня можно без труда приобрести в книжных магазинах.

На высоком профессиональном уровне выпущен спра­вочник [2] по типовой архитектуре, методам программирования. Поэтому в данной книге об этой серии микроконтроллеров мы го­ворить не будем.

Не будем мы также рассматривать архитектуры, разработанные в развитие MCS-51, а именно 16-разрядную архи­тектуру MCS-96, в отношении которой имеется издание [3].

Альтернативная архитектура Z86 проектировалась на базе ядра всем известного процессора Z80, который использовался в персона­льных компьютерах ZX-Spectrum, а позже — в автоматических опре­делителях номера телефонных абонентов.

Широкого распростране­ния эта архитектура пока не получила, хотя и заняла достойное место среди множества современных микроконтроллерных архитектур. Следует сказать, что литературы о применении Z86 на отечествен­ном рынке пока немного, хотя издание [4] достаточно неплохо разо­шлось среди отечественных читателей.

Данная тема еще ждет своих авторов, и тому должно способствовать появление линейки микро­схем с flash-программируемой памятью, а также пакет бесплатных инструментальных средств программирования и отладки.

Реально воплотить в жизнь слова о том, что «микроконтрол­лер это просто», сделать его доступным широкой радиолюбите­льской аудитории впервые удалось фирме Microchip [5] в серии PIC.

Фирма разработала чрезвычайно простое и понятное ядро, выпустила линейку микросхем с разными функциональными воз­можностями, снабдила разработчиков отличной документацией, бесплатными средствами разработки программ и «прошивки».

О популярности PIC свидетельствует тот факт, что на протяжении ряда лет в журнале «Радио», практически в каждом номере, появ­ляются радиолюбительские конструкции на основе этого микро­контроллера.

Вышла отличная книга [6], в которой также приведе­но множество самоделок, которые легко повторить в домашних условиях. Фирма-производитель активно переводит фирменную документацию на русский язык, и ее можно «скачать» с сервера (в домене www.microchip.ш) или получить вместе с фирменным ком- пакт-диском с того же сайта.

Мощным конкурентом архитектуры PIC, стремящимся занять лидирующие позиции, является фирма Atmel [7] с архитектурой типа AVR (АТ90, ATMEGA).

Все те слова, которые были сказаны в отношении Р1С, можно с успехом сказать и в отношении AVR: широкий состав «линейки», наличие бесплатного отладочного программного обеспечения, простота программирования, множе­ство практических конструкций — это все слагаемые успеха AVR у отечественного (и не только) радиолюбителя.

Из книг, которые стоит рекомендовать читателю, можно назвать издание [8], содер­жащее множество практических конструкций и компакт-диск с необходимой документацией. В пользу AVR можно также отнести и то, что они стремительно дешевеют, когда PIC продолжают оставаться на прежнем ценовом уровне.

Нельзя не сказать и о попытках отечественных производителей насытить рынок микроконтроллерами собственной архитектуры. Несколько лет назад на отечественном рынке появился микрокон­троллер КР1878ВЕ с оригинальной архитектурой ТЕСЕЙ, разра­ботанной специалистами ОАО «Ангстрем».

Начало было положе­но неплохое: выпущена недорогая микросхема, предоставлена бес­платная документация, простые средства программирования и отладки. Автор этой книга приложил немало усилий к популяри­зации этого микроконтроллера, выпустив издания [9] и [10].

К со­жалению, ОАО «Ангстрем» ничего больше не сделало для продви­жения на рынок своего изделия: не была выпущена линейка, не исправлены ошибки в документации, средства программирования так и остались на начальном уровне, новых версий не вышло.

Но, что самое главное, в какой-то момент этот микроконтроллер по цене сравнялся с AVR, продолжая неуклонно дорожать (конечно, сравнительно). Собственно, это обстоятельство стало «последней каплей» и оттолкнуло от него многих, кто готов был освоить архи­тектуру ТЕСЕЙ.

О чем еще мы не будем говорить в этой книге? Ни слова не будет сказано о 8-разрядных микроконтроллерах архитектур ST62 и ST7 (производитель — STMicroelectronics), о 16-разрядных микроконтроллерах архитектуры С167 (производитель — Infine­on), о 16-разрядном семействе М16С (производитель — Mitsubishi Electric). Эти семейства микроконтроллеров хотя и встречаются в прайс-листах отечественных дистрибьюторов электродных ком­понентов, но применяют их не столь часто. Причин тому неско­лько: высокая стоимость, отсутствие полного набора бесплатных инструментальных средств, аппаратная избыточность.

Наша книга познакомит читателя с интересным семейством микроконтроллеров MSP430, выпускаемых фирмой Texas Instru­ments.

Эти микроконтроллеры, конечно, пока менее популярны, чем PIC и AVR, но могут быть использованы там, где очень важно обеспечить минимальное потребление тока, например, в аппарату­ре с низковольтным аккумуляторным или батарейным питанием.

Читатели узнают о том, какие существуют инструментальные средства программирования и отладки, каковы характеристики се­мейства MSP430. Будет уделено внимание архитектуре и системе команд. Однако основная цель данной книги — познакомить чи-

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

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

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

Б. Ю.Семенов

С.-Петербург

Январь 2006 г.

Источник: http://nauchebe.net/2011/01/mikrokontrollery-msp430-pervoe-znakomstvo/

Знакомство с MSP430 и «туалетная» автоматизация

Давно читаю рубрику DIY и руки чесались что-нибудь сделать на микроконтроллере. И наудачу прочитал о MSP430 Launch Pad от Texas Instruments по цене $4.30. Идеальный набор для старта. В качестве объекта для экспериментов был выбран автоматический освежитель воздуха одной известной марки.

Задача

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

К тому же разработчики встроили «защиту» от использования баллонов других производителей, которая хоть и обходится достаточно просто, но без нее жить становится проще.

К тому же, для «ручного» распыления приходилось доставать баллон и пользоваться им как обычным освежителем.

Что же хотелось получить

Во-первых, сделать алгоритм работы более интеллектуальным. А именно сделать так, чтобы освежитель срабатывал после посещения туалета. А во-вторых, добавить функцию «ручного» срабатывания без открывания корпуса.

Решение

Алгоритм

Автоматизацию срабатывания распылителя я решил сделать на основе датчика освещенности. То есть при выключении света через 5 секунд должен сработать распылитель.

После этого не реагировать на включение-выключение света в течение 15 минут. Для того чтобы не «переосвежить» помещение так что дышать будет не возможно.

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

Вскрытие «пациента»

Прежде чем добавлять что-то новое, решил посмотреть, что же внутри у этого «чудо-агрегата».

И первое на что наткнулся это шурупы с нестандартной «треугольной» головкой:

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

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

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

Электронная часть

Когда стало ясно, что из себя представляет это устройство можно приступать к проектированию собственного модуля управления. Мозгом станет микроконтроллер MSP430G2553. В наборе LaunchPad есть еще младшая модель G2452 и можно использовать и ее, но я выбрал старшую, так как в ней есть аппаратный UART, что удобно для отладки и калибровки. Например, индикатор пустого баллона.

Изначально не известно, на сколько распылений его хватит, поэтому в программе предусмотрен счетчик с записью в энергонезависимую память с последующим чтением и отправкой по UART (для этого придется снять контроллер с модуля управления и поместить на отладочную плату).

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

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

Схема составлялась исходя из рекомендаций Datasheet на контроллер и статей из интернета. Отдельное спасибо DIHALT его учебник по электронике для начинающих стал для меня отправной точкой.
По компонентам все очень просто.

Фильтр на конденсаторах С1 и С2 согласно рекомендациям из Datasheet увеличивает точность работы АЦП. Фоторезистор LDR1 является датчиком освещенности и подключен через делитель напряжения на резисторе R3. Мотор спуска управляется через транзистор BC337.

Так же на схеме добавлены кнопка ручного спуска S1 и светодиоды двух цветов. Я использовал двухцветный светодиод. Он мигает зеленым раз в секунду как индикатор нормального режима работы, при разряде батарей ниже 2.5В начинает мигать красным.

Источник сигнала часов реального времени — кварц Z1 на 32768 Гц который идет в комплекте c платой и контроллерами.

Программная часть

Программу для контроллера я писал в IAR Embedded Workbench на С++. Привожу здесь ее код с комментариями.

Заголовочный файл spray.h

#ifndef __SPRAY_H_
#define __SPRAY_H_
#include // Константы
#define BUTTON BIT4; // Изменить в релизе
#define SPRAY_PORT BIT6;// P1.6
#define LED_GREEN BIT1; // P2.1
#define LED_RED BIT2; // P2.2
#define LIGHT_SENSOR INCH_5; // A5
#define DARK_VALUE 650; // Значения АЦП соответствющее “Свет выкл.”
#define LOWBATT_VALUE 520; // Значение АЦП соответствующее разряженной батарее. // Переменные константы
unsigned int SleepPeriod = 900; // Период спящего режима после срабатывания. 15 минут. (900)
unsigned int SpayDelay = 5; // Задержка перед срабатыванием 5с.
unsigned int DarkValue = 650; // Значения АЦП соответствющее “Свет выкл.”
unsigned int LowBattValue = 520; // Значение АЦП соответствующее разряженной батарее.
unsigned int BattInterval = 5; // Измерять напряжение каждые 5сек. // Переменные
unsigned int ADCValue; // Значение АЦП
unsigned int SprayCount; // Счетчик числа срабатываний
unsigned int TimerCount = 0; // Счетчик временных интервалов
unsigned int BattTimer = 0; // Счетчик интервалов замера напряжения
unsigned int RXByte; // Переменная для хранения принятого байта по UART // Флаги
bool ADCDone = false; // Флаг завершения преобразования
bool LightOn = false; // Флаг включения света (ожидание выключения)
bool SleepMode = false; // Флаг спящего режима (после срабатывания 15 минут)
bool IsCounting = false; // Флаг поднимаемый после выключения света, индикация // режима ожидания перед срабатыванием распылителя
bool LowBatt = false; // Флаг низкого напряжения батареи
bool BlinkOn = false; // Флаг включения мигающего светодиода
bool Tick = false; // Флаг прерывания по таймеру реального времени
bool IsADCOn = false; // Флаг показывающий работу АЦП
bool IsADCLight = true; // Флаг режима работы АЦП (true – измерение уровня // освещенности, false – напряжения)
bool ForceSpay = false; // Принудительное распыление по нажатию на кнопку
bool UARTReceived = false; // Флаг получения команды по UART // Функции
void UARTSend(string str); // Отправка строки UART
void LightSensorOn(); // Включение АЦП и измерение уровня освещенности
void VCCSensorOn(); // Включение АЦП и измерение напряжения питания
unsigned int ReadCountFromFlash(); // Считать значение счетчика срабатываний
void WriteCountToFlash(unsigned int); // Запись значения счетчика срабатываний
void Spray(); // Включение распылителя #endif

Текст программы. main.cpp:

#include
#include “spray.h” int main( void )
{ // Остановка WDT нам не потребуется WDTCTL = WDTPW + WDTHOLD; // Блок инициализаци переферии //————————- // Порты ввода-вывода P1DIR &= ~BUTTON; // Порт кнопки на вход P1REN |= BUTTON; // Включение внутреннего подтягивающего резистора P1OUT &= ~BUTTON; // Направление подтяжки – GND P1IES |= BUTTON; // Прерывание по фронту сигнала P1IFG &= ~BUTTON; // Сброс флага прерывания P1IE |= BUTTON; // Разрешение прерывания по кнопке P1DIR |= SPRAY_PORT; // Выход на управление распылителем P1OUT &= ~SPRAY_PORT; // низкий уровень на порту // Настройка выводов на светодиоды P2DIR |= LED_GREEN P2DIR |= LED_RED; // Включаем зеленый светодиод (Признак загрузки) P2OUT |= LED_GREEN; P2OUT &= ~LED_RED; // Тушим красный. //————————- // Системные таймеры DCOCTL = CALDCO_1MHZ; // Главный и вспомогательные таймеры ~ 1МГц BCSCTL1 = CALBC1_1MHZ; //————————- // Таймер реального времени TACTL = TASSEL_1 + MC_1; // Источник тактового сигнала ACLK (кварц), // прерывание по достижению значения CCR0 CCR0 = 0x8000; // Т.к. частота кварца 32768Гц, то и считаем до этого значения // в результате получаем прерывание раз в секунду CCTL0 = CCIS0 + OUTMOD0 + CCIE; // Настройки таймера, простой счет и вызов // прерывания по достижению значения //————————- // UART. Нужен для считывания значения из FLASH P1SEL = BIT1 + BIT2; // Выбор функции портов P1SEL2 = BIT1 + BIT2; // UART UCA0CTL1 |= UCSSEL_2; // Тактовый сигнал – вспомогательный таймер SMCLK ~ 1MHz UCA0BR0 = 0x68; // Скорость передачи 9600 UCA0BR1 = 0; // 1000000Гц / 9600 = 104 = 0x68 UCA0MCTL = UCBRS0; UCA0CTL1 &= ~UCSWRST; // Выбор модуляции и сброс флага блокировки IE2 = UCA0RXIE; // Разрешаем прерывания по приему UART //————————- // Flash FCTL2 = FWKEY + FSSEL1 + FN1; // Выбор источника тактового сигнала и делителя // Проверка значения счетчика срабатываний. Если значение 65535 – считчик // не инициализирован SprayCount = ReadCountFromFlash(); if(SprayCount == 65535) { SprayCount = 0; // Обнуляем счетчик WriteCountToFlash(SprayCount); // Записываем 0 во Flash } //————————- __delay_cycles(2000); // Ожидание инициализации переферии //————————- __bis_SR_register(GIE); // Глобальное разрешение прерываний P2OUT &= ~LED_GREEN; // Выключаем зеленый светодиод. Загрузка окончена. UARTSend(“Readyrn”); // Главный цикл while(true) { if(Tick) // Раз в секунду. { Tick = false; // Опускаем флаг BattTimer++; if(BattTimer >= BattInterval) // Если прошло время между замерами напряжения { BattTimer = 0; // Сброс таймера VCCSensorOn(); // Измерение напряжения батареи } if(!SleepMode) // Если не в спящем режиме { LightSensorOn(); // Измерить уровень освещенности if(IsCounting) // Если в режиме задержки { if(TimerCount >= SpayDelay) // Время задержки истекло { Spray(); // Включение распылителя } } } else { //Проверка таймера в спящем режиме if(TimerCount >= SleepPeriod) { TimerCount = 0; // Сброс таймера SleepMode = false; // Выход из спящего режима } } } if(ADCDone) // При завершении преобразования { ADCDone = false; // Опускаем флаг преобразования if(IsADCLight) // Если проводился замер уровня освещения { if(ADCValue < DarkValue) // Горит свет. { LightOn = true; // Поднимаем флаг "Горит свет" IsCounting = false; // Останавливаем отсчет (был или не было, не важно) TimerCount = 0; // Сбрасываем таймер } else // Свет не горит { if(LightOn) // Если горел свет { LightOn = false; // Опускаем флаг IsCounting = true; // Запускаем таймер задержки перед срабатыванием TimerCount = 0; } } } else // Если замерялось напряжение { if(ADCValue < LowBattValue) { LowBatt = true; // Поднимаем флаг низкого напряжения } else { LowBatt = false; // Иначе - сброс флага } } } if(ForceSpay) // Нажата кнопка. Принудительное распыление. { ForceSpay = false; Spray(); } if(UARTReceived) // Получена команда UART. Отправить значение счетчика. { UARTReceived = false; ostringstream s; s

Источник: http://www.pvsm.ru/msp430/20285

Подключение дисплеев Nokia 1110/1110i/1200/1202/1203/1112/1116/2660/2760/6085 | Digital Chip – Цифровые устройства

Самый активный читатель и комментатор на сайте Валерий Гончаренко сделал мне приятный подарок — прислал несколько дисплеев от Nokia (я об этом еще напишу, все времени не хватает).

Но он также любезно подготовил статью, в которой поделился практическим опытом подключения целого ряда экранов от мобильных телефонов Nokia к микроконтроллерам.

В конце статьи приведены платы переходников для подключения к микроконтроллерам в формате Sprint Layout 5. Валера, большое спасибо за статью. Итак:

После продолжительных тестов разных дисплеев Nokia с библиотекой, уважаемого Chiper-а была наработана небольшая практическая база с которой хотелось бы поделиться. Начну из далека. Где-то с год меня терзало смутное желание  приобрести термопинцет для возможности демонтажа SMD элементов с убитой техники.

Термопинцет для демонтажа

Но цена на него показалась завышенной и недавно посетив магазин , я увидел что она еще и выросла. Терпению пришел конец и я решил сделать его сам!

Для этого понадобилось: два паяльника по 25 Вт, кусочек фанеры толщиной 20 мм, немного термоусадочной трубки, дрель, сверло Ø10 мм, два часа времени и конечно пара прямых рук растущих из нужного места! Прямые затраты – два паяльника и термоусадка = 240 р.

Конструкция до безобразия проста: две заготовки — это наши будущие ручки в них сверлим сквозные отверстия для наших паяльников, винт чтобы все собрать и кусочек пружинящей стальной полоски- для возврата в исходное положение, одеваем ручки в термоусадку и … Вуаля !

Самодельный термопинцет

На самом деле возможности его применения очень широки – демонтаж smd (и не только) резисторов, конденсаторов (включая электролиты), транзисторов, микросхем.

Теперь плавно переходим к дисплеям. Вопрос — как соединить LCD Nokia 1110iс печатной платой? Естественно через разъем, который мы найдем либо на убитом телефоне, или придется его снять с шлейфа. Наш вариант – второй, а вот — как это происходит с помощью термопинцета в одно касание.

Демонтаж с помощью термопинцета

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

Дисплей Nokia 1110i/1112/1200/1116 – напряжение подсветки 3,3 в через резистор 100 Ом

Lcd Nokia 1110i/1112/1116/1200

Дисплей Nokia 1110 – инверсный с зеркальным разворотом по горизонтали, подсветка – 5 в через резистор 100 Ом, имеет очень высокую контрастность.

Lcd Nokia 1110

Дисплей Nokia 1202/1203/1280 – изображение немного сжато по вертикали, подсветка 3,3 в через резистор 100 Ом

Lcd Nokia 1202/1203/1280

Дисплей Nokia 2660/2760/6085 – самый маленький 24х24 мм, аналогичен 1110 , напряжение питания подсветки – 7,2…8,0 в через резистор 100 Ом, подсветка синего цвета

Lcd Nokia 2660/2760/6085

Обращаю внимание, что по быстродействию 1110i/1112/1116 – тормозные: не удается установить задержку менее 130 us, у оригинальных 1110i – с быстродействием порядок. Все остальные дисплеи в тестах показали высокую скорость _delay_us(1);

Дисплеи 1110i и 1112 – попадаются с невыраженной желтой, или ядовито-зеленой подсветкой – проблема решается довольно просто: если скальпелем поддеть отражатель в районе светодиода, то мы увидим там нечто похожее на изоленту приклеенную к светодиоду – снимаем ее и наслаждаемся голубовато-белым свечением.

Все рассмотренные дисплеи монохромные и имеют разрешение 96х68, напряжение питания тестируемых образцов – 3,3 в , но я бы рекомендовал при возможности снизить его до 2,8 в ( в экспериментах погибло 2 дисплея).

Цоколевка всех рассмотренных дисплеев – одинаковая (у 1202/1203/1280 – своя). Схема подключения к микроконтроллеру очень проста и не прилагается, так как все понятно из печатных плат.

Подведем итоги

Первое место: 1202/1203/1280 Плюсы: быстрый, питание и подсветка – 3,3 в, распайка шлейфа сразу на плату.

Минусы: нет.

Второе место: 1110 Плюсы: быстрый, питание и подсветка – 3,3 в, очень высокий контраст изображения.

Минусы: требуется разъем подключения .

Третье место: 1110i/1112/1116
Быстродействие – необходимо тестировать конкретный экземпляр, некоторые экземпляры -доработка подсветки, питание и подсветка – 3,3 в.

Четвертое место: 2660/2760/6085 Плюсы: быстрый.

Минусы: питание подсветки от 7,2 в и мягко говоря она очень насыщенная.

Скачать

Источник: http://digitalchip.ru/podklyuchenie-displeev-nokia-1110-1110i-1200-1202-1203-1112-1116-2660-2760-6085

Подключение дисплея от Nokia 1202 к микроконтроллеру

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

Разнообразие размеров дисплеев, интерфейсов подключения, способов физического подключения множество, так же есть как цветные так и монохромные дисплеи.

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

— доступность в магазинах радио(телефонных)  деталей;

— интерфейс подключения (как можно с меньшим количеством используемых ног) SPI, I2C;

— напряжение питания 3,3 (5) В;

— удобность физического подключения дисплея;

— минимальная цена ~1 — 2$ ;

— доступный набор команд (наличие даташита на контроллер дисплея) инициализации и работы.

Под выше перечисленные требования подпали два дисплея от Nokia 1202 и Nokia 1616.

Nokia 1202 (рисунок 1):

напряжение питания (подсветки): 3,3 В;

технология: LCD;

количество цветов: монохромный;

разрешение: 96×68 точек;

диагональ: 1,3 «;

интерфейс: SPI 9 бит;

физическое подключение: шлейф с шагом 0,6 мм.

Рисунок 1 — Дисплей от Nokia 1202

Nokia 1616 (рисунок 2):

напряжение питания (подсветки): 3,3 В;

технология: TFT;

количество цветов: до 65 тыс;

разрешение: 128×160 точек;

диагональ: 1,8 «;

интерфейс: SPI 9 бит;

физическое подключение: шлейф с шагом 0,6 мм.

Рисунок 2 — Дисплей от Nokia 1616

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

Распиновка дисплея (рисунок 4):

1 — NC (не используется);

2 — Reset (сигнал сброса);

3 — CS (сигнал выбора);

4 — GND (минус питания);

5 — MOSI (сигнал данных);

6 — SCK (сигнал тактирования);

7 — Uпит (напряжение питания);

8 — Uпит (напряжение питания);

9 — GND (минус питания);

10 — LED- (катод подсветки);

11 — LED+ (анод подсветки);

12 — NC (не используется).

Рисунок 4 — Нумерация шлейфа дисплея

Была разработана плата (рисунок 5) с местом для подпайки шлейфа дисплея, 4-мя тактовыми кнопками.

Рисунок 5 — Плата лицевой панели

Из рисунка с изображением платы видно, что на ней установлено 4 тактовых кнопки, по две с права и с низу дисплея, несколько SMD  компонентов и разъем pls для подключения к основной плате. Схема платы приведена на рисунке 6.

Рисунок 6 — Схема печатной платы

На схема:

— С1 — шунтирующий конденсатор емкостью 0,1 мкФ;

— 4-ре кнопки (B1-B4) с подтягивающими резисторами (R3-R6) к плюсу питания;

— VT1 — биполярный транзистор для возможности регулирования ШИМ-ом яркости подсветки;

— R1, R2 — ограничительные резисторы.

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

Печатная плата (верхний слой) приведена на рисунке 7, внешний вид платы 2D на рисунке 8, 3D на рисунке 9, готовое устройство на рисунке 10.

Рисунок 7 — Печатная плата

Рисунок 8 — 2D печатная плата

Рисунок 9 — 3D печатная плата

Рисунок 10 — Готовое устройство

Пример инициализации дисплея будет рассмотрен в следующей статье.

Источник: http://redblot.ru/archives/1207

RCF метр на MSP430 и Nokia1202

Пару лет назад почти полностью перешел на SMD компоненты. И размер меньше и хранить удобней, платы меньше в размерах, сверлить не надо. Запчасти в основной массе из донорских неисправных плат выпаиваются. Взял фен прогрел плату и пинцетом поснимал все детали. И начинается процесс сортировки.

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

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

Основными методами являются время измерения заряда конденсатора и генераторный метод когда емкость определяется путем измерения частоты генератора в который она входит. Пошерстив Интернет на предмет работоспособных и главное простых конструкций я остановился на генераторном методе.

В качестве измерителя выступил микроконтроллер от Техас Инструмент msp430f1132. Экран от Nokia 1202. Генератор на триггере Шмидта 74С132. Изначально планировалось сделать измеритель только для емкостей. Но так как памяти еще немного оставалось то был доделан еще измеритель сопротивлений. Также в качестве бонуса получился частотомер.

Характеристики:
– измеряемые сопротивления от 0 Ом до 10МОм
– измеряемые емкости от 0 пф до 10 мкф
– измеряемые частоты от 0 до 25МГц (по крайней мере у меня нет генератора более 25МГц при этом измеритель показывал 24999200Гц и плавала +-15Гц). Погрешность может объяснятся как точностью кварца в измерителе так и точностью кварца в генераторе.

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

Итак, алгоритм работы измерителя.

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

Временной интервал замера формируется сторожевым таймером WDT, работающем в интервальном режиме.

Особенность сторожевого таймера в том что его значение нельзя программно изменить, поэтому для определения частоты за 1 секунду введена программная коррекция измеренного значения. Интервальный таймер тактируется от ACKL с делителем 32768.

ACKL в свою очередь тактируется от кварца на 6МГц с делителем 8. Для получения секундного интервала подсчет происходит 25 раз и время измерения составляет чуть более секунды. Для приведения его ровно к одной секунде и используется коэффициент коррекции 1,04475136.

Для возможности использования экрана от Nokia библиотека шрифтов была порезана до необходимого минимума.

В принципе можно использовать любой кварц. Достаточно подобрать число переполнений таймера WDT так что бы интервал замера был как можно ближе к единице и рассчитать программный коэффициент коррекции.

Генератор выполнен на микросхеме 74С132 причем как и подобных конструкциях отдельные генераторы на измерение емкости и сопротивления.

Точность замера частоты 600кГц составляет порядка 2-5Гц таким образом точность замера емкости и сопротивления будет очень сильно зависит от точности питания и стабильности опорных элементов.

Для повышения точности напряжения был использован источник опорного напряжения LM4040 с напряжением стабилизации 2,5В от техас инструмент (что было то и поставил).

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

Вверху экрана отображается напряжение источника питания. Это для того чтобы определять степень разряда литиевой батарейки от которой планируется питание. Следует помнить что не следует подавать питание выше 5В. Если решите запитать схему от 9В батарейки то необходимо питание микроконтроллера перенести на выход стабилизатора 3.3В. Правда и отображаться будет всегда 3.

3В (что впрочем не критично, это батарейка а не аккумулятор).

Номиналы опорных элементов условны, в первую очередь важна стабильность. У меня используются резисторы на 470 Ом и емкости на 1000пФ что дает частоту при замкнутых щупах в режиме измерения сопротивления и отключенной емкости в режиме измерения емкостей порядка 1200000Гц.

Настройка

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

После этого калибруются отдельно измеритель емкости и измеритель сопротивления. Для этого например включается режим измерения емкости. Отображаемая частота записывается в ячейку массива a[9]. В ячейке массива b[9] записывается соответствующее значение емкости в пф. Затем подключается точно измеренная или известная емкость номиналом например 200 пф.

Измеренное значение емкости записывается в ячейку массива a[8] в ячейку массива b[8] записывается 200.0 и так далее пока не заполнится весь массив. Калибровка измерителя сопротивления осуществляется аналогично но измеренная частота записывается в массив c[] а соответствующее ей значение сопротивления в Омах записывается в массив d[].

После этого производится перезапись программы в контроллер.

При работе программы рассчитанное значение емкости или сопротивления получается из линейного закона соответствия измеряемой величины соответствующей частоте с линейно-кусочной аппроксимацией.

Печатка была выполнена на одностороннем текстолите. Самое неудобное для повторения это корпус контроллера типа PW (расстояние между ногами 0,65мм) но в принципе легко повторяемо ЛУТом. Часть соединений выполнено перемычками. На печатке белым цветом. Экран припаивается шлейфом к плате, загибается на противоположную строну и клеиться к ней.

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

Измерительные щупы сделаны в виде пинцета из пластмассы. Контакты из старого разъема, штыри прикреплены к пинцету а ответные части вклеены внутрь корпуса. Для изменения типа измеряемого элемента, пинцет необходимо перекинуть в соседние гнезда.

Список радиоэлементов

Скачать список элементов (PDF)

Прикрепленные файлы:

  • RCFmeter.zip (56 Кб)
  • RLF meter.lay (40 Кб)

Источник: http://cxem.net/izmer/izmer123.php

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}