Генератор-частотомер на msp430

Генератор-частотомер на MSP430

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

Прибор имеет следующие характеристики:

Генератор:
генерируемая частота в низкочастотном диапазоне 0-15000 Гц с дискретностью 0.0005 Гц
генерируемая частота в высокочастотном диапазоне 0-4000000 Гц с дискретностью 0.03 Гц
амплитуда выходного сигнала 3В
Максимальный выходной ток 300мА
форма сигнала: синус треугольник меандр.

Частотомер:
измеряемый диапазон 0.01Гц-25МГц.
точность измерения в диапазоне 1Гц-1МГц 0.01Гц
точность измерения в диапазоне 1МГц-25МГц 1Гц
чувствительность не хуже 500мВ

В качестве ядра прибора выступает микроконтроллер MSP430F147 (может быть без проблем и изменения кода заменен на любой из следующих микроконтроллеров MSP430F133 MSP430F135 MSP430F148 MSP430F149). В качестве экрана используется экран от Nokia 1202 с программной реализацией интерфейса SPI. В роли генератора используется широко известный генератор прямого цифрового синтеза AD9833 от Analog Device. Контроллер использует два источника тактирования: от высокочастотного кварца на 8МГц и часового кварца 32768Гц. Благодаря возможности буферизирования тактовых частот на ногах ввода-вывода появляется возможность переключения тактовой частоты генератора AD9833, что позволяет получить низкочастотный генератор в высокой разрешающей способностью, так и высокочастотный генератор. Для увеличения выходной мощности генератора и увеличения амплитуды выходного сигнала используется операционный усилитель AD8397. Схема устройства приведена на рисунке.

Частотомер до 1МГц выполнен на хорошо себя зарекомендовавшем принципе временных ворот в котором начало и конец временных ворот формируются фронтами измеряемого сигнала. Точность в этом случае определяется точностью тактовой частоты. Наличие асинхронного таймера в контроллере позволяет измерять частоты выше тактовой. Хотя в даташите на микроконтроллер и указана максимальная частота на входе INCLK таймера 10МГц это дает основание предположить, что частота на входной ноге INCLK может быть асинхронна и выше тактовой. Дальнейшая проверка это подтвердила. Если в методе временных ворот частота оказалась выше 1МГЦ, то частотомер автоматически переключается на метод подсчета измеряемых импульсов за 1с. На экране это видно по обнуленным разрядам измеряемой частоты после запятой.

На рисунке показан принцип измерения частоты методом временных ворот формируемых входной частотой.


В микроконтроллере настраиваются два таймера. Один тактируется от высокочастотного кварца 8МГц, а второй тактируется от внешнего входа INCLK. Оба находятся в режиме стоп.
На первом этапе программа стоит пока на ножке INCLK высокий уровень. На втором этапе как только он сменяется низким уровнем то программ опять останавливается до появления фронта сигнала. (это необходимо для исключения ошибочного измерения в случае начала измерения например в середине входного импульса, таким образом захватывается именно фронт).После этого на третьем этапе включаются оба таймера в режиме счета с прерыванием. В прерываниях инкрементируются переменные для расширения разрядности счетчиков. После включения таймеров стартует задержка на 1 секунду. (величина задержки не критична, но естественно влияет на точность измерения)
После окончания задержки на этапе четыре и пять повторяется процедура ожидания фронта измеряемого сигнала. При его обнаружении счетчики переводятся в режим стоп. Измеряемая частота находится по формуле число импульсов измеряемой частоты*тактовую частоту/число импульсов тактовой частоты насчитанных за время задержки. Так как мы ловили фронты входного измеряемого сигнала то их число за период измерения всегда целое, а точность определяется точностью тактовой частоты. Этот принцип позволяет мерить как низкочастотные так и высокочастотные сигналы.

Захватывать фронт входного сигнала можно несколькими способами:
1. Использовать прерывание по фронту входного сигнала и в прерывании стартовать и останавливать таймеры. Погрешность вноситься за счет того что требуется время на вход в прерывание. Так же возможна ситуация, что прерывание вызовется в момент переполнения счетчика таймера измеряемой частоты, что также приведет к дополнительной ошибке измерения.
2. Использовать режим захвата при котором фронт входного сигнала приводит к захвату текущего значения таймера, переносу его в регистр захвата и вызову прерывания. Ошибка измерения может быть вызвана теми же причинами, что и в пункте 1.
3. Программный опрос входного сигнала на предмет обнаружения фронта.
В процессе реализации прибора были опробованы все три метода и наибольшую точность показал метод номер 3.

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

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

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

Управление прибором осуществляется от четырех кнопок. Кнопки осуществляют передвижение курсора по экрану. Кнопки вверх и вниз осуществляют изменение соответствующей позиции на которой установлен курсор. Текущий элемент выделяется инвертированным цветом. Частотный диапазон генератора переключается когда курсор стоит на символе LF (в случае низкочастотного генератора) или меняется на HF (в случае высокочастотного сигнала). Форма генерируемого сигнала меняется при нахождении курсора на символе меандра вверху справа (меняется на символ синуса или треугольника). Важно помнить, что хотя все позиции в выбираемой частоте генератора являются числами от 0 до 9, частота в режиме низкой частоты не может превышать 15кГц и 4МГц в режиме высокой частоты, что определяется требованиями генератора AD9833.

Настройка прибора заключается в следующем:
Так как величина частоты генератора AD9833 рассчитывается относительно тактовой и точность измерения частотомера тоже зависит от тактовой частоты, то необходимо измерить частоту высшего высокочастотного кварца и низкочастотного кварца на любом частотомере. Частоту можно взять с ножки тактирования генератора AD9833 в режиме генератора HF и LF. Эти частоты необходимо записать в программе.

Важно в опциях проекта IAR при компилировании выставить следующие настройки оптимизации


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

Плата на одностороннем текстолите. Плата для экрана тоже и распаяна на шлейф экрана.

Генератор-частотомер на msp430


Чип MSP430g2453IPW28 распаяный на адаптере TSSOP28-DIP28

Чипы AVR заслужили хорошую репутацию отчасти тем, что содержат АЦП даже в самых младших моделях микроконтроллеров. Аббревиатура MSP430 не случайно ассоциируется с DSP, данные чипы при вполне разумной стоимости могут нести в себе 16-битные или даже 24-битные сигма-дельта АЦП, а также есть целая линейка CC430 микроконтроллеров c радиомодулем(!) на борту. MSP430 (расшифровывается как Mixed Signal Processor) имеет 16-битную архитектуру что позволяет обрабатывать данные с АЦП за один прием, не обрезая их до 8-бит как на AVR. Данные микроконтроллеры изначально разрабатывались как малопотребляющие. Причем настолько малопотребляющие, что ввелась новая концепция устройств с одной батарей для всего жизненного цикла устройства. Семейства MSP430x5xx и MSP430x6xx включают в себя модуль DMA. Одним словом, это еще одна достойная замена устаревающим AVR.

Фирма производитель MSP430 — Texas Instruments — (прародитель легендарной TMS32010), разложена в Cеверной Америке, и там микроконтроллеры MSP430 чрезвычайно популярны. Кроме того им удалось портировать на свою архитектуру фреймворк Arduino и дав ему название Energia.

Справедливости ради, должен сказать, что есть у TI как вполне «взрослые» DSP, например TMS320C5535, так и микроконтроллеры серии MSP432 на ядре ARM Cortex-M4, который как известно имеет блок DSP.

Кстати, MSP430 примечателен своей архитектурой PDP-11, которая была чрезвычайно популярной в 70-80 года, в том числе и в СССР. В нашей стране был большой модельный ряд вычислительной техники на этой архитектуре, в том числе и вполне приличные модели, например «Электроника МС 0585».

Если касаться технической стороны, то архитектура PDP-11 было популярна своей ортогональностью. В TI попытались максимально воссоздать оригинальную PDP-11 архитектуру на RISC ядре с гарвардской архитектурой. И желание «пощупать» возрожденную легенду было одной из двух причин подтолкнувших меня к MSP430. Второй причиной было низкое энергопотребление. Мне нужен был эталонный чип, сравнивая с которым можно было бы сказать, что тот или иной чип такой то фирмы лучше или хуже, или допустим «на уровне». STM например, тоже предлагает энергоэффективные чипы, и далеко не факт, что они хуже MSP430. Посмотрим — узнаем.

Итак заскочив в ближайший радио-магазин, я приобрел чип MSP430G2453IPW28 в TSSOP28 корпусе за 150 рублей. Здесь возможно следует провести небольшой ликбез по модельному ряду. Хорошая классификация по семействам есть в англоязычной википедии. Я же немного расскажу своими словами как я понял положение дел.

В рунете есть много публикаций по серии MSP430x1xxx. Как понимаю это первая основная линейка запущенная еще в 1999-м году. Это хорошие микроконтроллеры, среди которых есть и такие популярные как msp430f149, они выпускаются, продаются, но. они устарели. Актуальная сейчас линейка, это MSP430x2xxx. Хороший материал по различиям между линейками MSP430F1xxx и MSP430F2xxx можно почитать здесь:

Кроме основной линейки MSP430F2xx, в 2010 году TI выпустила «оптимизированную по цене» Value Line, линейку с бувкеным индексом G. Для продвижения новой линейки на рынке, TI запустила рекламную компанию по продаже отладочного комплекта начального уровня Launchpad по бросовым ценам 4.3USD c доставкой(!). При том, что доллар тогда стоил 28р. получился такой реальный «Arduino Killer». И большое число публикаций касательно Launchpad’а относится именно к тому периоду. Вскоре халява закончилась, ценник подскочил в три раза, и тема пошла резко на спад.

Я отчаиваться не стал тому факту, что остался не удел, и взяв свежекупленный MSP430G2453IPW28, быстро распаял его на переходнике TSSOP28-DIP28.

Предлагаю взглянуть на характеристики этого чипа:

На мой взгляд, выглядит как ATmega8, разве что питание 3.3Вольта. Однако замечу, что в отличии от ATmega8 чип содержит модуль jtag, загрузчик, а так же GPIO можно сконфигурировать как входы touch-сенсоров. Кроме того, система команд поддерживает аппаратное умножение, правда отсутсвует деление.

Datasheet на чип скачать можно с официального сайта: http://www.ti.com/lit/ds/symlink/msp430g2453.pdf

Первым делом нужно взглянуть на распиновку микросхемы:

Порты I/O здесь нумеруются не буквам, а цифрами: P1, P2 и т.д. Внешнее прерывание по одному на каждый порт, правда третий порт обошелся без него. Кроме jtag микросхему можно отлаживать через SBW-интерфейс. Интерфейсы SPI/I2C/UART объедены в один интерфейсный модуль USCI.

Прошивать чип будем через BSL(загрузчик). Часто можно прочитать, что BSL имеется в каждом чипе MSP430. ЭТО не так. Если в распиновке микросхемы нет ног с функциями BSL_receive/BSL_transmit, значит загрузчика там нет и его можно шить через jtag. В MSP430F20xx например, загрузчика нет. Зато в MSP430F2003 есть 16-битный сигма дельта АЦП 😉 Еще один миф — микроконтроллеры можно бесплатно заказать для освоения. Чудес не бывает, физ.лицам ничего не шлют.

Читайте также  Схема соединений модулей барабанной установки

Хитрые китайцы приноровились продавать BSL программаторы для неопытных людей. На самом деле сгодится любой USB-TTL конвертор с выведеными линиями RTS/DTR/TX/RX. Если вы занимались Arduino наверняка у вас такой есть:

У меня такого не было, зато со времен Arduino-мании осталась плата CraftDuino v1.0 На котором соответствующие выводы от FT232RL были выведены:

Оставалось только вытащить чип с ATmega, пропаять штыревой разъем PBS и плата превращалась в обычный USB-TTL конвертер.

FT232RL MSP430G2453
TX BSL_receive (P1.5)
RX BSL_transmit (P1.1)
DTR RST/NMI
RST TEST
Vcc (3.3V) DVCC
GND DVSS

Выглядит все это как-то так:

Но, повторюсь можно использовать любой другой USB-TTL или COM-TTL конвертер с линиями RTS и DTR

Найти программу-прошивальщик оказалось не простым делом. После некоторого времени безрезультативного поиска, нашел таки рабочий вариант здесь:

Сложность в том, что прошивки на чипе защищены паролем, и просто так ничего «для тестирования не считаешь». Поэтому сначала следует скомпилировать программу 😉 Кроме того версии загрузчиков разные, а MSP430G2453 относительно новый чип.

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

Предупреждение! Все описанные ниже действия выполнялись из WindowsXP. Как это будет работать в более поздних Windows, я не имею представления.

Скачиваем и распаковываем архив, что в конце приведенной выше статьи. Для прошивки понадобится программа MspFet.exe

В опциях нужно выставить настройки также так указано в статье: т.е. RST invert выставить в True, выбрать тип программатора BSL, свой порт, сбросить галочку «Reload file». После чего следует открыть файл с прошивкой:

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

Если при нажатии на кнопку «AUTO» не появится красных надписей, то значит прошивка прошла успешно.

Если же такие надписи появились, то NAK это в принципе не страшно, мне думается что просто нужно скорость подобрать, а вот » Synchronization error » это уже означает что программа «не видит» чип, и значит что-то вы сделали не так.

Ок. Последний момент который нужно разобрать это: «как программировать?»

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

Плохая новость заключается в том, собрать тулчейн самостоятельно для меня показалась задачей практически невозможной. В смысле у меня собиралась, но при линковке все-таки вылетала ошибка. Проблема в системной библиотеке glibc. На сайте проекта библиотеки mspgcc висит надпись : обсолит(устарело) и дальше ссылка на сайт TI. На сайте же я библиотеки не нашел, только компилятор, который при сборке требует библиотеку.

Поэтому самое простое, это взять готовый тулчейн. Он содержится в пакете Energia и к счастью имеется 64-битная версия:

После распаковки, каталог hardware/tools/msp430 нужно просто скопировать в /usr/local, после чего все заработает.

Но прежде чем начать компилировать blink, предлагаю не отворачиваться от Arduino-подобной Energia. Думаете она не сможет скомпилировать скетч под наш микроконтроллер? Не знаю как насчет программы расчета эфемерид, но Blink она мне скомпилировала)

Если заглянуть в меню «Board» там есть платы на похожих чипах: msp430g2452 и msp430g2253.

Теперь, если текстовым редактором открыть файл: hardware/msp430/boards.txt, и добавить туда секцию:

то можно будет выбрать launchpad c нужным чипом:

Остается лишь загрузить скетч и нажать «скомпилировать»:

Вуоля! И прошивка готовая лежит в каталоге /tmp/бла-бал-бла.cpp.hex

Осталось узнать, что это за такой RED_LED который мы научили мигать. Открыв файл hardware/msp430/variants/launchpad/pin_energia.h видим перед собой хорошо комментированный код:

Здесь 20-пиновый корпус, но в целом все понятно. RED_LED это пин P1.0

Ок. теперь попробуем то же самое сделать на Си. Вариант Blink для MSP430 на Си:

Здесь первым делом выключается Watchdog, т.к. в MSP430 он включен по умолчанию, а уже потом идет все остальное. На первый взгляд может показаться что ничего сложного нет, регистр на вход, регистр на уровень. Однако, если в AVR GPOI регистров для каждого порта было три, в STM8 их пять, то в MSP430 их девять!

Правда третий порт здесь «полевого образца», там РВВ поменьше. Вообще, по MSP430 очень рекомендую книгу: СЕМЕЙСТВО МИКРОКОНТРОЛЛЕРОВ MSP430x2xx. Архитектура. Программирование. Разработка приложений. Это перевод выполненный фирмой «Компэл» официального User’s Guide.

Ну здесь вообще красота, AVR нервно курит в сторонке 😉 Запись константы в ячейку памяти одной командой, никаких промежуточных манипуляций с регистрами! BSET? Нафиг! XOR работает напрямую с РВВ! Это же ортогональная система команд! Волшебный цикл из пяти команд? Здесь он занимает всего цетыре!

Красота! Одним словом, мне здесь все нравится)

Для IAR текст программы практически не отличается:

Но там в свойствах линкера нужно указать, формат выходной прошивки Intel. После чего программу можно компилировать в hex файл и затем подхватывать его флешером.

Последняя момент, о котором осталось упомянуть: если кого-то при рассматривании распиновки микросхемы смутил знак инверсии над RST, то совершено справедливо. При подключении микроконтроллера на RST нужно подавать положительный потенциал, т.е. DVCC.

[07-2015] Микроконтроллеры MSP430. Измеритель RC



Автор продолжает цикл статей о микроконтроллерах MSP430. Он считает, что читатели знакомы со всеми предыдущими статьями цикла [1—6] и имеют достаточно знаний, а за прошедшее время смогли обзавестись и некоторыми умениями. Поэтому, не останавливаясь слишком подробно на особенностях текстов программ, он дал больше информации о прикладном применении отладочной платы MSP-EXP430G2 LaunchPad.

В предлагаемой статье будет рассмотрен ещё один модуль микроконтроллера MSP430G2553, о котором в предыдущих статьях речь не шла. Это аналоговый компаратор Comparator_A+. Вот его особенности:

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

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

3. Выход компаратора можно подключить к входу захвата Таймера А. Эта возможность очень полезна при использовании компаратора для измерения напряжения, о чём будет рассказано ниже.

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

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

Задача, которую предстоит решить в этой статье, формулируется так:

Реализовать на базе отладочной платы MSP-EXP430G2 LaunchPad, используя модули Comparator_A+ и Таймер А микроконтроллера, измеритель постоянной времени RC-цепи. Измеренное значение передавать в компьютер через COM-порт для вычисления неизвестного сопротивления или ёмкости. Производить вычисления и выводить их результаты на экран должна специально разработанная компьютерная программа.

Для начала рассмотрим регистры управления модулем компаратора Comparator_A+, которые будут использованы в программе микроконтроллера. Их всего три.

Регистр CAPD позволяет отключить входные и выходные цифровые буферы от тех выводов микроконтроллера, которые используются для ввода аналоговых сигналов. Это позволяет уменьшить общий ток, потребляемый микроконтроллером. Разряды этого регистра имеют названия CAPDx, где х — цифра от 0 до 7. Запись единиц в эти разряды отключает буферы выводов микроконтроллера, связанных с входами САО— СА7 компаратора. Соответствие между этими входами и физическими выводами приведено в описаниях конкретных микроконтроллеров.

Регистр CACTL1 — первый регистр настройки модуля компаратора.

Его разряд 7 (САЕХ) позволяет поменять местами входы компаратора, при этом выходной сигнал инвертируется.

Разряд 6 (CARSEL) указывает, на какой из входов подано образцовое напряжение от внутреннего источника. При одинаковых значениях разрядов САЕХ и CARSEL образцовое напряжение поступает на неинвертирующий вход, а при разных — на инвертирующий вход.

Разряды 5 и 4 (CAREF1 и CAREF0) задают значение образцового напряжения:

CAREF1=0 и CAREF0=0 — генератор образцового напряжения выключен;

CAREF1=0 и CAREF0=1 — четверть напряжения питания;

CAREF1=1 и CAREF0=0 — половина напряжения питания;

CAREF1 = 1 hCAREF0=1 — около 0,5 В.

Разряд 3 (CAON) включает (CAON=1) или выключает (CAON=0) компаратор. Генератор образцового напряжения включается и выключается независимо от компаратора.

Разряд 2 (CAIES) задаёт перепад уровня на выходе компаратора, при котором генерируется запрос прерывания: CAIES=0 — нарастающий, CAIES=1 — спадающий.

Разряд 1 (CAIE) разрешает (СА1Е=1) или запрещает (СА1Е=0) запросы прерывания от компаратора.

Разряд 0 (CAIFG) — флаг запроса прерывания от компаратора. Снимается автоматически с началом обработки прерывания или может быть снят программно.
Регистр CACTL2 — второй регистр настройки модуля компаратора.

Его разряд 7 (CASHORT) используют для соединения между собой входов компаратора: CASHORT=1 — входы соединены, CASHORT = 0 — входы не соединены.

Разряды 6 и 2 (Р2СА4 и Р2СА0) задают подключение неинвертирующего (при САЕХ=0) или инвертирующего (при САЕХ=1) входа согласно табл. 1.

Разряды 5, 4, 3 (Р2САЗ, Р2СА2, Р2СА1) задают подключение инвертирующего (при САЕХ=0) или неинвертирующего (при САЕХ=1) входа согласно табл. 2. Соответствие между физическими выводами микроконтроллера и входами САх указано в документации на конкретные микроконтроллеры.

Разряд 1 (CAF) включает (CAF=1) или выключает (CAF=0) выходной фильтр компаратора.

Разряд 0 (CAOUT) отображает состояние выхода компаратора. Запись в этот разряд не имеет смысла и игнорируется.

Для измерения постоянной времени интегрирующей цепи R1C1 подключим её к микроконтроллеру, как показано на рис. 1. На выходе Р2.0 будем программно постоянно поддерживать низкий логический уровень. Применённое подключение обусловлено исключительно близостью выводов Р1.4, Р1.5 и Р2.0 как на корпусе микроконтроллера, так и на разъёме платы LaunchPad. В принципе, вместо вывода Р2.0 нужно было бы использовать общий провод.

В начальный момент времени на выводе Р1.5 устанавливают напряжение высокого логического уровня, в результате чего конденсатор С1 начинает заряжаться через резистор R1. Через некоторое время (около 1,5 с) считают, что конденсатор полностью заряжен до напряжения питания микроконтроллера, и на выходе Р1.5 устанавливают напряжение низкого уровня. Конденсатор С1 начинает разряжаться через резистор R1. Таймер А начинает отсчёт длительности разрядки.

Напряжение с конденсатора С1 поступает на вывод Р1.4, который в рассматриваемом случае служит неинвертирующим входом СА4 компаратора. На инвертирующий вход компаратора подано образцовое напряжение, равное четверти напряжения питания. Когда напряжение на конденсаторе достигает образцового, уровень на выходе компаратора становится низким, что приводит к срабатыванию блока захвата/ сравнения 1 Таймера А. Определив продолжительность разрядки конденсатора, программа вычисляет постоянную времени R1C1.

Конденсатор разряжается по экспоненте

В данном случае t — продолжительность разрядки конденсатора С1 от полного напряжения питания до его четверти. Зная постоянную времени и один из параметров RC-цепи (сопротивление или ёмкость), можно определить другой параметр.

Для измерения неизвестной ёмкости конденсатора С1 необходимо использовать резистор R1 известного с возможно большей точностью сопротивления. Соответственно для измерения сопротивления резистора R1 необходим конденсатор С1 известной ёмкости. Поскольку на зарядку конденсатора отведено около 1,5 с, необходимо выбирать конденсатор и резистор так, чтобы постоянная времени не превышала 0,5 с.

Читайте также  Команды передачи управления

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

Строки 51—53 настраивают модуль компаратора. Отключают цифровой буфер от входа СА4, переключают входы компаратора (теперь СА4 — неинвертирующий вход), включают внутренний источник образцового напряжения 0,251)пи1, включают компаратор и разрешают генерацию запроса прерывания по спадающему перепаду на его выходе, а также включают выходной фильтр.

Цикл измерения запускает компьютерная программа, посылая байт 0x00 на вход RXD модуля UART микроконтроллера. После приёма этого байта строка 9 программы микроконтроллера устанавливает на выходе Р1.5 высокий уровень, а строка 10 выдерживает паузу длительностью около 1,5 с, после чего строка 11 устанавливает на выходе Р1.5 низкий уровень. Далее строка 12 обнуляет счётчик таймера А, строка 13 снимает флаг прерывания по переполнению счётчика, а строка 14 — флаг захвата. В строке 15 обнуляется переменная time, в которой будет подсчитываться время разрядки.

В строках 16—23 реализован цикл ожидания события захвата Таймера А, которое происходит при спадающем перепаде уровня на выходе компаратора. Внутри этого цикла периодически проверяется флаг TAIFG, устанавиваемый при переполнении Таймера А. Поскольку таймер работает с тактовой частотой 1 МГц, то в течение разрядки конденсатора он может переполниться несколько раз. Каждое переполнение увеличивает переменную time на 65536 единиц (строки 18—22).

Когда захват произошёл, строка 24 добавляет к переменной time содержимое счётного регистра таймера А. Затем строка 25 вычисляет постоянную времени по приведённой ранее формуле. Поскольку в используемом микроконтроллере отсутствует аппаратная возможность работать с дробными числами, операция деления на 1,386 заменена умножением на 1000 и последующим делением на 1386.

Затем переменная time, имеющая тип unsigned long длиной 4 байта, разбивается на отдельные байты, которые в строках 26—31 модуль UART поочерёдно передаёт в компьютер.

Компьютерная программа RC-meter собирает принятые четыре байта в 32-разрядное слово, вычисляет значение ёмкости или сопротивления и выводит его на экран.

Для проверки программы был собран макет, показанный на рис. 2. Конденсатор С1 ёмкостью 0,1 мкФ ±5 % и резистор R1 сопротивлением 10 кОм ±5 % подключены к разъёму Л платы LaunchPad съёмными перемычками из её комплекта. Связь модуля UART микроконтроллера с USB-портом компьютера организована с помощью имеющегося на плате LaunchPad преобразователя интерфейса.

Окна программы RC-meter представлены на рис. 3 (измерение сопротивления) и рис. 4 (измерение ёмкости). В первом случае необходимо ввести в соответствующую графу с клавиатуры известную ёмкость конденсатора и нажать на экранную кнопку «Измерить». Через некоторое время в нижней строке появится измеренное значение сопротивления резистора. Аналогично выполняют измерение ёмкости.

Если плата не подключена к компьютеру, при нажатии на экранную кнопку «Измерить» будет выдано сообщение об этом, а поле измеренного значения останется пустым.

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

1. Сокол С. Микроконтроллеры MSP430. Первые шаги. — Радио, 2012, № 12, с. 43, 44; 2013, № 1, с. 47-49.

2. Сокол С. Микроконтроллеры MSP430. Снижаем энергопотребление. — Радио, 2013, № 2, с. 49-51; № 3, с. 51,52.

3. Сокол С. Микроконтроллеры MSP430. Необычный термометр. — Радио, 2013, № 5, с. 48—50; №6,с.51-53.

4. Сокол С. Микроконтроллеры MSP430. Сенсорный регулятор яркости светодиода. — Радио, 2013, № 7, с. 49, 50; № 8, с. 53, 54.

5. Сокол С. Микроконтроллеры MSP430. Хранение измеряемых параметров во FLASH-памяти. — Радио, 2014, № 3, с. SI-54.

6. Сокол С. Микроконтроллеры MSP430. Регистратор напряжения. — Радио, 2014, № 4, с. 51—54.

Генератор частоты 0 — 40 000 000 Hz + Частотомер.

Автор: Samodelkin. Опубликовано в Радиолюбительские

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

«Цифровой генератор от 1Hz до 40 МНz, это просто» и удачно собрал генератор частоты, возникла идея дополнить генератор частотомером. Поэтому хочу вам представить генератор частоты 1 — 40 000 000 Hz c настройкой частоты в пределах 1 Hz. Генератор может выдавать на одной частоте одновременно синусоиду и прямоугольный сигнал. Также в этом приборе встроенный частотомер. Прибор очень универсальный идеально подходит не только для новичков, но и для больших шаманов радиоэлектроники. Схема очень простая и при возможности может поместиться в компактный корпус.

Все это сделано на основе микроконтроллера ATmega8 и DDS синтезатора AD9850.

Микросхему AD9850 я заказал из Китая, покупал на сайте Ebay цена данной микросхемы 6-7 $

Модуль AD9850

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

Для питания прибора я использовал трансформаторный блок питания 9V 800mA. Трансформатор вместе с выпрямителем вынул из БП и засунул в корпус прибора.

Управления прибора выполняется с помощью: кнопок Кн.1, Кн.2; энкодера; тумблера Кн.3. Также есть включатель прибора, который расположен в задней части корпуса, и предохранитель который вмонтирован в трансформатор.

В приборе имеется 10 ячеек памяти, куда можно записать нужные нам частоты, а затем быстро задать генератору нужную нам частоту.

Кн. 2 — вход в меню записи частоты.

Кн. 1 — кнопка вывода быстрого выбора частоты с нужной нам ячейки памяти.

Энкодер и Кн.0 — отвечает за настройку частоты генератора.

Тумблер Кн.3 — выключает сигналы прямоугольной формы.

Основной экран: Отображение частоты генератора (верхняя строка), отображение частоты частотомера (нижняя строка). При нажатой кнопке KEY_0 – энкодером устанавливается шаг настройки частоты. На дисплее значение шага.

Нажатие на KEY_1 – вход в меню выбора памяти. На дисплее мигает номер ячейки и частота, записанная в данную ячейку. Энкодером выбор ячейки, повторное нажатие на KEY_1 – подтверждение выбора и выход из меню.

Нажатие на KEY_2 – меню выбора памяти. На дисплее номер ячейки, частота для записи в ячейку. Энкодером выбор ячейки, повторное нажатие KEY_2 – запись в эту ячейку частоты, которая была на дисплее до входа в меню записи — выход из меню.

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

Фото готовой платы

Также хочу заметить, что максимальная частота измерения частотомера равна половине частоты кварцевого резонатора. В файле присутствуют 2 прошивки для кварцевых генераторов с частотой 8 , 16 MHz. У меня лично кварца с частотой 16 MHzне оказалось, поэтому я поставил кварц на 8 MHz, максимальная частота измерения частоты составила 3 900 000 Hz

Как говорил в самом начале, для качественной работы частотомера нужно спаять формирователь импульсов. Я использовал схему, которую нашел в интернете. После настройки схемы, поместил ее в металлическую коробочку для того чтобы она не давала помехи на другие компоненты прибора. Формирователь импульсов соединил с МК с помощью коаксиального кабеля, при этом старался все максимально защитить от воздействия помех.

Плата формирователя импульсов

Металлическая коробочка для формирователя импульсов

Металлический корпус изготовил из того что было, в запасах.

Снизу добавил резиновые ножки, так корпус увереннее держится поверхности.

Видео о собранном приборе

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

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

Генератор-частотомер на msp430

МЫР-Р-Р.
Кто ищет, тот не всегда находит.
Особенно — меня, да ещё — в тёмной комнате.
Особенно, если я там напрочь отсутствую.
Ежели искать нечто другое, то и результат, само-собой, возможно, будет другим?
По поводу генерации.
Я, лично, гененрирую разные сигналя в зависимости от многих факторов. Как внутренних, так и внешних.
Вот таким вот образом, например:
М-р-р-ЯУ.

АНТОЛОГИЯ «ГЕНЕРАТОРЫ НЧ и ЧАСТОТОМЕРЫ»

по материалам журналов «РАДИО» 1955-2013 гг

Я не преследую цель создать некую библиотеку схем генераторов НЧ и частотомеров. Моя задача — показать ТЕНДЕНЦИЮ.
Переворошив свою коллекцию журналов РАДИО (1955 -2013), я хотел показать, как с течением времени менялся интерес к данной теме, и как часто схемы данных устройств появлялись на страницах журнала.
Конечно, сейчас всё обстоит несколько иначе: хочешь иметь — покупай. Были бы деньги.
Но в иные времена умельцы делали не только отдельные устройства, но целые измерительные комплексы.

1955
№3, с.25, Генераторы на кристаллических триодах

№6, с.43, Узкополосный фильтр – звуковой генератор

1956
№11, с.50, Генератор звуковой частоты

1958
№9, с.52, Частотомер

№11, с.54, Широкодиапазонный RC-генератор

1960
№9, с.47, Широкодиапазонный RC-генератор дискретных частот

1961
№5, с.47, Звуковой генератор

№5, с.49, Генератор фиксированных частот

1962
№9, с.49, Звуковой генератор на транзисторах

№12, с.22, Частотомер НЧ

1964
№6, с.51, RC-генератор

1965
№11, с.65, Звуковой генератор на транзисторах

1966
№4, с.53, Портативный генератор НЧ

№12, с.50, Комбинированный низкочастотный прибор

1968
№2, с.52, Комбинированный генератор ВЧ и НЧ

№5, с.57, Генератор НЧ на одной лампе (аналог – 6Н2П)

№10, с.58, Генератор ПЧ и НЧ

№10, с.62, Генератор RC

1969
№2, с.51, Транзисторный частотомер

№4, с.29, Звуковой генератор

№9, с.51, Транзисторный частотомер

1970
№4, с.60, Универсальный генератор НЧ

1971
№1, с.40, Звуковой генератор на полевом транзисторе

№2, с.34, Генератор низких частот

№3, с.60, Широкодиапазонный RC-гененратор

№8, с.60, Широкодиапазонный RC-гененратор

1972
№4, с.38, Генератор-частотомер

№4, с.46, Генератор НЧ

№5, с.59, Транзисторный частотомер

1973
№1, с.42, RC-генератор

№2, с.41, RC-генератор с электронной перестройкой

1974
№3, с.52, Низкочастотный генератор качающейся частоты

№4, с.45, RC-генератор с электронной настройкой

№5, с.59, RC-генератор с малыми нелинейными искажениями

№6, с.49, Электронный частотомер

№8, с.45, Простой генератор сигналов

№9, с.53, Частотомер с линейной шкалой

№10, с.49, Генератор сигналов звуковой и ультразвуковой частоты

№10, с.52, Звуковой генератор

1975
№8, с.48, Низкочастотный генератор на микросхеме К1УС181Д

№12, с.40, Частотомер на интегральных микросхемах

1976
№2, с.47, Низкочастотный генератор

№5, с.45, Генератор-частотомер на микросхемах

№11, с.59, Генератор на микросхемах

1977
№3, с.40, Цифровой частотомер (схема довольно большая и сложная)
1978
№11, с.28, Простой генератор НЧ и ВЧ

1979
№4, с.58, RC-генератор с емкостной настройкой

№8, с.56, Аналоговый частотомер

1980
№5, с.40, Миниатюрный вольтметр-частотомер

№8, с.47, RC-генератор

1981
№5-6, с.68, Низкочастотный функциональный генератор

№10, с.44, Цифровой частотомер

1982
№8, с.47, Звуковой генератор

1983
№3, с.58, Низкочастотный функциональный генератор

№4, с.48, Генератор без катушки индуктивности

1986
№2, с.42, Генератор звуковой частоты

№9, с.46, RC-генератор с цифровым управлением и отсчётом

1987
№1, с.56, Широкодиапазонный функциональный генератор

№2, с.60, Генератор сигналов звуковой частоты

№6, с.48, Функциональный генератор на одном ОУ

1988
№10, с.50, Генератор ЗЧ (начало)

№11, с.52, Генератор ЗЧ (окончание)

1989
№5, с.67, Генератор сигналов ЗЧ

№8, с.76, Стабильный генератор синусоидального напряжения

№11, с.61, Генератор на цифровой микросхеме

1992
№6, с.44, Несложный функциональный генератор

1994
№4, с.28, Генератор ЗЧ

2002
№2, с.54, Функциональный генератор с электронной перестройкой частоты

№4, с.52, Генератор ЗЧ на микросхеме К174УН7

Читайте также  Устанавливаем в корпус многофункциональный циклический таймер

Генератор-частотомер на msp430

430_2. MSP430. Простая программа генератора и эксперимент.

Если Вы хотите разобраться как работает MSP430Gxxx,
и у Вас есть время и желание, то это нужно деалать.
Если времени нет, то нужно выбрать другой путь.
На данный момент, есть оболочка програмир. Energia,
которая позволяет программировать быстро, используя
готовый код. Запрограммировать LCD display — 10 минут .
Сделать многоканальный вольтметр — еще 10 минут .
Вывести данные и сохранить на компьютере — еще 10 .
Готовый вольтметр, который уже работает — здесь . .

Не знаю как и кого, а меня данный микроконтроллер интересует с точки зрения потребления энергии. Одна из конструкций должна питаться от солнечной батареи, с которой при напряжении 3V можно получить только 10 мА (при хорошей погоде). При этом необходимо дополнительно заряжать два аккумулятора по 1,5V. Так что «сильно не разгуляешься».

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

#include
void main (void) <
WDTCTL = WDTPW + WDTHOLD;
P1DIR |=0x41; P1OUT |=0x01; P1OUT &=

0x40;
for(;;) <
volatile unsigned int i;
P1OUT ^= 0x41;
i = 10000;
do i—;
while(i != 0); >>

В программе два светодиода зажигаются по очереди, так что в любой момент времени горит один из них. Ход программы такой. После сброса програмно отключается таймер ( WDTCTL = WDTPW + WDTHOLD; ), биты «0» и «6» первого порта переключаются на выход ( P1DIR |=0x41; ) , бит «0» устанавливается в «1» ( P1OUT |=0x01; ), бит «6» в «0» ( P1OUT &=

0x40; ), программа переходит в бесконечный цикл ( for(;;) < >) и формируется задержка ( do- while ). Описание программы на отдельной странице.

Фотографию момента измерений Вы можете видеть на фотографии (контроллер MSP430G2452, напряжение питания — 2,6V, яркость светодиодов — нормальная ).

Результат следующий. При напряжении 2,6 V и тактовой частоте 1 МГц , микроконтроллер потребляет ток, около, 0,22 mA (0,00022 А). На плате « Launchpad », при той же частоте ( 1 МГц ) и напряжении питания 3,55 V, микроконтроллер MSP430G2452 потребляет 0,35 mA , а MSP430G2553 — 0,4 mA .

Можно посчитать на сколько времени хватит двух аккумуляторов 200 mA/h (AAA) или 250mA/h (2/3 AA), если не переводить микроконтроллер в режим пониженного энергопотребления. Но из практики, двух аккумуляторов с верхней фотографии хватает больше, чем на месяц непрерывной работы.

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

Данный микроконтроллер MSP430G2452, при:

1,5V – не работает ,
1,55V – начинает работать, но неустойчиво .
1,6V – уже работает .

По данным TI ( T exas I nstruments) , минимальное рабочее напряжение – 2,2V . Ядро будет продолжать работать до напряжения 1,8V , но при этом не гарантируется запись в энергонезависимую память (EEPROM). Максимально допустимое напряжение — 3,9V ( 4,2V ) и этого мы проверять не будем.

Но вернемся к результатам. Как видно на фотографии, осциллограф (справа) измеряет частоту импульсов (на выходе P1.0). Частота переключения светодиодов, около 4 Гц. Таким образом микроконтроллер формирует импульсы, длинной, около 120 mS (0,12 секунды). Программа формирует задержку в цикле do-while, с начальным значением счетчика i = 10000 . Вопрос следующий. Какую максимальную частоту можно получить на выходе микроконтроллера, и как влияет длинна цикла задержки ( i = . ) на эту частоту?

Но в начале вернемся к программированию.

Подпрограммы или как это выглядит.

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

0x40;
for(;;) <
volatile unsigned int i;
P1OUT ^= 0x41;
i = 10000;
do i—;
while(i != 0); >>

Правило очень простое. Подпрограмма объявляется;» ) до начала функции main , используется (» ; « ) в теле функции main , описывается (без » ; « ) после функции main (после последней фигурной скобки функции main ).

Применение подпрограммы , в нашем примере, только усложнило программу. Но чаще бывает по другому. К примеру, следующая программа легко читается. Если программист был в «здравом уме и трезвой памяти», то эта программа делает то, что написано (независимо от программной реализации).

void Flush_Both_LEDs_1_Time (void) ; // Объявляем . Если человеческим языком, то

void Flush_LED_Green_5_Time (void); // официально предупреждаем компилятор

void Flush_LED_Red_5_Time (void); // что будут 4-ре подпрограммы, которые

void Flush_ Both_LEDs_NonStop_EndLess_Loop (void); // необходимо включить

// в конечный файл.

void main (void)

Flush_Both_LEDs_1_Time () ; // Вызываем подпрограммы на исполнение.

Flush_LED_Green_5_Time (); // Если программист был нормальный, то ход программы

Flush_LED_Red_5_Time (); // понятен из названий подпрограмм.

Flush_ Both_LEDs_NonStop_EndLess_Loop ();

void Flush_LED_Green_5_Time (void) // Описываем каждую подпрограмму.

// В скобках – программная реализация.

void Flush_LED_Red_5_Time (void)

void Flush_Both_LEDs_1_Time (void)

void Flush_ Both_LEDs_NonStop_EndLess_Loop (void)

Это основа программы, где видна логика происходящего. Ее можно написать, даже, не зная языка Си. Дальше, необходимо наполнить подпрограммы содержанием (операторами языка Си, константами, переменными и так далее). Тут уже «на вкус и цвет» .

Почему мы говорим о подпрограммах именно сейчас? Есть три причины. Во первых, при написании подпрограмм, мелкие неточности в синтаксисе выливаются в длинные бессонные ночи. Во вторых, программы пишутся именно так. Любая программа делится на маленькие кусочки, которые пишутся (чаще «копипастятся») и отлаживаются отдельно, а потом все собирается вместе. В третьих, это позволяет использовать одну и ту же подпрограмму по несколько раз. А еще подпрограммы (или функции) можно вызывать рекурсивно . , но без этого можно прожить.

Полезно знать что делает компилятор. Все объявленные подпрограммы раскладываются в памяти и вызовы этих подпрограмм (в основной программе main.c) заменяются на ссылки на их расположение. Если подпрограммы не объявлены, то текст после последней фигурной скобки функции main.c – игнорируется. Компилятор пытается найти разумное объяснение неизвестным подпрограммам / функциям в файле msp430g2452.h , где их не находит, и сообщает об ошибке.

Настало время измерить частоту.

Можно, конечно, посчитать длительности импульсов по тактам процессора, но это не спортивно. Значительно проще и скорее это можно сделать с помощью обычного осциллографа, «зацепившись» за один из выходов микроконтроллера.

Программу пришлось дописать. Не потому, что старая не работала, а потому, что значение задержки значительно удобнее менять вне тела программы. Глобальная переменная » k » объявлена в начале программы. Эта переменная используется как аргумент подпрограммы Flush_LEDs ( k ) .

void Flush_LEDs (void);

void main (void)

void Flush_LEDs (void)

P1DIR |=0x41; P1OUT |=0x01; P1OUT &=

volatile unsigned int i;

i = 10000;

do i—; while(i != 0);>

volatile unsigned int k = 60000;

void Flush_LEDs (unsigned int aaa);

void Flush_LEDs (unsigned int aaa)

P1DIR |=0x41; P1OUT |=0x01; P1OUT &=

volatile unsigned int i;

С точки зрения программирования, переменные бывают глобальные и локальные . Глобальные , объявляются перед программой main , живут постоянно и «видны» всем подпрограммам и функциям. Локальные переменные (временные), объявляются в теле программ, подпрограмм, циклов и т.д. и существуют только во время их работы. То есть, переменная i , в цикле do-while , исчезнет, как только цикл закончится, и появится снова при следующем использовании цикла.

Вернемся к длительности импульсов на выходах портов P1.0 и P1.6 . Результаты для счетчиков цикла k = i = 1000, 100, 10 и 1 – на фотографии ниже. Результат для k = i = 10000 — 4,15 Гц , Вы могли видеть в начале страницы.

Так же, было интересно узнать какую максимальную частоту (минимальную длину импульсов) можно получить. Для этого надо убрать цикл do-while . После этого, инверсия состояния битов порта P1 будет происходить, только, в бесконечном цикле for(;;) .

Для микроконтроллера MSP430G2452 , (работающем на внутренней частоте 1 МГц *, при напряжении питания 3,55V ) удалось получить импульсы с длительностью около 5,5 мкс . Таким образом, частота следования импульсов — около 90 кГц . Я думаю, что это неплохой результат для 16-ти битного микроконторллера , при токе потребления 0,35 мА .

Итак, что мы узнали.

1. Плату « Launchpad » можно использовать как программатор для микросхем MSP430Gxxxx. При этом, запрограммированная микросхема прекрасно работает отдельно (и без кварцевого резонатора!). То есть проблему с программатором мы сняли.
2. Основная программа легко разбивается на подпрограммы. Это немного улучшает «читаемость» и «вспоминаемость». Но главное, что это позволяет набирать сложную программу из отдельных подпрограмм (часто не своих).
3. Благодаря тому, что «Техас Инструмент» продумал систему сброса (по питанию), мы можем использовать микроконтроллер не задумываясь о внутренней конфигурации (как «черный ящик»). То есть, после подачи питания, в микроконтроллере включается внутренний тактовый генератор (1 МГц) и начинается выполнение программы.
4. WatchDogTimer является единственным модулем, который включается после сброса «по умолчанию». Если его не выключить строкой «WDTCTL = WDTPW + WDTHOLD;», то он будет регулярно «рестартовать» микроконтроллер, мешая нормальной работе программы. Остальные внутренние модули можно включить программно, если есть желание.
5. Мы использовали микроконтроллер MSP430Gxxxx как программный автомат. То есть программировали последовательность действий, а микроконтроллер их выполнял. Это позволило реализовать генератор прямоугольных импульсов с частотой до 90 кГц при тактовой частоте процессора 1 МГц. Добавив две команды (BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ;) можно увеличить тактовую частоту процессора до 16 МГц (выбор 1, 8, 12 или 16 МГц). Соответственно увеличится максимальная частота выходных импульсов. Согласитесь, что генератор до частоты 1,5 МГц, на одной микросхеме – это заманчиво.

Пользуясь логикой «программного автомата», можно написать («скопипастить») простую программу, для работы с LCD дисплеем. А дальше, на дисплей можно выводить все что угодно, текст, цифры, числа, показания вольтметра (результат работы АЦП), частоту и так далее.

« Вы можете это сделать! Это очень просто! ».

На фотографии универсальная заготовка устройства, которая УЖЕ работает. Можно превратить во что угодно (зависит от фантазии и необходимости).

Техническая реализация следующая. Порты микроконтроллера P2.0-P2.3 соединены с D4-D7 индикатора, P2.4 с EN , P2.5 с RS . Вывод R/W индикатора соединен с « общим проводом ». При напряжении 3,5V добиться изображения на экране – не возможно. Поэтому дополнительная батарейка, 1,5V (в правом нижнем углу фотографии), решает эту проблему.