Термометр на pic контроллере

 

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ  ОБРАЗОВАНИЯ  “ГРОДНЕНСКИЙ

ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ ЯНКИ КУПАЛЫ”

 

 

 

ФИЗИКО - ТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ

 

 

 

Кафедра ИСиТ

 

Курсовая работа по предмету

” Микропроцессорная техника”

 

ТЕРМОМЕТР НА PIC КОНТРОЛЛЕРЕ

 

 

 

Специальность “ Промышленная электроника ”

Автор работы

Студент 4 курса, 2 группы               Ванцовский А.Г.

 

Руководитель

Ст.преподаватель       Самородов А.П.

 

 

 

Гродно 2010

 

СОДЕРЖАНИЕ

ВВЕДЕНИЕ…………………………………………………………………….3

  1. МИКРОКОНТРОЛЛЕР PIC16F62X…………………………………...4

2.       ТЕРМОМЕТР НА PIC16F62X………………………………………...10

2.1.  Программа цифрового термометра…………………………………14

ЗАКЛЮЧЕНИЕ……………………………………………………………….31

ЛИТЕРАТУРА………………………………...................................................32

 

 

ВВЕДЕНИЕ

За  последние  десятилетия  электронная  промышленность развивалась  опережающими  темпами  в сравнении  с любой  другой отраслью. Появление  недорогих интегральных схем высокой  и сверхвысокой степени интеграции, ориентированных на решение всевозможных задач, позволило разработать принципиально новые подходы к проектированию электронных устройств. Появившийся в конце 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 позволяют  сократить число внешних компонентов, что в  свою  очередь  снижает  стоимость  конечного  устройства,  повышает  надежность  системы и уменьшает энергопотребление.  Дополнительную  гибкость  в  разработках  дает  широкий  выбор  режимов  работы  тактового генератора: ER генератор, наиболее дешевое решение; LP генератор, минимизирует потребляемый ток; XT генератор, для подключения стандартного резонатора; INTRC внутренний RC генератор; HS генератор, для  высокоскоростных режимов работы.

Энергосберегающий  режим 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.Принципиальная схема  цифрового термометра

С помощью стабилизированного преобразователя постоянного напряжения в постоянное (DC/DC) МАХ1674 напряжение гальванического элемента G1 (1,5 В) повышается до 3,3 В. Эта микросхема способна работать с КПД до 94 % при входном напряжении 0,7...5,5 В, отдавая в нагрузку ток, достигающий 1 А. Если ее вывод 1 (FB) соединить не с выходом (вывод 8. OUT), как на схеме, а с общим проводом (вывод 6, GND), выходное стабилизированное напряжение возрастет до 5 В. Подключая между указанными выводами резисторы, выходное напряжение можно регулировать. 
        В МАХ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

; Сигнал сброса микросхем К176ИЕ4

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АА – Температура

; Прочитанное значение (только  старший байт)

; загружается в регистр "Temperature"

     

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 и третьих производителей.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЛИТЕРАТУРА

    1. MPLAB IDE: Интегрированная среда разработки для микроконтроллеров PICmicro компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
    2. PIC16F62F: Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated.-Москва: Микро-Чип,2001.
    3. Экономичный цифровой термометр : [Электронный ресурс]. -Режим доступа .: http://eldigi.ru/site/house/11.php