Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра «Электроника»
ЦИФРОВЫЕ УСТРОЙСТВА И
МИКРОПРОЦЕССОРЫ
PIC -СИМУЛЯТОР
Методические указания к выполнению лабораторных работ
для студентов всех форм
обучения специальности
5В070400 – Вычислительная техника и программное обеспечение
Алматы 2010
СОСТАВИТЕЛЬ: Б.С. Байкенов. PIC-симулятор. Методические указания к
выполнению лабораторных работ по
дисциплине «Цифровые устройства и микропроцессоры» для студентов всех форм
обучения специальности 5В070400 – Вычислительная техника и программное обеспечение. – Алматы: АУЭС, 2010. – 25 с.
В методической разработке приводятся краткие сведения
об архитектуре семейства PIC-микроконтроллеров фирмы Microchip и PIC-симуляторе, позволяющего пользователю осуществить
программно все этапы обработки информации. Приведены схемные и программные
решения, касающихся взаимодействия PIC-микроконтроллеров с популярной периферией и
реализации типовых интерфейсов.
Рассмотрены примеры программной реализации различных функций: внутренней
FLASH-памяти программ и EEPROM-памяти данных, аналого-цифрового преобразования,
асинхронной передачи данных с помощью модуля UART и отображения информации на двухстрочном
жидкокристаллическом дисплее LCD.
Методическая
разработка составлена в целях закрепления лекционного материала и предназначена
для всех форм обучения специальности 5В070400 – Вычислительная техника и программное обеспечение.
ВВЕДЕНИЕ
Основной целью методических указаний является
закрепление знаний по разработке микроконтроллерных систем управления и
приобретение практических навыков программирования на симуляторе, оснащенного
ассемблером PIC-микроконтроллера фирмы Microchip.
Микроконтроллеры - разновидность микропроцессорных
систем, ориентированная на реализации алгоритмов управления техническими
устройствами и технологическими процессами производства.
Микроконтроллер имеет малый объем памяти и
ограниченный состав внешних устройств, реализуют заранее известные и несложные
алгоритмы. Набор внешних устройств также существенно сужается, а сами они
значительно проще. Микроконтроллеры используется в таких областях производства,
как бытовая аппаратура, станкостроение, автомобильная промышленность и т. д.
В последнее время фирма Intel сосредоточила усилия на
разработке сложных микропроцессоров для компьютеров и уступила сектор рынка
простых микроконтроллеров другим фирмам, в частности, фирмам Atmel и Microchip.
Наиболее широко представлены МК фирмы Microchip серии
PIC, которые будут рассмотрены более подробно в данной разработке.
PIC Simulator IDE - это мощное приложение, которое предназначено
для разработчиков в графической среде Windows с интегрированным BASIC
компилятором, ассемблером, дизассемблером и отладчиком.
В главном окне программы отображается PIC-микроконтроллер c внутренней
мнемоникой, последней выполненной инструкцией, мнемоника следующей инструкции,
такт и счетчик в режиме реального времени.
В меню Tools содержатся следующие основные команды:
- PROGRAM Memory Editor - команда открывает доступ
к редактору FLASH памяти программ и позволяет вручную ввести код операции
инструкции;
- EEPROM Memory Editor - команда открывает доступ
к редактору EEPROM памяти данных;
- Hardware Stack Viewer (аппаратный стек) - команда
откроет аппаратный стек буфера просмотра;
- Assembler - команда запускает ассемблер (по умолчанию
расширение ASM).
Директивы ORG (.ORG), EQU (.EQU), DB (.DB),
DEFB (.DEFB), DW (.DW), END (.END) ассемблера поддерживаются. Конфигурация
слова и буферов памяти также сохраняются в файл HEX. Эти буферы доступны и
редактируются. Также можно использовать директивы D (.DCONF), DEFCONF (.DEFCONF).
Как и ранее рассмотренный симулятор 8085 Simulator IDE,
симулятор PIC Simulator IDE очень удобен, прост в обращении
и позволяет студентам разрабатывать программы в ассемблере для РГР, курсового и
дипломного проектирования (не выходя из дома) на персональном компьютере.
.
1 Лабораторная
работа №1. Память данных EEPROM
Цель работы: изучить организацию внутренней памяти
программ и данных микроконтроллера, методы чтения и записи EEPROM данных.
1.1 Общие
сведения
Данные из EEPROM памяти могут быть прочитаны/записаны
в нормальном режиме работы микроконтроллера. Операции выполняются с одним
байтом для EEPROM памяти данных. Запись производится по принципу "стирание
- запись" для каждого байта.
При записи байта автоматически стирается
соответствующая ячейка, а затем выполняется запись. Запись в EEPROM память
данных не воздействует на выполнение программы.
В течение операции записи тактовый генератор
продолжает работать, периферийные модули включены и генерируют прерывания,
которые "ставятся в очередь" до завершения цикла записи. После
завершения записи выполняется загруженная команда (из-за конвейерной обработки)
и происходит переход по вектору прерываний, если прерывание разрешено и условие
прерывания возникло во время записи.
Доступ к функциям записи/чтения EEPROM памяти данных
выполняется через 4 регистра специального назначения:
- EEDATA;
- EEADR;
- EECON1;
- EECON2.
Операции чтения/записи EEPROM памяти данных не приостанавливают
выполнение программы. В регистре EEADR сохраняется адрес ячейки EEPROM памяти
данных. Данные сохраняются/читаются из регистра EEDATA. В PIC16F877 объем
EEPROM памяти данных 256 байт.
Для управления памятью предназначен регистр EECON1,
который содержит биты управления косвенной записи/чтения EEPROM памяти данных и
FLASH памяти программ. Регистр EECON2 физически не реализован, но используется
только при записи для контроля внимания пользователя.
Значение бита EEPRG в регистре EECON1<7>
определяет тип памяти, к которой обращаются (см. таблицу 1.1). Если EEPRG = 0, то операции относятся к EEPROM
памяти данных, а если EEPRG = 1, то - к FLASH памяти программ.
В операции чтения используется только один
дополнительный бит RD, инициализирующей операцию чтения из указанной памяти.
Установив бит RD в «1», значение ячейки памяти будет доступно в регистре
данных.
Для чтения из EEPROM памяти данных необходимо только
записать адрес в регистр EEADR и сбросить бит EEPRG в 0. После установки в 1
бита RD данные будут доступны в регистре EEDATA в следующем машинном цикле.
Данные в регистре EEDATA сохраняются до выполнения следующей операции чтения
или записи в EEDATA.
В операции записи используются два служебных бита WR,
WREN и два бита статуса WRERR, EEIF. Бит WREN применяется для разрешения/запрещения
записи. Флаг прерывания EEIF PIR2<4> устанавливается в 1 по завершении
записи.
Таблица 1.1 – Регистр EECON1 (адрес 18Ch)
EEPGD |
- |
- |
- |
WRERR |
WREN |
WR |
RD |
Бит 7 Бит 0
Бит 7: EEPGD – выбор памяти
1 = FLASH память программ;
0 = EEPROM память данных;
Биты 6-4: не используются;
Бит 3: WRERR – флаг ошибки данных
1 = запись прервана по переполнению;
0 = запись завершена;
Бит 2: WREN – разрешение записи данных
1 = запись разрешена;
0 = запись запрещена;
Бит 1: WR – инициализировать запись данных;
1 = инициализировать запись;
0 = запись завершена;
Бит 0: RD – инициализировать чтение данных
1 = инициализировать чтение;
0 = чтение завершено.
1.2 Моделирование
в PIC Simulator IDE
1.2.1 Исследование памяти данных EEPROM.
Необходимо выполнить следующие действия:
- запустить PIC Simulator IDE;
- нажать Options/Select
Microcontroller;
- выбрать PIC16F84 и нажать
кнопку Select;
- нажать File/Load Program;
- выбрать
файл eeprom.hex и нажать на «Open». Начнется
загрузка программы в память PIC;
- нажать на Tools/EEPROM Memory Editor. Откроется окно EEPROM Memory
Editor, и можно отрегулировать
его расположение для лучшего обзора;
- нажать
на Options/Change
EEPROM Write Time, ввести 100 для нового
значения и нажать на OK;
Реальное значение составляет около 20000 циклов синхронизации
при 4 MHz. Выбранное значение 100 - короткое, потому что оно не
может оказать воздействие на функциональность программы, но может значительно
сократить время выполнения моделирования;
- выбрать Rate/Extremely Fast;
- выделить опцию в Options/Infinite Loop Stops Simulation;
- нажатием
на «Simulation/Start» начнется
моделирование.
Эта программа заполняет всю память данных EEPROM и
введет МК в бесконечный цикл. Выявив бесконечный цикл, симулятор автоматически
остановит моделирование.
Рисунок 1.1 - Вид экрана с выполняемой программой
1.2.2 Листинг программы.
Dim a As Byte ; адрес ячейки в EEPROM
Dim
b As Byte ; данные, которые будут записаны в EEPROM
For
a = 0 To 63 ; цикл для адресов EEPROM емкостью 64
байта
b
= 255 – a ; значение ‘b’ для записи в память
Write a, b ; запись ‘b’ в ячейку ‘a’
Next
a ; выбор следующей ячейки ‘a’ EEPROM
1.3 Контрольные вопросы
1)
Какие регистры управляют памятью микроконтроллера?
2)
В какие регистры помещаются адрес и данные?
3)
Для чего при операции записи используются EECON1 и EECON2?
4)
Какая емкость памяти данных EEPROM?
5)
Какая емкость памяти программ FLASH?
2 Лабораторная
работа №2. Модуль АЦП
Цель работы: изучение настройки каналов модуля
аналого-цифрового преобразователя с помощью регистров управления ADCON0 и ADCON1, а также
методов выравнивания результатов преобразования.
2.1 Общие
сведения
Модуль АЦП имеет восемь аналоговых каналов. Входной
аналоговый сигнал через коммутатор каналов заряжает внутренний конденсатор
СHOLD. Модуль АЦП преобразует напряжение, удерживаемое на конденсаторе СHOLD, в
соответствующий 10-разрядный цифровой код методом последовательного
приближения.
Для управления
АЦП используются два специальных регистра: ADCON0 и ADCON1, расположенные в 0 и
1 банках памяти соответственно. Регистр ADCON0 используется для настройки
работы модуля АЦП (см. таблицу 2.1).
Таблица 2.1 – Регистр ADCON0 (адрес 1Fh)
ADCS1 |
ADCS0 |
CHS2 |
CHS1 |
CHS0 |
GO/DONE |
- |
ADON |
Бит 7 Бит 0
Биты 7-6: ADCS1- ADCS0 – выбор источника тактового сигнала
00 = FOSC/2; 01 = FOSC/8; 10 = FOSC/32; 11 = FRC (внутренний генератор АЦП).
Биты 5-3: CHS2- CHS0 – выбор аналогового канала
000 = канал 0, (RA0/AN0); .... 101 = канал 4, (RA5/AN4);
101 = канал 5, (RE0/AN5); … 111 = канал 7, (RE2/AN7);
Бит 2: GO/DONE – бит статуса АЦП
1 = начало преобразования;
0 = состояние ожидания;
Бит 1: не используется;
Бит 0: ADON – включение АЦП
1 = модуль АЦП включен;
0 = АЦП выключен.
Регистр ADCON1 выбирает входы модуля и режимы работы,
выбранных каналов АЦП.
В регистры ADRESH:ADRESL сбрасывается 10-разрядный
результат цифрового преобразования и флаг GO/DONE (ADCON0) и устанавливается
флаг прерывания ADIF PIR1<6>.
После включения и конфигурации ФЦП выбирается рабочий
аналоговый канал. Соответствующие биты TRIS аналоговых каналов должны быть
настроены на вход. Перед началом преобразования обязательно необходимо
выдержать временную паузу не менее 20мкс.
Запись результата преобразования может выполняться с
правым или левым выравниванием (см. рисунок 2.1), в зависимости от значения
бита ADFM регистра ADCON1<7>. Не задействованные биты регистров
ADRESH:ADRESL читаются как «0». Если модуль АЦП выключен, то 8-разрядные регистры
ADRESH:ADRESL могут использоваться как регистры общего назначения.
Рисунок 2.1 – Выравнивание результата АЦП
2.2
Моделирование в PIC Simulator IDE
2.2.1 Исследование модуля АЦП.
Необходимо выполнить следующие действия:
- запустить PIC симулятор IDE;
- нажать на Options/Select Microcontroller;
- выбрать
PIC16F877 и нажать на
Select;
- нажать на File/Load Program;
- выбрать
adc.hex file и нажать
Open. Начнется загрузка программы в память PIC;
- нажать на Tools/Microcontroller View - откроется окно Microcontroller
View;
- отрегулировать
расположение окон для лучшего обзора;
- выбрать
Rate/Extremely Fast;
- нажать
на Simulation/Start - начнется
моделирование;
- нажать
кнопку А, связанную с выводом RA0/AN0 (использование «панели прокрутки»
изменяет аналоговое значение на этом выводе);
- нажать
кнопку Accept и посмотреть, как это изменит состояние выводов порта PORTB.
Последние три шага можно повторить несколько раз и посмотреть
на результаты. Вид экрана с выполняющейся программой показан на рисунке 2.2.
2.2.2 Листинг программы.
Symbol ad_action = ADCON0.GO_DONE ;новое название
для бита запуска A/D
Symbol display = PORTB ;новое название для PORTB
TRISB = %00000000 ; настойка PORTB как выход
TRISA
= %111111 ; настройка PORTA как
вход
ADCON0
= 0xc0 ; внутренний генератор
ADCON1
= 0 ; настройка PORTA и
PORTE как аналоговых входов
High ADCON0.ADON ; запуск АЦП (A/D)
main:
Gosub
getadresult ; переход в
подпрограмму преобразования
display
= ADRESH ; результат преобразования
в PORTB
Goto
main ; бесконечное
повторение программы
End
getadresult: ; подпрограмма
преобразования
High
ad_action ; запуск
преобразования
While
ad_action ; пауза для окончания
преобразования
Wend
Return
Рисунок 2.2 - Вид экрана с выполняемой программой
2.3
Содержание отчета
-
цель работы;
-
листинг программы и ее описание;
-
вид экрана микроконтроллера;
-
выводы.
2.4
Контрольные вопросы
1)
Как включить модуль АЦП?
2)
Зачем выдерживается пауза перед преобразованием?
3)
Как происходит настройка каналов АЦП?
4)
Где содержится байт результата преобразования?
5)
Что такое выравнивание результата преобразования?
3 Лабораторная
работа №3. Модуль UART
Цель работы: изучить режимы работы универсального
приемо-передатчика UART, а также настройку каналов.
3.1 Общие
сведения
Универсальный асинхронный приемопередатчик (UART) -
это модуль последовательного ввода/вывода, который может работать в дуплексном
асинхронном режиме для связи с терминалами, персональными компьютерами.
Специальные регистры TXSTA (transmitter status) и
RCSTA (receiver status) модуля USART являются регистрами управления и статуса,
соответственно передатчика и приемника.
В асинхронном режиме UART использует стандартный
формат (NRZ): один стартовый бит, 8 или 9 битов данных и один стоповый бит.
Модуль USART в асинхронном режиме состоит из следующих
элементов:
-
генератор скорости обмена;
-
цепь опроса;
-
асинхронный передатчик;
-
асинхронный приемник.
Структурная схема организации связи между МК и ПК в
асинхронном режиме показана на рисунке 3.1.
Рисунок 3.1 – Структурная схема организации связи в
асинхронном режиме
Главным в передатчике USART является сдвиговый регистр
TSR, который получает данные из буфера передатчика TXREG (см. рисунок 3.2).
Рисунок 3.2 – Структурная схема асинхронного
передатчика USART
Данные в регистр TXREG загружаются программно. После
передачи стопового бита предыдущего байта, в последнем машинном такте цикла
RRG, TSR загружается новым значением из TXREG (если оно присутствует), после
чего устанавливается флаг прерывания TXIF (PIR1<4>). Прерывание может
быть разрешено или запрещено битом TXIE (Р1Е1<4>). Флаг TXIF
устанавливается независимо от состояния бита TXIE и не может быть сброшен в '0'
программно. Очистка флага TXIF происходит только после загрузки новых данных в
регистр TXREG. Аналогичным образом бит TRMT (TXSTA<1>) отображает
состояние регистра TSR.
Для разрешения передачи необходимо установить бит TXEN
(TXSTA<5>) в '1'. Передача данных не начнется до тех пор, пока в TXREG не
будут загружены новые данные; не придет очередной тактовый импульс от
генератора BRG. Можно сначала загрузить данные в TXREG, а затем установить бит
TXEN.
Рисунок 3.3 – Временная
диаграмма передачи данных
Прием данных производится аналогично, под управлением
регистра RCSTA.
3.2
Моделирование в PIC Simulator IDE
3.3.1 Исследование модуля UART.
Необходимо выполнить следующие действия:
- запустить
PIC симулятор
IDE;
- нажать
на Options/Microcontroller;
- выбрать
PIC16F877 и нажать на
Select;
- нажать Options/Change Clock
Frequency;
- ввести 4 и нажать кнопку
OK;
- нажать Options/Change UART
Transmit/Receive Time;
- ввести 100 и нажать кнопку
OK;
- нажать File/Load Program;
- выбрать файл uart.hex и
нажать кнопку Open;
- нажать Tools|Hardware
UART Simulation Interface
(откроется окно симуляции аппаратного интерфейса UART);
- выбрать Rate/Extremely Fast
simulation rate;
- нажать Simulation/Start
(начнётся выполнение программы).
После этого
необходимо выждать, пока программа выдаст 6 строк текста в последовательный
порт. Для пересылки данных в порт используется одна из трёх доступных кнопок
интерфейса UART. Последние два шага можно несколько раз повторить и посмотреть
на результаты.
Рисунок 3.4 - Вид экрана с выполняемой программой
3.2.2 Листинг программы.
Dim i As Byte ; объявим
переменную i как байт
Hseropen 9600 ;
включение UART, скорость 9600 бод
WaitMs 1000 ; задержка
в 1000 мс
For i = 10 To 5 Step – 1 ; организуем цикл с
уменьшением
Hserout "Number: ", #i, CrLf ; передача данных
WaitMs 500 ; задержка в 500мс
Next i
loop:
Hserin i
; ожидание данных из порта
Hserout "Number: ",
#i, CrLf ; передача данных в
порт
Goto loop ; бесконечный
цикл
3.3
Контрольные вопросы
1)
Как включить модуль UART?
2)
Как настроить UART в режим приема?
3)
Как настроить UART в режим передачи?
4)
Какой формат передаваемого слова?
4 Лабораторная работа №4. Модуль LCD
Цель работы: изучить работу модуля жидкокристаллического
индикатора с контроллером HD44780 фирмы Hitachi в различных режимах.
4.1 Общие
сведения
Наибольшее распространение получили ЖКИ (Liquid Christal Display - LCD) с контроллером HD44780 фирмы Hitachi.
Таблица 4.1 - Стандартные выводы ЖК-модуля
вывод |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
Функ. |
Gnd |
Vdd |
V0 |
RS |
R/W |
E |
D0 |
D1 |
D2 |
D3 |
D4 |
D5 |
D6 |
D7 |
Модуль HD44780 содержит два регистра:
- регистр команд IR (Instraction
Register);
- регистр данных DR (Data
Register).
Выбор регистров осуществляется путем подачи сигнала
управления от микроконтроллера на вывод
RS: если RS = 0, то будет подключен регистр команд, а если RS = 1, то регистр
данных. Вывод R/W – чтение – 1; запись - 0, а вывод Е – Enable – для
строб-сигнала положительной полярности (+5В) длительностью не менее 450 нс, в
течение которого записываются передаваемые биты.
Управление ЖКИ осуществляется через порт Е (Е0, Е1 и
Е2), питание и подсветка подключаются напрямую - +5В, а данные или команды
подаются от порта В (см. рисунок 4.1).
Рисунок 4.1 – Схема подключения ЖКИ к микроконтроллеру
Регистр IR принимает команды от микроконтроллера,
например: смещение курсора, гашение табло или установку адреса индикатора.
Регистр DR служит для промежуточного хранения данных,
которые затем с помощью внутренних операций автоматически передаются в память
отображаемых данных (DD - Display Data) DDRAM или в память знакогенератора (CG - Character
Generator) CGRAM.
Содержимое регистра IR не может быть прочитано МК.
Возможно только чтение флага занятости (разряд 7) и текущего состояния
внутреннего счетчика адреса AC (Address Counter) (разряды 6...0).
Установленный флаг занятости (В=1) означает, что
модуль HD44780 занят выполнением внутренней операции и в данный момент к приему
не готов. Соответственно, когда В=0 флаг занятости сигнализирует о том, что
модуль готов к приему.
Считывание данных из памяти DD или CG выполняется
через регистр DR. После того как МК записал некоторый адрес в регистр IR, байт
данных, расположенный в памяти по этому адресу, с помощью внутренней операции
переписывается в регистр DR. Процесс чтения завершается считыванием байта
данных из этого регистра. Когда текущая операция чтения завершена, с помощью
функции автоинкремента в регистр DR записывается байт данных, извлеченный из
памяти по следующему адресу, который будет использован при очередном
считывании.
В модуле HD44780 используется две разные памяти:
-
DDRAM — для хранения отображаемых данных;
-
CGRAM — для хранения битовых комбинаций, которые соответствуют матрице размером
5x8 или 5x10 (определяет форму символа).
Емкость памяти
DD составляет 80 знаков, представленных в 8-разрядной ASCII-кодировке. Из них на
двухстрочном табло могут быть одновременно отображены 16 символов в каждой
строке, однако с помощью операции сдвига последующие символы также могут
оказаться в отображаемой области (выделено жирным).
Таблица 4.2 – Двухстрочное табло ЖКИ
Позиция |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
|
39 |
40 |
Адрес DD-RAM |
00 |
01 |
02 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
0A |
0B |
0C |
0D |
0E |
0F |
10 |
.. |
26 |
27 |
Адрес DD-RAM |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
4A |
4B |
4C |
4D |
4E |
4F |
50 |
.. |
66 |
67 |
Первая строка начинается с адреса 00h, а вторая — с адреса 40h, (64d). Память
разбита на две половины по 40d (28h) байт
каждая, причем между последним адресом первой строки и первым адресом второй
строки есть разрыв в 24d байта.
После сдвига вправо первая строка начинается с адреса
$01, а вторая строка - с адреса $41, а после сдвига влево первая строка
начинается с адреса $27, а вторая строка — с адреса $67.
Знакогенератор - это память типа ROM, предназначенная
для хранения битовых комбинаций, соответствующих матрице размерами 5x8 или
5x10. В этой памяти можно хранить информацию о 208 (в случае матрицы 5x8) или
32 (в случае матрицы 5x10) символов. Распределение знаков показано в таблице 7.4,
причем четыре старших разряда символа определяют его размещение по горизонтали,
а четыре младших — по вертикали (например, "А" = $41).
В модуле HD44780 используется встроенная схема сброса
по включению питания. При этом реализуются следующие функции:
-
начальная инициализация: DL = 1 - 8-разрядный интерфейс; N = 1 - двухстрочное
табло; F = 0 - матрица 5x8;
- управление
табло: D = 0 - табло отключено; С = 0 - курсор отключен
В = 0 - мерцание отключено;
- очистка
табло;
- режим
ввода данных: I/D = 1 - инкремент на 1; S = 0 - нет сдвига тa6ло.
Все функции управления табло реализуются с помощью
команд, перечисленных в таблице 3. Следует учесть, что после записи или чтения
байта данных адрес памяти DD или CG автоматически инкрементируется или
декрементируется по ниспадающему фронту сигнала занятости. Однако новое
значение в счетчик адреса АС записывается только спустя TADD = 1,5/fOSC
– тактовая частота HD44780.
Таблица 4.3 – Система команд HD44780
Команда |
RS |
R/W |
D7 – D0 |
Описание |
Tвып |
Clear Display Return Home Display ON/OFF control Function Set Set Entry Inc Set CGRAM address Set DDRAM address Read BUSY flag and Address Write Data to RAM Read Data from RAM |
0 0 0 0 0 0 0 0 1 1 |
0 0 0 0 0 0 0 1 0 1 |
00000001 00000010 00001DCB 00111000 00000AS0 01XXXXXX 1XХХ ХХХХ ВХХХХХХХ Write Data Read Data |
Очистка индикатора и перемещение курсора в левую позицию Возврат курсора в левую позицию Включение индикатора (D = 1), курсор (С=1) и выбор типа курсора: курсор мигает (В=1) или подчеркивает (В=0) Установка 8- битного интерфейса Установка направления перемещения (А = 1 приращение) и сдвига (S = 1 сдвиг) курсора Установка адреса для последующих операций и выбор области CGRAM Установка адреса DDRAM для последующих операций и выбор области DDRAM-xxxxxx Прочитать флаг занятости B (В = 1 занят) и содержимое счетчика адреса АС - ххххххх Запись данных в активную область Чтение данных в активную область |
1,64 мс 4 мс 40 мс 40 мс 40 мс 40 мс 40 мс 0 40 мс 40 мс |
Примечание:
перед каждой записью кода символа необходима специальная установка адреса
командой Set DDRAM Address.
Символы английского алфавита выводятся на индикатор
как обычные символьные константы в виде 'simvol′, а для вывода русского
алфавита используется таблица 4.4.
Таблица 4.4 –
Набор символов знакогенератора
4.2
Моделирование в PIC Simulator IDE
4.2.1 Исследование модуля LCD.
Необходимо выполнить следующие действия:
- запустить
PIC симулятор
IDE;
- нажать на Options\ Microcontroller;
- выбрать PIC16F877 и нажать на «Select»;
- нажать на File\Load Program;
-
выбрать файл lcd.hex и ЛКМ на Open. Начнется загрузка программы в память PIC.
- нажать на Tools/MicrocontrollerView - откроется окно Microcontroller
View;
- нажать
на Tools/LCD Module, а затем на «Yes» для модуля LCD,
чтобы загрузить параметры установки из исходной программы. Откроется окно
моделирования элемента LCD. (параметры
элемента LCD могут быть установлены вручную с помощью команды «Setup».)
- отрегулируйте
расположение окон для лучшего обзора;
- выбрать
скорость моделирования Rate/Extremely Fast;
- нажать
на «Simulation/Start» - начнется
моделирование;
- нажать
кнопку А, связанную с выводом RA0/AN0 (использование «панели прокрутки»
изменяет аналоговое значение на этом вводе).
После изменения аналогового значения нужно нажать
кнопку Accept и подождать, пока на LCD отобразится новое значение. Последние
три шага можно несколько раз повторить и посмотреть на результаты. Вид экрана с
выполняющейся программой показан на рисунке 4.2.
Процедура запуска LCD займет около 10ms реального
времени, которое будет показано в поле «Real Time Duration».
Рисунок 4.2 - Вид экрана выполняемой программы
4.2.2 Листинг программы.
Define
ADC_CLOCK = 3 ; значение по
умолчанию 3
Define
ADC_SAMPLEUS = 10 ; значение по
умолчанию 20
Define
LCD_BITS = 8 ; 4 или
8 линий связи интерфейса данных
Define
LCD_DREG = PORTB
Define
LCD_DBIT = 0 ; 0 или 4
для интерфейса на 4 бита
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 3
Define LCD_RWREG = PORTD ; по умолчанию 0, если не используем
Define
LCD_RWBIT = 2 ' по умолчанию
0, если не используем
Define
LCD_COMMANDUS = 100 ' задержка после
LCDCMDOUT, значение по
умолчанию 5000
Define
LCD_DATAUS = 10 ' задержка после
LCDOUT, по умолчанию 50
Define
LCD_INITMS = 1 ; задержка,
используемая LCDINIT, значение по
умолчанию 100
; последние три команды Define устанавливают
значения, подходящие
только для моделирования
Dim
an0 As Word
TRISA
= 0xff
; настройка PORTA как вход
ADCON1
= 0 ';PORTA и PORTE как аналоговые
входы
Lcdinit
; инициализация LCD; курсор выключен
loop:
Adcin
0, an0
Lcdcmdout
LcdClear ;
очистка дисплея LCD
Lcdout "Analog
input AN0" ; текст для строки 1
Lcdcmdout
LcdLine2Home ; курсор в начале строки 2
Lcdout
"Value: ", #an0 ; текст для строки 2
WaitMs
1 ; в реальном LCD должно
быть больше
Goto
loop ; бесконечный цикл
4.3
Контрольные вопросы
1)
Как осуществляется управление LCD?
2)
Какую функцию выполняют регистры IR и DR?
3)
Что сообщается микроконтроллеру при В=1?
4)
Для чего служит память DDRAM?
5)
Для чего служит память CGRAM?
5 Лабораторная
работа №5. Внешние прерывания и модуль TMR0
Цель работы: изучить особенности портов
микроконтроллера, регистров управления TRIS и INTCON, а также таймер TMR0 и реагирование на внешние прерывания.
5.1
Общие сведения
PIC Simulator IDE - приложение, предназначенное для разработчиков
в графической среде Windows с интегрированным BASIC компилятором, ассемблером,
дизассемблером и отладчиком.
В главном окне программы отображается PIC-микроконтроллер c внутренней
мнемоникой, последней выполненной и следующей инструкцией, тактом и счетчиком в
режиме реального времени.
PORTA - 6-разрядный порт
ввода/вывода (RA5–RA0).
Все каналы PORTA имеют
соответствующие биты направления в регистре TRISA, позволяющие настраивать канал как вход или выход. Запись 1 в TRISA переводит соответствующий выходной буфер в 3-е состояние. Запись '0' в регистр TRISA определяет соответствующий канал как
выход, содержимое защелки PORTA передается на вывод микроконтроллера.
Чтение регистра PORTA возвращает состояние
на выводах порта, а запись производится в защелку PORTA. Все операции записи в порт выполняются по принципу «чтение - модификация -
запись», т.е. сначала производится чтение состояния выводов порта, затем
изменение и запись в защелку.
Основная особенность портов А и Е заключается в том, что они мультиплицированы
с аналоговыми входами АЦП и аналоговым входом источника опорного напряжения VREF. Биты
управления режимов работы каналов порта ввода/вывода PORTA и PORTE находятся в регистре ADCON1.
Следует отметить, что PORTD работает и как 8-разрядный
параллельный порт PSP, когда бит PSPMODE(TRISE<4>) установлен в 1.
Внешний микроконтроллер может читать/записывать данные в PORTD. В режиме
ведомого данные асинхронно читаются или записываются внешними сигналами -RD (RE0/-RD)
или -WR(RE1/-WR) соответственно.
Биты TRISE (TRISE<2:0>) должны быть установлены
в 1. В регистре ADCON1 выводы RE2:RE0 должны быть настроены как цифровые каналы
ввода/вывода (биты PCFG3:PCFG0).
Запись в PSP происходит, если выводы -CS и -WR имеют низкий
уровень сигнала. После перехода сигнала на выводе -CS или -WR в высокий уровень
данные сохраняются во входной защелке на такте Q2. На такте Q4 устанавливаются
в 1 бит IBF(TRISE<7>) и флаг прерываний PSPIF(PIR<7>). Бит IBF
может быть сброшен в 0 только чтением регистра PORTD. Бит переполнения
IBOV(TRISE<5>) устанавливается в 1, если произошла следующая запись в
PSP, а предыдущий байт не был прочитан.
Чтение из PSP
происходит, если выводы -CS и -RD имеют низкий уровень сигнала. Немедленно
сбрасывается в 0 бит OBF (TRISE<6>), указывающий, что PORTD ожидает
чтение внешней шиной. После перехода сигнала на выводе -CS или -RD в высокий
уровень устанавливается флаг прерывания PSPIF на такте Q4 (только после такта
Q2), указывая, что чтение завершено. Бит OBF остается сброшенным в '0' пока не
будут загружены новые данные в PORTD.
Когда режим PSP выключен, биты IBF и OBF равняются
нулю, а предварительно установленный в 1 бит IBOV должен быть сброшен
программно.
Флаг прерывания PSPIF устанавливается в 1 по завершению
каждой операции чтения или записи (сбрасывается в 0 программно).
Разрешить/запретить прерывания от модуля PSP можно установкой/сбросом бита
PSPIE (РIЕ1<7>).
Рисунок 5.1 -
Временная
диаграмма чтения из параллельного ведомого порта
Регистр INTCON доступен
для чтения/записи, содержит биты:
-
разрешения немаскируемых прерываний от внешних модулей – бит 6 (PEIE);
-
разрешения прерывания по переполнению TMR0 –
бит 5 (TOIE);
-
разрешения прерывания RB0/INT – бит 4 (INTE);
-
разрешения прерывания по изменению сигнала на входах RB7-RB4 – бит 3 (RBIE);
- флаг прерывания по переполнению TMR0 – бит 2 (TOIF);
-
флаг внешнего прерывания INT – бит 1 (INTF);
-
флаг прерывания по изменению сигнала на входах RB7-RB4 – бит 0 (RBIF).
5.2.
Моделирование в PIC Simulator IDE
5.2.1 Исследование регистров PORTA и PORTB при
внешних прерываниях.
Необходимо выполнить следующие действия:
- запустить
PIC Simulator IDE;
- нажать Options/Select Microcontroller;
- выбрать
PIC16F877 и нажать кнопку Select;
- нажать на Options/Change Clock Frequency;
- в
появившемся окне набрать 4 и после этого на OK;
- нажать File/Load Program;
-
выбрать файл 7segment.hex и нажать кнопку Open (программа загружена);
- нажать
Tools/7_Segment LED Displays Panel (откроется окно с четырьмя 7 сегментными индикаторами);
- нажать
кнопку Setup ниже индикатора № 2;
- нажать
оранжевое поле рядом справа от Display
Enable;
- дважды
нажать на Always Enable – появится окно Select pin;
- выделить
PORTC и 0
– появится PORTC.0;
- нажать
кнопку Setup ниже индикатора № 1;
- нажать
оранжевое поле рядом справа от Display
Enable;
- дважды
нажать на Always Enable – появится окно Select pin;
- выделить
PORTC и 1
– появится PORTC.1;
- нажать
кнопку Hide Setup, чтобы сохранить немного экранного пространства;
- выбрать
Rate/Ultimate (без
изменения скорости);
- нажать
Simulation/Start.
Программа отобразит числа от 0 до 99 на двух 7 сегментных
дисплеях, используя процедуру мультиплексирования прерывания TMR0. Сохраняя данные
на экране, необходимо экспериментировать с опцией Keep Last Display. Вид экрана
с выполняющейся программой показан на рисунке 5.2.
Рисунок 5.2 - Вид экрана с выполняемой программой
5.2.2 Листинг программы.
Dim
digit As Byte ; входная переменная
для подпрограммы GETMASK
Dim
digit1 As Byte ; текущее значение
старшей цифры
Dim
digit2 As Byte ; текущее значение
младшей цифры
Dim
mask As Byte ; выходная переменная от
подпрограммы GETMASK
Dim
mask1 As Byte ; текущее значение старшей
цифры
Dim
mask2 As Byte ; текущее значение младшей
цифры
Dim i As Byte
Dim phase
As Bit
Symbol
d1enable = PORTC.0 ;линия управления для
старшего элемента
7 сегментного индикатора
Symbol
d2enable = PORTC.1 ;линия управления для
младшего элемента
7 сегментного индикатора
TRISB
= %00000000 ; настройка порта PORTB
на вывод
TRISC.0
= 0 ; настройка RC0 на вывод
TRISC.1
= 0 ; настройка RC1
на вывод
d1enable = False
d2enable = False
mask1 = 0
mask2 = 0
phase = 0
INTCON.T0IE = 1 ; разрешение прерывания от Timer0
INTCON.GIE
= 1 ; разрешение всех
прерываний
OPTION_REG.T0CS
= 0 ; Timer0 от внутреннего генератора
loop:
For
i = 0 To 99
digit1
= i / 10 ; текущая цифра для старшей цифры
digit2
= i Mod 10 ; текущая цифра для младшей
цифры
TMR0
= 0 ; сброс Timer0,
чтобы предотвратить его прерывание
digit
= digit1
Gosub
getmask ; значение
для старшей цифры
mask1
= mask
digit
= digit2
Gosub
getmask ; значение для
младшей цифры
mask2
= mask
Gosub
show1 ;' отобразим
новое значение старшей цифры
Gosub
show2 ; отобразим
новое значение младшей цифры
WaitMs 500 ; задержка для
моделирования
Next
i
Goto
loop
End
On
Interrupt ; подпрограмма
прерывания Timer0 непрерывно переключает
первый
и второй дисплей
If
phase = 0 Then
phase = 1
Gosub show1
Else
phase = 0
Gosub show2
Endif
INTCON.T0IF = 0 ; разрешение прерывания
от TMR0
Resume
getmask: ; соответствующее
значение 7 сегментного индикатора
для входной
цифры
mask
= LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digit
Return
show1: ; вывод
старшей цифры на дисплей
d2enable = False
PORTB = mask1
d1enable = True
Return
show2: ; вывод младшей цифры
d1enable = False
PORTB = mask2
d2enable = True
Return
5.3
Контрольные вопросы
1)
Чем отличается порт А от порта В?
2)
Как изменить направление порта?
3)
Как изменить цифровые входы портов А и Е на аналоговые?
4)
Какой регистр разрешает внешние прерывания?
5)
Какой байт нужно сбросить на индикатор для цифры 6?
Список литературы
1. Новиков Ю.В., Скоробогатов П.К. Основы
микропроцессорной техники. – М.: БИНОМ. Лаборатория знаний, 2006.
2. Тавернье К. PIC – Микроконтроллеры. – М.: ДМК
Пресс, 2003.
3. Трамперт В. AVR-RISC микроконтроллеры. – К.:
«МК-Пресс», 2006.
4. Техническая документация. Однокристальные 8-разрядные
FLASH микроконтроллеры. – М.: ООО «Микро-Чип», 2002.
Содержание
1
Введение
3
2
Лабораторная работа №1 4
3 Лабораторная
работа №2 7
4 Лабораторная
работа №3 10
5 Лабораторная
работа №4 13
6 Лабораторная
работа №5 18
Список
литературы
23