Термометр на pic контроллере
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ “ГРОДНЕНСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ ЯНКИ КУПАЛЫ”
ФИЗИКО - ТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ
Кафедра ИСиТ
Курсовая работа по предмету
” Микропроцессорная техника”
ТЕРМОМЕТР НА PIC КОНТРОЛЛЕРЕ
Специальность “ Промышленная электроника ”
Автор работы
Студент 4 курса, 2 группы Ванцовский А.Г.
Руководитель
Ст.преподаватель
Гродно 2010
СОДЕРЖАНИЕ
ВВЕДЕНИЕ…………………………………………………………
- МИКРОКОНТРОЛЛЕР PIC16F62X…………………………………...4
2. ТЕРМОМЕТР НА PIC16F62X………………………………………...10
2.1. Программа цифрового термометра…………………………………14
ЗАКЛЮЧЕНИЕ……………………………………………………
ЛИТЕРАТУРА………………………………........
ВВЕДЕНИЕ
За последние десятилетия электронная промышленность развивалась опережающими темпами в сравнении с любой другой отраслью. Появление недорогих интегральных схем высокой и сверхвысокой степени интеграции, ориентированных на решение всевозможных задач, позволило разработать принципиально новые подходы к проектированию электронных устройств. Появившийся в конце 70-хг. XX века новый класс полупроводниковых приборов, являющихся полностью укомплектованной управляющей ЭВМ на одном кристалле, вызвал настоящую революцию в мире электроники. Подобные устройства получили название микроконтроллеров (в русскоязычной литературе микроконтроллеры достаточно часто называют однокристальными ЭВМ – ОЭВМ) и нашли широкое применение в системах управления различными объектами в реальном масштабе времени.
Несмотря на огромное количество разнообразной литературы, посвященной микроконтроллерам, ее использование начинающими конструкторами затруднительно, вследствие несистематизированного изложения материала и частого применения нестандартных обозначений.
PIC — микроконтроллеры Гарвардской архитектуры, производимые американской компанией Microchip Technology Inc. Название PIC является сокращением от Peripheral Interface Controller, что означает «периферийный интерфейсный контроллер». Название объясняется тем, что изначально PIC предназначались для расширения возможностей ввода-вывода 16-битных микропроцессоров CP1600.
В номенклатуре Microchip Technology Inc. представлен широкий спектр 8-и, 16-и и 32-битных микроконтроллеров и цифровых сигнальных контроллеров под маркой PIC. Отличительной особенностью PIC-контроллеров является хорошая преемственность различных семейств. Это и программная совместимость (единая бесплатная среда разработки MPLAB IDE, С-компиляторы от GCC), и совместимость по выводам, по периферии, по напряжениям питания, по средствам разработки, по библиотекам и стекам наиболее популярных коммуникационных протоколов. Номенклатура насчитывает более 500 различных контроллеров со всевозможными вариациями периферии, памяти, количеством выводов, производительностью, диапазонами питания и температуры и т. д.
1.МИКРОКОНТРОЛЛЕР PIC16F62X
18-выводные FLASH микроконтроллеры PIC16F62X входят в состав распространенного семейства PICmicro PIC16CXX. Микроконтроллеры этого семейства имеют 8-разрядную, высокопроизводительную и полностью статическую RISC архитектуру.
Рис.1.1. Расположение выводов.
PIC16F62X имеют 8-уровневый аппаратный стек и большое количество внутренних и внешних прерываний. В гарвардской архитектуре RISC ядра микроконтроллера разделены 14-разрядная память программ и 8-разрядная память данных. Такой подход позволяет выполнять все инструкции за один машинный цикл, кроме команд ветвления, которые выполняются за два машинных цикла. Ядро микроконтроллеров поддерживает 35 простых в изучении, но очень эффективных инструкций. Дополнительные регистры управления и архитектурные новшества позволяют создавать высокоэффективные устройства.
По сравнению с 8-разрядными микроконтроллерами этого класса, при использовании PIC16F62X выигрыш в эффективности использования памяти программ достигает 2:1, а в производительности 4:1.
Специальные особенности
микроконтроллеров PIC16F62X позволяют
сократить число внешних
Энергосберегающий режим SLEEP, позволяет эффективно использовать микроконтроллеры в устройствах с питанием от батареек или аккумуляторов. Выход из режима SLEEP происходит при возникновении внешних, некоторых внутренних прерываниях и сбросе микроконтроллера. Высоконадежный сторожевой таймер WDT с собственным внутренним RC генератором предотвращает «зависание» программы.
Микроконтроллеры PIC16F62X удовлетворяют ряду параметров для их использования от зарядных устройств до удаленных датчиков с малым потреблением электроэнергии. FLASH технология и большое количество периферийных модулей, совместимых с предыдущими микроконтроллерами, позволяют быстро и удобно разрабатывать программное обеспечение. Высокая производительность, малая стоимость, легкость в использовании и гибкость портов ввода/вывода – делают PIC16F62X универсальными микроконтроллерами.
В таблице 1.1. сведены основные характеристики микроконтроллеров PIC16F62X.
Таблица 1.1.
На рисунке 1.2. представлена структурная схема микроконтроллеров PIC16F62X.
Рис.1.2. Структурная схема микроконтроллеров PIC16F62X.
Микроконтроллеры PIC16F62X удовлетворяют ряду параметров для их использования от зарядных устройств до удаленных датчиков с малым потреблением электроэнергии. FLASH технология и большое количество периферийных модулей, совместимых с предыдущими микроконтроллерами, позволяют быстро и удобно разрабатывать программное обеспечение. Высокая производительность, малая стоимость, легкость в использовании и гибкость портов ввода/вывода – делают PIC16F62X универсальными микроконтроллерами.
Высокая эффективность микроконтроллеров PIC16F62X достигается за счет архитектуры ядра, подобная архитектура обычно используемой в RISC микропроцессорах. В PIC16F62X используется Гарвардская архитектура с раздельными шинами доступа к памяти программ и памяти данных, в отличие от традиционных систем, в которых обращение к памяти программ и данных выполняется по одной шине.
Разделение памяти программ и памяти данных позволяет использовать не 8-разрядные команды или кратные разрядности шины данных. Все команды микроконтроллера 14-разрядные однословные. По 14-разрядной шине доступа к памяти программ выполняется выборка кода за один машинный цикл. Непрерывная работа ядра микроконтроллера по выборке и выполнению кодов программы дает возможность выполнять все команды за один машинный цикл (200нс @ 20МГц), кроме команд ветвления. Ядро микроконтроллеров поддерживает 35 высокоэффективных команд.
В таблице 1.2. представлен объем FLASH памяти программ, памяти данных (ОЗУ) и EEPROM памяти данных.
Таблица1.2.
В PIC16F62X адресовать память данных можно непосредственно или косвенно. Все регистры специального назначения отображаются в памяти данных, включая счетчик программ. PIC16F62X имеет ортогональную систему команд, что дает возможность выполнить любую операцию с любым регистром памяти данных, используя любой метод адресации. Это облегчает написание программ для микроконтроллеров PIC16F62X и снижает общее время разработки устройства.
Микроконтроллеры PIC16F62X содержат 8-разрядное АЛУ (арифметико-логическое устройство) с одним рабочим регистром W. АЛУ выполняет арифметические и булевы операции между рабочим регистром и любым регистром памяти данных. Основными операциями АЛУ являются: сложение, вычитание, сдвиг и логические операции. В командах с двумя операндами один операнд всегда рабочий регистр W, а второй операнд регистр памяти данных или константа. В командах с одним операндом используется регистр W или регистр памяти данных.
В микроконтроллерах PIC16F62X существует два типа памяти данных:
- энергонезависимая EEPROM память данных, предусмотрена для хранения калибровочной информации, таблиц или любой другой информации, требующей периодического изменения. Данные, записанные в EEPROM память, не будут потеряны при отключении питания микроконтроллера;
- регулярная память данных (ОЗУ), используется для хранения временной информации во время выполнения программы. Информация в регулярной памяти данных будет потеряна при выключении питания микроконтроллера.
Назначение выводов микроконтроллеров сведено в таблицу 1.3.
2.ТЕРМОМЕТР НА PIC16F62X
В последнее
время конструирование цифровых
термометров очень популярно. Применение
микроконтроллеров (МК) и современных
датчиков температуры позволяет
упростить подобные устройства до предела.
Однако цифровые термометры с питанием
от сети — явно не лучший вариант для портативного
прибора, которым пользуются всего несколько
раз в сутки.
Для отображения показаний радиолюбители
применяют в термометрах либо светодиодные
индикаторы, потребляющие довольно большой
ток и, следовательно, неоптимальные при
батарейном питании, либо дорогостоящие
ЖКИ со встроенным контроллером. Между
тем существуют дешевые ЖКИ без контроллера,
например ИЖЦ5-4/8. При правильном подходе
к разработке схемы их использование лишь
немного ее усложняет. Уменьшить габариты
экономичного прибора можно за счет питания
от одного гальванического элемента.
Имеет значение
и выбор датчика температуры. Использовать
p-n переход полупроводникового прибора,
терморезистор или прецизионный аналоговый
датчик, дающий пропорциональное температуре
напряжение, нерационально, так как требуется
аналого-цифровое преобразование. Из датчиков
с цифровым выходом распространены приборы
серии DS18Х2Х с однопроводным интерфейсом
1-Wire. Они компактны и в принципе допускают
параллельное подключение неограниченного
числа датчиков к одному проводу (точнее
к двум, считая общий). Однако программная
реализация однопроводного интерфейса
довольно сложна.
Для измерения температуры в быту лучше
использовать датчики с интерфейсом I2C.
Они не менее компактны, а многие можно
соединять до восьми в параллель. Программно
интерфейс I2С гораздо проще однопроводного.
В предлагаемом термометре реализованы
все изложенные идеи.
Как видно из приведенной на
рис.2.1. схемы, применен микроконтроллер
PIC16F628 — более совершенный, чем PIC16F84A, и
дешевле последнего. Датчик температуры
— DS1631 с интерфейсом I2С. Его погрешность ±0,5 °С в интервале
температуры 0...+70 °С. В остальных участках
интервала -55...+125 СС она не превышает ±1°С.
Помимо прямого назначения, датчик DS1631
может служить узлом управления термостатом
с программируемыми значениями температуры
включения и выключения нагревателя, причем
сделанные установки хранятся в энергонезависимой
памяти датчика. Точность преобразования
"температура—число" можно программно
изменять от 9 до 12 двоичных разрядов. В
зависимости от заданной точности длительность
измерительного цикла составит 93,75.. .750
мс. Завершив его, датчик DS1631 автоматически
переходит в режим пониженного энергопотребления,
из которого его выводит только очередная
команда, полученная по интерфейсу I2С.
Рис.2.1.Принципиальная схема цифрового термометра
С помощью стабилизированного
преобразователя постоянного
В МАХ1674 предусмотрен
встроенный компаратор. На вывод 2 (LBI) —
его не инвертирующий вход — подано входное
напряжение. На инвертирующем входе компаратора
— образцовое напряжение 1,3 В от внутреннего
стабилизатора, его можно измерить, на
выводе 4 (REF). С помощью дополнительных
внешних резисторов порог срабатывания
компаратора можно изменить. В предлагаемом
устройстве к выходу компаратора (вывод
3. LBO) подключен светодиод HL1. Его свечение
предупреждает о необходимости заменить
элемент G1.
В термометре установлен индикатор
на жидких кристаллах ИЖЦ5-4/8 (MG1). Так как
управлять им динамически невозможно,
пришлось ввести микросхемы DD2 и DD3 — широко
известные КМОП счетчики К176ИЕ4 с встроенными
преобразователями кода. Выводя результат
измерения температуры на индикатор, микроконтроллер
DD1, прежде всего, посылает сигнал сброса
на входы R счетчиков. Затем подает на входы
С каждого из них импульсы, числом, соответствующим
выводимым цифрам.
Входы 5 счетчиков, отвечающие за полярность
их выходных сигналов, соединены с подложкой
индикатора, на которую с вывода 18 микроконтроллера
поступают прямоугольные импульсы. В итоге
напряжение на элементах индикатора тоже
импульсное, причем на тех, которые не
должны быть видны, оно синфазно напряжению
на подложке, а на видимых- противофазно
ему.
Выводы элементов
ж1 (знак "минус"), б2 и в2 (цифра 1 в разряде
сотен градусов) подключены к микроконтроллеру
напрямую. Он программно формирует сигналы
нужной для управления ими формы.
Если температуру проверяют лишь несколько
раз в сутки, нет смысла держать термометр
включенным Для повышения экономичности
предусмотрено управление его питанием
с помощью ключа на транзисторе VT1. Кратковременное
замыкание контактов кнопки SB1, подключенной
параллельно участку эмиттер—коллектор
транзистора, дает микроконтроллеру DD1
достаточно времени для запуска тактового
генератора и выполнения процедуры инициализации,
которая, в частности, устанавливает низкий
уровень на выходе RB6. Это удерживает транзистор
открытым, а термометр — включенным после
отпускания кнопки.
Завершив инициализацию, микроконтроллер
обращается к датчику температуры, переводя
его в режим девятиразрядного преобразования,
затем посыпает датчику команду начать
измерение. Через 100 мс микроконтроллер
считывает результат и преобразует полученное
значение в вид, пригодный для вывода на
индикатор. Если датчик не подключен или
неисправен, будут выведены два нуля со
знаком "минус".
По завершении загрузки
цифр результата в счетчики DD2 и DD3 на выводе
18 микроконтроллера появится напряжение
возбуждения индикатора. Еще через 3 с
программа завершит работу, предварительно
установив высокий уровень на выводе 12
микроконтроллера. Транзистор VT1 будет
закрыт, питание прибора выключено.
Таким образом, нажатие
на кнопку SB1 приводит к однократному измерению
температуры и трехсекундному отображению
результата на индикаторе. Этим обеспечена
высокая экономичность прибора.
В слове конфигурации необходимо указать,
что тактовый генератор — INTRC (RA6 и RA7 —
линии ввода-вывода), сторожевой таймер
выключен, включены таймер задержки запуска
при включении питания и узел сброса при
снижении напряжения питания. Состояние
разрядов, отвечающих за режим низковольтного
программирования и работу вывода MCLR/RA5,
в данном случае безразличны.
Рис.2.2. Печатная плата цифрового термометра
При разработке
печатной платы, которая изображена на
рис.2.2, ставилась цель добиться минимальных
габаритов прибора. Это удалось сделать
благодаря использованию пассивных элементов
типоразмера 0805 для поверхностного монтажа
и установке микросхем DD2, DD3 под индикатором
HG1. Микроконтроллер DD1 в малогабаритном
корпусе SO.
Катушка L1 намотана на высокоомном (более
2 МОм) резисторе МЛТ-0,125 обмоточным проводом
диаметром 0,4 мм. Число витков — 17. Ее можно
заменить унифицированной индуктивностью
10...47 мкГн, рассчитанной на ток не менее
1 А.
Рекомендуется
элементы преобразователя напряжения
устанавливать на плату первыми. К сожалению,
микросхему МАХ1674 выпускают только в малогабаритном
корпусе с шагом выводов 0,5 мм. Паять их
следует маломощным паяльником с тонким
заостренным жалом, набирая минимальное
количество припоя.
Лишь убедившись,
что преобразователь работоспособен и
его выходное напряжение не отличается
от номинального (3,3 В) более чем на 5 %, можно
продолжать монтаж. Установив запрограммированный
микроконтроллер, проверяют работу автоматического
выключателя питания на транзисторе VT1
и наличие импульсных сигналов на выводах
10,11 и 18 микроконтроллера.
После этого можно
монтировать микросхемы DD2, DD3 и в последнюю
очередь — индикатор HG1. Выводы датчика
ВК1 могут быть соединены с соответствующими
контактными площадками на плате жгутом
проводов длиной до нескольких метров.
2.1. Программа цифрового термометра
ORG 0
data H'A',H'A',H'B'
goto Program
; ----------------- Прерывание -----------------
movwf |
W_copy | |
movf |
STATUS,w | |
movwf |
STATUS_copy | |
bcf |
INTCON,T0IF | |
movlw |
B'00000001' ; Меняем полярность напряжения | |
xorwf |
FLAGS,f ; возбуждения ЖКИ с частотой | |
bcf |
PORTA,Flcd ; Fosc/4/256/16, что составляет | |
btfsc |
FLAGS,RA1 ; порядка 240 Гц | |
bsf |
PORTA,Flcd | |
ShowOne |
btfss |
FLAGS,One ; Если нужно, |
goto |
NotShow_One ; выводим цифру "1" | |
bsf |
PORTB,BC2 ; во втором разряде | |
btfsc |
FLAGS,RA1 | |
bcf |
PORTB,BC2 | |
goto |
ShowMin | |
NotShow_One |
||
bcf |
PORTB,BC2 | |
btfsc |
FLAGS,RA1 | |
bsf |
PORTB,BC2 | |
ShowMin |
btfsc |
FLAGS,Sign ; Если нужно, выводим знак "-" в первом разряде |
goto |
NotShow_Min | |
bsf |
PORTB,G1 | |
btfsc |
FLAGS,RA1 | |
bcf |
PORTB,G1 | |
goto |
ENDINT | |
NotShow_Min |
||
bcf |
PORTB,G1 | |
btfsc |
FLAGS,RA1 | |
bsf |
PORTB,G1 | |
ENDINT |
||
movf |
STATUS_copy,w | |
movwf |
STATUS | |
swapf |
W_copy,f | |
swapf |
W_copy,w | |
retfie |
||
; ------------ Основные переменные ------------ | ||
CBLOCK H'26' |
||
STATUS_copy |
; Копии содержимого | |
W_copy |
; регистров W и STATUS | |
Ind1 |
; Цифры для вывода на индикатор | |
Ind2 |
; (Ind1 - левая цифра, т.е. десятки) | |
CLK_count |
; Счетчик тактовых импульсов для загрузки цифр в К176ИЕ4 | |
FLAGS |
; Различные флаги | |
Temperature |
; Показания температуры | |
DELAY_reg_1 |
; Регистры для | |
DELAY_reg_2 |
; подпрограмм задержки | |
ENDC |
||
; ------------ Для шины I2C ------------ |
||
Bus_Status |
equ H'21' |
; Регистр состояния шины I2C |
_Bus_Busy |
equ 0 |
; Если "1" - шина занята |
_Txmt_Progr |
equ 1 |
; Если "1" - выполняется передача данных |
_Rcv_Progr |
equ 2 |
; Если "1" - выполняется прием данных |
_Txmt_Success |
equ 3 |
; Если "1" - передача данных успешно завершена |
_Rcv_Success |
equ 4 |
; Если "1" - прием данных успешно завершен |
_ACK_Error |
equ 5 |
; Если "1" - не получено подтверждение от ведомого |
Bus_Control |
equ H'22' |
; Регистр управления шиной I2C |
_Slave_RW |
equ 0 |
; "1" - операция чтения, "0" - операция записи |
_Last_Byte |
equ 1 |
; "1" означает, что читаем последний байт |
DataByte |
equ H'23' |
; Данные для записи и после чтения |
LSB |
equ 0 |
; Младший разряд |
DataByteCopy |
equ H'24' |
|
BitCount |
equ H'25' |
; Счетчик битов передаваемого или принимаемого байта |
; -------- Разряды регистра FLAGS -------- | ||
RA1 |
equ 0 |
; Для формирования напряжения возбуждения ЖКИ |
One |
equ 1 |
; Если "1" - в первом разряде должна быть единица |
Sign |
equ 2 |
; Знак температуры (0 - минус, 1 - плюс) |
; ----------- Описание порта А ----------- | ||
Flcd |
equ 1 |
; Напряжение возбуждения ЖКИ |
_SDA |
equ 6 |
; Шина I2C |
_SCL |
equ 7 |
|
; ----------- Описание порта B ----------- | ||
CLK1 |
equ 1 |
; Тактовые входы |
CLK2 |
equ 2 |
; микросхем К176ИЕ4 |
RST |
equ 3 |
; Сигнал сброса микросхем |
BC2 |
equ 4 |
; Сегменты В и С 2-го разряда (цифра 1) |
G1 |
equ 5 |
; Сегмент G 1-го разряда (минус) |
PWD |
equ 6 |
; Управление питанием (включено при "0") |
; ----------- Макрос, отправляющий команду ---------- | ||
; ------------ в регистр CONFIG в DS1631 ------------ | ||
; Так можно отправлять команды "Начать преобразование" (51h), | ||
; "Остановить преобразование" (22h), "Программный сброс" (54h) | ||
; и "Доступ к регистру Config" (АСh) |
||
Command_to_DS1631 macro Command,Config | ||
local Stop | ||
bcf |
Bus_Control,_Slave_RW ; Операция записи | |
call |
TxmtStartBit | |
movlw |
B'10011111' ; Адрес для датчика DS1631 при А0..А2 = 111 | |
movwf |
DataByte ; нагрузка на адрес DataByte для передачи | |
bcf |
DataByte,LSB | |
btfsc |
Bus_Control,_Slave_RW ; если пропустить то операции записи | |
bsf |
DataByte,LSB ; Операция чтения | |
call |
Send_data ; В случае успеха, то _Txmt_Success бит | |
btfsc |
Bus_Status,_ACK_Error ; пропустить, если NACK, устройство отсутствует или не отвечает | |
goto |
BUS_ERROR | |
movlw |
Command ; Загружаем команду | |
movwf |
DataByte | |
call |
Send_data | |
btfsc |
Bus_Status,_ACK_Error | |
goto |
BUS_ERROR | |
movlw |
Command ; Если передали команду 0хАС | |
xorlw |
H'AC' ; (доступ к регистру "Config"), | |
BZ |
$+2 ; записываем туда необходимое значение | |
goto |
Stop | |
movlw |
Config ; Загружаем число, которое | |
movwf |
DataByte ; надо записать в регистр "Config" | |
call |
Send_data | |
btfsc |
Bus_Status,_ACK_Error | |
goto |
BUS_ERROR | |
Stop |
||
call |
TxmtStopBit | |
endm |
||
; ----------- Макрос для чтения из регистров ----------- | ||
; ----------- Тн, ТL и регистров температуры ----------- | ||
; "Command_byte" определяет, из каких
регистров будут прочитаны | ||
; 0xA1 - Тн, 0xA2 - ТL, 0xАА – Температура | ||
; Прочитанное значение (только старший байт) | ||
; загружается в регистр " | ||
Read_from_DS1631 macro Command_byte | ||
bcf |
Bus_Control,_Slave_RW ; Набор для операции записи | |
call |
TxmtStartBit | |
movlw |
B'10011111' ; Адрес для датчика DS1631 при А0..А2 = 111 | |
movwf |
DataByte ; нагрузка на адрес DataByte для передачи | |
bcf |
DataByte,LSB | |
btfsc |
Bus_Control,_Slave_RW ; если пропустить то операции записи | |
bsf |
DataByte,LSB ; Операция чтения | |
call |
Send_data ; В случае успеха, то _Txmt_Success бит | |
btfsc |
Bus_Status,_ACK_Error ; пропустить, если NACK, устройство отсутствует или не отвечает | |
goto |
BUS_ERROR | |
movlw |
Command_byte ; Команда чтения температуры | |
movwf |
DataByte | |
call |
Send_data ; В случае успеха, то _Txmt_Success бит | |
btfsc |
Bus_Status,_ACK_Error; пропустить, если NACK, устройство отсутствует или не отвечает | |
goto |
BUS_ERROR | |
call |
TxmtStartBit | |
bsf |
Bus_Control,_Slave_RW ; Набор для операции чтения | |
movlw |
B'10011111' ; Адрес для датчика DS1631 при А0..А2 = 111 | |
movwf |
DataByte ; нагрузка на адрес DataByte для передачи | |
bcf |
DataByte,LSB | |
btfsc |
Bus_Control,_Slave_RW ; если пропустить то операции записи | |
bsf |
DataByte,LSB ; Операция чтения | |
call |
Send_data ; В случае успеха, то _Txmt_Success бит | |
btfsc |
Bus_Status,_ACK_Error ; пропустить, если NACK, устройство отсутствует или не отвечает | |
goto |
BUS_ERROR | |
bsf |
Bus_Control,_Last_Byte ; Принимаем последний байт | |
call |
Get_data | |
movfw |
DataByte | |
movwf |
Temperature | |
call |
TxmtStopBit | |
endm |
||
; ----------------- Инициализация ---------------- | ||
Program |
||
clrf |
PORTB | |
clrf |
PORTA | |
movlw |
B'00000111' ; Отключаем компараторы | |
movwf |
CMCON | |
bsf |
STATUS,RP0 ; Банк 1 | |
bsf |
PCON,OSCF ; Устанавливаем частоту внутреннего генератора 4 МГц | |
|
clrf |
TRISB ; Весь порт B - на вывод |
clrf |
TRISA ; Весь порт A - на вывод | |
|
bcf |
OPTION_REG,T0CS; Таймер 0 - к кварцевому генератору |
|
bcf |
OPTION_REG,PSA ; Предделитель - к таймеру 0 |
bcf |
OPTION_REG,PS0 ; Коэффициент деления - 16 (PS2..PS0 = 011) | |
bcf |
OPTION_REG,PS1 | |
bcf |
OPTION_REG,PS2 | |
bcf |
STATUS,RP0 ; Банк 0 | |
clrf |
FLAGS | |
clrf |
Bus_Control | |
clrf |
Bus_Status | |
clrf |
BitCount | |
bsf |
PORTA,_SDA ; Устанавливаем исходное | |
bsf |
PORTA,_SCL ; состояние шины I2C | |
|
bsf |
INTCON,T0IE ; Разрешение прерываний от таймера 0 |
; ****************************** | ||
; ОСНОВНАЯ ПРОГРАММА | ||
; ****************************** | ||
; Сначала записываем в регистр "Config" датчика число 00000001, | ||
; устанавливая разрешение 9 бит
и режим однократного | ||
; Максимальное время измерения - 93,75 мс. | ||
Command_to_DS1631 H'AC',01 | ||
Command_to_DS1631 H'51',00 ; Подаем команду "Start Convert" | ||
call |
DELAY_100ms ; и ждем примерно 100 мс. | |
Read_from_DS1631 H'AA' ; Читаем показания датчика | ||
bcf |
FLAGS,Sign; Определяем знак температуры | |
btfss |
Temperature,7 ; и если нужно, выведем на индикатор минус | |
bsf |
FLAGS,Sign | |
btfsc |
FLAGS,Sign ; Если температура ниже нуля, инвертируем | |
goto |
$+3 ; показания и увеличиваем их на единицу, | |
comf |
Temperature,f ; потому что DS1631 выдает значение | |
incf |
Temperature,f ; температуры в коде с дополнением до двух | |
call |
BIN_to_BCD ; Преобразуем двоичное значение температуры | |
call |
LOAD_to_LCD ; в десятичный код и загружаем его в DD2, DD3 | |
bsf |
INTCON,GIE; Включаем индикатор | |
goto |
POWER_DOWN | |
BUS_ERROR |
||
movlw |
0 ; Если датчик DS1631 не обнаружен, | |
movwf |
Ind1 ; на индикатор выводим символы "- 00" | |
movwf |
Ind2 | |
bcf |
FLAGS,Sign | |
call |
LOAD_to_LCD | |
bsf |
INTCON,GIE | |
goto |
POWER_DOWN | |
POWER_DOWN |
||
movlw |
D'30'; Ждем 3 секунды | |
movwf |
Temperature; Показания температуры | |
call |
DELAY_100ms; больше не нужны | |
decfsz |
Temperature,f | |
goto |
$-2 | |
bsf |
PORTB,PWD; Выключаем питание! | |
; **************** Подпрограммы для шины I2C **************** | ||
TxmtStartBit |
||
bsf |
PORTA,_SDA | |
bsf |
PORTA,_SCL | |
call |
Delay50uSec | |
bcf |
PORTA,_SDA | |
call |
Delay50uSec | |
bsf |
Bus_Status,_Bus_Busy | |
return |
||
; ------------------------------ | ||
TxmtStopBit |
||
bcf |
PORTA,_SDA | |
bcf |
PORTA,_SCL | |
bsf |
PORTA,_SCL | |
call |
Delay50uSec | |
bsf |
PORTA,_SDA | |
call |
Delay50uSec | |
bcf |
Bus_Status,_Bus_Busy | |
return |
||
; ------------------------------ | ||
Send_data |
||
movfw |
DataByte | |
movwf |
DataByteCopy ; сделать копию DataByte | |
bsf |
Bus_Status,_Txmt_Progr ; set Bus status for txmt progress | |
bcf |
Bus_Status,_Txmt_Success ; сбросить бит статуса | |
movlw |
8 | |
movwf |
BitCount | |
TxmtNextBit |
||
bcf |
PORTA,_SCL | |
rlf |
DataByteCopy,f; MSB-первых, заметим DataByte теряетс | |
bcf |
PORTA,_SDA | |
btfsc |
STATUS,C | |
bsf |
PORTA,_SDA | |
call |
Delay50uSec; guareentee min LOW TIME tLOW & Setup time | |
bsf |
PORTA,_SCL; установить часы высокой, проверить, если часы высокой, иначе часы растягивается | |
call |
Delay50uSec; guareentee min HIGH TIME tHIGH | |
decfsz |
BitCount,f | |
goto |
TxmtNextBit; Проверьте Ack | |
|
||
bcf |
PORTA,_SCL | |
bsf |
PORTA,_SDA; Release SDA line for Slave to pull down | |
call |
Delay50uSec; guareentee min LOW TIME tLOW & Setup time | |
bsf |
PORTA,_SCL; clock for slave to ACK | |
call |
Delay50uSec; guareentee min HIGH TIME tHIGH | |
btfsc |
PORTA,_SDA; SDA should be pulled low by slave if OK | |
|
goto |
TxmtErrorAck |
bcf |
PORTA,_SCL | |
bcf |
Bus_Status,_Txmt_Progr ; reset TXMT bit in Bus Status | |
bsf |
Bus_Status,_Txmt_Success ; transmission successful | |
bcf |
Bus_Status,_ACK_Error ; ACK OK | |
return |
||
_TxmtErrorAck |
||
bsf |
PORTA,_SDA ; tristate SDA | |
bsf |
PORTA,_SCL ; tristate SCL | |
bcf |
Bus_Status,_Bus_Busy ; Bus Not Busy, TEMP ????, set/clear on Start & | |
Stop |
||
bcf |
Bus_Status,_Txmt_Progr ; reset TXMT bit in Bus Status | |
bcf |
Bus_Status,_Txmt_Success ; transmission NOT successful | |
bsf |
Bus_Status,_ACK_Error ; No ACK From Slave | |
return |
||
; ------------------------------ | ||
Get_data |
||
bsf |
Bus_Status,_Rcv_Progr; set Bus status for txmt progress | |
bcf |
Bus_Status,_Rcv_Success; reset status bit | |
movlw |
8 | |
movwf |
BitCount | |
RcvNextBit |
||
bcf |
PORTA,_SCL | |
bsf |
PORTA,_SDA; can be removed from loop | |
call |
Delay50uSec; guareentee min LOW TIME tLOW & Setup time | |
bsf |
PORTA,_SCL; clock high, data sent by slave | |
call |
Delay50uSec; guareentee min HIGH TIME tHIGH | |
bcf |
STATUS,C | |
btfsc |
PORTA,_SDA | |
bsf |
STATUS,C | |
; TEMP ???? DO 2 out of 3 Majority detect | ||
rlf |
DataByte,f; left shift data (MSB first) | |
decfsz |
BitCount,f | |
goto |
RcvNextBit | |
; Generate ACK bit if not last byte to be read, | ||
; if last byte generate NACK |
||
; do not send ACK on last byte, main routine will send a STOP bit | ||
bcf |
PORTA,_SCL | |
bcf |
PORTA,_SDA ; ACK by pulling SDA low | |
btfsc |
Bus_Control,_Last_Byte | |
bsf |
PORTA,_SDA ; if last byte, send NACK by setting SDA high | |
call |
Delay50uSec ; guareentee min LOW TIME tLOW & Setup time | |
bsf |
PORTA,_SCL | |
call |
Delay50uSec ; guareentee min HIGH TIME tHIGH | |
RcvEnd |
||
bcf |
PORTA,_SCL ; reset clock | |
bcf |
Bus_Status,_Rcv_Progr; reset TXMT bit in Bus Status | |
bsf |
Bus_Status,_Rcv_Success; transmission successful | |
bcf |
Bus_Status,_ACK_Error; ACK OK | |
return |
||
; **************** Прочие подпрограммы **************** | ||
; -------------- Вывод цифр на индикатор -------------- | ||
LOAD_to_LCD |
||
bsf |
PORTB,RST ; Импульс сброса счетчиков | |
bcf |
PORTB,RST | |
K176IE4_1 |
||
movfw |
Ind1 ; Загружаем первую цифру в первый счетчик | |
movwf |
CLK_count | |
xorlw |
0 | |
BZ |
K176IE4_2 | |
bsf |
PORTB,CLK1 | |
bcf |
PORTB,CLK1 | |
decfsz |
CLK_count,f | |
goto |
$-3 | |
K176IE4_2 |
||
movfw |
Ind2 ; Загружаем вторую цифру во второй счетчик | |
movwf |
CLK_count | |
xorlw |
0 | |
BZ |
Go_back | |
bsf |
PORTB,CLK2 | |
bcf |
PORTB,CLK2 | |
decfsz |
CLK_count,f | |
goto |
$-3 | |
Go_back |
||
return |
||
; ----------- Преобразование двоичного кода в десятичный ----------- | ||
BIN_to_BCD |
||
clrf |
Ind1 | |
movfw |
Temperature | |
movwf |
Ind2 | |
GTENTH |
||
movlw |
D'10' | |
subwf |
Ind2,w | |
btfss |
STATUS,C | |
goto |
GHUNDRED | |
movwf |
Ind2 | |
incf |
Ind1,f | |
goto |
GTENTH | |
GHUNDRED |
||
movlw |
D'10' | |
subwf |
Ind1,w | |
btfss |
STATUS,C | |
goto |
OVER | |
bsf |
FLAGS,One | |
movwf |
Ind1 | |
OVER |
return |
|
; ------------ Задержка около 100 мс ------------ | ||
DELAY_100ms |
||
movlw |
D'130' | |
movwf |
DELAY_reg_1 | |
movlw |
H'FF' | |
movwf |
DELAY_reg_2 | |
LOOP |
||
decfsz |
DELAY_reg_2,f | |
goto |
LOOP | |
decfsz |
DELAY_reg_1,f | |
goto |
LOOP | |
return |
||
; --------------- Задержка 50 мкс --------------- | ||
Delay50uSec |
||
movlw |
D'15' | |
movwf |
DELAY_reg_1 | |
decfsz |
DELAY_reg_1,f | |
goto |
$-1 | |
return |
||
END |
||
ЗАКЛЮЧЕНИЕ
В данном курсовом проекте мы подробнее познакомились с семейством микроконтроллеров PIC, а в частности с PIC16F628. Это одни из самых доступных и простых микроконтроллеров. Основной целью работы являлось разработка программы для микроконтроллера PIC16F628 на базе которого был собран цифровой термометр. Основной средой программирования MPLAB IDE.
MPLAB IDE – бесплатная интегрированная среда разработки для микроконтроллеров PICmicro фирмы Microchip Technology Incorporated. MPLAB IDE позволяет писать, отлаживать и оптимизировать текст программы.
MPLAB IDE включает в себя редактор текста, симулятор и менеджер проектов, поддерживает работу эмуляторов (MPLAB-ICE, PICMASTER) и программаторов (PICSTART plus, PRO MATE) фирмы Microchip и других отладочных средств фирмы Microchip и третьих производителей.
ЛИТЕРАТУРА
- MPLAB IDE: Интегрированная среда разработки для микроконтроллеров PICmicro компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
- PIC16F62F: Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
- Экономичный цифровой термометр : [Электронный ресурс]. -Режим доступа .: http://eldigi.ru/site/house/
11.php

- Термометры сопротивления
- Термонапружений стан частково прозорих тіл з порожнинами за теплового опромінення
- Термообработка магниевых отливок
- Термообработка тонкостенных цилиндрических изделий. Термообработка толкостенных точных заготовок
- Термопара. Устройство, принцип работы
- Термопарные сенсоры
- Термопластик: полиэтилентерефталат (ПЭТФ, ПЭТ)
- Термодинамические характеристики поверхности в однокомпонентных системах
- Термодинамический анализ химических процессов. Производство азотной кислоти
- Термодинамическое равновесие
- Термодинамическое равновесие и устойчивость Фазовые переходы
- Термодинамічні та кінетичні аспекти корозії металів. Захист від корозії
- Термометрия
- Термометрия тела человека