Вы находитесь на странице: 1из 9

5/12.

Устройство считывания данных из ПЗУ датчиков температуры DS1820


(DS18S20), DS18B20 с выводом результата считывания в ЖКИ модуль на
основе HD44780 от Шевченко Ивана.

Ниже опубликовано полученное мной, от Ивана Шевченко, письмо – техническое


описание.
Это письмо характеризует Ивана как человека, стремящегося объяснить мотивы и
“механику” того, что он наработал, да и просто как человека.
Идея написания программы для считывания содержимого ПЗУ температурных датчиков
DS1820(DS18S20), DS18B20 и вывода его на индикацию в ЖКИ модуль на основе HD44780
(в HEX формате), посетила меня после получения Вашей рассылки DS1820_a.asm.
Я подумал, что неудобно (в случае применения более одного датчика) дёргать PIC для
считывания значения, записанного в его память.
Ведь чего проще, прогнать все датчики, имеющиеся в наличии, записать на листике
содержимое их ПЗУ, а потом просто подставлять их в программу для работы с несколькими
датчиками.
Не хочу прослыть человеком, занимающимся плагиатом. В этой программе мне принадлежит
только процедура перекодировки значений полубайтов в символы букв формата HEX,
которые выводятся в ЖКИ модуль. Всё остальное – результат Вашего труда.
Процедуры инициализации датчиков, передачи команд, чтения данных и инициализации LCD,
были Вами подробно описаны.
Зачем толочь воду в ступе. Все они скопированы из Ваших программ (ну и копируйте на
здоровье, и “трансформируйте” их под конкретные задумки. Я для этого их и составляю.).

;***********************************************************************************************
; Read_PZU.asm Программа считывания данных из ПЗУ датчиков температуры
; DS1820(18S20), DS18B20 и вывода на ЖКИ HD44780
; (4-x разрядный интерфейс)
; в формате HEX (COD->XX XX XX XX XX XX XX XX<-CRC)
;***********************************************************************************************
; Вывод DQ DS..... подключается к выводу RA4
; Между RA4 и шиной питания резистор 4,7-5,1 кОм
; DSxxxx с активным питанием
; вывод 1 - общий
; вывод 2 - сигнальный,
; вывод 3 - питание (+5в)
; PIC16F84A (кварц 4мГц)
;***********************************************************************************************
list p=16f84a ; Используется PIC16F84A
#include <p16f84A.inc> ; Файл, описывающий специфические переменные,
; соответствующие процессору
__CONFIG 03FF1H ; WDT выключен, бит защиты не установлен
;***********************************************************************************************
N EQU 0CH ; Счетчик битов, регистр временного хранения
N1 EQU 0DH ; Счетчик байтов
Temp EQU 0EH ; Многофункциональный регистр временного хранения
Count EQU 0FH ; Счетчик количества проходов задержки 10 мкс
Buff1 EQU 10H ; Байт типа устройства
Buff2 EQU 11H ; 1-й байт серийного номера
Buff3 EQU 12H ; 2-й байт серийного номера
Buff4 EQU 13H ; 3-й байт серийного номера
Buff5 EQU 14H ; 4-й байт серийного номера
Buff6 EQU 15H ; 5-й байт серийного номера
Buff7 EQU 16H ; 6-й байт серийного номера
Buff8 EQU 17H ; Байт контрольной суммы (CRC)
LED0 EQU 18H ; Младший байт выводимого числа
LED1 EQU 19H ; Старший байт выводимого числа
DQ EQU 4 ; Бит порта A для управления DSxxxx
RW EQU 0 ; Вывод RA0 - линия RW
RS EQU 1 ; Вывод RA1 - линия RS

1
E EQU 2 ; Вывод RA2 - линия Е
BF EQU 7 ; Флаг занятости BF - RB7
;***********************************************************************************************
ORG 0x000 ; Вектор сброса процессора
; Начальный адрес
;***********************************************************************************************
clrf PORTA ; Сброс защёлок порта А
clrf PORTB ; и порта В
bsf STATUS, RP0 ; 1-й банк
clrf PORTA ; Выводы портов А
clrf PORTB ; и портов В на выход
bcf STATUS, RP0 ; 0-й банк

;***********************************************************************************************
; Инициализация DS.....
;***********************************************************************************************
DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное состояние:
; за счёт подтягивающего резистора
; на линии устанавливается 1
call PIN_LO ; Установка на линии нуля
movlw .60 ; Установка количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=60х10=600мкс.)
call PIN_HI ; Установка вывода в высокоимпедансное состояние:
; за счёт подтягивающего резистора
; на линии устанавливается 1
movlw .7 ; Установка количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=7х10=70мкс.)
;***********************************************************************************************
; Определение отклика на импульс сброса
;***********************************************************************************************
btfsc PORTA, DQ ; На линии DQ 0 или 1 (отклик есть или нет)?
goto DQ_INIT ; Если отклика нет (1), то снова начинается
; исполнение процедуры инициализации
movlw .50 ; Если отклик есть, то установка
; количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=50х10=500мкс.)
;***********************************************************************************************
; Передача команды Read ROM для чтения ПЗУ DSxxxx
;***********************************************************************************************
movlw 033H ; Запись команды чтения ПЗУ (Read ROM)
movwf Temp ; в регистр Temp
movlw .8 ; Запись количества бит передаваемого
movwf N ; байта в регистр N
METKA_1 rrf Temp, f ; Сдвиг вправо содержимого передаваемого байта
btfss STATUS, C ; В бите С "лежит" 0 или 1 ?
goto OUT_0 ; Если С=0, то переход в ПП передачи нуля
goto OUT_1 ; Если С=1, то переход в ПП передачи единицы
METKA_2 decfsz N, f ; Уменьшение на 1 содержимого счетчика битов
goto METKA_1 ; Если результат не =0, то переход на метку METKA_1
;***********************************************************************************************
; Чтение 8 байтов из ПЗУ DSxxxx
;***********************************************************************************************
movlw Buff1 ; В FSR записывается адрес
movwf FSR ; регистра Buff1
movlw .8 ; Определение количества
movwf N1 ; считываемых байтов
SNOVA movlw .8 ; Запись количества бит принимаемого
movwf N ; байта в регистр N
clrf Temp ; Очистка регистра принимаемого байта
IN_BYTE call PIN_LO ; Формирование на линии уровня 0
call PIN_HI ; Формирование на линии уровня 1
nop ; Калибровочный NOP
;***********************************************************************************************
; Запись в бит С уровня текущего бита, выдаваемого DSxxxx в линию

2
;***********************************************************************************************
btfss PORTA, DQ ; На линии 0 или 1 ?
bcf STATUS, C ; Если на линии 0, то в бите С выставляется 0
btfsc PORTA, DQ ; Если на линии 1 (а также после исполнения предыдущей
; команды), то еще одна проверка состояния линии
bsf STATUS, C ; Если на линии 1, то в бите С выставляется 1
; Если на линии 0 (а также после исполнения предыдущей
; команды), то программа исполняется далее
;***********************************************************************************************
; Последовательное заполнение битами регистра Temp
;***********************************************************************************************
rrf Temp, f ; Сдвиг содержимого регистра Temp вправо (через C)
movlw .4 ; Установка количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=4х10=40мкс.)
decfsz N, f ; Уменьшение на 1 содержимого счетчика битов
goto IN_BYTE ; Если результат не=0, то переход
; на прием следующего бита
movf Temp, w ; Если =0, то копирование принятого байта в регистр w
movwf INDF ; Копирование содержимого регистра w
; в текущий регистр Buff...
incf FSR, f ; Запись в FSR адреса следующего регистра Buff...
decfsz N1, f ; Декремент счетчика байтов
goto SNOVA ; Приняты все байты? Нет, продолжим
goto INIT_LCD ; Да, вывод в ЖКИ
;***********************************************************************************************
; Передача бита с уровнем "0"
;***********************************************************************************************
OUT_0 call PIN_LO ; Переход в п/п установки уровня 0. Начало передачи
movlw .6 ; Установка количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=6х10=60мкс.)
call PIN_HI ; Переход в п/п установки уровня 1. Конец передачи
goto METKA_2 ; Переход на исполнение процедуры декремента
; и анализа содержимого счетчика битов
;***********************************************************************************************
; Передача бита с уровнем "1"
;***********************************************************************************************
OUT_1 call PIN_LO ; Переход в п/п установки уровня 0. Начало передачи
call PIN_HI ; Переход в п/п установки уровня 1. (передача 1)
movlw .6 ; Установка количества проходов по 10мкс
call PAUSE_X ; Переход в п/п задержки (задержка=6х10=60мкс.)
goto METKA_2 ; Переход на новый цикл передачи бита
;***********************************************************************************************
; Инициализация ЖКИ
;***********************************************************************************************
INIT_LCD movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек
call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000
movlw b'00101000' ; Установка: 4-разрядный интерфейс, 2 строки, 5х7 точек
call ENTER_BF ; "Плавающая" задержка со стробом под команду 00101000
movlw b'00001100' ; Установка: дисплей включен, видимое отображение
; курсора выключено
call ENTER_BF ; "Плавающая" задержка со стробом под команду 00001100
movlw b'00000001' ; Установка: очистка дисплея со сбросом данных,
; установка курсора в начало 1-й строки
call ENTER_BF ; "Плавающая" задержка со стробом под команду 00000001
;***********************************************************************************************
; Вывод в первую строку надписи "COD->"
;***********************************************************************************************
movlw .5 ; Количество выводимых в строку
movwf Count ; символов в Count
WR_1 movf Count, w ; Копируем Count в w
sublw .5 ; 5-Count
call TEXT ; В п/п TEXT
bsf PORTA, RS ; Вывод на индикацию текущего символа
call ENTER_BF ; Задержка

3
decfsz Count, f ; Вывод следующего
goto WR_1 ; символа
;***********************************************************************************************
; Вывод первых четырёх принятых байтов
;***********************************************************************************************
movlw .4 ; Определение количества
movwf N1 ; считываемых байтов
movlw Buff1 ; В FSR записывается адрес
movwf FSR ; регистра Buff1
call OUTPUT ; В п/п преобразования и вывода на ЖКИ
;***********************************************************************************************
; Вывод во вторую строку последних четырёх байтов
;***********************************************************************************************
movlw b'11000000' ; Выбор ячейки DD RAM с адресом 40Н
call ENTER_BF ; 2-я строка 1-е слева знакоместо
movlw .4 ; Определение количества
movwf N1 ; считываемых байтов
movlw Buff5 ; В FSR записывается адрес
movwf FSR ; регистра Buff5
call OUTPUT ; В п/п преобразования и вывода на ЖКИ
;***********************************************************************************************
movlw b'11001011' ; Выбор ячейки DD RAM с адресом 4ВН
call ENTER_BF ; 2-я строка 12-е слева знакоместо
;***********************************************************************************************
; Вывод во вторую строку надписи <-CRC
;***********************************************************************************************
movlw .5 ; Количество выводимых в строку
movwf Count ; символов в Count
WR_2 movf Count, w ; Копируем Count в w
sublw .5 ; 5-Count
call TEXT1 ; В п/п TEXT1
bsf PORTA, RS ; Вывод на индикацию текущего символа
call ENTER_BF ; Задержка
decfsz Count, f ; Вывод следующего
goto WR_2 ; символа
;***********************************************************************************************
goto $ ; Баста карапузики!
;***********************************************************************************************
; Распределение байта из Buff... пополубайтно в регистры LED0 и LED1
;***********************************************************************************************
OUTPUT movf INDF, w ; Скопируем данные в w
movwf N ; и во временный регистр N
andlw 0FH ; Убьём старший п/байт
movwf LED0 ; младший в LED0
swapf N, w ; Поменяем п/байты N
andlw 0FH ; Убьём старший п/байт
movwf LED1 ; младший в LED1
;***********************************************************************************************
; п/п преобразования значений LED1 и LED0 в код ЖКИ HD44780
;***********************************************************************************************
movlw 0AH ; Загрузим в w число 0AH
subwf LED1, w ; Вычесть 0АН из значения в LED1
btfsc STATUS, C ; Выводим число или символ?
goto SIM_LED1 ; Символ, обработка значения LED1
movlw 30H ; Число, запись в регистр w числа 30Н
iorwf LED1, f ; Логическое "ИЛИ" w и LED1
goto NUM_LED0 ; Обработка LED0
SIM_LED1 movlw 37H ; Запись в w числа 37Н
addwf LED1, f ; Сложить LED1 и 37H, результат в LED1
NUM_LED0 movlw 0AH ; Загрузим в w число 0AH
subwf LED0, w ; Вычесть 0АН из значения в LED0
btfsc STATUS, C ; Выводим число или символ?
goto SIM_LED0 ; Символ, обработка значения LED0
movlw 30H ; Число, запись в регистр w числа 30Н

4
iorwf LED0, f ; Логическое "ИЛИ" w и LED0
goto DISPLAY ; Вывод результата преобразования в ЖКИ
SIM_LED0 movlw 37H ; Запись в w числа 37Н
addwf LED0, f ; Сложить LED0 и 37H, результат в LED0
;***********************************************************************************************
; п/п вывода преобразованных данных в ЖКИ
;***********************************************************************************************
DISPLAY movf LED1, w ; вывод
bsf PORTA, RS ; готовых
call ENTER_BF ; данных
movf LED0, w ; на
bsf PORTA, RS ; индикацию
call ENTER_BF ; Задержка
movlw 20H ; Вывод на индикацию
bsf PORTA, RS ; символа "пусто"
call ENTER_BF ; Задержка
incf FSR, f ; Запись адреса следующего регистра Buff...
decfsz N1, f ; Декремент счётчика байтов. Всё вывели?
goto OUTPUT ; Нет, продолжим
return ; Да, возврат из п/п
;***********************************************************************************************
; п/п "плавающей" задержки на основе анализа состояния флага занятости BF
;***********************************************************************************************
ENTER_BF movwf Temp ; Переправка старшего п/байта регистра w на линии
movwf PORTB ; RB4...7
;***********************************************************************************************
; Запуск в работу старшего п/байта (строб)
;***********************************************************************************************
nop ; Задержка в 1 м.ц
bsf PORTA, E ; Установка на линии Е "1"
nop ; Задержка в 1 м.ц
bcf PORTA, E ; Установка на линии Е "0"
swapf Temp, w ; Смена п/байтов с сохранением результата операции в w
movwf PORTB ; Переправка младшего п/байта регистра w на линии
; RB4...7
;***********************************************************************************************
; Запуск в работу младшего п/байта (строб)
;***********************************************************************************************
nop ; Задержка в 1 м.ц
bsf PORTA, E ; Установка на линии Е "1"
nop ; Задержка в 1 м.ц
bcf PORTA, E ; Установка на линии Е "0"
;***********************************************************************************************
; Проверка состояния флага занятости BF
;***********************************************************************************************
bsf STATUS, RP0 ; Переход в 1-й банк
movlw b'11110000' ; Запись в w "11110000"
movwf PORTB ; RB4...7 работают на вход, а RB0...3 работают на выход
bcf STATUS, RP0 ; Переход в 0-й банк
bcf PORTA, RS ; Установка на линии RS "0" (режим команд)
bsf PORTA, RW ; Линия RW в "1" (режим чтения данных)
nop ; Задержка в 1 м.ц
bsf PORTA, E ; Установка на лини Е "1"
POVTOR nop ; Задержка в 1 м.ц
btfsc PORTB, BF ; Проверка состояния флага занятости BF
goto POVTOR ; Если BF=1, то продолжение задержки до тех пор, пока
; BF не установится в "0" (программа исполняется далее)
clrf PORTA ; Сброс в "0" всех защелок порта А (RW=0, RS=0, E=0)
bsf STATUS, RP0 ; 1-й банк
clrf PORTB ; Все выводы порта В работают на выход
bcf STATUS, RP0 ; 0-й банк
return ; Возврат по стеку
;***********************************************************************************************
; Формирование на линии уровня "1" за счет подтягивающего резистора

5
;***********************************************************************************************
PIN_HI bsf STATUS, RP0 ; 1-й банк
bsf PORTA, DQ ; Настройка вывода RA4 на работу "на вход"
bcf STATUS, RP0 ; 0-й банк
return ; Возврат по стеку
;***********************************************************************************************
; Формирование на линии уровня "0" средствами микроконтроллера
;***********************************************************************************************
PIN_LO bcf PORTA, DQ ; Установка 0 на выходе защелки вывода RA4
bsf STATUS, RP0 ; 1-й банк
bcf PORTA, DQ ; Настройка вывода RA4 на работу "на выход"
bcf STATUS, RP0 ; 0-й банк
return ; Возврат по стеку
;***********************************************************************************************
; Подпрограмма задержки
;***********************************************************************************************
PAUSE_X movwf Count ; Копирование количества проходов из w в Count
;***********************************************************************************************
; Пауза в 10 мкс.
;***********************************************************************************************
PAUSE_10 nop ;
goto $+1 ; Одноразрядный,
goto $+1 ; вычитающий
goto $+1 ; счетчик
decfsz Count, f ; с "врезкой"
goto PAUSE_10 ;
return ; Возврат по стеку
;***********************************************************************************************
TEXT addwf PCL, f ; Приращение РС на величину содержимого w
retlw 43H ; "C"
retlw 4FH ; "O"
retlw 44H ; "D"
retlw 2DH ; "-"
retlw 3EH ; ">"
;***********************************************************************************************
TEXT1 addwf PCL, f ; Приращение РС на величину содержимого w
retlw 3CH ; "<"
retlw 2DH ; "-"
retlw 43H ; "C"
retlw 52H ; "R"
retlw 43H ; "C"
;***********************************************************************************************
END ; Конец программы

Первый этап:
После инициализации датчика и получения от него отклика, считываем содержимое ПЗУ и
распределяем их, с использованием косвенной адресации, по регистрам Buff1 - Buff8.
Я решил, что нет смысла в инициализации LCD до получения содержимого ПЗУ датчика.
Зачем торопить события? Ведь до этого ещё нечего выводить на экран.
После заполнения регистров Buff1 – Buff8, - в самый раз!
После инициализации ЖКИ (4-разрядный интерфейс, 2 строки, 5х7 точек) выводим в первую
строку информационную надпись “COD->”, указывающую на код семейства датчика.
Пять знакомест в первой строке заняты, осталось 11.
Что мы можем вывести?
Только значения первых четырёх байтов (по два знакоместа на байт, учитывая ещё и
пробелы между ними).
Значит, на первом этапе вывода данных, нам необходимо:
1. для сокращения количества команд, использовать косвенную адресацию (да так и
удобнее),
2. обработать первые четыре байта (перекодировать в код LCD),
3. вывести полученный результат в первую строку.
Исполняем…

6
В регистр количества байтов N1 загружаем число 4, в регистр FSR записываем адрес первого
регистра Buff1.
Всё остальное делаем в п/п OUTPUT.
Так как нам необходимо представить содержимое регистров Buff1 – Buff8 в формате HEX
(т.е. два знака), байт данных необходимо разбить на два полубайта с соблюдением
старшинства.
В регистре INDF лежит то, что нам как раз и нужно - первый байт ПЗУ датчика.
Скопируем его в регистр w и затем в регистр N (на данный момент он свободен, пусть
поработает).
Раскидаем его по регистрам LED0 и LED1.
Выполняем побитное «И» содержимого регистра w (там лежит байт первого регистра Buff1)
с числом 0FH (00001111) и копируем из w полученный младший полубайт в регистр LED0.
В регистре N у нас всё ещё лежит байт первого регистра Buff1.
Заберём у него старший полубайт!
Меняем местами его полубайты, с сохранением результата в регистре w, и выполняем ту же
самую процедуру отбора (теперь уже бывшего старшего полубайта) с копированием
результата в LED1.
Так как решено выводить результат в HEX формате, то необходимо выяснить, что мы имеем
в регистрах LED1 и LED0?
Число от 0 до 9, или число от 10 до 15?
Определяемся: от 10 (0АН) вычитаем содержимое LED1.
Каков результат?
Если результат положительный, значит там что-то в диапазоне от 0 до 9, а отрицательный,
значит число от 10 до 15.
Теперь смотрим в таблицу знакогенератора LCD HD44780…
Выводимым символам цифр от 0 до 9 соответствует код от 30Н до 39Н (00110000 –
00111001).
В регистрах LED1 и LED0 значимы только младшие полубайты, а в старших одни нули!
Но ведь содержимое младших полубайтов регистров LED1 и LED0 (если там число от 0 до 9)
такое же, как и содержимое младших полубайтов кода знакогенератора LCD!
Выполняем побитное «ИЛИ» командой iorwf числа в LED1 со значением 30Н.
Код числа готов к выводу в ЖКИ.
А если там число от 10 до 15?
Этим числам соответствуют символы от “А” до “F”.
Опять смотрим в таблицу знакогенератора LCD…
Им соответствует код от 41Н до 48Н (01000001 – 01001000).
Здесь побитное «ИЛИ» не прокатит…
Почему?
Да потому, что числам в HEX формате от 0АН до 0FH соответствует бинарный код от
00001010 до 00001111.
Поэтому: 41Н-0АН=37Н.
Значит, к значению, лежащему в LED1, нужно тупо прибавить число 37Н.
Код числа готов к выводу.
То же самое делаем и со значением, находящимся в регистре LED0.
Выводим перекодированные данные из LED1, LED0 (не забывая о разделительном символе
“пусто”) в первую строку ЖКИ.
Один байт (Buff1) вывели, берёмся за следующий.
В FSR, командой incf FSR, f, записываем адрес следующего регистра (Buff2) и уменьшаем
на 1 счётчик выводимых байтов.
Таким же образом выводим в ЖКИ оставшиеся три байта Buff2-Buff4.
В 17-е знакоместо индикатора, по адресу 10Н, загрузится символ “пусто”.
Ну и пусть там сидит. Мы его всё равно не увидим, и он погоды не делает…
Первая строка ЖКИ заполнена…
Второй этап:
Переходим на вторую строку и снова повторяем процедуры
преобразования данных в код ЖКИ и вывода его результатов
экран, только уже в части касающейся регистров Buff5 –
Buff8.

7
Если после вывода последних данных, мы выведем информационную надпись “<-CRC”,
указывающую на контрольную сумму, то на экране мы не увидим последнюю букву “C”.
Почему?
Потому, что последний выводимый код символа “пусто” займёт ячейку LCD с адресом 4ВН.
Выбираем ячейку DD RAM LCD HD44780 4BH и c этого адреса выводим в него надпись
“<-CRC”.
То, что требовалось, получено.
После исполнения команды goto $, рабочая точка программы уходит в вечное кольцо.
Программа составлена так, что на экран ЖКИ выводятся данные, начиная с кода семейства
устройства и заканчивая контрольной суммой.
Примечание: на картинке, расположенной выше, Вы видите содержимое ПЗУ датчика
DS18B20.
Мне кажется, что так информация воспринимается лучше (по аналогии с таблицей, в которой
код семейства расположен сверху, а контрольная сумма снизу).
Для желающих изменить порядок вывода данных на противоположный, тоже нет проблем.
1. Сначала выводится надпись “CRC->”.
Первыми обрабатываются регистры Buff8 – Buff5, а затем Buff4 – Buff1.
2. В п/п вывода первых четырёх принятых байтов, вместо Buff1 прописать Buff8.
3. В п/п вывода во вторую строку последних четырёх байтов, вместо Buff5 прописать Buff4.
4. В п/п DISPLAY, заменить команду incf FSR, f на команду decf FSR, f.
5. Последней выводится надпись “<-COD”.
P.S.: В п/п преобразования в код ЖКИ, вместо команды   iorwf LEDx, f, можно смело
использовать команду addwf LEDx, f. Результат от этого не изменится.
Иван Шевченко (RW1ZK).

Слова не должны расходиться с делом.


Проверяю в “железе” (датчик DS1820).
“Завелось с пол-тыка”.
Сверяю “выданное на гора” с теми данными, которые я считал из ПЗУ еще “до того”.
Полное и сокрушительное совпадение.
Вывод: “зер гут” (а что тут еще скажешь?)
Я проверил работу устройства на DS1820 (DS18S20), а Андрей Сахненко проверил его
работу на DS18B20 (кстати, выше Вы видите его фотографию, которую я скопировал с
форума), так что “независимая экспертиза” прошла успешно и можно точно сказать,
что возможности устройства полностью соответствуют заявленным (можно смело
использовать на практике).
А раз это так, то, по факту, имеет место быть добротная работа.
Учитывая то, что Иван начинал с нуля, это очень хороший результат (время потрачено
совсем не зря).
В его работе мне больше всего понравилась добросовестность и серьезный подход к
“прорисовке” деталей.
Это признак и хорошего тона, и справного хозяина, который, в конечном итоге, все
“разложит по полочкам”, а заодно и русского мужика (в самом лучшем смысле этого
слова), который долго запрягает, но быстро едет.
Не знаю как думаете Вы, это мое личное впечатление.
На выходе - нужное и удобное в использовании устройство, которое обязательно будет
востребовано. А чего лучшего еще желать?
Помашем этой “железяке” рукой. “Полетела”, родимая. Как говорится, в добрый путь.
Примечание: я не стал менять стиль оформления программы.
Пора потихоньку приучаться к различным стилям их оформления, но только в
пределах разумного и без “анархии”.
Принципиальная схема этого устройства находится в подразделе 5/2 (рис. 1).

8
"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

Оценить