Реализация десятичного калькулятора на PIC16F874
Реализация десятичного калькулятора
на PIC16F874
Задание
Разработать микропроцессорную систему на базе однокристальной
микроЭВМ и её программное обеспечение, реализующее заданный набор функций.
.
Краткое описание PIC16F874
Этот микроконтроллер является одним из представителей
семейства PIC16. Архитектура основана на концепции раздельных шин и областей
памяти для данных и для команд (Гарвардская архитектура). Шина данных и память
данных (ОЗУ) имеют ширину 8 бит, а программная шина и программная память (ПЗУ)
имеют ширину 14 бит.
Общая архитектура
Контроллер включает в себя (рис. 1):
§ процессор;
§ память программ;
§ память данных (ОЗУ, регистровый файл);
§ многочисленные внешние устройства.
К узлам процессора можно отнести:
§ 8-разрядное АЛУ;
§ 8-разрядный рабочий регистр W (аккумулятор);
§ 8-разрядный регистр флагов STATUS (рис. 2);
§ 13-разрядный программный счетчик PC, по содержимому которого
осуществляется доступ в память программ;
§ 8-уровневый стек программного счетчика,
предназначенный для хранения только адресов возврата из подпрограмм
(прерываний). (Программный доступ в стек не возможен!);
§ регистр команд и блок управления;
§ тактовый генератор;
§ схемы, реализующие режимы пониженного
энегропотребления.
Рис. 1. Общая структура микроконтроллера PIC16
Регистр STATUS
содержит арифметические флаги АЛУ, состояние контроллера при сбросе и биты
выбора банка для памяти данных
Область ОЗУ (память данных) организована как 256 × 8 бит и разбита на два банка, каждый по 128
байтов. Каждый банк занимает адресное пространство 7Fh (128 байт). Первые 32 адреса в обоих банках занимают
специальные регистры. Адреса 20h - 7Fh (банк 0) и A0h - FFh (банк 1) занимают регистры общего назначения (ячейки ОЗУ).
Среди регистров семейства PIC16 можно выделить группу «процессорных» - PCL, OPTION, STATUS, FSR, PCLATH; и несколько групп, относящихся к различным «внешним» устройствам
и подсистемам. Подсистема прерываний поддерживается регистрами INTCON, PIR1, PIR2, PIE1, PIE2; подсистема параллельного ввода / вывода
- регистрами портов PORT A, PORT B, PORT C, PORT D, PORT E и регистрами направлений TRIS A, TRIS B, TRIS C, TRIS D, TRIS E.
Подсистема контроля времени включает регистры таймеров управления
ими: TMR0, TMR1L, TMR1H, T1CON, TMR2, T2CON, а
также регистры, относящиеся к двум каналам CCP - Capture\Compare\PWM (захват \ сравнение \ ШИМ): CCPR1L, CCPR1H, CCP1CON, CCPR2L, CCPR2H, CCP2CON.
Подсистема последовательного ввода / вывода представлена
регистрами асинхронного приемопередатчика: TXREG, RCREG, TXSTA, RCSTA, SPBRG и синхронного последовательного порта: SSPBUF, SSPCON, SSPADD, SSPSTAT.
Наконец, аналого-цифровой преобразователь использует регистры ADRES, ADCON 0, ADCON 1.
Память программ в PIC16 не пересекается с памятью данных (Гарвардская
архитектура) и имеет собственную разрядную шину в 14 бит. Адресация памяти
программ осуществляется только по содержимому программного счетчика.
Программный счетчик имеет разрядность 13 бит и способен адресовать 8К ×
14 бит объема программной памяти.
При обращение к адресам выше 0FFFh фактически обращение производится к тем же
четырем килобайтам.
Форматы команд и способы адресации
Все команды контроллера имеют одинаковую длину - 14 бит (одно
командное слово) и с точки зрения форматов делятся на три разновидности (рис.
4):
§ байт-ориентированные;
§ бит - ориентированные;
§ команды с константами (8- или 11-битными).
Форматы этих команд (рис. 5), при этом приняты следующие
обозначения:
СОР - поле кода операции;
f - поле адреса памяти данных;
d - указатель регистра-приемника;
b - номер бита в адресуемом f регистре;
k - 8-битная константа - непосредственный операнд;
Addr - адрес перехода или вызова (для команд GOTO, CALL).
Для доступа к регистрам ОЗУ используется прямая или косвенная
адресация.
|
13
|
|
|
|
|
8
|
7
|
6
|
|
|
|
|
|
0
|
|
1
|
СОР
|
d
|
f
|
байт-ориентированные
|
|
13
|
|
|
10
|
9
|
|
7
|
6
|
|
|
|
|
|
0
|
|
2
|
СОР
|
b
|
f
|
бит-ориентированные
|
|
13
|
|
|
|
|
8
|
7
|
|
|
|
|
|
|
0
|
|
3
|
СОР
|
команды с константами
|
|
13
|
|
11
|
10
|
|
|
|
|
|
|
|
|
|
0
|
|
3а
|
СОР
|
Addr
|
|
Рис. 4. Форматы команд
|
Для организации косвенной адресации необходимо в поле f
команды поместить код 000 0000.
В PIC16F874 объем ОЗУ составляет 256 байт и. Поэтому биты IRP и RP1
для формирования адреса не используются. Их можно, но не рекомендуется,
использовать как биты общего назначения.
При непосредственной адресации первый операнд
двухместных операций извлекается из младшего байта командного слова, второй
операнд и результат - всегда в регистре W.
Порты ввода / вывода
На кристалле PIC16F874 предусмотрено пять портов параллельного обмена с
побитовой индивидуальной настройкой на вход или на выход. Выводы кристалла,
линии портов используются одновременно и для подключения к АЦП, к внешнему
прерыванию и другим встроенным узлам кристалла. Альтернативные переключения
осуществляются через управляющие регистры. В таблице 1 приведено назначение
выводов кристалла.
Таблица 1
Обозначение
|
Тип вывода
|
Тип буфера
|
Режим
|
|
Порт А
|
RA0/AN0 - RA3/AN3
|
I/O
|
TTL
|
Порт ввода / вывода // Аналоговый вход канала
|
RA4/T0CKI
|
I/O
|
ST
|
Линия порта ввода / вывода с открытым стоком //
Вход частоты для таймера / счетчика TMR0.
|
RA5/AN4 //SS
|
I/O
|
TTL
|
Порт ввода / вывода // Аналоговый вход канала
4 // В режиме последовательного интерфейса SPI - сигнал выборка slave
|
Порт B
|
RB0/INT
|
I/O
|
TTL/ST
|
Порт ввода / вывода // Внешний вход прерывания
|
RB1-RB3
|
I/O
|
TTL
|
Порт ввода / вывода
|
RB4, RB5
|
I/O
|
TTL
|
Порт ввода / вывода. Прерывание при изменении
значения на выводе
|
RB6, RB7
|
I/O
|
TTL/ST
|
Порт ввода / вывода. Прерывание при изменении
значения на выводе. // Также используется при программировании кристалла.
|
Порт С
|
RС0/T1OSO/T1CKI
|
I/O
|
ST
|
Порт ввода / вывода. // Выход генератора TMR1
// Вход внешней тактовой частоты
|
|
RС1/T1OSI/CCP2
|
I/O
|
ST
|
Порт ввода / вывода. // Вход генератора TMR1
// Модуль CCP2 (защелкивание2 - вход, сравнение2 - выход, ШИМ2 - выход)
|
|
RС2/CCP1
|
I/O
|
ST
|
Порт ввода / вывода. // Модуль CCP1
(защелкивание1-вход, сравнение1 - выход, ШИМ1 - выход)
|
|
RС3/SCK/SCL
|
I/O
|
ST
|
Порт ввода / вывода // Тактовая частота для
режимов SPI, I2C
|
|
RС4/SDI/SDA
|
I/O
|
ST
|
Порт ввода / вывода // Вход данных в режиме SPI
// Вход/выход данных в режиме I2C
|
I/O
|
ST
|
Порт ввода / вывода // Выход данных в режиме
SPI
|
|
RС6/TX/CK
|
I/O
|
ST
|
Порт ввода / вывода // В режиме SCI
(асинхронном) выход данных // В режиме SCI (синхронном) тактовая частота
|
|
RС7/RX/DT
|
|
|
Порт ввода / вывода // В режиме SCI
(асинхронном) вход данных // В режиме SCI (синхронном) вход / выход данных
|
|
Порт D
|
RD [0:7]/PSP [0:7]
|
I/O
|
ST/TTL
|
Двунаправленный порт (RD0..RD7) ввода / вывода
// Параллельный порт-защелка (PSP0..PSP7) для подключения к микропроцессорной
шине в качестве сопроцессора
|
|
Порт Е
|
E0 //RD/AN5, E1
//WR/AN6, E2 //CS/AN7
|
I/O
|
ST/TTL
|
Двунаправленный порт ввода / вывода // Сигнал
чтения в режиме микропроцессорной шины // Аналоговый вход канала
|
Выводы кристалла, не входящие в порты
|
/MCLR/Vpp
|
I/P
|
ST
|
Низкий уровень на этом входе генерирует сигнал
сброса для контроллера. Активный низкий.
|
OSC1/CLKIN
|
I
|
CMOS
|
Для подключения кварца или вход внешней
тактовой частоты
|
OSC2/CLKOUT
|
O
|
|
Генератор, выход тактовой частоты в режиме RC
генератора, в остальных случаях - для подключения кварцевого резонатора
|
Vdd
|
Р
|
-
|
Напряжение питания
|
Vss
|
Р
|
-
|
Общий(земля)
|
Условные обозначения: I - только вход, O -
только выход, I/O - вход / выход, P - питание, TTL - уровень ТТЛ, ST - вход
триггера Шмитта.
|
|
|
|
|
|
|
Порт А - это порт разрядностью 6 бит, соответствующие
выводы кристалла RA [5:0]. Выводы RA [3:0], RA5 двунаправленные. Относящийся к
порту А управляющий регистр TRISA расположен по адресу 85h.
Порт В-это двунаправленный порт разрядностью 8 бит
(адрес регистра 06h). Относящийся к порту В управляющий регистр TRISB
расположен по адресу 86h.
Порт С - это двунаправленный порт разрядностью восемь
бит (адрес регистра 07h). Относящийся к порту C управляющий регистр TRISC
расположен по адресу 87h.
Порт D - это двунаправленный
порт разрядностью восемь бит (адрес регистра 08h). Относящийся к порту D
управляющий регистр TRISD расположен по адресу 88h.
Порт Е имеет три линии (RE0, RE1, RE2), которые могут
быть настроены как линии ввода / вывода (адрес регистра 09h. Относящийся к
порту E управляющий регистр TRISE (рис. 6) расположен по адресу 89h.
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
IBF
|
OBF
|
IBOV
|
PSPMODE
|
|
TRISE2
|
TRISE1
|
TRIS0
|
- входной буфер заполнен;
OBF - выходной буфер заполнен;
IBOV - входной буфер переполнен;
PSPMODE - выбирает режим для порта D и порта E;
TRISE [2:0] - биты управления направлением на выводах
RE [2:0] соответственно
Аналого-цифровой преобразователь (АЦП)
Модуль АЦП (рис. 7) содержит восемь аналоговых каналов,
мультиплексируемых на одну схему выборки / хранения и далее на АЦП. Опорное
напряжение поступает извне через вывод RA3/AIN3/Vref или формируется внутри
кристалла из напряжения питания Vdd.
Таймерная система
В семействе PIC16 находятся 3 таймера TMR0, TMR1, TMR2.
Таймер TMR1. Таймер 1 - это 16-битовый таймер /
счетчик (рис. 7), который имеет два 8-битовых регистра (TMR1H и TMR1L). Эти
регистры доступны для чтения и записи. Таймер 1 инкрементируется от 0000h до
FFFFh, после чего опять переходит в 0000 h.
.1
Параметры устройства
Разрабатываемая система должна обеспечить:
· ввод и редактирование входных значений;
· выполнение операции в зависимости от нажатой
кнопки («+», «-», «=», «+\-», «С»);
· индикацию результата;
Для выполнения данных функций ОМЭВМ должна обладать
следующими ресурсами:
· встроенный АЦП;
· 8 выходных линий для подключения ЖК индикатора
при динамической индикации;
· 8 выходных линии для подключения матричной
клавиатуры;
· система таймеров;F874 удовлетворяет всем
требованиям данной задачи
.2
Обоснование выбранных устройств. Организация диалога с пользователем
В качестве индикатора устройства используются широко
распространенный 10-разрядный жк-индикатор. Для управления
На лицевой панели устройства находятся 10-разрядный
жк-индикатор, предназначенный для вывода результатов вычислений, кнопки ввода, редактирования
и вычислений заданных арифметических операций.
Лицевая панель устройства
Тип и назначение каждой из кнопок:
Кнопка «0» - «9» предназначен для записи чисел в регистры
REG1 и REG2 и вывода на индикацию.
Кнопка «С» предназначена для очистки регистров (REG1, REG2,
REZ) и индикации.
Кнопка «+» предназначена для записи значения «+» в регистр
операций OPER.
Кнопка «-» предназначена для записи значения «-» в регистр
операций OPER.
Кнопка «+\-» предназначена для изменения знакового разряда
числа.
Кнопка «=» предназначена для подсчета результатов в
зависимости от выполняемой операции и вывод на индикацию индицируемого регистра
SPI.
калькулятор программа микроконтроллер десятичный
2.3
Схема устройства
Для индикации используется 10-разрядный жк-индикатор. Для
управления индикатором используется интерфейс SPI.
Для управления устройством используется матричная клавиатура
(используемые регистры: A0 - A5, B4 - B7). Она реализована следующим образом: выводы RB4-RB7 подтянуты
к Vdd, т.е. при чтении порта возвращают логическую единицу. Четыре вывода из
RA0-RA3 также находятся в высоком состоянии, а один - в низком, причем этот
вывод периодически меняется. Если какая-либо из кнопок нажата, то при
логическом нуле на соответствующем выводе порта А, ноль будет и на одном из
выводов порта В. Таким образом, зная какие из выводов портов А и В в данный
момент находятся в низком состоянии, можно определить, какая кнопка нажата.
Принципиальная схема устройства
2.4
Программное обеспечение
Для работы данной программы частота 20 Мгц является высокой
поэтому она занижена до 5 Мгц. Сама программа состоит из 3-х основных частей:
настройки системы, вывода индикации и измерений. В первой части происходит настройка
портов, АЦП, таймеров, очистка необходимых для работы ячеек и т.д. Во второй
происходит опрос клавиатуры и ввод значений в регистры для дальнейшего
выполнения операций. Третья часть вызывается при нажатии кнопки «=». В ней
выполняется заданная ранее операция и производится вывод на индикацию
полученного значения.
Распределение памяти
Номер(а) ячейки
|
Назначение
|
21-23
|
Коды цифр первого введенного числа
|
24-26
|
Коды цифр второго введенного числа
|
27-2B
|
Коды цифр результирующего числа
|
2С-30
|
Коды двоично-десятичного числа
|
31-34
|
Коды двоичного числа
|
35-39
|
Коды индицируемого числа
|
3A-41, 49
|
Регистры временного хранения
|
42
|
Регистр сдвигов
|
43
|
Регистр циклов
|
44-46
|
Регистры счетчика
|
47
|
Регистр флагов
|
48
|
Регистр операций
|
Заключение
Таким образом, была завершена разработка микропроцессорной
системы на базе однокристальной микроЭВМ PIC16F874 и её программного
обеспечения, реализующих заданный набор функций в соответствии с техническим
заданием.
Код был разработан на языке ассемблер в среде MPLAB IDE v8.84. MPLAB - это
интегрированная среда разработки (IDE) для семейства микроконтроллеров PICmicro
фирмы Microchip Technology Incorporated, поддерживающая написание на таких
языках, как C\C++ и ассемблер.
Список литературы
1.
Жмакин А.П., Титов В.С. Однокристальные микроЭВМ в системах управления: Учебное
пособие / Курск. гос. тех. ун-т., Курск, 2002.
.
Однокристальные микроЭВМ. Справочник. М.: МИКАП, 1994.
.
Руководство по микроконтроллерам II. М. Предко, 2001.
.
URL: http://www.gaw.ru/html.cgi/txt/interface/spi/index.htm - Информация про интерфейс
SPI
.
URL: http://www.averos.narod.ru/pdf/ht1611.pdf - Информация про
10-разрядный жк-индикатор НТ 1611
Приложение 1
Текст программы
REG1L = H'21'H = H'22'
EXP1 = H'23'L = H'24'H = H'25' = H'26'L = H'27'H = H'28' L = H'29'H = H'2A' = H'2B' = H'2C' = H'2D' = H'2E' = H'2F' = H'30' = H'31' = H'32' = H'33' = H'34'_R1 = H'35'_R2 = H'36'_R3 = H'37'_R4 = H'38'_R5 = H'39' = H'3A' = H'3B' = H'3C' = H'3D' = H'3E' = H'3F = H'40' = H'41' = H'42' = H'43' = H'44' = H'45' = H'46' = H'47' = H'48' = H'49'
#DEFINE MINES FLAG, 0
#DEFINE ZERO FLAG, 1
H'00'
BSF STATUS, RP0 H'00' TRISA H'06' ADCON1 B'11110000' TRISB H'00' TRISC OPTION_REG STATUS,
RP0
STATUS, RP0 SSPSTAT SSPSTAT, CKE STATUS,
RP0
H'FF' PORTC PORTB SDVIG CYCLE COUNT COUNT1 EXP TEMP TEMP1 TEMP2 TEMP3 TEMP4 TEMP5 TEMP6 TEMP7 TEMP8 SPI_R1 SPI_R2 SPI_R3 SPI_R4 SPI_R5 FLAG BC1 BC2 BC3 BC4 BCD1 BCD2 BCD3 BCD4 BCD5 REG1L REG1H REG2L REG2H REZ1L REZ1H REZ2L REZ2H
H'0A' SPI_R1 SPI SPI_R1
;*******************************************************************************************
; Сканирование клавиатуры
MOVLW B'11111110' PORTA
CALL SCANB B'11111101' PORTA SCANB B'11111011' PORTA SCANB B'11110111' PORTA SCANB B'11011111' PORTA
CALL SCANB A1
;****************************************************
; п/программа определения вводимого числа
SCANB PORTB, W STATUS, Z PORTB, 4 B4 PORTB,
5 B5 PORTB, 6 B6 PORTB, 7 B7
TEMP H'0B' STATUS, Z A2 STATUS,
C NUMBER TEMP, W H'0B' STATUS, C COMMAND
COMF PORTB, W STATUS, Z A2
PORTA, 0 H'07' PORTA, 1 H'08' PORTA, 2 H'09' PORTA,
0 H'04' PORTA, 1 H'05' PORTA, 2 H'06' PORTA, 0 H'01' PORTA, 1 H'02' PORTA,
2 H'03' PORTA, 3 H'26'; минус PORTA, 0 H'00' PORTA, 1 H'2A' PORTA,
3 H'2E' PORTA, 5 EQUEL H'0B'
;****************************************************
; п/п нажатой цифры COUNT COUNT,
W H'04' STATUS, C
H'04' CYCLE STATUS, C RLF BCD1 BCD2 BCD3 CYCLE A3 TEMP,
W BCD1
EXP_FL EXP
TEMP, W STATUS, Z A4 H'0A' TEMP
MOVLW H'04' CYCLE STATUS, C RLF SPI_R1 SPI_R2 SPI_R3 CYCLE A5 TEMP,
W SPI_R1
SPI
;****************************************************
; п/п нажатой операции TEMP,
5 TEMP, W PCL P_MINUS PM; +/- P_PLUS
;****************************************************
; п/п вывода на индикацию
SPI
MOVLW H'FF' PORTC
SPI_R5, W TEMP2 SPI1 SPI_R4, W TEMP2 SPI1 SPI_R3,
W TEMP2 SPI1 SPI_R2, W TEMP2 SPI1 SPI_R1, W TEMP2 SPI1 SSPCON,
SSPEN B'00110000' SSPCON TEMP2, W SSPBUF STATUS,
RP0 BTFSS SSPSTAT, BF A6 SSPSTAT, BF STATUS, RP0
RETURN
;****************************************************
; п/п индикации переполнения
MOVLW H'FF' PORTC TEMP2 SPI1 SPI1 SPI1 SPI1 SPI1 SSPCON,
SSPEN H'FF' PORTC
$
;****************************************************
; п/п вывода +/- MINES A7 MINES H'F0' SPI_R5 SPI
BCF MINES H'F0' SPI_R5 SPI
;****************************************************
; п/п оптимизации индицируемого числа
OPTIM TEMP TEMP1 TEMP2 TEMP3 TEMP4 TEMP5 TEMP6 TEMP7 TEMP8 EXP_FL
;****************************************************************************************
; если EXP>0, то приведение к EXP=0, иначе - вставка
запятой
MOVLW H'7F' EXP, W STATUS, C
;************************************************
; умножение SPI_R на 10 и декремент EXP, пока EXP не станет
=0
OP1 MOVF EXP, W STATUS, Z OP_ZERO;
EXP=0 OPT1 EXP TEMP1, W STATUS, Z OVER OP1 OP_ZERO
;************************************************
; п/п формирования нулей_ZERO
CLRF TEMP1 TEMP2 TEMP3 TEMP4 TEMP5
ZERO
H'09'; CYCLE
OPT1 H'0C' TEMP1, W STATUS, Z OP6 H'AC' TEMP1 CYCLE ZERO
CALL OPT1 H'0F' TEMP1, W STATUS,
Z OP7 ZERO OP8 H'0A' TEMP1 BSF ZERO H'0C' TEMP1,
W STATUS, Z OP8 H'AC'
MOVWF TEMP1
OP8 DECFSZ CYCLE OP6
ZERO OP9 H'0A' TEMP1
MOVF TEMP1, W SPI_R1 TEMP2,
W SPI_R2 TEMP3, W SPI_R3 TEMP4, W SPI_R4 TEMP5, W SPI_R5
;************************************************
; п/п вставки минуса при сформированном BCD
BTFSS MINES OP12
H'F0' SPI_R5, W STATUS, Z OP10 OP11
BTFSS EXP_FL OVER
OPT2 MOVLW H'F0' SPI_R5
;************************************************
OPT1
MOVLW H'04'; сдвиг влево 4 раза
MOVWF CT _1 RLF SPI_R1 SPI_R2 SPI_R3 SPI_R4 SPI_R5 TEMP1 TEMP2 TEMP3 TEMP4 TEMP5 CT OPT1_1
;*************************************************
H'04' CYCLE_1 BCF STATUS, C SPI_R5 SPI_R4 SPI_R3 SPI_R2 SPI_R1 CYCLE OPT2_1
;*******************************************************************************************
; необходимые действия для ввода втрой цифры
CLRREG BCD_BC