Программируемый таймер

0

 

Физический факультет

 

Кафедра промышленной электроники и

информационно-измерительной техники

 

 

 

 

 

 

КУРСОВОЙ ПРОЕКТ

 

По дисциплине ЭМПТ

 

Программируемый таймер

 

Кафедра промышленной электроники и

информационно-измерительной техники

 

 

Данный курсовой проект содержит разработку и описание на языке ассемблер функциональных узлов программируемого таймера

 Программа микроконтроллера была написана и отлаживалась с помощью прикладной программы MPLAB IDE.

Проект содержит 5 рисунков, 4 таблицы и 2 приложения.

 

Оглавление

 

1 Функциональная спецификация и системные требования. 5

2 Системно-алгоритмическое проектирование. 7

3 Разработка аппаратных средств. 8

4 Разработка программы для МПУ.. 12

5 Автономная отладка программы.. 19

6 Комплексная отладка микропроцессорной системы.. 20

Список использованных источников. 21

Приложение А.. 22

Приложение Б. 23

 

 

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

 

 Скачать: zadanie.docx
kursach_1.docx

Категория: Курсовые / Электроника курсовые

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.