ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования СА...
74 downloads
348 Views
455KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
ПРОЕКТИРОВАНИЕ СРЕДСТВ КОНТРОЛЯ И ДИАГНОСТИКИ С ЭЛЕМЕНТАМИ ВЫСОКОЙ ИНТЕГРАЦИИ Методические указания к выполнению лабораторных работ № 6, 7, 9, 10, 11
Санкт-Петербург 2005
Составители: кандидат технических наук, доцент С. И. Ковалев, кандидат технических наук, доцент В. А. Голубков
Даны методические указания к выполнению лабораторных работ по курсу «Проектирование средств контроля и диагностики с элементами высокой интеграции» и ориентированы на изучение записи и чтения из энергозависимой памяти данных микроконтроллеров фирмы Microchip Technology, работы последовательного интерфейса 12С, последовательной передачи данных и работы с прерываниями. Методические указания предназначены для студентов специальности 190200 – «Приборы и методы контроля качества и диагностики». Подготовлены кафедрами электротехники и информационных систем и рекомендованы к изданию редакционно-издательским советом государственного образовательного учреждения высшего профессионального образования «Санкт-Петербургский государственный университет аэрокосмического приборостроения».
Подписано к печати 28.04.05. Формат 60×84 1/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 2,03. Уч. -изд. л. 2,48. Тираж 100 экз. Заказ № Отпечатано с оригинал-макета, подготовленного автором Отдел оперативной полиграфии СПбГУАП 190000, Санкт-Петербург, ул. Б. Морская, 67 © ГОУ ВПО «СПбГУАП», 2005
Лабораторная работа № 6 Изучение записи и чтения из энергонезависимой памяти данных микроконтроллеров фирмы Microchip Technology Цель работы: ознакомление с процессами чтения и записи в энергонезависимую память данных PIC-контроллеров (на примере PIC16F877) и приемами программирования EEPROM. Методические указания 1. EEPROM ПАМЯТЬ ДАННЫХ Данные из EEPROM памяти и FLASH памяти программ могут быть прочитаны/перезаписаны в нормальном режиме работы микроконтроллера во всем диапазоне напряжения питания VDD. Операции выполняются с одним байтом для EEPROM памяти данных и одним словом. Запись производится по принципу "стирание – запись" для каждого байта. Сформированная кодом программы операция стирания не может выполнена при включенной защите записи. Число циклов стирания/записи смотрите в разделе электрических характеристик (для EEPROM памяти данных EEPROM память данных должна использоваться для сохранения часто изменяемых данных. Время записи данных управляется внутренним таймером, оно зависит от напряжения питания, температуры и имеет небольшой технологический "разброс". При записи байта автоматически стирается соответствующая ячейка, а затем выполняется запись. Запись в EEPROM память программ не воздействует на выполнение программы. В течение операции записи тактовый генератор продолжает работать, периферийные модули включены. Доступ к функциям записи/чтения EEPROM памяти данных и FLASH памяти программ выполняется через шесть регистров специального назначения: EEDATA; EEDATH; EEADR; EEADRH; EECON1; EECON2. Операции чтения/записи EEPROM памяти данных не приостанавливают выполнение программы. В регистре EEADR сохраняется адрес ячейки EEPROM памяти данных. Данные сохраняются/читаются из регистра EEDATA. В микроконтроллерах PIC16F873/874 объем EEPROM памяти 128 байт. Старший бит адреса в регистре EEADR всегда должен равняться нулю, потому что не поддерживается циклическая адресация (т. е. ячейка с адресом 0×80 не
1
отображается на 0×00). В PIC16F876/877 объем EEPROM памяти данных 256 байт (используются все 8-разрядов регистра EEADR). 1.1. Регистры EECON1, EECON2 Регистр EECON1 содержит биты управления косвенной записи/чтения EEPROM памяти данных и FLASH памяти программ. Регистр EECON2 физически не реализован, он используется только при операциях записи с целью предотвращения случайной записи. Значение бита EEPGD в регистре EECON1 определяет тип памяти, к которой будет выполнено обращение. Если EEPGD = 0, то операции относятся к EEPROM памяти данных. Когда EEPGD=1, обращение происходит к FLASH памяти программ. В операции чтения используется только один дополнительный бит RD, инициализирующий операцию чтения из указанной памяти. Установив бит RD в '1', значение ячейки памяти будет доступно в регистре данных. Бит RD не может быть сброшен программно в '0', он сбрасывается автоматически по окончании операции чтения. При чтении из EEPROM памяти данные будут доступны в регистре EEDATA в следующем машинном цикле, после установки бита RD. При чтении из FLASH памяти программ данные будут доступны в регистре EEDATA:EEDATH на втором машинном цикле, поле установки бита RD. В операции записи используется два служебных бита WR, WREN и два бита статуса WRERR, EEIF. Бит WREN применяется для разрешения/запрещения операции записи (WREN = 0 – операция записи запрещена). Перед выполнением записи бит WREN необходимо установить в '1'. Бит WR предназначен для инициализации записи, он аппаратно сбрасывается в '0' по завершении операции записи. Флаг прерывания EEIF устанавливается в '1' по завершении записи. Этот флаг должен быть сброшен программно в '0' перед установкой бита WR. Для EEPROM памяти данных: После установки битов WREN, WR в '1' стирается, указанная в регистре EEADR, ячейка EEPROM памяти, а затем происходит запись данных из регистра EEDATA. Операция записи сопровождается выполнением кода программы. По завершении записи устанавливается флаг прерывания EEIF в '1'. Бит WRERR указывает, что произошел сброс микроконтроллера PIC16F87X во время выполнения операции записи. Бит WRERR устанавливается в ‘1’, если во время выполнения записи данных произошел сброс по сигналу-MCLR или по переполнению сторожевого таймера WDT в нормальном режиме. Проверив состояние бита WREER, пользователь может повторить запись (регистры EEDATA и EEADR не изменяют своего значения). Содержимое регистров данных, адреса и бит EEPGD не изменяется после сброса по сигналу -MCLR, по переполнению сторожевого таймера WDT в нормальном режиме.
2
Регистр EECON1 (адрес 18Сh)
1.2. Чтение из EEPROM памяти данных Для чтения из EEPROM памяти необходимо только записать адрес в регистр EEADR и сбросить бит EEPGD в '0'. После установки в '1' бита RD данные будут доступны в регистре EEDATA на следующем машинном цикле. Данные в регистре EEDATA сохраняются до выполнения следующей операции чтения или записи в EEDATA. Рекомендованная последовательность действий при чтении из EEPROM памяти данных: 1. Записать адрес в регистр EEADR. Проверьте, что записанный адрес корректен для данного типа микроконтроллера. 2. Сбросить в '0' бит EEPGD для обращения к EEPROM памяти данных. 3. Инициализировать операцию чтения установкой бита RD в '1'. 4. Прочитать данные из регистра EEDATA. Пример 1. Чтение из EEPROM памяти данных BSF STATUS,RP1 ; BCF STATUS,RP0 ; Выбрать банк 2 MOVF ADDR,W ; Записать адрес 3
MOVWF EEADR ; ячейки BSF STATUS,RP0 ; Выбрать банк 3 BCF EECON1,EEPGD ; Выбрать EEPROM память BSF EECON1,RD ; Инициализировать чтение BCF STATUS,RP0 ; Выбрать банк 2 MOVF EEDATA,W ; W = EEDATA 1.3. Запись в EEPROM память данных Запись данных в EEPROM память несколько сложнее чтения. Адрес ячейки EEPROM памяти и записываемые данные должны быть помешены в соответствующие регистры специального назначения, бит EEPGD сбрасывается в '0'. Бит WREN должен всегда равняться нулю, кроме непосредственной записи в EEPROM память. Бит WR может быть установлен в '1' только, если бит WREN был установлен в предыдущих командах, т. е. биты WR, WREN не могут устанавливаться в '1' одной командой. Бит WREN должен быть сброшен в '0' после инициализации записи (на процесс записи он не влияет). Перед записью в EEPROM память должна быть выполнена обязательная последовательность команд, предотвращающая случайную запись. Обязательная последовательность выполняется при выключенных прерываниях. Рекомендованная последовательность действий при записи в EEPROM память: 1. Если шаг 10 не был выполнен, то необходимо проверить, что не происходит запись (WR=0). 2. Записать адрес в регистр EEADR. Проверьте, что записанный адрес корректен для данного типа микроконтроллера. 3. Записать 8-разрядное значение в регистр EEDATA. 4. Сбросить в '0' бит EEPGD для обращения к EEPROM памяти данных. 5. Установить бит WREN в '1', разрешив запись в EEPROM память. 6. Запретить прерывания, если они разрешены. 7. Выполнить обязательную последовательность из пяти команд: · Запись значения 55h в регистр EECON2 (две команды, сначала в W затем в EECON2; · Запись значения AAh в регистр EECON2 (две команды, сначала в W затем в EECON2); · Установитьбит WR в '1'. 8. Разрешить прерывания (если необходимо). 9. Сбросить бит WREN в '0'. 10. После завершения цикла записи сбрасывается в '0' бит WR, устанавливается в '1' флаг прерывания EEIF (сбрасывается программно). Если шаг 1 не выполняется, то необходимо проверить состояние битов EEIF, WR перед началом записи. 4
Пример 2. Запись в EEPROM память данных BSF STATUS, RP1 ; BSF STATUS, RP0 ; Выбрать банк 3 BTFSC EECON1, WR ; Проверить завершения GOTO $-1 ; операции записи BCF STATUS, RP0 ; Выбрать банк 2 MOVF ADDR, W ; Указать адрес ячейки MOVWF EEADR ; MOVF VALUE, W ; Указать данные для записи MOVWF EEDATA ; BSF STATUS, RP0 ; Выбрать банк 3 BCF EECON1, EEPGD ; Выбрать EEPROM память данных BSF EECON1, WREN ; Разрешить запись в EEPROM память данных BCF INTCON, GIE ; Запретить прерывания MOVLW 0x55 ; Записать 55h в регистр EECON2 MOVWF EECON2 ; MOVLW 0xAA ; Записать AAh в регистр EECON2 MOVWF EECON2 ; BSF EECON1, WR ; Инициализировать запись BSF INTCON, GIE ; Разрешить прерывания BCF EECON1, WREN ; Запретить запись в EEPROM память данных 1.4. Проверка записи В микроконтроллерах PIC16F87X аппаратно не проверяется значение, сохраненное при записи. Рекомендуется поверять фактически записанное значение контрольным чтением. Особенно проверку записи необходимо выполнять при возможном исчерпании гарантированного числа циклов стирания/записи. 1.5. Защита от случайной записи Существуют условия при которых запись данных в EEPROM память или во FLASH память программ не будет выполнена. В микроконтроллерах PIC16F87X предусмотрены различные виды защиты от случайной записи. При включении питания сбрасывается в '0' бит WREN и во время счета таймера по включению питания PWRT (если он включен) запись запрещена. Обязательная последовательность команд, бит WREN предотвращают случайную запись при сбросе микроконтроллера или сбое программы. Схема лабораторной установки представлена на рис. 1.
5
Рис. 1
Практическая часть: 1. Прочесть методичку и после собеседования с преподаваелем получить у него задание. 2. Написать и отладить программу в среде MPLAB. 3. С разрешения преподавателя занести программу в PIC16F877. 4. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - блок-схему алгоритма; - комментированный листинг программы. английском языке предпочтительны.
6
Комментарии
на
Лабораторная работа № 7 Изучение работы последовательного интерфейса I2C на примере обмена информацией между микросхемой последовательной памяти 24LC256 микроконтроллерами фирмы Microchip Technology Цель работы: ознакомление с работой последовательного интерфейса I2C на примере обмена информацией между микросхемой последовательной памяти 24LC256 и PIC- контроллерами (типа PIC16F877). Методические указания По протоколу связи Inter-Integrated Circuit (I2C) имеется большое количество литературы и ссылок в Интернете. Мы остановимся здесь лишь на общих принципах связи по этому протоколу и рассмотрим элементы программной реализации этого протокола для случая, когда микроконтроллер работает в режиме “Master”. C аппаратной точки зрения шина I2C представляет собой два проводника, “подтянутые” к +5V резисторами с сопротивлением в несколько кОм (см. Рис.1).
Рис. 1. Подключение периферийных устройств к I2C шине
7
Все устройства, подключенные к этой шине, имеют выходные каскады типа “открытый коллектор” или “открытый сток”. Когда все выходные транзисторы всех устройств закрыты – на линии присутствует высокое напряжение, а когда хотя бы один транзистор открыт – низкое. Одна из линий отвечает за передачу импульсов синхронизации (SCL), а другая (SDA) – за передачу данных между устройствами, подключенными к шине. В нашем макете линия SCL соединена с разрядом RC3 порта С, а линия SDA – с разрядом RC4 порта С. В рассматриваемом нами режиме работы инициатором обмена всегда является микроконтроллер, он называется Master – хозяин или ведущий), а периферийные элементы лишь отвечают на запросы микроконтроллера (они называются Slave – раб - ведомый). Синхросигнал по линии SCL всегда формируется контроллером независимо от того, куда передаются данные – из контроллера или в контроллер. Каждый бит передаваемой или принимаемой информации сопровождается синхроимпульсом по линии SCL. Если передача информации ведется от внешнего устройства в микроконтроллер, то и в этом случае устройство выставляет на линию данных очередной бит информации только по началу синхроимпульса, полученного от микроконтроллера. Общий принцип организации связи по I2C очень прост. Сначала микроконтроллер передает в шину I2С специальную комбинацию сигналов на линиях SCL и SDA, которая называется стартовой комбинацией или просто сигналом START. Сигнал START – это просто перевод линии SDA из состояния высокого напряжение в нулевое состояние в то время как на SCL присутствует высокий уровень напряжения. Сигнал STOP – это перевод линии SDA из нулевого состояния в состояние высокого напряжения в то время, как на SCL присутствует высокий уровень напряжения. Сигналы START и STIOP – особые сигналы, для которых разрешено изменение значение SDA в то время, как SCL находится в единичном состоянии. Для всех остальных режимов работы I2C допускается изменение SDA только при нулевом значении SCL (см. рис. 2).
Рис. 2. Формирование основных сигналов на линиях SCL и SDA 8
Сигнал START говорит всем периферийным устройствам, что сейчас к кому-то из них будет произведено обращение. Теперь микроконтроллер передает по I2C байт данный, который мы ниже будем называть запросным. Этот запросный байт содержит информацию о “номере” периферийного устройства, с которым желает связаться микроконтроллер. Этот номер (также часто называемый адресом slave-устройства) принимается всеми устройствами, подключенными к шине I2C. Каждое периферийное устройство “знает”, какой за ним закреплен номер и сверяет этот номер с тем адресом, который содержится в запросном байте. Если эти адреса совпали, то устройство готово к дальнейшему обмену данными с контроллером. Если нет, то устройство “отключается” от I2C до тех пор, пока там не появится следующий сигнал START. Выбранное устройство “отзывается” на обращение к нему сигналом ACK – выдает нулевой бит на SDA во время действия девятого синхроимпульса. Напомним, что первые 8 синхроимпульсов соответствовали передаче запросного байта (см. рис. 3).
Рис. 3. Формирование сигнала подтверждения ACК Сигнал АСК (acknowledge – подтверждение) говорит о нормальном завершении приема байта данных. Микроконтроллер должен освободить линию данных перед приемом ACK, чтобы периферия могла выдать нулевой бит на эту линию. Под освобождением линии понимается перевод выходного каскада в закрытое состояние, т. е. на линии появляется высокий уровень напряжения за счет “подтягивающего” резистора. Далее последовательность сигналов START+запросный байт+ACK и сопровождающие эти сигналы синхроимпульсы мы будем называть запросным пакетом. В запросном байте последний (младший) бит содержит информацию о том, какое действие хочет совершить микроконтроллер – передачу данных в периферийное устройство или чтение данных из периферийного устройства. Если последний бит запросного байта нулевой, то это запрос на запись, в противном случае – на чтение. Заметим, что в процессе работы микроконтроллера с выбранным периферийным устройством сигнал START сформироваться “случайно” не
9
может в принципе. Поэтому одновременное включение в работу нескольких периферийных устройств совершенно исключено. Структура запросного байта, таким образом, формируется из двух частей – адресной части и бита направления передачи данных. Адресная часть, в свою очередь, состоит из двух полей – поле типа устройства (4 бита) и поле номера конкретной микросхемы (3 бита). Дело в том, что на одной шине I2C могут “висеть” несколько однотипных микросхем, и их надо как-то отличать друг от друга. Например, двоичный код 1010 закреплен фирмами-производителями последовательной памяти за любыми устройствами последовательной памяти. Таких устройств на одной шине I2C может быть до 8 штук, т.к. отводится три бита на адрес конкретного устройства этого типа. Следует пояснить, что все микросхемы последовательной памяти “знают”, что их код 1010. Кроме того, у каждой микросхемы имеется три “ножки”, на которые заводятся высокие или низкие уровни сигналов с внешних цепей общей схемы. Обычно эти уровни не меняются и жестко определяются разводкой печатной платы и сапой принципиальной схемой. Вот эти-то три входных сигнала и составляют вторую часть адреса каждой конкретной микросхемы. Разумеется, все однотипные микросхемы, подключенные к одной шине I2C, должны иметь различные адреса во втором поле адреса slaveустройства. Структура запросного пакета представлена на рис.4. Напомним, что сигнал ACK поступает от периферии (автоматически), остальные сигналы – от микроконтроллера, т.е. должны формироваться программой пользователя.
Рис. 4. Структура запросного пакета (линия данных)
10
Рассмотрим теперь дальнейший обмен данными между микроконтроллером и выбранным периферийным устройством. Их дальнейшее взаимодействие зависит от конкретного типа периферийного устройства. Здесь мы рассмотрим обмен данными с микросхемой последовательной памяти 24LC256 фирмы Microchip и с микросхемой датчика температуры (двоичный код типа устройства – 1001) фирмы Dallas (теперь принадлежащей фирме Maxim). Работа с последовательной памятью Запись в память отдельного байта Вслед за запросным байтом микроконтроллер должен передать два байта адреса ячейки последовательной памяти, к которой выполняется обращение. Каждый такой байт сопровождается восемью синхроимпульсами, и девятый импульс дает возможность принять от периферии сигнал ACK. Если все в порядке (все ACK приняты контроллером), то следующим шагом микроконтроллера будет передача байта, предназначенного для записи. После принятия байта данных периферия должна выдать ACK, после чего контроллер завершает связь с микросхемой памяти, сформировав на линиях SCL и SDA специальную комбинацию сигналов, которая называется стоповой комбинацией или просто сигналом STOP. Процесс записи одиночного байта по указанному адресу проиллюстрирован рисунком рис. 5.
Рис. 5. Запись одиночного байта После получения сигнала STOP, микросхема памяти на некоторое время становится недоступной для связи. Дело в том, что в действительности прием байта микросхема памяти производит во внутренний промежуточный буфер, и только после получения сигнала STOP происходит физическая запись информации в основную память микросхемы. Запись информации требует порядка 5 миллисекунд (10мс для старых версий микросхем). Это весьма значительный интервал времени, если учесть, что передача синхроимпульсов может вестись с частотой до 400кГц (до 100кГц для старых микросхем), т. е. передача данных в микросхему происходит весьма быстро. У пользователя есть 11
два пути для продолжения работы с памятью – ждать 5-10 мс и затем обращаться к памяти с запросным пакетом, либо постоянно посылать запросный пакет до тех пор, пока микросхема памяти не откликнется сигналом ACK. Запись в память последовательности байт (пакетный режим записи) Как мы отмечали выше, запись информации по одному байту требует достаточно длительного времени. Для ускорения процесса записи в составе микросхемы памяти имеется специальный буфер, в который происходит предварительная запись получаемой от контроллера информации. Запись последовательности байт в принципе аналогична записи одного байта с той лишь разницей, что микроконтроллер не передает сигнал STOP после первого байта, а просто продолжает передачу, посылая второй байт, третий и т. д. (не забывая получать ACK в конце каждого байта). Когда буфер в микросхеме памяти заполняется полностью, необходимо прекратить передачу и выдать сигнал STOP, чтобы инициализировать физическую запись буфера в память. Интересно, что время записи информации из буфера в память практически не зависит от степени заполнения буфера, т. е. на запись одного байта из буфера потребуется примерно столько же времени, что и для записи полного буфера (в нашем случае буфер имеет размер 64 байта). Процесс записи одиночного байта по указанному адресу проиллюстрирован рисунком рис. 6.
Рис. 6. Запись последовательности байт В работе с буфером имеются некоторые тонкости. Эти тонкости связаны с тем, что передаваемая информация не обязательно начинает заполнять буфер с его начала. Вкратце этот процесс можно описать следующим образом. Предположим, что мы начали запись информации в микросхему последовательной памяти с адреса 30. Этот адрес был передан в микросхему памяти, и ее внутренний счетчик адреса установился в указанное значение. Теперь мы начали записывать байты один за другим в микросхему памяти (а точнее – в ее буфер) и дошли до конца буфера. Когда это произойдет? Это произойдет через 34 записи, т. к. длина буфера в нашем случае – 64 байта, а начали мы его заполнять не с начала, а с адреса 30. После записи 34-х байт 12
следует сформировать сигнал STOP, и из буфера будут записаны в память переданные из микроконтроллера 34 байта. Каким образом можно определить, в какое место буфера происходит текущая запись? Можно считать, что младшие 6 битов адреса ячейки памяти, куда производится запись, являются адресом ячейки памяти в буфере, куда заносится текущий байт. Когда в процессе записи микроконтроллер доходит до последней ячейки буфера, младшие биты адреса будут иметь вид 111111. После записи байта в эту последнюю ячейку буфера, адрес имеет в младших битах все нули. Это и является признаком того, что нужно прекратить передачу и очистить буфер, выдав STOP. У программиста нет прямого доступа к внутреннему счетчику адреса микросхемы памяти. Однако, программа пользователя может иметь свою собственную переменную – аналог внутреннего счетчика адреса микросхемы памяти. Программа должна инкрементировать значение этой переменной с каждой новой записью байта данных. Таким образом, программа пользователя может самостоятельно определять заполнение буфера и выдавать сигнал STOP в нужный момент времени. Затем можно снова начать запись, отправив в микросхему памяти новый начальный адрес записи, который, кстати, будет иметь младшие разряды вида 000000, т. е. соответствует началу буфера. Если дальше передача ведется длинной последовательностью подряд идущих байт, то перезапись будет происходить уже по целому буферу, а не по его части, что заметно повышает среднюю скорость записи информации в память. Чтение одного байта или нескольких последовательно расположенных (в адресном пространстве) байт из памяти При чтении данных из памяти надо выполнить следующую, на первый взгляд не совсем естественную процедуру. А именно, надо сначала сделать вид, что мы собираемся выполнять запись байта в указанный адрес, а затем переключиться на чтение данных. Такая “хитрая” операция необходима для того, чтобы установить внутренний счетчик адреса микросхемы памяти в нужное значение. Чуть более подробно эта процедура (c точки зрения микроконтроллера) выглядит так: 1. Выдать запросный пакет (с признаком записи информации). Получить ACK. 2. Выдать два байта адреса. На каждый получить ACK. 3. Выдать запросный пакет (с признаком чтения информации). Получить ACK. 4. Принять байт информации из памяти. Далее возможны два варианта. Если микроконтроллер собирается продолжить чтение данных, то необходимо выдать (из микроконтроллера!) сигнал ACK - подтверждение принятия байта из памяти. По этому сигналу микросхема памяти подготовит для выдачи следующий байт. Затем контроллер переходит к началу пункта 4 и т.д. Если контроллер не собирается продолжать чтение следующего байта, он должен вместо ACK выдать специальную комбинацию сигналов на линиях SCL и SDA, которая называется сигналом NACK (отсутствие подтверждения). Далее 13
контроллер формирует STOP и заканчивает сеанс связи с периферией. Описанные выше варианты чтения иллюстрируются рисунками рис. 7 и 8.
Рис. 7. Чтение одного байта
Рис. 8. Чтение последовательности байт Чтение из памяти происходит очень быстро и никаких специальных задержек не требует. Фактически быстродействие при чтении ограничивается только максимальной частотой подачи синхроимпульсов, о которой мы упоминали выше. Отметим, что у разных микросхем памяти может быть различный размер буфера. Обычно, чем меньше объем памяти, тем меньше размер буфера. Для уточнения размера буфера у каждого конкретного типа памяти следует обратиться к техническому описанию данной микросхемы. Теперь коротко сформулируем основные моменты, которые необходимо понимать при работе с последовательной памятью. 1. Имеются два специальных сигнала, один из которых начинает сеанс связи с периферией (сигнал START), второй заканчивает сеанс связи (сигнал STOP). 2. Вслед за сигналом START всегда следует запросный байт с адресом slaveустройства и признаком записи/считывания информации, говорящим о дальнейших намерениях микроконтроллера, инициирующего сеанс связи. 3. Далее из микроконтроллера в память передаются два байта адреса, которые должны указать ячейку памяти с которой контроллер собирается выполнить какие-то действия. 4. Каждая передача данных из контроллера в память должна завершаться передачей от памяти к микроконтроллеру специального сигнала ACK, подтверждающего успешный прием микросхемой памяти байта информации от контроллера. Аналогично, микроконтроллер должен формировать ACK при 14
каждом получении байта данных от микросхемы памяти. Имеется одно исключение – выдача контроллером сигнала NACK в случае, если контроллер хочет прервать сеанс последовательного чтения данных из памяти. Понимание этих основных принципов и внимательное изучение приведенных выше рисунков позволяет успешно реализовать операции обмена данными с последовательной памятью. В заключение заметим, что некоторые PIC-контроллеры имеют встроенные аппаратную поддержку шины I2C, что позволяет написать более эффективную программную библиотеку для обмена данными с последовательной памятью и несколько облегчить работу программиста, возложив большинство операции на аппаратную часть PICконтроллера. И последнее замечание. Последовательная память 24LC256 и аналогичная ей память другой емкости и других фирм предназначена в первую очередь для хранения и чтения данных и только во вторую очередь – для записи. Ресурс микросхемы памяти по чтению практически неограничен. А вот ресурс по количеству записи в одну ячейку памяти (по данным фирм-изготовителей) может составлять “всего” сто тысяч перезаписей. На первый взгляд это очень много, но легко подсчитать, что при желании этот ресурс легко исчерпать за несколько дней работы прибора. А вот ресурс по времени хранения записанной информации действительно большой – может достигать 200 лет! Схема лабораторной установки представлена на рис. 9.
Рис. 9 15
Практическая часть: 1. Прочесть методичку и после собеседования с преподавателем получить у него задание. 2. Написать и отладить программу в среде MPLAB. 3. С разрешения преподавателя занести программу в PIC16F877. 4. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - блок-схему алгоритма; - комментированный листинг программы. Комментарии на английском языке предпочтительны.
Лабораторная работа №9 Последовательная передача данных Цель работы: изучение метода асинхронной передачи данных на примере организации связи лабораторной установки с последовательным портом IBM PC. Методические указания Устройства на базе микроконтроллеров часто используются в качестве периферийных устройств сбора и первичной обработки информации, работающих в составе более сложной информационной системе, включающей в себя большую ЭВМ, предназначенной для решения более сложных задач анализа и хранения собранной информации. Существует несколько способов подключения устройств к ЭВМ, в зависимости от требуемой скорости передачи. Подключение к IBM PC устройств с относительно низким быстродействием осуществляется через последовательный порт передачи данных (COM-порт). В данной работе рассматривается подключение к СОМ-порту IBM PC простейшего устройства ввода данных, передающего в РС символы в виде ASCII-кода, отображаемые на экране компьютера. Код ASCII каждого символа состоит из восьми бит. Таблица ASCII-кодов приведена в приложении. Главное отличие последовательной передачи данных от параллельной заключается в том, что при последовательной передаче информация передается по одному биту в единичный интервал времени. (При параллельном – сразу 16
байт или несколько байт). Для параллельной передачи данных требуется столько проводников, сколько бит одновременно вы хотите передать. Таким образом, главное достоинство последовательной передачи данных – малое количество проводов, необходимых для организации передачи, а главный недостаток – относительно низкая скорость передачи информации. Существует две разновидности данных:
последовательного способа передачи
1) синхронный:
Необходимое условие – наличие одного синхрогенератора для приемника и передатчика. Достоинства: высокая скорость передачи. Недостаток: необходимость специального синхропровода для передачи синхросигнала (для синхронной работы приемника и передатчика) 2) асинхронный:
Генератор приемника периодически подстраивается под генератор передатчика по специальным сигналам синхронизации. Для подстройки используют специальную структуру передаваемых сигналов. Обычно синхросигнал предшествует началу передачи блока данных и называется стартовым битом. Данные в последовательный порт передаются пакетами. Структура пакета данных:
17
Из рисунка видно, что исходное состояние линии последовательной передачи данных – уровень логической единицы. Стартовый бит служит для формирования перехода из единицы в ноль, который означает начало передачи данных. Далее передаются биты данных (от 5 до 8 шт. в зависимости от выбранного вами формата данных), далее возможно наличие бита проверки на четность (на рисунке отсутствует), а затем один или два стоповых бита, завершающих передачу пакета и устанавливающих уровень линии в единицу до прихода следующего стартового бита (следующего пакета данных). Структура пакета, формируемого передатчиком, должна быть известна приемнику, иначе он не сможет правильно организовать прием. Другая важная характеристика – скорость передачи данных. Она должна быть одинаковой для передатчика и приемника. Скорость последовательной передачи измеряется в бодах. Боды – количество бит (как информационных так и вспомогательных), передаваемых в секунду. Последовательный порт IBM PC поддерживает следующие скорости передачи данных: 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 бод. Главная трудность передачи данных через последовательный порт связана с эффектом накапливания погрешности рассинхронизации с течением времени. Он иллюстрируется рисунком: Передаваемые контроллером данные. Жирными точками отмечены моменты возможного изменения сигнала. 1
2
3
Старт.бит Погрешность
4
5
6
Биты данных
Стоповые биты
Середина передаваемого бита
Синхросигнал
1 2 3 4 5 6 Сигналы синхронизации последовательного порта. Они должны совпадать с серединой каждого бита информации. Пунктиром показаны идеальные синхроимпульсы. Видно, что в середине стартового бита включается генератор синхронизирующих сигналов приемника (COM-порта). На каждом синхросигнале считывается значение со входа порта. Если длительность передачи контроллером одного бита пакета отличается от периода синхросигналов, появляется погрешность. С каждым следующим
18
передаваемым битом погрешность накапливается и возможна ошибка. Например, на рисунке 5-й синхроимпульс приходится на 6-й бит пакета. Для обмена информации с COM-портом необходимо выбрать скорость работы последовательного порта из указанных выше и протокол передачи данных. Обычно выбирается один стартовый и один стоповый бит. Задержка между выдачей битов пакета должна быть согласована с выбранной скоростью. Приведем пример расчета задержки для скорости порта 300 бод. Тактовая частота микроконтроллера равна 32768 Гц. Учитывая, что в одном цикле содержится 4 такта, в секунду выполняется 32768/4=8192 цикла. Таким образом, необходимо выдавать очередной бит через 8192/300=27,31 циклов. Максимальная допустимая ошибка рассинхронизации при передаче пакета равна половине задержки между выдачей битов, т. е 13,65 циклов. Всего пакет содержит 10 битов, поэтому погрешность рассинхронизации каждого бита не должна превышать 1,365 цикла. Следовательно, допустимые интервалы задержки составляют 26,27,28 циклов. Схема лабораторной установки представлена на рис. 1. Инверторы выполняю преобразование сигналов к инверсному виду, согласованному с правилом формирование сигналов на входе/выходе СОМ-порта. Реализована самая простая схема связи с PС, называемая “Связь по трем проводам.” Имеется в виду проводники, присоединенные ко входам R×D (вход приемника СОМ-порта), T×D (выход передатчика СОМ-порта) и “Земля”.
Для связи с РIС со стороны компьютера запускается терминальная программа HiperTerminal, входящий в стандартный набор программ Windows. 19
Перед началом работы необходимо настроить терминальную программу. Надо установить в настройках терминальной программы работу через второй СОМпорт, установить требуемую скорость передачи, задать формат передаваемых блоков, отключить все виды аппаратного или программного контроля. После этого можно начинать передавать данные в PIC, нажимая на клавиши клавиатуры или передавать символы от PIC к компьютеру в соответствии с программой, прошитой в PIC-е. В этом случае принятые символы будут отображаться на экране компьютера. Практическая часть: 1. Получить у преподавателя задание. 2. Написать программу. 3. Отладить программу в эмуляторе. 4. С разрешения преподавателя занести программу в PIC16F84. 5. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - расчет задержки; - алгоритм программы; - комментированный листинг программы.
20
Приложение 1 Таблицы ASCII-кодов символов Первые 128 символов представляют собой стандартный набор ASCII-символов, а последние 128 символов являются расширением. В таблице приведена стандартная расширенная кодовая таблица ASCII символов. Например, символ “1” имеет код 0×31, а символ “C” имеет код 0×43. Таблица 1 Стандартная расширенная кодовая таблица ASCII символов (номер 437)
Как видно, в этой таблице полностью отсутствуют символы кириллицы. В настоящее время существуют несколько вариантов кодировки русских букв (кириллицы) для операционной системы MS-DOS – основная, альтернативная, минская и т. д. Они отличаются, в основном, расположением русских букв и символов псевдографики. Однако наибольшее распространение получила альтернативная таблица кодировки, особенно после того, как в 1989 году эта таблица была принята IBM в качестве стандартной для Советского Союза.
21
Таблица 2 Альтернативная русская кодовая таблица ASCII символов (номер 866)
22
Лабораторная работа № 10 Работа с прерываниями, сторожевой таймер, прескалер, универсальный таймер-счетчик Цель работы: обучить использованию механизма прерывания и сторожевого таймера для эффективной организации программ, распознаванию источников сброса и прерывания. Методические указания Существуют две ситуации, когда программный счетчик микроконтроллера принудительно (не по команде программы) меняет свое состояние. 1. Сброс (перезапуск) контроллера, когда счетчик устанавливается в ноль и программа начинает работать сначала. 2. Прерывание программы и переход на выполнение программы по адресу 04. Возможны различные причины возникновения первой или второй ситуации. Распознавание причины прерывания или сброса 0 не совсем простая задача и требует четкого понимания реакции микроконтроллера в различных ситуациях. Грамотно написанная программа должна выполнять распознавания различных источников возникновения этих событий и при необходимости выполнять те или иные действия в зависимости от причины, вызвавшей сброс или прерывание. Сложные программы, использующие все возможности микроконтроллера, обычно имеют в начале программы (по нулевому адресу) обращение к подпрограмме – обработчику сброса, которая выясняет причину сброса и действует в соответствии с выявленной причиной. По адресу 04 в программной памяти обычно располагают обращение к подпрограмме распознавания прерывания, которая решает аналогичную задачу в случае возникновения прерывания. Т. е. общий вид программы может быть следующий: ;--------------------------------------------------------------------------------ORG 0 ; начало программы с нулевого адреса CALL Reset_Detection ; обращение к подпрограмме ; определения причины перехода программы на нулевой адрес. GOTO Main_Program ORG 4 ; продолжение программы с адреса 04 CALL Interrupt_Detection ; обращение к подпрограмме ;определения источника прерывания Main_Program : ;---------------------------------------------------------------------------
23
Организация прерываний Прерывания в PIC16C84 могут быть от четырех источников: - внешнее прерывание с ножки RB0/INT, - прерывание от переполнения счетчика/таймера RTCC, - прерывание по окончании записи данных в EEPROM, - прерывание от изменения сигналов на ножках порта RB<7:4>. К работе микроконтроллера по прерываниям имеют отношения три группы флагов-битов. К первой группе относятся флаги, которые устанавливаются в единичное состояние в момент возникновения события, которое может вызвать прерывание. Тут следует различать два понятия: возникновение события, которое может вызвать прерывания и собственно прерывание, которое выражается в прерывании работы микроконтроллера и переходе на подпрограмму обработки прерывания. Если событие произошло, то оно будет отмечено в первой группе флагов, но не обязательно вызовет прерывание. Вторая группа флагов – разрешает или запрещает каждый тип прерывания индивидуально. Это “разрешительная” группа флагов. Флаги в первой группе взводятся независимо от состояния флагов второй группы и должны сбрасываться самой программой обработки прерывания. Таким образом, первая группа является просто индикатором возникновения того или иного события, которое вызывает прерывание, если оно разрешено флагом второй группы и если вообще все прерывания не запрещены флагом третьей группы. И, наконец, третья группа флагов состоит из единственного флага полного запрета всех прерываний. Все три группы флагов объединены в регистр INTCON (адрес 0Вh). Все прерывания имеют один и тот же вектор/адрес – 0004h. Это означает, что при возникновении любого прерывания происходит принудительный переход к выполнению команды, расположенной в памяти программ по адресу 04h. Адрес возврата автоматически сохраняется в аппаратном стеке. В регистре INTCON записывается информация, по которой можно узнать, от какого именно источника поступил запрос прерывания. Эта информация записывается в виде перевода в единичное состояния соответствующего бита-флага в регистре INTCON. Единственным исключением является прерывание по концу записи в EEPROM. Этот флаг находится в другом регистре – EECON1. Бит общего разрешения/запрещения прерывания GIE (INTCON <7>) разрешает (если=1) все индивидуально незамаскированные прерывания или запрещает (если=0) их. Каждое прерывание в отдельности может быть дополнительно разрешено/запрещено установкой/сбросом соответствующего бита в регистре INTCON.
24
При подаче напряжения питания бит GIE автоматически обнуляется, т. е. изначально все прерывания запрещаются. Если далее в программе разрешаются прерывания (GIE устанавливается программой в единицу), то когда прерывание происходит, выполняется переход на подпрограмму обработки прерывания. При этом бит GIE автоматически обнуляется, чтобы запретить дальнейшие прерывания. Адрес возврата посылается в стек, а в программный счетчик загружается адрес 0004h. Время реакции на прерывание для внешних событий, таких как прерывание от ножки INT или порта B, составляет приблизительно пять циклов. Это на один цикл меньше, чем для внутренних событий, таких как прерывание по переполнению от таймера RTCC. Время реакции от одного и того же источника всегда одинаковое. В подпрограмме обработки прерывания источник прерывания может быть определен по соответствующему взведенному биту в регистре флагов INTCON. Этот флаг-бит должен быть сброшен подпрограммой обработки прерывания. Флаги запросов прерываний не зависят от соответствующих маскирующих битов и бита общего маскирования GIE. Команда возврата из прерывания RETFIE должна завершать подпрограмму обработки прерывания. Она загружает в счетчик команд адрес возврата (берет из стека) и устанавливает в единичное состояние бит GIE, чтобы разрешить последующие прерывания. Если за время обработки данного прерывания произошло другое незамаскированное прерывание, то после выхода из текущего прерывания программа сразу перейдет к выполнению нового прерывания. Регистр запросов и масок INTCON Адрес: 0Bh Значение при reset= 0000 000? 7 GIE
6 EEIE
5 RTIE
4 INTE
3 RBIE
2 RTIF
1 INTF
0 RBIF
RBIF - Флаг прерывания от изменения на порту RB. Флаг устанавливается, когда сигнал на входе RB<7:4> изменяется. Любое изменение сигналов на четырех входах порта RB<7:4> установит бит RBIF (INTCON<0>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RBIE (INTCON<3>). Сброс флага RBIF должен выполнятся программой обработки этого прерывания. INTF - Флаг прерывания от входа INT. Флаг устанавливается, когда на ножке INT появляется сигнал от внешнего источника прерывания. Сбрасывается программным способом.
25
Внешнее прерывание на ножке RB0/INT осуществляется по фронту: либо по нарастающему (если бит 6 INTEDG=1 в регистре OPTION), либо по спадающему фронту (если INTEDG=0). Когда фронт обнаруживается на ножке INT, то бит запроса INTF устанавливается (INTCON <1>). Это прерывание может быть замаскировано установкой управляющего бита INTE в ноль (INTCON <4>). Бит запроса INTF должен быть очищен прерывающей программой перед тем, как опять разрешить это прерывание. Прерывание INT может вывести процессор из режима SLEEP, если перед входом в этот режим бит INTE был установлен в единицу. Состояние бита GIE также определяет: будет ли процессор переходить на подпрограмму прерывания после просыпания из режима SLEEP. RTIF - Флаг прерывания от переполнения внутреннего счетчика-таймера TMR0(RTCC). Переполнение счетчика TMR0 (старое обозначение этого счетчикаRTCC). При переходе состояния таймера из FFh в 00h установится бит запроса RTIF (INTCON<2>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RTIE (INTCON<5>). Сброс флага RTIF должен выполнятся программой обработки этого прерывания. RBIE - Бит разрешения/запрещения RBIF прерывания. Прерывание от от старших четырех разрядов порта B RBIE = 0: запрещает RBIE прерывание RBIE = 1: разрешает RBIE прерывание INTE - Бит разрешения/запрещения INT прерывания. INTE = 0: запрещает INT прерывание INTE = 1: разрешает INT прерывание RTIE - Бит разрешения/запрещения RTIF прерывания. RTIE = 0: запрещает RTIE прерывание RTIE = 1: разрешает RTIE прерывание EEIE - Бит разрешения/запрещения прерывания EEPROM записи. EEIE = 0: запрещает EEIF прерывание EEIE = 1: разрешает EEIF прерывание Флаг запроса прерывания по окончании записи в EEPROM, EEIF (EECON1<4>) устанавливается по окончании автоматической записи данных в EEPROM. Это прерывание может быть замаскировано сбросом
26
бита EEIE (INTCON<6>). Сброс флага EEIF должен выполнятся программой обработки этого прерывания. GIE - Бит разрешения/запрещения всех прерываний. GIE = 0: запрещает ВСЕ прерывания GIE = 1: разрешает ВСЕ прерывания, которые не запрещены индивидуальными битами Он сбрасывается в ноль автоматически при следующих обстоятельствах: - по включению питания; - по внешнему сигналу /MCLR при нормальной работе; - по внешнему сигналу /MCLR в режиме SLEEP; - по переполнению таймера WDT при нормальной работе; - по переполнению таймера WDT в режиме SLEEP. Сторожевой таймер Перезапуск микроконтроллера можно осуществить с помощью сторожевого таймера (Watchdog timer, WDT). WDT предназначен для того, чтобы избежать “зависания" микроконтроллера. Это таймер работает от собственного тактового генератора, который включается сразу после подачи напряжения питания. Импульсы этого генератора подсчитываются специальным регистром-счетчиком импульсов. Когда происходит его переполнение, выполняется автоматический перезапуск микроконтроллера, и выполнение программы начинается заново с нулевого адреса. Регистр-счетчик сторожевого таймера переполняется с периодом в 18 мсек. Для увеличения периода срабатывания WDT используют пределитель. Он представляет собой дополнительный счетчик, который подключается между генератором и счетчиком WDT. Для пределителя задается коэффициент деления, на величину которого увеличивается период срабатывания (переполнения) сторожевого таймера. Таким образом счетчик WatchDog таймера время срабатывания WDT составляет 18 мсек*коэффициент пределителя. В ходе нормального выполнения программы WDT необходимо периодически обнулять чтобы избежать ненужного перезапуска. Обнуление производится командой CLRWDT. Если произошло зацикливание или подвисание, то через предусмотренный промежуток времени (зависит от значения коэффициента деления пределителя) WDT подаст сигнал сброса, и программа будет выполняться заново. Подключение пределителя к WDT и задание коэффициента деления осуществляется с помощью регистра OPTION. Он расположен по адресу 81h и имеет следующую структуру:
27
Регистр OPTION: 7 RBPU
6 5 INTEDG T0C S
4 T0CE
3 PSA
2 PS2
1 PS1
0 PS0
Чтобы подключить пределитель к WDT, необходимо установить в единицу бит PSA. Биты PS2, PS1, PS0 задают коэффициент деления пределителя в соответствии со следующей таблицей: PS2, PS1, PS0 Коэфф. Деления 000 1 001 2 010 4 011 8 100 16 101 32 110 64 111 128
1. RBPU – включение или отключение подтягивающих резисторов ко входу порта В. 2. INTEDG – значение фронта, по которому происходит прерывание RBO/INT (1 – прерывания будут происходить по положительному фронту). 3. T0CS – указывает источник тактовых импульсов для внутреннего счетчика-таймера TMR0. Если = 1, то внутренний счетчик будет заполняться импульсами со входа RA4, если = 0 – от основного тактового генератора микроконтроллера импульсами начала машинного цикла (частота F/4). 4. T0SE – указывает по какому фронту увеличивается значение внутреннего счетчика TMR0. Если T0SE = 1 – увеличение по отрицательному фронту (переход из единицы в ноль), T0SE = 0 – по положительному фронту (из нуля в единицу). Счетчик-таймер TMR0 Счетчик-таймер представляет собой восьмиразрядный двоичный счетчик, который удобно использовать для подсчета внешних импульсов или для измерения временных интервалов. При переполнении счетчика взводится соответствующий флаг прерывания T0IF, как было описано выше. Таймер может быть в любой момент прочитан или изменен программным образом. Его адрес – 01h.
28
В качестве источника тактовых импульсов может быть выбран один из двух источников. 1. Внешний источник тактовых импульсов, подключенный ко входу RA4/T0CKI (в ранней литературе используется обозначение RA4/RTCC). 2. Внутренний источник тактовых импульсов, совпадающий по частоте с частотой циклов. Период срабатывания таймера может быть увеличен путем подключения к нему прескалера с заданным коэффициентом деления (см рис. 1). Все настройки таймера и прескалера производятся с помощью регистра OPTION, рассмотренного выше.
Рис 1. Схема таймера TMR0 и связанных с ним блоков Чтобы подключить пределитель к TMR0, необходимо сбросить в ноль бит PSA регистра OPTION. Биты PS2, PS1, PS0 задают коэффициент деления пределителя в соответствии со следующей таблицей: PS2, PS1, PS0 Коэфф. Деления 000 2 001 4 010 8 011 16 100 32 101 64 110 128 111 256
Как видно из этой таблицы, коэффициент деления пределителя отличается вдвое от аналогичного коэффициента деления для случая подключения пределителя к сторожевому таймеру. Типы перезапусков программы Срабатывание сторожевого таймера приводит к перезапуску программы с нулевого адреса. При включении питания микроконтроллер также начинает выполнение программы с нулевого адреса. Есть еще некоторые ситуации, когда программа принудительно начинает свою работу с нулевого адреса. Как узнать, 29
в результате какого события мы оказались в начале программы? Необходимая для ответа на этот вопрос информация находится в регистре STATUS, описанном в лаб. работе 2. Рассмотрим сейчас более подробно флаги регистра STATUS, которые имеют отношение к перезапуску контроллера. Аппаратные биты статуса TO (Time Out- STATUS<4>) и PD (Power Down- STATUS<3>) По состоянию битов регистра статуса "TO" и "PD" можно определить, чем был вызван "Сброс". Возможны 4 варианта: - просто включение питания; - срабатывание (переполнение) таймера watchdog; - при поступлении нулевого сигнала на вход сброса контроллера - MCLR, когда микроконтроллер находился “в спячке”, т. е. в режиме пониженного энергопотребления SLEEP; - при поступлении нулевого сигнала на вход сброса контроллера - MCLR, когда контроллер выполнял обычные операции. На состояние этих битов данные события влияют следующим образом: События Включение питания WDT timeout Срабатывание MCLR (не в режиме SLEEP) Выход из Sleep по MCLR CLRWDT команда
TO 1 0 Х
PD 1 Х Х
1 1
0 1
Примечание Не воздействует на бит PD Не воздействует на оба бита
Примечание: Биты TO и PD сохраняют текущее состояние до тех пор, пока не произойдет одно из событий, перечисленных в таблице. Практическая часть: 1. Внимательно прочесть методичку. После собеседования с преподавателем получить задание. 2. Написать и отладить программу с использованием прерываний или сбросов. 3. Ввести программу в лабораторный макет и продемонстрировать преподавателю ее работу. 4. Получить отметку о выполнении задания. Отчет должен содержать: - задание; - схему лабораторной установки; - блок-схему алгоритма; - комментированный листинг программы. 30
Лабораторная работа № 11 Использование PIC16F84 для управления микропроцессорной автоматизированной системой. Регулирование температуры воздуха в помещении Цель работы: изучение арифметических команд PIC16F84 и использования шагового двигателя для вращения вентилятора с переменной скоростью. Методические указания Автоматизированные системы управления (АСУ) – одно из важнейших применений микропроцессорной техники. Примерами АСУ могут быть пожарная сигнализация, беспилотные летательные аппараты, и т. д. В данной работе рассматривается автоматизированная система управления температурой воздуха в помещении. Управление температурой сводится к периодическому опросу температурного датчика и, в зависимости от полученной информации, регулированию скорости вращения ротора двигателя вентилятора. Рассмотрим сначала опрос температурного датчика. Реализованный в данной работе способ получения числа, пропорционального текущей температуре, заключается в следующем. К двум выводам микроконтроллера подключается RC-фильтр вида:
где R – терморезистор. Пусть в данный момент на входе фильтра напряжение логического нуля (близкое к нулю). Подадим теперь на вход напряжение логической единицы. Сигнал на выходе будет иметь вид: U
τ
Uвлу
t где Uвлу – минимальное напряжение, при котором сигнал принимает значение логической единицы, τ – время переходного процесса. τ равно задержке между подачей логической единицы на вход фильтра и появлением ее на выходе. Можно показать, что τ = RC. Емкость конденсатора постоянна, а сопротивление терморезистора возрастает при увеличении температуры окружающего воздуха. Поэтому величина задержки пропорциональна температуре. 31
Задержку нетрудно подсчитать в программе. Зная ее, можно вычислить необходимую для охлаждения помещения скорость работы двигателя. Для работы с цифровыми устройствами лучше всего подходит так называемый шаговый двигатель. Ротор в нем вращается дискретно, и его положение изменяется шагами. В этом двигателе используется две обмотки. Для вращения на них должны подаваться следующие сигналы: t (для первой обмотки) t (для второй обмотки) Из рисунка видно, что на каждую обмотку должен подаваться меандр. Каждое изменение напряжения на обмотках соответствует повороту ротора на один шаг. Заметим, что напряжения верхнего и нижнего уровня меандров равны соответственно +U и –U. В работе 1 рассматривался способ генерации меандра с уровнями U и 0, и для того, чтобы его применить, нужно преобразовать напряжения в +U, -U. Для преобразования напряжений используется схема: R2 +5В VT2
R1
3 4
VT1
VT3
VT4 M1
1 2
VT5
VSS
Вход
Рассмотрим работу этой схемы. Пусть на вход схемы подается логический ноль. Тогда VT3 закрыт, и на базах VT1 и VT5 появляется логическая единица, а на базах VT2 и VT4 – логический ноль. VT1 и VT4 открываются, а VT2 и VT5 закрыты. Поэтому ток через обмотку двигателя течет от эмиттера VT1 к эмиттеру VT4. При подаче единицы на вход схемы состояния всех транзисторов изменяются на противоположные. Поэтому открыты VT2 и VT5 и ток течет через обмотку от эмиттера VT2 к эмиттеру VT5.
32
Итак, для управления одной обмоткой достаточно выдавать меандр на один из выводов микроконтроллера. На другой вывод необходимо подавать меандр, смещенный во времени. Поэтому выдача на два вывода микроконтроллера через равные промежутки времени чисел 002, 012, 112, 102 вызывает непрерывное вращение ротора двигателя. Подбирая величину этих промежутков, можно регулировать скорость вращения вентилятора. Схема лабораторной установки состоит из фильтра, вход которого подсоединен к RB0, а выход – к RB1. Обмотки двигателя через 2 схемы преобразования напряжений подключены к выводам RA0, RA1. Подключение VSS, VDD, OSC1, OSC2 аналогично рассмотренному в работе 1. Температура в помещении меняется медленно, поэтому можно выполнять ее оценку примерно раз в секунду. Оценка температуры длится в зависимости от параметров фильтра от нескольких микросекунд до нескольких миллисекунд. Большую часть времени будет работать двигатель, поэтому его можно считать вращающимся непрерывно. Таким образом, каждую секунду необходимо повторять один и тот же фрагмент программы. Есть два подхода к решению этой задачи. Первый подход заключается в оформлении этого фрагмента как тела цикла. Второй использует перезапуск программы с нулевого адреса приблизительно каждую секунду. Программа в этом случае представляет из себя оценку температуры и бесконечный цикл вывода меандров. Перезапуск можно осуществить с помощью сторожевого таймера (Watchdog timer, WDT). WDT предназначен для того, чтобы избегать “подвисание" микроконтроллера. Это таймер, работающий на собственной тактовой частоте, не зависящей от тактовой частоты микроконтроллера. WDT имеет собственный регистр-счетчик, который через определенные промежутки времени инкрементируется. Когда происходит его переполнение, выполняется автоматический перезапуск микроконтроллера, и выполнение программы начинается заново с нулевого адреса. По умолчанию регистр-счетчик сторожевого таймера инкрементируется внутренним тактовым генератором и переполняется с периодом в 18 мсек. Для увеличения периода срабатывания WDT используют предилитель. Он подключается между источником частоты и счетчиком WDT. Для пределителя задается пороговое значение, при превышении которого производится обнуление пределителя и инкрементирование счетчика. Таким образом счетчик WatchDog таймера подсчитавает количество переполнений пределителя и время срабатывания WDT составляет 18 мкс*порог пределителя. Примечание. В предыдущих работах WDT не использовался поэтому был отключен. Чтобы его включить необходимо перед прошивкой программы в микроконтроллер выбрать WDT – on в настройках ComPic (ConfigFuses).
33
В ходе нормального выполнения программы WDT периодически обнуляют чтобы избежать ненужного перезапуска. Это можно сделать командой CLRWDT. Если произошло зацикливание или подвисание, то через предусмотренный промежуток времени (зависит от значения коэффициента деления пределителя) WDT подаст сигнал сброса и программа будет выполняться заново. В нашем случае это можно использовать следующим образом. В начале программы опрашиваем RC-цепочку, выбираем нужную скорость вращения шагового двигателя и запускаем бесконечный цикл подачи меандров на соответствующие выводы микроконтроллера. По истечению запланированного времени произойдет сброс. Программа опять будет опрашивать RC-цепочку и т. д. Подключение пределителя к WDT и задание коэффициента деления осуществляется с помощью регистра OPTION. Он расположен по адресу 81h и имеет следующую структуру: 7 6 5 4 Не рассматриваются в работе. Равны 1
3 PSA
2 PS2
1 PS1
0 PS0
Чтобы подключить пределитель к WDT, необходимо установить в единицу бит PSA. Биты PS2, PS1, PS0 задают порог пределителя по следующей таблице: PS2, PS1, PS0 Коэфф. Деления 000 1 001 2 010 4 011 8 100 16 101 32 110 64 111 128
Для вычисления задержки при выводе меандров на обмотки двигателя понадобятся арифметические команды: ADDWF f, d SUBWF f, d SUBWF вычитает из содержимого ячейки f значение аккумулятора и, в зависимости от признака d, сохраняет результат в ячейку или в аккумулятор. ADDWF складывает аккумулятор с содержимым ячейки f. Существуют аналогичные команды для работы с литералами: ADDLW k SUBLW k
34
SUBLW вычитает из аккумулятора константу и результат записывает в аккумулятор. ADDLW складывает значение аккумулятора с константой. Практическая часть: 1. Получить у преподавателя задание. 2. Написать программу. 3. Отладить программу в эмуляторе. 4. С разрешения преподавателя занести программу в PIC16F84. 5. Проверить работу программы на лабораторной установке. Отчет должен содержать: - задание; - схему лабораторной установки; - алгоритм программы; - комментированный листинг программы.
35