Принципиальная схема
Принципиальная схема замены микросхемы DS2409 [1] на микроконтроллер (МК) 12F629 [2] для использования с интерфейсом 1-Wire фирмы Dallas Semicondutor представлена на рис. 1.
Схема выполняет «ветвление» или «разделение» шины 1-Wire на участки, поэтому используется термин «схема ветвителя» или «ветвитель». Стрелками показано состояние приёма или передачи данных для соответствующего вывода МК.
Схема содержит узел управления на микросхеме U1 (12F629) и управляемые ключевые элементы на транзисторах Q1…Q5 (2N7000).
Диоды D1…D3 (1n5817) выполняют защитные функции от возможных импульсов положительных и отрицательных напряжений, наводимых на линию интерфейса 1-Wire. Конденсатор C1 фильтрует возможные импульсные помехи по линии питания +5 В.
Поскольку интерфейс 1-Wire двунаправленный, для коммутации сигналов используется последовательное включение двух транзисторов от одного сигнала управления. Транзисторы Q 1, 2 управляются от вывода 6 (GP1) МК U1 (12F629), транзисторы Q 3, 4 управляются от вывода 3 (GP4) МК U1 (12F629).
Резисторы R1…R4 выполняют функцию «подтягивания» линии 1-Wire к положительному уровню +5 В. При установке МК на выводах управления высокого логического уровня +5 В управляемые транзисторы открываются, и линия разъёма XP3 (1w) соединяется с разъёмами XP1 (aux-1w) или XP2 (main-1w). Суммарное сопротивление соединения не превышает одного Ома.
И наоборот, при установке МК на выводах управления низкого логического уровня 0 В транзисторы закрываются, и суммарное сопротивление устанавливается максимально большим. Выходная линия отключается, и при этом выполняется «подтяжка» к уровню +5 В через резисторы R2, R3.
Контроль выходных шин MAIN-1W и AUX-1W на возможное короткое замыкание выполняется МК через вывод 2 (GP5) и вывод 5 (GP2). Таким образом, передавая сигнал запроса, можно определить исправность коммутируемых линий.
Управление МК осуществляется в стандарте 1-Wire. Через вывод 4 (GP3) сигналы принимаются от шины 1-Wire и через вывод 7 (GP0) передаются в линию 1-Wire.
Передачу сигнала выполняет управляемый транзистор Q5, который замыкает шину 1-Wire к уровню 0 В и тем самым формирует из него сигнал 0 стандарта 1-Wire для приёма на компьютере.
Временны¢е интервалы замыкания формирует МК U1 (12F629). При использовании внутреннего RC генератора в 4 мГц погрешность сигналов управления составляет ±1 мс, что не вызывает ошибок в сигналах при приёме и идентификации данных интерфейса 1-Wire.
Необходимо учесть дополнительный потребляемый ток МК в 1…3 мА по шине +5 В и возможное падение напряжения для длинной шины питания.
Конструкция
Схема и все компоненты собраны на печатной плате и предназначены для монтажа под «винт». На рис. 2 представлены: слева фото собранной печатной платы, справа 3D-модель той же платы. Печатная плата разработана в среде проектирования DipTrace, проект доступен в каталоге программ [3] и находится в файле sh_12F675_kan1_v1.zip.
Предусмотрена установка транзисторов в разных исполнениях ТО-92 и SOT-23. МК устанавливается через переходную колодку DIN-8, что позволяет модифицировать и изменять программное обеспечение и возможные функции использования.
Программное обеспечение
Для работы схемы замены используется программное обеспечение, совместимое с интерфейсом 1-Wire, которое подготовлено и представлено в [3]. Это программа термометрии silos_v3.exe, которая написана на языке программирования FORTH [4]. Программа содержит все компоненты для программирования и модификации программы замены ds2409 [1] на 12F629 [2], а также печатные платы и схемы.
Программный код формируется в режиме «восстановление всех файлов – компиляция нового кода». Для получения кода и дальнейшей прошивки его через программатор требуется выполнить следующую последовательность действий с программой silos_v3.exe [3]:
- скачать архив по адресу [3] и распаковать исполняемый файл silos_v3.exe в отдельной папке;
- выполнить программу и в предлагаемом меню выбрать режим «восстановление всех исходных файлов» (нажать цифровую клавишу 3);
- программа выполнит восстановление всех исходных файлов и остановится;
- перейти в созданный каталог test_monsys_exe и выполнить командный файл start_new_versii.cmd;
- программа выполнит компиляцию нового кода, а также создаст каталог hex_12f629_2409_v1, в котором созданы файлы для МК. Данные файлы имеют номера, которые привязаны к номерам устройств идентификации протокола 1-Wire. Например, файл hex_12f629_2409_v1_D2012F6290040B1F.hex предназначен для схемы ветвителя с номером D2012F6290040B1F. Для работы программы термометрии этот номер записывается в файле инициализации к соответствующим датчикам DS1820, чтобы обращаться именно к данному ветвителю c установленными для него датчиками.
Полученные файлы нужно записать в МК любым программатором для данного типа МК. Если не требуется модернизация программы, например, изменение кодов для обращения к ветвителям, то сформированный каталог можно удалить. Если изменили коды обращения, то оставляете сформированный файл silos_v3.exe и удаляете все предыдущие файлы. После компиляции сформированный файл silos_v3.exe содержит все новые изменения для работы с новыми номерами идентификации ветвителя. В новом файле изменится контрольная сумма и дата создания, размер файла останется прежним.
При более «серьёзной» модификации программы изменится и размер исполняемого файла. Рассмотрим несколько поясняющих примеров функционирования программного обеспечения для схемы ветвителя на 12F629 на языке программирования FORTH. Текст программы находится в файле silos_v3_2409_v1.f и компилируется через выполнение общей программы silos_v3.f с помощью файла 100_spf4.exe. Для уточнения, где описание и где программа, фрагменты текста программ, «вырезанные» из основного текста, размещены в цветных квадратах.
Пример 1. Изменение идентификационного кода
В стандарте интерфейса 1-Wire доступ к «ведомым» элементам осуществляется по их идентификационному коду, который состоит из 8 байт [1].
Первый байт определяет функцию или тип устройства, далее 6 байт каких-либо номеров, а последний байт – контрольная сумма первых 7 байт.
Таким образом, формируется стандартизация интерфейса 1-Wire и его устройств. Например, первый байт 0x28 определяет датчики температур DS18B20, первый байт 0x1F определяет ветвители DS2409 и так далее.
Требуется выполнять стандартизацию обращения к устройствам интерфейса 1-Wire, поскольку в этом случае программное обеспечение производителя будет работать нормально со схемой ветвителя на МК.
Следовательно, можно изменять со 2-го по 7-й байт и оставлять 1-й байт с кодом 0x1F. Последний байт формируется по первым 7 байтам.
Для формирования последовательности номеров задействованы 2-й и 3-й байт. Остальные 4, 5, 6, 7-й байты не меняются, и допустимо записывать любую информацию.
Рассмотрим распределение байт идентификационного номера:
D2012F6290040B1F – код идентификации, где:
- 1F – тип устройства 1-Wire, ветвитель DS2409, и он заменён на 12F629;
- 040B – номер, формируемый программой в количестве 10 штук, начиная с 0403 до 040С;
- 012F6290 – постоянные байты, где записан тип используемого микроконтроллера;
- D2 – контрольная сумма первых 7 байт.
Отсчёт нумерации байтов может выполняться в разных направлениях и зависит от представления в программе. На нижнем уровне передача начинается с байта кода информации об устройстве, а в программном обеспечении верхнего уровня отображается в обратном виде.
Представление кодов идентификации с разным видом дано в табл. 1.
- В файле программы silos_v3_2409_v1.f текстовым редактором находим строки, определяющие начальный номер идентификации:
CREATE ZAPROS_ACP_OUT_RGN1 0x3 C, \ мл. байт
CREATE ZAPROS_ACP_OUT_RGN2 0x4 C, \ ст. байт и меняем, например, старший байт на 0x1
Таким образом, будет формироваться последовательность 0103, 0104, … 010С, всего 10 кодов.
Далее находим строку, определяющую количество файлов с идентификационными кодами:
CREATE KOLVO_PIC_UI 0xA, \ и изменяем на другое требуемое количество файлов, отличное от 10. Следует обращать внимание на различные способы записи чисел с разными форматами счисления. 0xA – это число 10 в шестнадцатеричной системе счисления. Запись и отображение значения чисел контролируется через переменную BASE.
В файле программы находим форт-слово NAME_PIC_HEX_RG1 и изменяем значение постоянных байтов.
Например, после ks на месте 12F629 пишем простой ряд чисел от 0…7:
: NAME_PIC_HEX_RG1 S» hex_12f629_2409_v1_ks012F629000001F.hex»; – был текст форт-слова,
: NAME_PIC_HEX_RG1 S» hex_12f629_2409_v1_ks0123456700001F.hex»; – стал текст форт-слова,
Необходимо отметить, что имя формируемого файла содержит уточнение функции работы. Это все байты до ks. При необходимости данные по названию тоже можно поменять. Например:
: NAME_PIC_HEX_RG1 S» hex_12f629_2409_v1_ks012F629000001F.hex»; – был текст форт-слова.
: NAME_PIC_HEX_RG1 S» Novosibirsk_SibGUTIS_ks012F629000001F.hex»; – стал текст форт-слова.
Чтобы не нарушать структуру имени файловой системы, размер текста не должен превышать 255 байт.
- Выполняем компиляцию программы через командный файл start_new_versii.cmd и получаем файлы для программирования МК. В процессе выполнения программа посчитает контрольную сумму ks и подставит её в нужное место. В байтах 2-м и 3-м формируются номера с увеличением на +1 для младшего байта. Все данные записываются в HEX-формате в шестнадцатеричной системе счисления.
Для понимания отличия значения числа и его отображения в различных системах счисления (сс) приведём пример отображения натуральных чисел в интервале 0…16 в сс от 16 до 2 на языке FORTH.
\ начало текста программы
: PKZ_DEMO BASE @ DUP
DECIMAL CR
S" Ncc=" TYPE . CR BASE !
2DUP DO I . LOOP ;
: FORMAT_CH_DEMO HEX 0x10 0
2 0x10 DO I BASE ! PKZ_DEMO
-1 +LOOP HEX 2DROP ;
FORMAT_CH_DEMO
\ окончание текста программы.
Для работы программы нужно создать файл, например, test.f блокнотом, скопировать текст от комментария \ начало … до комментария \ окончание … и сохранить. Косая линия влево – это начало комментария до конца строки, и также комментарии заключены в круглые скобки внутри форт-слов. Открыть файл test.f с помощью файла 100_spf4.exe, т.е. выполнить программу. Программа выполнится, и в окне консоли отобразится одинаковый ряд натуральных чисел в системе счисления 16…2. Компилятор работает в Windows/XP/7/8/10 и доступен без ограничений [4].
Пример 2. Формирование низкоуровневых команд в конфигурации микроконтроллера
В форт-слове START_BLOK определяются используемые подпрограммы и настройки МК.
Например, две следующие строки определяют режим установки порта МК:
status 5 bcf (выбор банка 0 бит 5=0)
porta clrf (установка и сброс порта, выполняется инициализация режима фиксации сигналов)
Поясним определение первой строки:
status – специальный регистр определён как 0x03 equ status, согласно тех. описанию на МК;
5 – цифра, определяющая, какой бит установить в 0 для регистра status;
bcf – команда выполнения установки бита в указанном регистре.
Поясним определение bcf:
: bcf (status Ni – компилируем в область памяти команду по org уст. бита в 0)
|| status NI || (локальные переменные)
-> NI -> status (сохранили в локальных переменных)
0x1000 NI 0x80 * + status + (Kkm – получили код команды)
WRITE_ORG (Kkm – запись и сдвиг на +1 и проверка на превышение);
В определяемом слове bcf слово status – это локальная переменная, а не специальный регистр. И значение локальной переменной приходит из входного стека, в нашем случае это 3 и 5.
Далее выполнется обработка для получения кода команды. Форт-слово WRITE_ORG записывает этот код в область памяти.
Поясним определение WRITE_ORG:
: WRITE_ORG (Kkm – запись и сдвиг на +1 и проверка на превышение)
0x100 /MOD SWAP 0x100 * + (перевернули мл. и ст. байты)
ORG 4+ @ ORG @ 2* + W! (записали словом в 2 байта)
ORG 1+! (переход к след. ячейке записи)
TEST_ORG_COMP (тестирование на превышение кол-ва компиляции ячеек);
В определяемом слове WRITE_ORG арифметические операции подготовки кода и сдвиг на +1 байт счетчика кода в переменной ORG.
Поясним определение TEST_ORG_COMP:
: TEST_ORG_COMP (тестирование на превышение кол-ва компиляции ячеек)
ORG @ ORG 2 4* + @ = IF UST_ATR_LIM_CMD (установка атрибутов цветности знаков для тревоги)
CR ." превышен код компиляции 0x3FF FORTH-ACEMBLERA pic12f629 " (текст для тревоги)
5 0 BEGIN BEEP2 0x100 PAUSE exBEEP4 1+ 2DUP = UNTIL 2DROP (цикл 5 звуковых сигналов тревоги)
BYE (прекращение работы программы) THEN ;
Используемая переменная ORG содержит значения текущей компиляции и возможное максимальное значение. Если они сравняются, то выполнится IF-THEN – условие превышения, и на экране сформируется сообщение о превышении размера программы. Дополнительно прозвучит звуковой тревожный сигнал, и программа прекратит работу.
Все слова форт-ассемблерных команд МК доступны для модификации, что удобно при переходе к другим типам МК. Вторая строка данного примера определяется аналогично по тому же цепочному принципу поиска.
Описание цепочной структуры, т.е. определения форт-слов, показано в порядке последовательности работы.
В тексте программы определения расположены в обратном порядке, т.е. 2 строки примера завершают определения. Первым определяется переменная ORG, затем TEST_ORG_COMP и так далее. Завершает определение в нашем примере bcf.
На данном примере показано, что форт-слова допускают любую функцию или действие:
- исполняемое действие;
- компиляция в область памяти;
- указатель на переменную и значение.
Все форт-слова имеют цепочную связь, которая позволяет определить назначение, состав форт-слова, условия и возможности в работе.
Пример 3. При отсутствии сигналов по шине 1-Wire более 2 секунд выполняется сброс ключей шины MAIN и AUX
В исходной микросхеме DS2409 такого режима нет, но поскольку существует вероятность сохранения подключения коммутируемой шины из-за помех при передаче, автор счёл необходимым добавить такую функцию.
Используются три общих регистра, которые определены так:
0x26 equ time_n0 \ счетчик 0r времени паузы,
0x27 equ time_n1 \ счетчик 1r времени паузы,
0x28 equ time_n2 \ счетчик 2r времени паузы; итого 3 байта 2r1r0r
Интервал отсутствия сигнала на шине 1-Wire задаётся в форт-слове UST_TIME_IZM_PAUSE_1W# и оформлен подпрограммой.
\ задаём значения подсчета в переменные регистры, начиная с младшего байта
0x40 movlw \ тут можно и FF или 0
time_n0 movwf \ счётчик 0r времени паузы
0x4B movlw \
time_n1 movwf \ счётчик 1r времени паузы
0x04 movlw \
time_n2 movwf \ счётчик 2r времени паузы 04 4b 40 = 2 cек; если сигнала нет, выдается уст. 0 main aux
В форт-слове ST_RST_1W находится участок, который отвечает за фиксацию начала сигнала RST. Там и расположен учёт отсутствия сигнала.
(ждём перепада до --\__ и если очень долго ждём, то выдаём сигнал уст. aux=main=0, т.е. выкл.)
ORG @ m1 ! porta 0x3 btfss \ проверка на 0 gp3 выв.4 in-out-1w пропустить, если =1
m1 goto \ нет 1 далее, есть 0 возврат m1
1 UST_TIME_IZM_PAUSE_1W# (подпрограмма уст. значения для паузы)
ORG @ m2 ! 1 IZM_TIME_PAUSE_1W# (подсчёт по отниманию 1 и, если =0, то выкл. aux-main)
porta 0x3 btfsc \ проверка на 0 gp3 выв.4 in-out-1w; пропустить, если =0
m2 goto \ нет 0 далее, есть 1 возврат m2
Если программа ждёт сигнала 0, то она «циклится», и выполняется подпрограмма IZM_TIME_PAUSE_1W#.
Поясним определение подпрограммы:
\ отнимаем 1 и смотрим, пока не будет всё 0, тогда выдаём сигнал выключения main aux
0x1 movlw \ значение 1 для вычитания в общий регистр
time_n0 0xF decfsz \ декремент вычесть 1 из f и пропустить, когда будет 0, т.е. к след. разряду
m10 goto \ уходим
time_n1 0xF decfsz \ декремент вычесть 1 из f и пропустить, когда будет 0, т.е. к след. разряду
m10 goto \ уходим
time_n2 0xF decfsz \ декремент вычесть 1 из f и пропустить, когда будет 0, т.е. выполним выкл.
m10 goto \ уходим
\ или выключаем main aux в случае всех 0 в time_n0 n1 n2
porta 0x1 bcf (b'001м-x1аw' м/4/= а/1/= w/0/= - выбор bsf=1 bcf=0 нет aux)
porta 0x4 bcf (b'001м-x1аw' м/4/= а/1/= w/0/= - выбор bsf=1 bcf=0 нет main)
1 UST_TIME_IZM_PAUSE_1W# (подпрограмма уст. значения для паузы)
ORG @ m10 ! (выход)
Таким образом, при «зависании» или ожидании сигнала RST сброса от ведущего шины 1-Wire периодически выдаётся сигнал 0 на управляемые транзисторы для их закрытия.
Необходимо обратить внимание, что большая точность данного интервала не требуется, и можно значения для регистров time_n0 time_n1 не устанавливать. Время определяет регистр time_n2, и примерное значение 1 равно задержке в 0,5 секунды. Более подробное изучение Форт-ассемблера выходит за рамки данной темы. Необходимо отметить, что в тексте программы имеются комментарии и пояснения по функционированию.
Выводы
Предложенная схема и программа замены специальной микросхемы на универсальный микроконтроллер позволяет снизить монополизм производителей и фирм, поставляющих электронные компоненты.
Универсальный микроконтроллер создаёт возможность формирования новых функций к работающим системам измерений без их существенной модификации.
Использование языка программирования FORTH и подготовленного на этом языке FORTH-ASSEMBLER позволяет легко переходить на другие типы микроконтроллеров и также создавать программы с хорошей оптимизацией кодов для микроконтроллеров с малым объёмом памяти.
Язык программирования FORTH, кроме Windows, работает на всех основных типах операционных систем (Linux, Unix, Android и т.д.), существующих в настоящее время, что позволяет использовать данную программу на любых компьютерах.
Литература
- Описание DS2409 шины 1-Wire // URL: http://www.gaw.ru/html.cgi/txt/ic/Maxim/1-Wire/start.htm.
- Описание 12F765 // URL: http://www.microchip.ru/files/d-sheets-rus/PIC12F629_675.pdf.
- Каталог программы, платы: URL: http://90.189.213.191:4422/doc_sh/toguchin_2020n/test/ и копия в «облачном хранилище»: URL: https://disk.yandex.ru/d/aKAo_DVD1LzrUQ.
- Описание языка Форт spf4.exe, автор версии А. Черезов // URL: http://www.forth.org.ru/.
Если вам понравился материал, кликните значок - вы поможете нам узнать, каким статьям и новостям следует отдавать предпочтение. Если вы хотите обсудить материал - не стесняйтесь оставлять свои комментарии : возможно, они будут полезны другим нашим читателям!