Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Теория и практика управления вакуумно-люминесцентными дисплеями

Публикация предыдущей статьи про работу с вакуумно-люминесцентными дисплеями нашла отклик и обнаружила интерес к данным устройствам у многих читателей, что и не удивительно. VFD дисплеи имеют ряд привлекательных особенностей: приятный для глаза цветовой оттенок, высокую яркость и контрастность, широкие углы обзора, долгий срок службы, по сравнению со своими старшими братьями – газоразрядными индикаторами, ну и, конечно, какую-то непередаваемую чарующую "ламповую" атмосферу. Поэтому было решено продолжить работу в этом направлении: устранить недостатки предыдущей версии софта, перейти на использование современного микроконтроллера с более широкими возможностями, да и в целом изменить подход и логику работы программы.

Итак, немного теории для начала. Несмотря на все описанные выше достоинства, у вакуумно-люминесцентных дисплеев есть и недостатки: значительное энергопотребление, не самая простая схема электропитания, и самое главное – высокая стоимость. Поэтому они постепенно уходят из массового сегмента рынка, уступая свое место более современным устройствам (LED, OLED, LCD и т.д.). Благодаря этому цена на б/у дисплеи на вторичном рынке зачастую невысокая, что делает их очень привлекательным вариантом для использования в различных самоделках. Чаще всего их можно найти в составе т.н. "дисплея покупателя", который устанавливают на кассе для отображения информации о покупке. Производителей и моделей достаточно много, выглядят они примерно так:

Несмотря не внешнее разнообразие, внутреннее устройство у них достаточно похожее (для примера плата с индикатором 202-MD-25GINK от Wincor Nixdorf):

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

Для питания дисплею необходимо три напряжения: высокое анодное (примерно 40 вольт), напряжение питания логики (+5 вольт), и питание нитей накала (переменное напряжение, около 4 вольт). На данной плате все три напряжения получаются с единственного импульсного трансформатора, но встречаются и другие реализации, например, через три независимых преобразователя или даже с использованием умножителя напряжения на конденсаторах и диодах.

Управляет дисплеем и выводит на него информацию микроконтроллер, а данные для отображения поступают на него с преобразователя интерфейсов (RS232 или USB в зависимости от модели). 

В прошлом проекте "Часы на ардуино из дисплея покупателя (VFD)" основная идея работы заключалась в следующем: мы подключаемся напрямую к процессору через UART (а именно к ножке Rx, т.к. данные только передаются и не принимаются обратно) и дальше ведем передачу согласно установленному в дисплее протоколу, скорости и соответствующему набору команд (Firich/CD5220, Epson, DSP800 и т.д.). Это самый простой способ, но у него есть недостатки. Так, например, если мы хотим выводить текст, то проблем никаких нет, текст отображается с использованием встроенного знакогенератора. Но для тех же часов требовалось создание, запись в память и использование символов, созданных пользователем (не менее 40 для больших цифр), а вот эту возможность поддерживают далеко не все дисплеи. Часто можно создать всего несколько пользовательских символов, или вообще такая возможность отсутствует.

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

Начнем с теоретических предпосылок и логики работы дисплея. Управление дисплеем осуществляется с помощью 4 выводов (CLK, SIN, LAT, BK) и по своей сути представляет управление сдвиговым регистром.

  • CLK – сигнал тактирования. Когда на этой ножке уровень сигнала изменяется с низкого на высокий, происходит считывание данных с ножки SIN, иначе говоря синхронизация идет по переднему фронту тактового сигнала.
  • SIN – пин, на который подаем данные.
  • LAT – "защелка" сдвигового регистра. Пока на ножке низкий уровень экран – принимает данные, высокий – отправляет их на драйвер управления экраном.
  • BK – бланкирование, или просто отключение всего дисплея разом (если на ножке 0 – дисплей светится, 1 – погашен), должен быть высокий уровень (погашен экран), пока на ножке LAT высокий уровень (пока идет отправка данных непосредственно на аноды индикатора). Так же при необходимости используется для регулировки яркости экрана (посредством регулировки скважности).

Пин SO – это выход сдвигового регистра. Теоретически может использоваться для последовательного подключения нескольких дисплеев или просто для определения типа дисплея (например, по количеству тактовых импульсов сигнала CLK, необходимых для того, чтобы прогнать единицу через все регистры дисплея и получить ее на выходе, как, например, реализовано в прошивке камрада devICEpro). В нашем случае использоваться будет только для дисплея DN2029BD, для последовательного подключения регистра сеток, но об этом чуть позже. 

Остальные ножки (за исключением дисплея DN2029BD) не подключены, либо отвечают за питание индикатора, а именно: F1 и F2 – выводы нити накала, VDD – питание логики дисплея, HV – высокое анодное напряжение, GND(VSS) – минус питания.

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

Видимая область экрана состоит из двух рядов по 20 знакомест в каждом:

Логика вывода данных основана на представлении экрана в виде столбцов, т.е. 20 столбцов по 2 знакоместа, верхнее и нижнее. Сами знакоместа при детальном рассмотрении выглядят следующим образом:

 

Как видно, основное знакоместо состоит из 35 точек (5 в ширину на 7 в высоту), плюс еще три дополнительных (курсор, точка, запятая) итого 38 точек на знакоместо или 76 – на столбик. Есть исключения, например, колба 202-MD-25GINK (видно на фото вверху) не имеет дополнительных сегментов, а только лишь элементы основных знакомест.

Теперь непосредственно об управлении. Первым делом начинаем с инициализации экрана: подаем высокий уровень сигнала на BLK, затем высокий уровень на LAT, затем переключаем LAT на низкий уровень, и после этого переключаем на низкий уровень BLK. (Сверху вниз LAT, BLK, CLK, SIN)

Дальше следует выбор сетки (столбца). Всего 20 сеток (столбцов), значит, необходимо подать 20 тактовых импульсов (CLK), а сигнал SIN при этом должен быть включен на высокий уровень во время импульса с номером необходимой сетки. Так как запись данных происходит по переднему краю импульса, то лучше сигнал SIN включить чуть раньше, а выключать можно вместе с сигналом CLK. (На картинке выбрана 4 сетка)

После выбора сетки идут 35 (38) импульсов верхнего знакоместа и столько же для нижнего. Логика работы такая же, если точку нужно зажечь, вместе с нарастанием CLK устанавливаем "1" на SIN во время нужного импульса, если же нет – оставляем ноль (на картинке вывод большой буквы "М"):

 

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

Файл с анализатора приложу, если кому интересно посмотреть подробней.

Общие идеи ясны, перейдем к конкретной реализации. В качестве платформы был выбран микроконтроллер ESP32. Нет необходимости останавливаться подробно на его характеристиках, они и так известны. Несмотря на то, что ESP32 работает с логикой 3,3 вольта, а логика VFD дисплеев работает с 5 вольтами, проблем с совместимостью замечено не было, все работает отлично. 

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

В итоге получаем следующее: массив чисел, первые 4 бита в числе соответствуют состоянию управляющих пинов (CLK, BK, LAT, SIN) в единицу времени. Для наглядности можно представить в виде таблицы:

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

В таблице выше отображен момент первоначальной инициализации дисплея, как видно, сначала устанавливается 1 на линии BK, потом 1 на линии LAT, 0 на LAT и 0 на BK. И до конца цикла вывода (один столбец) эти биты можно больше не трогать, если только нам не потребуется регулировать (уменьшить) яркость, тогда позже можно опять установить 1 на линии BK до окончания цикла, тем самым уменьшив время свечения экрана и, соответственно, яркость. Общее количество элементов массива может быть различно и зависит от используемой колбы (дисплея). 

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

Разберем работу с дисплеем на примере самой распространенной и логичной в управлении колбы Futaba 202-MD-20GINK и ее аналогов от фирмы BOE CIG40-2003N и CIG40-2004NВыглядит она вот так: 

Цикл управления для этого дисплея выглядит следующим образом:

  • Инициализация 
  • 20 импульсов (бит) выбор сетки (столбца)
  • 35 (+3) импульсов (бит) для отрисовки верхнего знакоместа
  • 35 (+3) импульсов (бит) для отрисовки нижнего знакоместа

Итого 20 + 38 +38 = 96 импульсов CLK. Так как один импульс – это последовательная смена 0 и 1 на линии CLK, то получается, что для одного тика (импульса) необходимо два элемента массива, т.е. 96 * 2 = 192 элемента массива + 7 элементов в начале на инициализацию дисплея и еще один 0 в конце. Итого получается 200 элементов массива на отрисовку одного столбца. (Трудно абстрактно представлять себе массив, поэтому приложу к статье файл с таблицами, где все эти расчеты будут видны наглядно). Всего у нас 20 столбцов, следовательно 200 * 20 = 4000 элементов – это размер массива содержащий в себе информацию об экране целиком. Экранный буфер.

uint8_t  output_screen_buff_bin [20][200];//Экранный буфер

Для удобства доступа он представлен в виде двумерного массива, но в прерывании мы будем его читать просто по порядку от 0 до 4000 элемента.

После того, как массив объявлен, его необходимо заполнить данными, которые не будут меняться в процессе работы и не зависят от выводимой информации. А именно: состояние BK и LAT в самом начале для инициализации, сигнал тактирования (по сути чередование 0 и 1 нулевого бита (CLK)), выбираемый номер сетки (столбца), численно равный первому индексу элемента массива output_screen_buff_bin [0][..], output_screen_buff_bin [1][..], output_screen_buff_bin [2][..],... ) Это делается однократно в секции setup() вызовом функции:

  init_array(); //Заполняем буфер вывода  (сигнал тактирования, инициализации, выбор сеток, все кроме данных)

После инициализации массива буфера экрана создаем задачу для RTOS:

  xTaskCreate(main_task,  "main_task", 4000, NULL, 0, NULL ); //Создаем основную задачу

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

Далее настраиваем таймер и прерывания:

  timer = timerBegin(0, 2, true);              //80Мгц / 2 = 40Мгц
  timerAttachInterrupt(timer, &onTimer, true); //Функция обработки прерывания
  timerAlarmWrite(timer, 56, true);            //счетчик до прерывания
  timerAlarmEnable(timer);                     // Включаем

Это даст примерно 90 Гц частоту обновления экрана (для разных колб по-разному), что вполне достаточно. Можно медленнее, быстрее нельзя – начинает срабатывать WDT. 

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

    vfd_print ("Hello, world!", 0 , 0); //"Текст", номер строки (0, 1), номер столбца (0 - 19)
    vfd_print ("Привет, мир!", 1 , 8);

Которая в качестве аргументов принимает текст в виде С строки, номер строки (0,1) и позицию (0 - 19), начиная с которой он будет напечатан. 

Точно так же можно печатать числовые переменные целые и с точкой:

int val = 10;
flot fl_val = 15.32;
vfd_print (val, 0, 0);
vfd_print (fl_val, 1, 0);

При печати пользовательских символов, они выводятся на экран функцией vfd_write, которая аналогична vfd_print с той лишь разницей, что в качестве первого элемента принимает порядковый номер символа в массиве знакогенератора (по факту, первый  индекс массива знакогенератора const byte symbol[256][7], находящегося в подключенном файле CharGen.h). Например:

vfd_write (20, 0, 0); //Напечатает букву "Ф" 

Знакогенератор авторства devICEpro, какие символы в нем записаны – понятно из комментариев, естественно, при желании все они могут быть изменены. Небольшая утилита для создания собственных символов будет также в приложении, ну или можно использовать онлайн сервис, например вот этот.

Для очистки экрана реализована функция clean_screen, ее работа в комментариях не нуждается. 

Также имеется возможность плавно регулировать яркость от 0 до 100 процентов:

set_brightness (50); //Установит яркость 50 процентов

По умолчанию яркость максимальна.

Собственно, это и есть небольшой, но достаточный набор для отображения на VFD экране любой информации. Перед загрузкой прошивки необходимо только лишь раскомментировать ОДНУ строчку с названием дисплея, с которым планируется работать:

/*Подключить один из файлов, в соответствии с используемой колбой*/
#include "DriverDN2029DB.h"
//#include "Driver202MD25GINK.h"
//#include "Driver202MD20GINK.h" //BOE CIG40-2003N и CIG40-2004N

Теперь, когда мы разобрались с общими принципами, остановимся подробней на подключении дисплеев и их различиях. Как я уже писал, помимо управления индикатором на плате дисплея организовано и его питание. Дисплей останется на родной плате, и будет питаться от нее. Мы будем работать только с сигнальными линиями (LAT, BLK, CLK, SIN) и еще необходимо соединить земли (GND) . Это означает, что эти пины необходимо отсоединить от платы (я аккуратно откусил их вплотную к плате и отогнул). Далее подключаем их проводами к отладочной плате ESP32 по следующей схеме (Прошу прощения, за оформление, но адекватного способа рисовать схемы для модульных проектов я пока не нашел): 

  • Пин 12 – CLK
  • Пин 13 – BK
  • Пин 14 – LAT
  • Пин 15 – SIN
  • Любой пин GND – с землей на плате дисплея.

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

Подключение для дисплеев 202MD20 и 202MD25 очень похоже, с той лишь разницей, что 202MD25 необходимо перевернуть верх ногами:

Немного иначе дело обстоит с индикатором DN2029DB. Дело в том, что у него больше ножек, т.к. подразумевается раздельное управление регистром сеток и регистром анодов. Вот его распиновка из датшита:

Как можно заметить, выводы регистра сеток обозначаются так же, только с добавление буквы G в конце (grid- сетка). Нам необходимо подключить эти регистры последовательно, причем первый будет идти регистр анодов, а за ним – регистр сеток. Для этого необходимо попарно соединить выводы следующим образом:

  • CLKG – CLK
  • BKG – BK
  • LATG – LAT
  • SING – SO

Подключаемся так же к выводам SI, CLK, LAT, BK.

Важный момент! Как можно заметить, на плате вывод LATG соединен с напряжением питания логики дисплея VDD1 (+5в), в таком виде оставлять нельзя, его необходимо отключить от питания, можно просто перерезать дорожку.

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

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

Разберем разницу в управлении дисплеев. В приложении будет excel файл, содержащий таблицы, глядя в них будет проще понять, о чем идет речь. Итак, как я уже писал выше, управление дисплеем очень похоже на запись данных в сдвиговый регистр, это касается всех описанных дисплеев, с той лишь разницей, что размер этих регистров и расположение используемых в них битов отличается. В общем случае у нас имеется два последовательно соединенных регистра, регистр сеток и регистр анодов. Для того, чтобы их полностью записать, необходимо после инициализации дисплея послать на ножку CLK количество импульсов, равное суммарному количеству бит в регистрах, и во время импульса CLK подать на ножку SIN "0" или "1". Очень похоже на передачу сигнала по шине SPI. Так как у нас сигнал тактирования для всего цикла прописан в массиве output_screen_buff_bin (BIT0), то это означает, что для передачи данных так же необходимо прописать в массив значения для сигнала SIN (BIT3). Начнем с колбы 202-MD-20GIN. Если посмотреть в таблицу, то можно увидеть следующее: сначала выбор сетки, элементы массива с 7 по 46. Так как значения можно изменять дискретно, соответственно элементам массива, и важен передний (нарастающий) фронт сигнала CLK, устанавливать "1" на SIN будем немного заранее, а именно с установкой "0" на CLK, потом держать ее, когда на CLK установится "1", а сбрасывать в "0" уже вместе с сигналом CLK, т.е. например выбор 2 импульса будет выглядеть так:

 

№ имп.

 

1

 

2

 

3

 

4

 

CLK

0 1 0 1 0 1 0 1 0
SIN 0 0 1 1 0 0 0 0 0

Общая структура, как уже было описано выше: 20 импульсов для сеток, 38 для верхнего знакоместа, 38 для нижнего, всего 96 бит.

Немного иначе обстоят дела с колбой 202-MD-25GINK, если посмотреть в таблицу, видно, что там вначале идут 4 неподключенных бита, только потом 20 бит выбора сетки, потом еще 2 неподключенных бита, потом 35 бит для верхнего знакоместа (точка, запятая и курсор отсутствуют на этом дисплее) и еще 35 бит для нижнего знакоместа. Всего также 96 бит, но располагаются они по другому.

Теперь самое интересное, дисплей DN2029DB.

Как уже упоминалось выше, первой его особенностью является наличие отдельных выводов регистра сеток и регистра анодов, но этот момент решается при подключении. Что же касается управления, тут тоже не все просто. Если посмотреть на экран через микроскоп или хорошее увеличительное стекло, можно заметить, что сеток здесь гораздо больше, они узкие: на половину знакоместа и на каждый столбик их приходится по две. Следовательно, для управления сетками уже нужно не 20, а 40 бит, но и это еще не все. Нумерация сеток здесь сделана наоборот, т.е. начинается с конца, первый столбик это сетки 39 – 40, а последний 1 – 2 соответственно. Общая структура в итоге такова: 8 бит не подключены, 40 бит выбор сеток, 38 бит верхнее знакоместо, 2 пустых бита, 38 бит нижнее знакоместо и еще 18 бит пустых. Всего цикл управления составляет 144 бита – не самое экономичное использование ресурсов. Именно поэтому для этого индикатора частота обновления получается примерно на треть ниже, чем для остальных. Ну, думаю, у инженеров Noritake Itron были веские причины сделать именно так, а не иначе.

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

Немного о таблицах. Они выглядят таким образом:

В среднем столбике обозначены последовательно этапы в работе с экраном, т.е. сначала идет инициализация с использованием только сигналов BLK и LAT, после нее включается сигнал тактирования и, соответственно, отсчет битов регистров. Первая колонка – это как раз сквозная нумерация битов. Вторая колонка – это номера элементов массива буфера экрана (output_screen_buff_bin ), т.е. там видно, в каком именно элементе массива необходимо включить тот или иной бит. Колонка "Данные" предназначена для проверки выходного результата. Если распечатать в монитор порта массив выходного буфера, например так:

for (int i = 0; i < 294; i++){
Serial.println(output_screen_buff_bin[0][i],BIN);// распечатает данные для первого (нулевого) столбика 
}
}

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

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

Немного примеров работы программы.

На видео – пример работы софта для дисплея DN2029DB. Выводится последовательно все 256 символов знакогенератора с постепенно нарастающей яркостью экрана от 0 до 100 процентов. На камеру изменение яркости не очень заметно, но оно есть, и вживую видно хорошо.

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

Теги:

Опубликована: 0 0
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 2 чел.

Комментарии (7) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+2
andro #
Проделана большая работа, очень полезно хотя бы для саморазвития.
Ответить
0

[Автор]
AMatroskin #
Спасибо, так и есть, это основная цель.
Ответить
0
IG_58 #
Что-то я не заметил в упоминаемой выше статье ни одного упоминания о том, кто и когда впервые за несколько лет экспериментирования реализовал управление таким дисплеем и опубликовал эту информацию. На мой взгляд, это некорректно. А между тем, первоначально техзадание на стыковку собственно индикатора и микроконтроллера было сформировано коллегой Mantrid (см. форум http://www.mantrid.ru) и его коллегой - программистом, совместно изучившими осциллограммы, последовательности импульсов, составившими знакогенератор и впревые выложившими алгоритмы и собственно код, чтобы желающие могли повторить. Что же касается первичной идеи стыковки индикатора и контроллера ESP32, а также первой успешной практической реализации управления дисплеем ВЛИ в реальном времени с очень высоким быстродействием принадлежит вашему покорному слуге, т.е. конкретно мне.
Вот ссылка, где опубликована вся информация по теме:
http://www.mantrid.ru/forum/showthread.php?t=1683

Практическая реализация синтезатора с дисплеем ВЛИ в трансивере "Походная":
http://www.mantrid.ru/forum/showthread.php?t=1713
Ответить
0

[Автор]
AMatroskin #
Оо, и здесь вы. Хорошо что оставили ссылку, чтоб народ мог посмотреть и сравнить вашу реализацию и мою, возможно попытаться найти там что то общее кроме используемого дисплея и микроконтроллера, хотя вряд ли это получится. Труды вас и ваших коллег по изучению осциллограмм наверно тоже очень важны, но к счастью я к ним отношения никакого не имею, мои же исследования и логика работы подробно описаны в статье, которую вы к сожалению до сих пор не прочитали или просто не поняли, иначе бы не писали такие наивные претензии по поводу первенства в идее подключения распространенного микроконтроллера к не менее распространенным дисплеями. Так же, что касается "авторского права" перед тем как поднимать такие вопросы, я бы рекомендовал вам внимательно ознакомиться с наработками из различных источников, в том числе зарубежных, если вам это доступно конечно. Тема не нова, собственно как и сами дисплеи, и по всему миру достаточно людей работающих над этими устройствами. Кстати, судя по коду для атмеги, вложенному у вас на форуме ваш программист в отличии от вас хорошо знаком с этими наработками.
Ответить
0
IG_58 #
Не имею никакого намерения вступать с вами в какие бы то ни было дискуссии, равно как и не вижу ни одной причины, чтобы знакомиться с какими-то там "наработками из различных источников, в том числе зарубежных" или обсуждать мелкие технические детали различных вариантов реализайии, которых может быть бесчисленное множество. Мне это не нужно. Вы не привели ссылок на материалы форума, на котором коллеги занимались данной тематикой и впервые получили работающую и высокодинамичную реализацию, и я их привёл, т.к. считаю, что не приведя эту информацию, вы поступили не вполне корректно. Всё, конец сюжета, я со своей стороны эту тему закрыл, продложения не будет.
Ответить
0

[Автор]
AMatroskin #
Занимались и хорошо, но какое отношение ваши занятия имеют к данной статье и почему я должен был ссылаться на них, я так и не понял.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Тестер ESR, полупроводников, резисторов, индуктивностей Катушка Тесла
вверх