Физический факультет
Кафедра промышленной электроники и
информационно-измерительной техники
КУРСОВОЙ ПРОЕКТ
По дисциплине ЭМПТ
Программируемый таймер
Кафедра промышленной электроники и
информационно-измерительной техники
Данный курсовой проект содержит разработку и описание на языке ассемблер функциональных узлов программируемого таймера
Программа микроконтроллера была написана и отлаживалась с помощью прикладной программы MPLAB IDE.
Проект содержит 5 рисунков, 4 таблицы и 2 приложения.
Оглавление
1 Функциональная спецификация и системные требования. 5
2 Системно-алгоритмическое проектирование. 7
3 Разработка аппаратных средств. 8
4 Разработка программы для МПУ.. 12
5 Автономная отладка программы.. 19
6 Комплексная отладка микропроцессорной системы.. 20
Список использованных источников. 21
1 Функциональная спецификация и системные требования
Будем считать, что в соответствии с требованиями пользователя устройство для отсчета обратного времени будет отображать значение времени на четырехразрядном цифровом индикаторе.
При включении наше устройство будет работать в режиме ввода значения времени. Последовательно нажимая на кнопку «+5», можно будет выставить нужный интервал времени для обратного отсчета. В режиме ввода значения времени результат будет выводиться на индикаторы. В качестве индикаторов будут использоваться 2
Как и разработка любого устройства, разработка МПУ начинается с разработки структурной схемы.
В качестве прототипа разрабатываемого устройства предполагается использовать учебно-отладочный стенд, в котором для отсчета интервалов времени будет использоваться встроенный таймер TMR0.
Для управления индикаторами в отладочном стенде применен специализированный контроллер MC14489BP. Эта микросхема обеспечивает вывод информации на 7- сегментные индикаторы в режиме динамического управления.
Информация от МК к специализированному контроллеру MC14489BP передается по последовательному синхронному интерфейсу, состоящему из трех линий:
- RE1 (DATA IN) – данные;
- RE0 (Clk) - синхроимпульсы;
- RB3 (-CS) – выборка кристалла.
Структурная схема устройства для контроля за значением параметра приведена на рисунке 1.
2 Системно-алгоритмическое проектирование
В соответствии с принятыми решениями МК должен выполнять большинство основных функций МПУ, включая:
1) обратный отсчет времени
2) выставление времени кнопкой «+5» и запуск программы кнопкой «Пуск»;
3) вывод результата отсчета времени на цифровые индикаторы;
4) вывод сигнала на вкл./выкл. Какого-либо устройства.
Теперь необходимо решить, какие функции будут выполняться аппаратно периферийными модулями МК, а какие функции будут выполняться программой. Первая функция, несомненно, реализуется аппаратно встроенным в МК модулем 8-разрядный таймер/счетчик TMR0 с 8-разрядным программируемым предделителем. Для функций 2, 3 и 4 подойдет аппаратно-программная реализация.
3 Разработка аппаратных средств
В задании на курсовой проект тип микроконтроллера задан. Поэтому задача разработки аппаратных средств сводится к разработке принципиальной электрической схемы МПУ и настройке встроенных периферийных модулей МК. Жесткое требование задания, которое касается реализации прототипа МПУ на учебно-отладочном стенде, делает задачу разработки принципиальной схемы тривиальной. Практически все проектные решения уже приняты разработчиками учебно-отладочного стенда и не могут быть пересмотрены. Поэтому разработка принципиальной схемы МПУ сводится к дублированию схемы учебно-отладочного стенда с возможным удалением из нее неиспользуемых элементов и связей.
Выберем из имеющихся в учебно-отладочном стенде элементов и узлов, необходимые для данной задачи. Кроме МК и элементов цепей питания потребуются:
- две кнопки (например, R1 – «+5», R2- «Пуск» );
- элементы, обеспечивающие работу цифровых индикаторов;
Полученная принципиальная схема МПУ приведена в приложении Б.
В соответствии со схемой МПУ сигналы Data_in и Clk должны формироваться на линиях 1 и 0 порта PORTE, сигнал CS на линии 3 порта PORTB. Поэтому эти линии портов необходимо настроить на вывод. Для настройки модуля PORTE воспользуемся таблицей 1. Настройка линий на ввод-вывод определяется содержимым управляющего регистра TRISB2-TRISB0). Так как линии порта PORTE могут использоваться, как аналоговые входы, то следует также выполнить их настройку для работы в режиме цифровых линий.
Таблица 1 – Регистры и биты, связанные с работой PORTE
Адрес |
Имя |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
09h |
PORTE |
- |
- |
- |
- |
- |
RE2 |
RE1 |
RE0 |
89h |
TRISE |
IBF |
OBF |
IBOV |
PSPMODE |
- |
Рег. напр. данныхPORTE |
Сформируем константы для загрузки в управляющие регистры:
- b'00000100' - PORTE (3 - вывод).
Диаграммы сигналов CS, CLK, а также форматы слова конфигурации для MC14489BP и слов данных приведены на рисунке 2. Слово конфигурации длиной один байт определяет:
- режим потребляемой мощности (C0);
- режимы декодирования разрядов (С1 – С7).
Определим управляющее слово для отображения символов шестнадцатиричного алфавита в нормальном режиме потребляемой мощности INIT_MC14489=b'00000001'.
Рисунок 2
В соответствии с электрической схемой МПУ кнопка «Пуск» подключена к линии 2 порта PORTB. Кнопка «+5» подключена к линии 1 порта PORTB. Обозначим соответствующие разряды порта RB1 и RB2. Активному (нажатому) состоянию кнопки соответствует низкий потенциал на линии порта PORTB. Пассивному (отжатому) состоянию кнопки соответствует высокий потенциал, который обеспечивается встроенными подтягивающими резисторами. Включаются подтягивающие резисторы установкой разряда –RBPU=0 в регистре OPTION_REG. Для настройки модуля PORTB воспользуемся таблицей 2. Настройка линий определяется содержимым управляющего регистра TRISB.
Таблица 2 – Регистры и биты, связанные с работой PORTB
Адрес |
Имя |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
|
06h, 106h |
PORTB |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0 |
|
86h, 186h |
TRISB |
Регистр направления данных PORTB |
||||||||
81h, 181h |
OPTION_REG |
-RBPU |
INTEDG |
T0CS |
T0SE |
PSA |
PS2 |
PS1 |
PS0 |
|
Сформируем константы для загрузки в управляющие регистры:
- b'11110111' - PORTB (линия 3 - вывод, остальные ввод);
-b'10000111' - OPTION_REG(включить подтягивающие резисторы).
Функциональная схема модуля TMR0 приведена на рисунке 3.
Рисунок 3- Функциональная схема модуля TMR0.
Коэффициент деления определяется значениями разрядов PS2:PS0. Максимальное значение коэффициента деления частоты 1:256 получается при <PS2:PS0> = 111. При переполнении таймера устанавливается флаг T0IF (регистр INTCON<>2). После анализа флага, его необходимо сбросить. Если тактовая частота МК F=3.6864 МГц, то интервал времени между двумя переполнениями таймера составит:
ТTMR = 4×28 ×28/F = 4×256×256/3,6864×106 = 71,11 мс.
Для настройки модуля TMR0 воспользуемся таблицей 4.
Таблица 4 – Регистры и биты, связанные с работой TMR0
Адрес |
Имя |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
01h, 101h |
TMR0 |
|
|||||||
0Bh,8Bh,10Bh, 18Bh |
INTCON |
GIE |
PEIE |
T0IE |
INTE |
RBIE |
T0IF |
INTF |
RBIF |
81h, 181h |
OPTION_REG |
-RBPU |
INTEDG |
T0CS |
T0SE |
PSA |
PS2 |
PS1 |
PS0 |
Управляющее слово TMR0 находится в регистре OPTION_REG:
- бит 5 T0CS выбирает источник тактового сигнала (1 = внешний источник с вывода RA4/T0CKI, 0 = внутренний источник CLKOUT;
- бит 4 T0SE выбирает фронт приращения TMR0 при внешнем тактовом сигнале;
- бит 3 PSA выбирает включение предделителя (1 = предделитель включен перед WDT, 0 = предделитель включен перед TMR0);
- биты 2-0 PS2:PS0 задают коэффициент деления предделителя (000 = 1:2, 001 = 1:4, 010 = 1:8, 011 = 1:16, 100 = 1:32, 101 = 1:64, 110 = 1:128, 111 = 1:256).
Формируем управляющее слово OPTION_REG = b'01000111'.
4 Разработка программы для МПУ
Сначала следует принять принципиальные решения, определяющие структуру программы. Прежде всего, необходимо определиться, как должен реагировать МК на основные события:
- Реакцию на нажатие кнопки «+1»;
- Реакция на нажатие кнопки «Пуск»;
- Реакция на запуск таймера TMR0;
4)Реакция на переполнение таймера.
Есть 2 метода решения данной проблемы: метод по прерыванию и метод опроса. В своей программе я выбрал метод опроса. Для этого я постоянно опрашиваю кнопку «+5» и кнопку «Пуск» , причем сначала кнопку «+5». Нажатие на кнопку «+5» означает начало программы и выставления времени . После задания времени опрашиваем вторую кнопку и если на нее нажали то запускается таймер и начинает отсчет времени. Опрос кнопок прекращается и во время отсчета времени МК не реагирует ни на какие внешние события до окончании выставленного времени.
Сначала составим алгоритм программы, в соответствии с которым будем писать текст программы. Алгоритм приведен на рисунке 4.
Перейдем к формированию исходного текста основной программы. Текст основной программы должен начинаться с директивы установки адреса сброса 0x000. Чтобы использовать средства внутрисхемной отладки, следующей командой должна быть nop. Необходимо выполнить инициализацию всех используемых встроенных модулей МК, контроллера PIC16F877 и ячеек памяти.
Рассмотренные действия должны выполняться однократно после включения или сброса МПУ. Последующие действия должны повторяться. В теле цикла необходимо формировать и выводить информацию о текущем времени в последовательном коде в блок индикации, опрашивать линии порта ввода, выбирать режим работы и корректировать показания текущего времени. Так как МПУ должен однократно реагировать на нажатие любой из кнопок, то переход на начало цикла возможен только после отпускания кнопки. Поэтому опрос каждой кнопки должен выполняться дважды: сначала анализ на нажатое состояние, а затем анализ на отжатое состояние. Будем опрашивать состояние кнопок последовательно: сначала кнопку «+5», затем кнопку «Пуск».
Ниже приводится текст основы программы, полученной с учетом принятых решений. Нереализованные операторы пока представлены комментариями:
ORG 0x000 ;вектор сброса
nop
goto Begin ;переход на начало программы
;Здесь будут находиться все подпрограммы
Begin
;операторы инициализации модулей МК
;операторы инициализации PIC16F877
;операторы инициализации ячеек памяти
;-------------------------------------- Основной цикл --------------------------------
Cn clrf Cnt ;
Main
movf Cnt,W ;
movwf L_byte;
clrf H_byte
Call B2_BCD
Call Display;
bt1 btfsc PORTB,1; запрос кнопки "+5" (нажата?)
goto Cn1
movlw .5
addwf Cnt,f
Release call D15ms
btfss PORTB,1
goto Release
Cn1
movlw -.65
addwf Cnt,W; сравнить с числом 65
btfss STATUS,C ;если =65, то
goto bt3
goto Cn
bt3 movf Cnt,W ;
movwf L_byte;
btfsc PORTB,2; опрос кнопки "Пуск"
goto bt1;
bsf PORTD,1
bt2 call Dly
decfsz Cnt,f;
goto bt2
bcf PORTD,1
goto Main;
Информация, выводимая в контроллер индикаторов, должна быть представлена в последовательном коде. Информационное слово состоит из 24 разрядов, из них младшие 20 разрядов (D0 – D19) содержат пять тетрад кода отображаемых символов, разряды D20 – D22 управляют сегментами h (точка), разряд D23 – управляет яркостью свечения сегментов .Так как используются только четыре индикатора, то разряды D16-D19 можно задавать произвольно.
Рисунок 5
Так как данные должны передаваться в последовательном коде, необходим буфер данных IndVal, используемый как сдвигающий регистр, и счетчик разрядов CntInd. Тогда вывод одного байта можно свести к загрузке буфера IndVal, инициализации счетчика CntInd и последовательности сдвигов буфера влево, пока CntInd ≠ 0. После сдвига выводимый разряд байта будет находиться в разряде STATUS<C>. При этом каждый сдвиг должен сопровождаться формированием фронта синхроимпульса Clk. При условии, что байт находится в аккумуляторе w, алгоритм вывода можно представить в виде подпрограммы Send8:
Send8 bcf Clk ;Clk:=0
movwf IndVal ;переслать w в буфер
movlw 8 ;загрузить счетчик разрядов
movwf CntInd
sendloop bcf Data_in ;установить 0
rlf IndVal,f ;сдвиг влево
btfsc STATUS,C ;анализ флага С
bsf Data_in ;установить 1, если С=1
nop
bsf Clk ;сформировать импульс
nop
bcf Clk
decfsz CntInd,1
goto sendloop
return
Процесс вывода информации можно представить, как последовательный вывод трех восьмиразрядных слов при выборе контроллера MC14489 (Cs=0):
Display bcf CS ;Cs:=0
movf R0,0 ;загрузить R0
call Send8 ;вывести на индикатор
movf R1,w ;загрузить R1
call Send8 ;вывести на индикатор
movf R2,w ;загрузить R2
call Send8 ;вывести на индикатор
bsf CS ;Cs:=1
return
Теперь приступим к программированию нереализованных в основной программе операторов. Подпрограмма расчета 1 секунды работы программируемого таймера
Dly movlw .14
movwf Cnt ;загрузить счетчик переполнений
clrf TMR0 ;сброс TMR0
bcf INTCON,T0IF
T71ms btfss INTCON,T0IF
goto T71ms ;ожидание переполнения таймера
bcf INTCON,T0IF
decfsz Cnt,f ;время задержки истекло?
goto T71ms
return ;возврат в основную программу
Теперь, когда определены все используемые ресурсы МК, можно приступить к программированию операторов инициализации. При использовании операторов инициализации модулей МК необходимо помнить, что все ячейки статической памяти данных МК размещаются в четырех
банках. При обращении к регистрам специальных функций следует учитывать, в каком банке они размещаются. С учетом этого операторы инициализации модулей МК:
bsf STATUS, RP0
bcf STATUS, RP1
movlw b'11010111' ;
movwf TRISB^80h;
movlw b'11111100';
movwf TRISD^80h;
movlw b'00000000'
movwf TRISE^80h;
movlw b'00000000' ; pull-up B
movwf OPTION_REG^80h;
movlw b'00001110';
movwf T1CON
bcf STATUS,RP0
movlw b'00000001';
movwf IndVal
Операторы инициализации контроллера MC14489:
bcf CS
movf IndVal,0
call Send8
bsf CS
Операторы инициализации ячеек памяти:
clrf R0 ;сброс индикаторов
clrf R1
clrf R2
5 Автономная отладка программы
Отладка программ микропроцессорной системы проводится, как правило, на тех же ЭВМ, на которых велась разработка программ, и на том же языке программирования, на котором написаны отлаживаемые программы, и может быть начата на ЭВМ даже при отсутствии аппаратуры МПС. При этом в системном программном обеспечении ЭВМ должны находиться программы (интерпретаторы или эмуляторы), моделирующие функции отсутствующих аппаратных средств. Так, разработка и автономная отладка программных средств может вестись на больших ЭВМ, мини-ЭВМ, микро-ЭВМ, система команд которых не совпадает с системой команд используемого микропроцессора. Кроме того, при отладке программ может отсутствовать внешняя среда микропроцессорной системы, ее также необходимо моделировать.
Проверка корректности программ, т.е. проверка соответствия их внешним спецификациям, осуществляется тестированием. Программы проверяются на функционирование с различными исходными данными. Результаты функционирования программ сравниваются с эталонными значениями.
Отладка программ подразделяется на следующие этапы: планирование отладки; составление тестов и задания на отладку; исполнение программ; информирование о результатах исполнения программ по заданным исходным данным; анализ результатов, обнаружение ошибок и локализация неисправностей.
В нашем случае, как для разработки программы, так и для автономной ее отладки использовался специализированный пакет программ MPLAB IDE фирмы Microchip.
Для того чтобы проверить временные промежутки включения и выключения программируемого таймера, поставим точки останов в окне Stopwatch, полученные значения равны 1 секунде при выключении таймера, следовательно, таймер настроен правильно.
Далее для отладки программы применим быстрый пошаговый режим прогона программы – Animate, при этом проверялось содержимое регистров R0..R2.
После того, как убедились в правильности выполнения программы в режиме автономной отладки, перешли к комплексной отладке проекта.
6 Комплексная отладка микропроцессорной системы
При комплексной отладке наряду с детерминированным используется статистическое тестирование, при котором МПС проверяется при изменении исходных переменных в соответствии со статистическими законами работы источников информации. Полнота контроля работоспособности проектируемой системы возрастает за счет расширения диапазона возможных сочетаний переменных и соответствующих им логических маршрутов обработки информации.
Существуют пять основных приемов комплексной отладки микропроцессорной системы:
1) останов функционирования системы при возникновении определенного события;
2) чтение (изменение) содержимого памяти или регистров системы;
3) пошаговое отслеживание поведения системы;
4) отслеживание поведения системы в реальном времени;
5) временное согласование программ.
В данной работе использовался 4 прием комплексной отладки, то есть отслеживание поведения системы в реальном времени. Параметрами, по которым можно было определить правильность работы программируемого таймера, являются значения пройденного времени на индикаторах и правильность работы кнопок. В ходе проведения комплексной отладки, нарушений в работе устройства регистрации не обнаружено, следовательно, можно сделать вывод, что программа верна.
Приложение А
Учебно-отладочный стенд
(схема электрическая принципиальная)
Приложение Б
(обязательное)
Исходный текст программы
;***** Курсовая работа
list p=16f877,st=OFF
#include "p16f877.inc";
; ------------------------------------------------------
cblock 0x20
Cnt; рабочая ячейка
Temp1;
Temp2;
temp
R0;
R1;
R2;
IndVal;
CntInd ;
status_temp
L_byte
H_byte
endc
; ------------------------------------------------------
;#define RB1 PORTB,1 ;
#define Data_in PORTE,1; сигналы МС14489
#define Clk PORTE,0;
#define Cs PORTB,3;
org 0x000;
nop;
clrf PORTE;
bsf STATUS, RP0
bcf STATUS, RP1
movlw b'11010111' ;
movwf TRISB^80h;
movlw b'11111100';
movwf TRISD^80h;
movlw b'00000000'
movwf TRISE^80h;
movlw b'00000000' ; pull-up B
movwf OPTION_REG^80h;
movlw b'00001110';
movwf T1CON
bcf STATUS,RP0
movlw b'00000001';
movwf IndVal
call Control_MC14489;
Cn clrf Cnt ;
Main
movf Cnt,W ;
movwf L_byte;
clrf H_byte
Call B2_BCD
Call Display;
bt1 btfsc PORTB,1; запрос кнопки "+5" (нажата?)
goto Cn1
movlw .5
addwf Cnt,f
Release call D15ms
btfss PORTB,1
goto Release
Cn1
movlw -.60
addwf Cnt,W; сравнить с числом 60
btfss STATUS,C ;если =60, то
goto bt3
goto Cn
bt3 movf Cnt,W ;
movwf L_byte;
btfsc PORTB,2; опрос кнопки "Пуск"
goto bt1;
bsf PORTD,1
bt2 call Dly
decfsz Cnt,f;
goto bt2
bcf PORTD,1
goto Main;
Dly movlw .14
movwf Cnt ;загрузить счетчик переполнений
clrf TMR0 ;сброс TMR0
bcf INTCON,T0IF
T71ms btfss INTCON,T0IF
goto T71ms ;ожидание переполнения таймера
bcf INTCON,T0IF
decfsz Cnt,f ;время задержки истекло?
goto T71ms
return ;возврат в основную программу
;-----------------------------------------------------------
D15ms
movlw .30
movwf Temp2
call D500us
decfsz Temp2,f
goto $-2
return
;--------------------------------------------------------------
D500us
movlw .151
movwf Temp1
decfsz Temp1,f
goto $-1
return
B2_BCD
bcf STATUS,0
movlw .16
movwf Cnt
clrf R0
clrf R1
clrf R2
loop16
rlf L_byte
rlf H_byte
rlf R2
rlf R1
rlf R0
decfsz Cnt
goto adjDEC
retlw 0
adjDEC
movlw R2
movwf FSR
call adjBCD
movlw R1
movwf FSR
call adjBCD
movlw R0
movwf FSR
call adjBCD
goto loop16
adjBCD
movlw 3
addwf 0,W
movwf temp
btfsc temp,3
movwf 0
movlw 30
addwf 0,W
movwf temp
btfsc temp,7
movwf 0
retlw 0
;------------------------------------------------------------
Control_MC14489; операторы инициализации МС14489
bcf Cs; линию сбрасываем в ноль
movf IndVal,W; операторы загрузки числа 1
call Send8;
bsf Cs;
return
Display
movf STATUS,W
movwf status_temp ;подпрограмма отображ. 7сегм. символов
bcf Cs;
movf R0,0;
call Send8;
movf R1,0;
call Send8;
movf R2,0;
call Send8;
bsf Cs;
return;
Send8 ;подпрограмма отображ текущ. символа (W)
bcf Clk;
movwf IndVal;
movlw 8;
movwf CntInd;
sendloop
bcf Data_in ;
rlf IndVal,1;
btfsc STATUS,C;
bsf Data_in;
nop;
bsf Clk;
nop;
bcf Clk;
decfsz CntInd,1;
goto sendloop;
return;
end
Скачать: