Некоммерческое акционерное общество

АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ

Кафедра инженерной кибернетики

 

 

 

 

ПРОГРАММНЫЕ СРЕДСТВА МИКРОПРОЦЕССОРНЫХ КОНТРОЛЛЕРОВ УПРАВЛЕНИЯ В ЗАДАЧАХ АВТОМАТИЗАЦИИ 

Методические указания к лабораторным работам

для магистрантов всех форм обучения специальности

6М070200 – Автоматизация и управление

 

 

 

Алматы 2011

 СОСТАВИТЕЛЬ: А.А.Копесбаева Программные средства микропроцессорных контроллеров управления в задачах автоматизации. Методические указания к лабораторным работам для магистрантов всех форм обучения специальностей 6М070200 – Автоматизация и управление - Алматы: АУЭС, 2011 -   49 с.

 

Настоящие методические указания включают в себя методические рекомендации и примеры выполнения задач по программированию в лабораторных работах по дисциплине «Программные средства микропроцессорных контроллеров управления в задачах автоматизации» в рамках дисциплин по выбору магистрантов специализации «Автоматизация и управление».

         Методические указания предназначены для студентов всех форм обучения специальностей 6М070200 – Автоматизация и управление.

         Ил.    3, табл.   2, прилож.     3 , библиогр. –     15 назв.

 

         Рецензент: канд.техн.наук, профессор  Ибраева Л.К.

 

         Печатается по плану издания некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2011 г.

 

 

©НАО «Алматинский университет энергетики и связи», 2011 г.

 

Лабораторная работа № 1. Программирование клавиатуры и организация ввода-вывода

 

Цель работы: обучение программированию ввода с клавиатуры, привитие навыков расчета временных характеристик программ микроконтроллеров, организации условных переходов, инициализации портов для вывода информации на дисплей.

 

1.1   Задание к лабораторной работе

 

           1) Изучите схему подключения клавиатуры, изображенную на лицевой панели стенда. Здесь в виде контакта изображена кнопка клавиатуры. Обратите внимание, что одна клемма кнопки клавиатуры предназначена для ввода, а вторая для вывода сигнала. 

           2) Предполагая, что на третий вход канала порта RD3 подключается клавиша «1», а  выход клавиши «1» подключается для инициализации к выходному биту RD7 контроллера, разработайте программу зажигания светодиода при нажатии клавиши «1». Светодиод подключите к  биту RC7 (см. программу 1.1). Он остается включенным до тех пор, пока, нажата клавиша клавиатуры.

             Программа 1.1

include <p16F877.inc>

;Начало программы

                   org  00h      ;выполнение программы начинается с 0-го адреса

nop             ;nop - пустая команда, должна быть первой, так

nop             ;как она необходима для работы отладчика

nop

                   org    05h    ;начало кода с адреса 5 в шестнадцатеричном (h)

                                  ;формате

START

        CLRF                STATUS

        BSF                   STATUS,RP0    ;назначить 1-ый банк

        MOVLW           B'00001000'       ;3-ий разряд порта Д

        MOVWF           TRISD               ;вход, а остальные выходы

        CLRF                TRISC               ;порт С выход

        CLRF                STATUS           ;назначить 0-ой банк

        CLRF                PORTD                          ;очистить порт Д и С

        CLRF                PORTC

        MOVLW           B'10000000'       ;подать 1 на 7-ой выход

        MOVWF           PORTD                          ;порта Д

LOOP

        CLRF                PORTC                          ;очистить порт С

LOOP1

        BTFSS              PORTD, 3         ;когда 1 появится на 3-ем

        GOTO              LOOP                ;входе пропустить эту команду

        MOVLW           B'10000000'       ;зажечь 7-ой светодиод в

        MOVWF           PORTC                          ;порте С

        GOTO LOOP1              ;повторить опрос клавиши до

        END                               ;нового перезапуска

           4) Переработайте программу 1.1 так, что клавишей «1» светодиод включается и остается включенным, а при нажатии клавиши «5» отключается до нового включения ( программа 1.2).

           5) Запрограммируйте четыре светодиода на включении при нажатии клавиш с 1-го по 3-ий соответствующих номеров светодиода (программа 1.3) и отключении при нажатии клавиш с 5-ой по 7-ую.

6)     Изучите временные диаграммы команд CALL, RETLW.

           7) Изучите программу 1.4 задержки за счет организации циклов, определите, при каком числе, записанном в регистрах KOL,ZAD,ZAD1, будет максимальная и минимальная задержка.

 

Программа 1.4

         include <p16F877.inc>  

;Описание регистров ОЗУ             

                   KOL  EQU  H'0020'                 ;

                   ZAD  EQU  H'0021'                 ;

                   ZAD1          EQU  H'0022'       ;

;Начало программы

                   org     0       ;выполнение программы начинается с 0-го адреса

nop             ;nop - пустая команда, должна быть первой, так

nop             ;как она необходима для работы отладчика

nop

                   org     05h

START

                   CLRF                   STATUS             

                   BSF            STATUS, RP0     ; Выбираем банк 1

                   CLRF                   TRISC                 ;инициализировать порт С,как выход

                   CLRF         STATUS    ; выбрать 0 банк                   

                   MOVLW    H'FF'          ; количество повторений мигания

                   MOVWF    KOL           ;

LOOP

                   CLRF                   PORTC      ; очистить порт С-потушить светодиоды

                   CALL         LOOP1       ; вызвать п.п. задержки

                   MOVLW    B'11111111' ;

                   MOVWF    PORTC      ; зажечь светодиоды

                   CALL         LOOP1       ; задержка

                   DECFSZ     KOL,F        ;уменьшить количество повторений цикла

                                                        ;если 0, то пропустить следующую

                   GOTO        LOOP         ;если не ноль, то повторить цикл

                   GOTO        $                 ;закончить до нового перезапуска

                   END

;подпрограмма задержки

LOOP1               

                   MOVLW    B'11111111' ;

                   MOVWF    ZAD  ; установить время задержки в ячейку ZAD

                   MOVLW    B'11111111' ;

                   MOVWF    ZAD1          ; установить время задержки в ячейку ZAD1

LOOP2

                   NOP

LOOP3

                   DECFSZ     ZAD1,F;

                   GOTO        LOOP3;

                   DECFSZ     ZAD,F ;

                   GOTO        LOOP2;

                   RETURN    ;      

                   END

Пояснения: в результате выполнения программы светодиоды будут мигать 256 раз, а затем останутся в зажженном состоянии.

           8) Изучите, как в программе 1.4 использовался стек. Определите максимальное время задержки при частоте тактового генератора 12 Мгц.

           9) Изучите команды возврата из подпрограммы по условию RETLW k, RETFIE. Пусть в рабочем регистре содержится смещение от начала таблицы данных. Тогда получить нужный элемент можно следующей процедурой:

 

Программа 1.5 (фрагмент)

         MOVLW    02h                      ;задать смещение

         CALL                   SHOSYM   ;вызвать подпрограмму

         MOVWF    DATAPORT        ;вывести элемент таблицы в порт В

         GOTO        $                          ;зациклится навсегда

SHOWSYM

         ADDWF     PC                       ;вычислить смещение в таблице

         RETLW      0Aah                    ;1-ый элемент таблицы

         RETLW      0BBh                   ;2-ый элемент таблицы

         RETLW      0CCh                   ;3-ый элемент таблицы

Результат таблицы 10111011. Используйте этот фрагмент для реализации вывода результирующей таблицы на светодиоды при определенных сигналах с клавиатуры ( см. программу 1.5).

           10) Изучите следующие характеристики  ЖКИ типа MT-16S2D. Модуль позволяет отображать 2 строки по 26 символов в каждой. Символы отображаются в матрице 5х8 точек. Между символами имеются интервалы шириной в одну отображаемую точку. Каждому отображаемому символу соответствует его код в ячейке ОЗУ модуля. Модуль содержит два вида памяти – кодов отображаемых символов и пользовательского знакогенератора, а также логику для управления ЖК панелью. Символы английского алфавита  выводятся на индикатор как обычные символьные константы в виде ‘simvol, а для вывода русского алфавита используйте таблицу 1.1.

           Пример программирования индикатора приведен в программе 1.6.

 


Таблица 1.1

 

Программа 1.6

;============================================

;     Программа управления индикатором

;============================================

         include <p16f877.inc>

;============================================

;     Символы задержки

;============================================

SIMVOL              EQU  H'0020'

SIMVOLL            EQU  H'0021'

SIM                      EQU  H'0022'

;====================================================

; Расчет частоты работы индикатора и переменные настройки индикатора

;====================================================

Dev_Freq  EQU    D'12000000'; Базовая частота микроконтроллера 12 MHz

 

LCD_INIT_DELAY EQU (HIGH ((( Dev_Freq / 4 ) * D'46' / D'10000' ) / 3 ) ) + 1

MSD EQU  H'0030        '; Временный регистр, старшие цифры кода

; для преобразования BIN в BCD

LSD            EQU       H'0031'  ; Временный регистр, младшие цифры кода

CHAR        EQU       H'0032';Временный регистр, для вывода символа на LCD

LCD_DATA         EQU  PORTC

LCD_DATA_TRIS        EQU  TRISC

LCD_CNTL                  EQU  PORTE

E                 EQU  1                 ; Разрешение обращения к модулю

RRW          EQU  0                 ; Выбор режима чтение/запись

RS              EQU  2                 ; бит выбора режима данные/команда

; настройка LCD

DISP_ON            EQU           0x00C         ; вкл. дисплея

DISP_ON_C        EQU           0x00E; вкл. дисплей, курсор в исх. положение

DISP_ON_B        EQU           0x00F;вкл. дисплей, курсор в исх. положение,

;вкл.мигание курсора

DISP_OFF           EQU  0x008          ; выкл. дисплея

CLR_DISP           EQU  0x001          ; очистка дисплея

ENTRY_INC       EQU  0x006          ;

ENTRY_INC_S   EQU  0x007          ;

ENTRY_DEC      EQU  0x004          ;

ENTRY_DEC_S  EQU  0x005          ;

DD_RAM_ADDR          EQU  0x080          ; читать 7-bit адрес

DD_RAM_UL      EQU  0x080          ; перемещение влево курсора;

;============================================

;        Начало кода

;========================

         org    0000h          ; начать программу с 0-го адреса памяти программ

         nop

         GOTO        START             

;===========================================================

;        Начало исполняемого кода 100h

;===========================================================

         org    0100h

START

         CLRF                   STATUS                       ; назначение  0-го банка

         CLRF                   INTCON                       ; Запретить все прерывания

         CLRF                   PIR1

         BSF            STATUS,RP0

         MOVLW    0x00

         MOVWF    OPTION_REG

         CLRF                  PIE1

         MOVLW    0xFF

         MOVWF    ADCON1

         BCF           STATUS,RP0

;===========================================================

;        Инициализация портов

;===========================================================

         CLRF                   PORTC                        

         CLRF                   PORTE

         BSF            STATUS, RP0               ; выбор 1-го банка

         CLRF                  TRISC                           ; настройка порта С на выход

         CLRF                  TRISE                           ; настройка порта Д на выход

         BCF           STATUS, RP0               ; выбор 0-го банка

;===========================================================

;        Начальная настройка индикатора

;===========================================================

         CLRF                   LCD_CNTL                  ; обнулить порт управления

DISPLAY_INIT

         MOVLW    0x038                   ;  Выбираем 8-ми битный интерфейс

         MOVWF    LCD_DATA                 

         BSF            LCD_CNTL, E              ; передать команду

         BCF            LCD_CNTL, E             

LCD_DELAY

         MOVLW    LCD_INIT_DELAY; загрузка значений регистр MSD и LSD

         MOVWF    MSD ;  знач.регистра LCD_INIT_DELAY задается в библ.

         CLRF                   LSD  ; "lm032l.h" в зависимости от тактовой чатоты мк.

LOOP2      

         DECFSZ     LSD, F; время для инициал. = MSD * ((3 * 256) + 3) * Tcy

         GOTO        LOOP2                         

         DECFSZ     MSD, F                        

END_LCD_DELAY

         GOTO        LOOP2                         

CMD_SEQ

         MOVLW    0X038

         MOVWF    LCD_DATA                  ; команда - 8-битный интерфейс

         BSF            LCD_CNTL, E              ; передать команду

         BCF            LCD_CNTL, E             

;=====================================================

; Начальные установки индикаторов

;=====================================================

         MOVLW    DISP_ON                                 

         CALL                  SEND_CMD                 

         MOVLW    CLR_DISP          

         CALL                  SEND_CMD                 

         MOVLW    ENTRY_INC                   

         CALL                  SEND_CMD                             

         MOVLW    DD_RAM_ADDR                    

         CALL                  SEND_CMD                 

;=====================================================

;        Основная программа

;=====================================================

LOOP_NEW

         CALL                   ST1                      ;вывод первой бегущей стоки

         MOVLW    H'00AA'

         CALL                   ZAD                     ; Задержка

         CALL                   CLRF_LCD                   ; очистить индикатор

         CALL                   ST2                      ;вывод второй бегущей строки

         MOVLW             H'00AA'

         CALL                   ZAD                     ; задержка

         CALL                   CLRF_LCD                   ; очистить индикатор

         GOTO                 LOOP_NEW        ;повторить основную программу

;=====================================================

;        Вывод бегущей строки "HALLO THE STUDENT"

;=====================================================

ST1

         MOVLW    'H'

         CALL                  SEND_CHAR 

         MOVLW    'A'

         CALL                  SEND_CHAR

         MOVLW    'L'

         CALL                  SEND_CHAR

         MOVLW    'L'

         CALL                  SEND_CHAR

         MOVLW    'O'

         CALL                  SEND_CHAR

         MOVLW    B'11000000'

         CALL                  SEND_CMD

         MOVLW    'T'

         CALL                  SEND_CHAR 

         MOVLW    'H'

         CALL                  SEND_CHAR

         MOVLW    'E'

         CALL                  SEND_CHAR

         MOVLW    ' '

         CALL                  SEND_CHAR

         MOVLW    'S'

         CALL                  SEND_CHAR

         MOVLW    'T'

         CALL                  SEND_CHAR

         MOVLW    'U'

         CALL                  SEND_CHAR

         MOVLW    'D'

         CALL                  SEND_CHAR

         MOVLW    'E'

         CALL                  SEND_CHAR

         MOVLW    'N'

         CALL                  SEND_CHAR

         MOVLW    'T'

         CALL                  SEND_CHAR

         RETURN

;=====================================================

;        Вывод бегущей строки  "Здравствуй студент"

;=====================================================

ST2

         MOVLW    H'00A4'

         CALL                  SEND_CHAR 

         MOVLW    H'00E0'

         CALL                  SEND_CHAR

         MOVLW    'P'

         CALL                  SEND_CHAR

         MOVLW    'A'

         CALL                  SEND_CHAR

         MOVLW    'B'

         CALL                  SEND_CHAR

         MOVLW    'C'

         CALL                  SEND_CHAR

         MOVLW    'T'

         CALL                  SEND_CHAR

         MOVLW    'B'

         CALL                  SEND_CHAR

         MOVLW    H'00A9'

         CALL                  SEND_CHAR

         MOVLW    H'00A6'

         CALL                  SEND_CHAR

         MOVLW    B'11000000'

         CALL                  SEND_CMD

         MOVLW    'C'

         CALL                  SEND_CHAR 

         MOVLW    'T'

         CALL                  SEND_CHAR

         MOVLW    H'00A9'

         CALL                  SEND_CHAR

         MOVLW    H'00E0'

         CALL                  SEND_CHAR

         MOVLW    'E'

         CALL                  SEND_CHAR

         MOVLW    'H'

         CALL                  SEND_CHAR

         MOVLW    'T'

         CALL                  SEND_CHAR

         RETURN

;=====================================================

;        Подпрограмма задержки (три вложенных цикла)

;=====================================================

ZAD

         MOVWF    SIMVOLL

PAU

         MOVLW    H'000F'

         MOVWF    SIMVOL

PAUZ

         MOVLW    H'00FF'

         MOVWF    SIM

PAUZA

         DECFSZ     SIM,F

         GOTO                 PAUZA

         DECFSZ     SIMVOL,F

         GOTO                 PAUZ

         DECFSZ     SIMVOLL,F

         GOTO                 PAU

         RETURN

;=====================================================

;        Подпрограмма очистки индикатора

;=====================================================

CLRF_LCD

         MOVLW    CLR_DISP

         CALL                  SEND_CMD       

         MOVLW    ENTRY_INC      

         CALL                  SEND_CMD       

         MOVLW    DD_RAM_ADDR         

         CALL                   SEND_CMD       

         RETURN

;=====================================================

;        Подпрограмма вывода символа на индикатор

;=====================================================

SEND_CHAR

         MOVWF    CHAR                           ; загрузка символа в регистр  CHAR

         MOVLW    H'000F'

         CALL                   ZAD                     ; Задержка

         MOVF                 CHAR, w            

         MOVWF    LCD_DATA                  ; послать символ на индикатор

         BCF            LCD_CNTL, RRW; перевести индикатор в режим чтение

         BSF            LCD_CNTL, RS  ; установить индикатор в режим данных

         BSF            LCD_CNTL, E              ; начало передачи данных

         BCF           LCD_CNTL, E

         RETURN

;=====================================================

;        подпрограмма подачи команд на индикатор ;=====================================================

SEND_CMD

         MOVWF    CHAR                           ; сохранить команду в регистре  CHAR

         MOVLW    H'000F'

         CALL                   ZAD                     ; задержка

         MOVF                 CHAR, w                               

         MOVWF    LCD_DATA                  ; послать команду на индикатор

         BCF            LCD_CNTL, RRW; перевести индикатор в режим чтения

         BCF            LCD_CNTL, RS  ; установить индикатор в режим команд

         BSF            LCD_CNTL, E              ; начало передачи данных

         BCF           LCD_CNTL, E

         RETURN

;=====================================================

         end

 

 

 

 

 

 

 

 Рисунок 1.1

 

11) Сделайте анализ приведенной программы, определите, каков будет результат её выполнения. При этом подключайте индикатор к контроллеру в порядке, указанном на рисунке 1.1.

12) Напишите программу решения следующей задачи: при нажатии клавиши «5» на экран выводится строка «Здравствуй студент», а при отключенной клавише «5» - строка «Hallo student» ( программа 1.7).

 

Лабораторная работа № 2. Таймерные функции

 

Цель работы: изучение понятия таймеров микропроцессора, возможностей и режимов работы шестнадцатиразрядного таймера TMR1.

 

2.1 Задание к лабораторной работе

 

           1) Изучите поле сторожевого таймера WDT регистра STATUS и флаг прерывания по переполнению  тайм аута –TOIF регистра INTCON, разряды регистров TMRO-TMR2.

           2) Напишите программу 2.1 организации задержки за счет таймерных функций процессора при использовании TMR1.

 

Программа 2.1

;описание регистров

         include<p16F877.inc>

;Начало

         org 0  ;выполнение программы начинается с 0-го адреса.

         nop    ;пустая команда используется для

         nop    ;работы отладчика

         nop   

         org 05h       ;начать с адреса 5

START

         CLRF         STATUS

         BSF            STATUS,RP0

         MOVLW    B'00000000'

         MOVWF    TRISC

         CLRF                   STATUS

CLRF         T1CON       ; Остановить TMR1, тактирование от внутреннего

; генератора, пределитель частоты =1:1

         CLRF                  TMR1H      ;очистить старший байт таймера

         CLRF                  TMR1L       ;очистить младший байт таймера

CLRF         INTCON     ; Запретить прерывания от TMR1

         BSF            STATUS,RP0

         CLRF                  PIE1           ; Запретить периферийные прерывания

BCF            STATUS,RP0

         CLRF                   PIR1           ; Обнулить флаг периферийных прерываний

         MOVLW    0X30; Тактирование от внутреннего

         MOVWF    T1CON; генератора, пределитель частоты =1:8

         BSF            T1CON,TMR1ON; Старт TMR1

T1_OFF

         BTFSS       PIR1,TMR1IF; до тех пор, пока не установится

         GOTO        T1_OFF               ;флаг переполнения таймера зациклить

         MOVLW    H'FF' ;когда флаг переполнения установится

         MOVWF    PORTC      ;зажечь светодиоды

         BCF           PIR1,TMR1IF      ;обнулить флаг переполнения таймера

         BSF            T1CON,TMR1ON         ; Старт TMR1

T2_OFF    

         BTFSS       PIR1,TMR1IF

         GOTO        T2_OFF

         CLRF                  PORTC                ;потушить светодиоды

         BCF            PIR1,TMR1IF      ;обнулить флаг переполнения таймера

         GOTO        START                ;повторить сначала

END

В результате выполнения этого задания магистрант должен приобрести навыки  расчета конкретных временных значений по характеристикам микроконтроллера. Если коротко охарактеризовать работу таймера, то это накопление импульсов тактового генератора. Это накопление происходит до тех пор, пока не переполнятся два 8-разрядных регистра таймера TMR1 (TMR1H и TMR1L), то есть один 16 –разрядного регистр. Понятно, что это переполнение произойдет, когда в регистр поступит 216 импульсов (65536). Частота, с которой поступают импульсы, определяется частотой тактового генератора (12 Мгц), а также значением предделителя частоты (1:8). Накопление времени происходит каждый машинный цикл, который состоит из 4-х тактов тактового генератора. При таких данных период поступления импульсов составляет Т= [1/(12*10-6)]*8*4 = 2,67 мкс. Тогда максимальное время до установки флага переполнения:  tmax=2,67x65536x10-6 =0,18 c, значит, частота миганий светодиодов (или частота выходных импульсов) fmin=1/0,18= 5,56 Гц, tmin=2,67x10-6 с, значит, частота миганий светодиодов (или частота выходных импульсов) fmax=(1/2,67)x106= 375 KГц. Большее, чем 0,18 секунд, время формируем за счет организации вложенных циклов или простым повторением циклов опроса таймера. Формирование времени осуществляется накоплением импульсов от начального значения регистров TMR1H и TMR1L до переполнения таймера.

           3) Напишите программы организации зажигания светодиодов на 5 с и нового их включения через 10 с. Предусмотрите удобный для вас контроль выполнения программы по состоянию светодиодов. Процедуры задержек можно оформить в виде подпрограмм ( программа 2.2).

           4) Разработайте программу работы светофора, который через каждые 10 с выдает попеременно сообщения «STOY» и «IDI». В качестве светофора используйте ЖКИ ( программа 2.3).

           5) Разработайте такую программу,  в результате выполнения которой на 10 с включается звуковая сигнализация, а  на следующие 10 с включаются светодиоды (программа 2.4). При этом учтите, что частота работы звукового генератора должна быть в диапазоне слышимости от 20 до 15 000 Гц. Звуковой генератор подключен к портуС-7-му каналу, а светодиоды к остальным каналам порта С. 

 

Лабораторная работа № 3. Двоично-десятичное преобразование

 

Цель работы: изучение принципов преобразования двоичных кодов в двоично-десятичные, приобретение навыков использования подпрограмм преобразования.

 

1. Задание к лабораторной работе

 

           1) Изучите принцип преобразования двоичного кода в двоично-десятичное значение [1,2,3] и алгоритм (см. рисунок 3.1).

          

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 3.1 – Блок-схема алгоритма двоично-десятичного преобразования

 

           2) Наберите программу 3.1 преобразования восьмиразрядного кода в двоично-десятичное значение, исследуйте результат её выполнения.

           3) Наберите программу 3.2 преобразования шестнадцатиразрядного кода в двоично-десятичное значение, исследуйте результат её выполнения.

     4) Используя программы 3.1 и 3.2, разработайте программы вывода результатов на индикаторы.

 

Программа 3.1

;8-RAZRAD

;преобразование двоичного значения в ВСD

LSD       EQU  H'20';младшая цифра

MSD      EQU  H'21';старшая цифра результата

     org    H'00'

     GOTO        MAIN

BINBCD         

CLRF                   MSD

     MOVWF    LSD

GT

     MOVLW    D'10'

     SUBWF      LSD,0         ;вычесть 10

     BTFSS       STATUS,C

     GOTO        OVER         ;если <10 прекратить

     MOVWF    LSD  ;если больше 10 записать остаток в LSD

     INCF          MSD,1        ;+1 в MSD

     GOTO        GT    ;повторить

OVER   

RETLW      0        ;возврат в основную программу с 0 в аккумуляторе

;контрольная программа, преобразовать H'63', получиться 99

MAIN

     MOVLW    H'63'

     CALL         BINBCD

     GOTO $

     END

 

Программа 3.2

;Преобразование 16-RAZRAD двоичных кодов ы двоично-десятичное

;результат 5-ти разрядное десятичное число

;исходное число в регистрах H_BYTE и L_BYTE

COUNT          EQU           H'62';счетчик разрядов

TEMP             EQU           H'63';временный регистр хранения

R0                             EQU           H'64';старшие две цифры результата

R1                            EQU           H'65' ;средние две цифры результата

R2                             EQU           H'66' ;младшие две цифры результата

H_BYTE         EQU           H'67' ;старший байт исходного числа

L_BYTE                   EQU           H'68'  ;младший байт исходного числа

     ORG H'00'

     GOTO        MAIN

B2_BCD         

BCF            STATUS,C

     MOVLW    D'16'

     MOVWF    COUNT

     CLRF                   R0

     CLRF                   R1

     CLRF                   R2

LOOP16

     RLF            L_BYTE,1

     RLF            H_BYTE,1

     RLF            R2,1

     RLF            R1,1

     RLF            R0,1

     DECFSZ     COUNT,1

     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    H'03'

     ADDWF     INDF,0

     MOVWF    TEMP

     BTFSC       TEMP,3

     MOVWF    INDF

     MOVLW    H'30'

     ADDWF     INDF,0

     MOVWF    TEMP

     BTFSC       TEMP,7

MOVWF    INDF

     RETLW      0

; Тестовая программа. Результат R0,R1,R2=65,55,35

MAIN

     MOVLW    H'FF'

     MOVWF    H_BYTE;задаем двоичное FFFF (16 бит)

     MOVWF    L_BYTE

     CALL         B2_BCD

     GOTO        $

     END

 

           5) Изучите программы умножения чисел в двоичном коде по следующей программе 3.3.

 

Программа 3.3

;беззнаковое умножение 8-разрядных чисел

MN1           EQU           H'20'  ;МНОЖИМОЕ

MN2           EQU           H'21'  ;МНОЖИТЕЛЬ

H_BYTE     EQU           H'22'  ;старший байт результата

L_BYTE     EQU           H'23'  ;младший байт результата

COUNT      EQU           H'24'  ;счетчик разрядов

START

         MOVLW    0FF   ;контрольная константа = 255

         MOVWF    MN2  ;записать в множимое

         MOVLW    0FF   ;контрольная константа = 255

         MOVWF    MN1  ;записать в множитель

         CALL         UMN ;перейти на подпрограмму умножения

         GOTO        $

;

UMN

         CLRF                  STATUS

         MOVLW    D'08'

         MOVWF    COUNT      ;загрузить количество разрядов

         CLRF                  H_BYTE     ;очистить регистры результата

         CLRF                  L_BYTE

         MOVF        MN1,0        ;множимое в аккумулятор

         BCF           STATUS,C;очистить бит переполнения

CYC

         RRF  MN2,1        ;сдвиг множителя вправо

         BTFSC       STATUS,C;если не было переполнения пропустить

         ADDWF     H_BYTE,1;иначе сложить MN1+MN2

         RRF           H_BYTE,1;сдвиг вправо стврший байт результата

         RRF           L_BYTE,1;сдвиг вправо младший байт результата

         DECFSZ     COUNT,1   ;если все 8 бит опрошены пропустить

         GOTO        CYC  ;иначе повторить цикл

         RETLW      0        ;возврат из подпрограммы с 0 в аккумуляторе

         END 

           6) Изучите программу деления чисел в двоичном коде по программе 3.4. Комментарии к программе помогут вам в этом.

 

Программа 3.4

;деление 16-разрядных чисел

; АССВ(16 БИТ)/АССА(16 БИТ)=АССВ(16 БИТ)

;остаток помещается в АССС(16 бит)

;SIGNED определяет версию деления-

;SIGNED=1 - для версии деления со знаком

;SIGNED=0 - для версии деления без знака

; деление с двойной точностью (16 бит/16 бит=16 бит) b=b/a+c

; предварительно надо убедиться, что делимое больше, чем делитель

ACCAL0    EQU  H'20'

ACCAHI     EQU  H'21'

ACCBL0     EQU  H'22'

ACCBHI     EQU  H'23'

ACCCL0    EQU  H'24'

ACCCHI     EQU  H'25'

ACCDL0    EQU  H'26'

ACCDHI     EQU  H'27'

TEMP         EQU  H'28'

SIGN          EQU  H'29'

SIGNED     EQU  H'01'

         ORG H'00'

         GOTO        MAIN

D_DIVS

         BTFSC       SIGNED,0;если версия деления без знака,

;пропустить следующую команду

         CALL         S_SIGN      ;если со знаком перейти на

;определение знака результата

;

         CALL         SETUP       ;к подпрограмме записи делимого

; во временный регистр АССD

         CLRF                  ACCCHI     ;очистить регистр остатка

         CLRF                  ACCCL0

DLOOP     

BCF           STATUS,C;очистить бит переполнения

         RLF           ACCDL0,1;сдвиг влево делимого

         RLF           ACCDHI,1

         RLF           ACCCL0,1;сдвиг влево остатка

         RLF           ACCCHI,1

         MOVF        ACCAHI,0;делитель в аккумулятор

         SUBWF      ACCCHI,0;вычесть из остатка делитель,проверяем а>c?

         BTFSS       STATUS,Z;если a=c пропустить следующую команду

         GOTO        NOCHK      ;перейти к подпрограмме деления

         MOVF        ACCAL0,0

         SUBWF      ACCCL0,0;вычесть из остатка делитель для сташего байта

NOCHK     

BTFSS       STATUS,C; если с>а, пропустить следующую команду

         GOTO        NOGO        ;перейти к порограмме деления

         MOVF        ACCAL0,0;

         SUBWF      ACCCL0,1;выч из остатка делитель для младшего байта (с-а)=с

         BTFSS       STATUS,C;

         DECF         ACCCHI,1

         MOVF        ACCAHI,0

         SUBWF      ACCCHI,1

         BSF            STATUS,C; уст. бит переноса и сдвигаем в младший разряд

NOGO       

RLF            ACCBL0,1

         RLF            ACCBHI,1

         DECFSZ     TEMP,1      ;организация цикла по всем 16-ти разрядам

         GOTO        DLOOP

         BTFSC       SIGNED,0;если без знаковое деление

;пропустить следующую команду

         BTFSS       SIGN,7       ;если знаковое деление проверить

;знак отрицательный?

         RETLW      0        ;"нет", то возврат с 0 в аккумуляторе

         GOTO        NEG_A       ;"да", то перейти на изменение знака

;подпрограмма установки начальных условий

SETUP

         MOVLW    D'16'  ;количество битов 16

         MOVWF    TEMP

         MOVF        ACCBHI,0;переписать делимое в регистр D

         MOVWF    ACCDHI

         MOVF        ACCBL0,0

         MOVWF    ACCDL0

         CLRF                  ACCBHI     ;очистить регистр В для результата (частного)

         CLRF                  ACCBL0

         RETLW      0

;подпрограмма изменения знака -а=а

NEG_A      

COMF        ACCAL0,1

         INCF          ACCAL0,1

         BTFSC       STATUS,Z

         DECF         ACCAHI,1

         COMF        ACCAHI,1

         RETLW      0

;подпрограмма деления со знаком

S_SIGN     

MOVF        ACCAHI,0

         XORWF     ACCBHI,0

         MOVWF    SIGN

         BTFSS       ACCBHI,7;если "-" меняем знак байта А0СВ

         GOTO        CHEK_A

         COMF        ACCBL0,1;меняем знак

         INCF          ACCBL0,1

         BTFSC       STATUS,Z

         DECF         ACCBHI,1

         COMF        ACCBHI,1

CHEK_A   

BTFSS       ACCAHI,7;если "-" то меняем знак байта АССА

         RETLW      0

         GOTO        NEG_A

;тестовая программа

MAIN

         MOVLW    H'80'

         MOVWF    ACCAHI     ;загрузка "-2" ACCA

         MOVLW    H'02'

         MOVWF    ACCAL0

         MOVLW    H'00'

         MOVWF    ACCBHI

         MOVLW    H'08'

         MOVWF    ACCBL0     ;загрузка "8" в АССВ

         CALL         D_DIVS      ;перейти к подпрограмме деления

         GOTO        $

         END

           7) Разработайте программы представления результатов умножения и деления в двоично-десятичном виде (программа  3.5).

 

Лабораторная работа №4. Аналогово-цифровое преобразование

 

Цель работы: изучение принципов аналогово-цифрового преобразования в микропроцессорных средствах, приобретение навыков сбора схемы с аналоговыми сигналами, приобретение навыков подключения аналоговых датчиков в задачах автоматизации.

 

1       Задание к лабораторной работе

 

1)       Изучите схему центрального процессора PICF877 [1,2,4], обратите внимание на то, что к этому контроллеру подключаются аналоговые сигналы на напряжение  от 0 до 5 Вольт.

2)       Изучите принципы аналого-цифрового преобразования [5 стр.173].

3)       Изучите программу инициализации аналогового входа (программа 4.1) микроконтроллера для подключения аналоговых датчиков систем автоматизации.

 

Программа 4.1 (фрагмент)

; Код примера инициализации A/D преобразователя.

BSF            STATUS, RP0     ; Выбираем Bank1

CLRF         ADCON1             ; Все входы АЦП аналоговые

BСF           PIE1, ADIE          ; Запретить прерывание от АЦП

BCF           STATUS, RP0     ; Выбираем Bank0

MOVLW    0xC1                     ; Внутренний RC генератор, АЦП включен,

MOVWF    ADCON0         ;преобразования выполняются по 0-му каналу

                   ; (AN0)

BCF           PIR1,ADIF           ; Отчистить флаг окончания A/D

;преобразования

BСF           INTCON,PEIE     ; Запретить периферийные прерывания

BSF            INTCON, GIE      ; Запретить все прерывания

; Необходимо время для осуществления выборки

BSF            ADCON0, GO               ; Старт АЦП

; Производится опрос бита (ADIF) окончания A/D преобразования

AD_WAIT

BTFSS       PIR1, ADIF

GOTO        AD_WAIT

; A/D преобразование закончено

BCF           PIR1, ADIF

……………….

; Продолжение программы

           4) Дополните программу 4.1 выводом аналогового сигнала на индикатор (см. программу 4.2).

 

Программа 4.2

; Begin

     R0L EQU 0x20 ; младший регистр

     R0H EQU 0x21

     R1L EQU 0x22

     R1H EQU 0x23

     R2L EQU 0x24

     R2H EQU 0x25

     R3L EQU 0x26

     R3H EQU 0x27

     R4L EQU 0x28

     R4H EQU 0x29

     R5L EQU 0x2A

     R5H EQU 0x2B

;начало кода программы

     ORG 0x0000                  ; начать с 0-го адреса

     BCF PCLATH,3            ;назначение 0-ой страницы памяти программ

     BCF PCLATH,4

     GOTO L0002                ;перейти к основной программе

     ORG 0x0004                  ; при наличии прерываний

     RETFIE                         ;возврат с разрешением нового прерывания

L0002:

; 1:Определяет ADC_CLOCK=3 'если не выполняется перемен. времени 3

; 2:Определяет ADC_SAMPLEUS =10 'если не вып. переменная времени 20

; 3: Опред LCD_BITS=8'разрешение  4 и 8 – битных линий интерфейса

; 4: Определяет LCD_DREG = PORTB

; 5: Определяет LCD_DBIT=0'0 или 4 для 4-бит интерфейса, игнорируется ;для 8-битного интерфейса

; 6: Определяет LCD_RSREG = PORTD

; 7: Определяет LCD_RSBIT = 1

; 8: Определяет LCD_EREG = PORTD

; 9: Определяет LCD_EBIT = 3

; 10: Определяет LCD_RWREG = PORTD 'запрет на 0

; 11: Определяет LCD_RWBIT = 2 'запрет на 0

; 12: Определяет LCD_COMMANDUS = 2000 'продолжительность вывода ; ;команды LCDCMDOUT, предельное значение 5000

; 13: Определяет LCD_DATAUS = 50 'задержка LCDOUT, по значению 100

; 14: Определяет LCD_INITMS = 2 'задержка по LCDINIT, по значению 100

;15:  'переменная для отображения реальных величин в режиме симулляции

; 16:

; 17: Матрица «an0» как цифровое слово

;       адрес переменной 'an0'  0x2C

     an0 EQU 0x2C

; 18:

; 19: TRISA = 0xff 'установка всех каналов PORTA аналоговыми входами

     BSF            STATUS,RP0

     MOVLW    0xFF

     MOVWF    0x05

     BCF            STATUS,RP0

; 20: ADCON1 = 0 'установка PORTA все аналоговые входа

     BSF            STATUS,RP0

     CLRF         0x1F

     BCF            STATUS,RP0

; 21: начальные установки LCD модуля; курсор мигает

     BCF            0x08,3

     BCF            0x08,1

     BCF            0x08,2

     BSF            STATUS,RP0

     BCF            0x08,3

     BCF            0x08,1

     BCF            0x08,2

     CLRF         0x06

     BCF            STATUS,RP0

     MOVLW    0x02

     MOVWF    R0L

     MOVLW    0x00

     MOVWF    R0H

     CALL         W001

     MOVLW    0x33

     CALL         LC02

     MOVLW    0x33

     CALL         LC02

     MOVLW    0x33

     CALL         LC02

     MOVLW    0x38

     CALL         LC02

     MOVLW    0x0D

     CALL         LC02

     MOVLW    0x01

     CALL         LC02

; 22:

; 23: loop:

L0001:

; 24: 0-ой аналоговый вход an0

     BSF            STATUS,RP0

     BSF            ADCON1,ADFM

     MOVLW    0x00

     BCF            STATUS,RP0

     MOVWF    R0L

     CALL         A001

     BSF            STATUS,RP0

     MOVF        ADRESL,W

     BCF            STATUS,RP0

     MOVWF    0x2C

     MOVF        ADRESH,W

     MOVWF    0x2D

; 25: очистка дисплея

     MOVLW    0x01

     CALL         LC02

; 26: Lcdout "Analog input AN0" '- вывод текста в первую строку

     MOVLW    0x41

     CALL         LC01

     MOVLW    0x6E

     CALL         LC01

     MOVLW    0x61

     CALL         LC01

     MOVLW    0x6C

     CALL         LC01

     MOVLW    0x6F

     CALL         LC01

     MOVLW    0x67

     CALL         LC01

     MOVLW    0x20

     CALL         LC01

     MOVLW    0x69

     CALL         LC01

     MOVLW    0x6E

     CALL         LC01

     MOVLW    0x70

     CALL         LC01

     MOVLW    0x75

     CALL         LC01

     MOVLW    0x74

     CALL         LC01

     MOVLW    0x20

     CALL         LC01

     MOVLW    0x41

     CALL         LC01

     MOVLW    0x4E

     CALL         LC01

     MOVLW    0x30

     CALL         LC01

; 27: Lcdcmdout LcdLine2Home 'set cursor at the beginning of line 2

     MOVLW    0xC0

     CALL         LC02

; 28: Lcdout "Value: ", #an0 'formatted text for line 2

     MOVLW    0x56

     CALL         LC01

     MOVLW    0x61

     CALL         LC01

     MOVLW    0x6C

     CALL         LC01

     MOVLW    0x75

     CALL         LC01

     MOVLW    0x65

     CALL         LC01

     MOVLW    0x3A

     CALL         LC01

     MOVLW    0x20

     CALL         LC01

     MOVF        0x2C,W

     MOVWF    R2L

     MOVF        0x2D,W

     MOVWF    R2H

     CALL         LC21

; 29: Ожидание вывода переменной

     MOVLW    0x01

     MOVWF    R0L

     CLRF         R0H

     CALL         W001

; 30: Повторить сначала

     GOTO        L0001

; конец программы

L0003:    GOTO        L0003

; Цикл обработки

D001:     MOVLW    0x10

              MOVWF    R3L

              CLRF                   R2H

              CLRF                   R2L

D002:     RLF            R0H,W

              RLF            R2L,F

              RLF            R2H,F

              MOVF        R1L,W

              SUBWF      R2L,F

              MOVF        R1H,W

              BTFSS       STATUS,C

              INCFSZ      R1H,W

              SUBWF      R2H,F

              BTFSC       STATUS,C

              GOTO        D003

              MOVF        R1L,W

              ADDWF     R2L,F

              MOVF        R1H,W

              BTFSC       STATUS,C

              INCFSZ      R1H,W

              ADDWF     R2H,F

              BCF            STATUS,C

D003:     RLF            R0L,F

              RLF           R0H,F

              DECFSZ     R3L,F

              GOTO        D002

              MOVF        R0L,W

              RETURN

; Следующий цикл

W001:    MOVF        R0L,F

              BTFSC       STATUS,Z

              GOTO        W002

              CALL         W003

              DECF         R0L,F

              NOP

              NOP

              NOP

              NOP

              NOP

              GOTO        W001

W002:    MOVF        R0H,F

              BTFSC       STATUS,Z

              RETURN

              CALL         W003

              DECF         R0H,F

              DECF         R0L,F

              GOTO        W001

W003:    MOVLW    0x0C

              MOVWF    R2H

W004:    DECFSZ     R2H,F

              GOTO        W004

              NOP

              NOP

              MOVLW    0x12

              MOVWF    R1L

W005:    DECFSZ     R1L,F

              GOTO        W006

              CALL         W007

              CALL         W007

              NOP

              NOP

              RETURN

W006:    CALL         W007

              GOTO        W005

W007:    MOVLW    0x0D

              MOVWF    R2L

W008:    DECFSZ     R2L,F

              GOTO        W008

              NOP

              RETURN

; Следующий цикл – формирование байта аргумента

X001:     MOVLW    0x0A

              SUBWF      R4L,F

              BTFSS       STATUS,C

              RETURN

              GOTO        X002

X002:     MOVLW    0x06

              SUBWF      R4L,F

              BTFSS       STATUS,C

              RETURN

              GOTO X002

; Следующий цикл Слово аргумента

Y001:     MOVLW    0x10

              SUBWF      R4L,F

              CLRW

              BTFSS       STATUS,C

              ADDLW     0x01

              SUBWF      R4H,F

              BTFSS       STATUS,C

              RETURN

              GOTO        Y002

Y002:     MOVLW    0x0A

              SUBWF      R4L,F

              CLRW

              BTFSS       STATUS,C

              ADDLW     0x01

              SUBWF      R4H,F

              BTFSS       STATUS,C

              RETURN

              GOTO Y002

; АЦП преобразование

A001:     RLF            R0L,F

              RLF          R0L,F

              RLF          R0L,F

              MOVLW    0x38

              ANDWF     R0L,F

              MOVLW    0xC1

              IORWF      R0L,W

              MOVWF    ADCON0

              MOVLW    0x0A

              MOVWF    R4L

              CALL         X001

              BSF            ADCON0,GO

A002:     BTFSC       ADCON0,GO

              GOTO        A002

              BCF          PIR1,ADIF

              BCF          ADCON0,ADON

              RETURN

; Цикл обработки выводов монитора

LC01:     BSF            0x08,1

              BCF          0x08,2

              MOVWF    0x06

              BSF            0x08,3

              NOP

              BCF          0x08,3

              MOVLW    0x32

              MOVWF    R4L

              CALL         X001

              RETURN

; Цикл обработки команд на монитор

LC02:     BCF            0x08,1

              BCF          0x08,2

              MOVWF    0x06

              BSF            0x08,3

              NOP

              BCF          0x08,3

              MOVLW    0xD0

              MOVWF    R4L

              MOVLW    0x07

              MOVWF    R4H

              CALL         Y001

              RETURN

; Цикл десятичного преобразования

LC21:     BSF            R3H,7

              MOVLW    0x27

              MOVWF    R1H

              MOVLW    0x10

              CALL         LC22

              MOVLW    0x03

              MOVWF    R1H

              MOVLW    0xE8

              CALL         LC22

              CLRF         R1H

              MOVLW    0x64

              CALL         LC22

              CLRF         R1H

              MOVLW    0x0A

              CALL         LC22

              MOVF        R2L,W

              GOTO        LC23

LC22:     MOVWF    R1L

              MOVF        R2H,W

              MOVWF    R0H

              MOVF        R2L,W

              MOVWF    R0L

              CALL         D001

              MOVF        R0L,W

              BTFSS       STATUS,Z

              BCF            R3H,7

              BTFSC       R3H,7

              RETURN

LC23:     ADDLW     0x30

              CALL         LC01

              RETURN

; Конец листинга программы

              END

 

2 Указания к схемотехническому обеспечению лабораторной работы

 

Соберите схему подключения на аналоговый вход AN0 сигнала с источника аналогового сигнала (см. рисунок 4.1).

 

 

Рисунок 4.1 - Схема подключения аналогового сигнала 

 

Лабораторная работа № 5. Изучение способов и режимов прерывания

 

Цель работы: обучение способам организации прерываний как вариант обмена данными в системе автоматизации, инициализация различных видов прерываний, организация логического управления в задачах автоматизации с использованием прерывания.

 

5.1           Задание для домашней подготовки

 

1)       Изучите режимы следующих видов прерываний [1,2,4]:

-     внешнее прерывание RB0/int;

-     прерывание по завершению аналого-цифрового преобразования;

-     прерывание по переполнению таймера.

2) Изучите разряды регистров OPTION , INTCON, регистров прерывания PIR1, PIR2 и регистров разрешения прерывания PIE1,PIE2,    изменяющие свои флаги в режиме прерывания.

3)  Изучите карту памяти, обратив внимание на то, что вектор прерывания находится по адресу 04 h.

4)  Изучите программу организации прерывания по завершению аналого-цифрового преобразования (см. программу 5.1), аналогично организуются прерывания от внешнего сигнала и по переполнению таймера.

 

Программа 5.1

include <p16F877.inc>

         org    0x000

         nop               

RESET       GOTO    START

org    0x004

;======================================================

;          Вектор прерываний находится по адресу 4h

;======================================================

;

; Здесь вставьте код обработки прерывания(й)

;

;======================================================

;          Начало исполняемого кода с адреса 100h

;======================================================

            ORG     100h

START            

; Исправленный код из программы 5.1

end 

 

5.2           Задание к лабораторной работе

 

1)     Соберите схему для приёма аналогового сигнала  на рисунке 4.1.

2) Запишите программу 5.1. Дополните программу окнами для наблюдения за состоянием регистров OPTION и INTCON, PIR1, PIR2, PIE1, PIE2, откомпеллируйте программу  и запустите её. Исследуйте выполнение программы. Определите, как используются разряды перечисленных регистров для организации аналого-цифрового преобразования (АЦП). Как устанавливается, как очищается флаг переполнения по АЦП и как этот флаг используется для организации аналого-цифрового преобразования? 

3) Соберите схему соединения микроконтроллера с клавиатурой, подключив одну из клавиш к выводу RB0 (внешнее прерывание происходит по изменению состояния на выводе микроконтроллера RB0). Предусмотрите в программе событие по прерыванию, например включение звукового генератора или событие включение светодиода. Проверьте работу микроконтроллера по прерыванию. Какие внешние факторы реальной системы автоматизации должны вызывать прерывание и при каких из них срабатывает звуковая или световая сигнализации. Приведите примеры систем, изобразите электрическую схему и алгоритм работы такой системы.

4) Запишите программу 5.2 (видоизменив программу 5.1. для обработки внешнего прерывания) Дополните программу окнами для наблюдения за состоянием регистров OPTION и INTCON, TNR2CON,. PIR1, PIR2, PIE1, PIE2, откомпеллируйте программу запустите. Исследуйте её выполнение, подавая с клавиатуры значения, которые приведут к прерыванию.  Сопоставьте Ваши результаты с программными единицами в приложении 1.

 

Лабораторная работа № 6. Программирование арифметического сложения и вычитания много байтовых слов

 

Цель работы: Изучение способов обработки много байтовых слов, изучение алгоритма арифметического сложения много байтовых слов, приобретение навыков формирование системы цифровой индикации в системах автоматизации.

 

6.1 Задание для домашней подготовки

 

1)  Изучите различные коды чисел с фиксированной запятой: прямой код, дополнительный код, числа в двоично-десятичном коде [5].

2)  Изучите алгоритм сложения   данных с получением много байтового результата [1,2,4].

3)  Составьте программу сложения двух слагаемых с выводом двух байтового результата на индикацию в шестнадцатеричном коде на семисегментный индикатор (программа 6.1).

4)  Дополните программу 6.1 включением звукового генератора при выходе результата сложения за пределы двух байт (программа 6.2).

5)  Составьте программу вычитания с выводом результата вычитания в шестнадцатеричном виде на семисегментный индикатор (программа 6.3).

6)  Дополните программу 6.3 включением светодиодов при отрицательном результате вычитания (программа 6.4).

 

6.2 Задание к лабораторной работе

 

1) На входе микроконтроллера подключены два аналоговых сигнала с датчиков расхода жидкости. Необходимо организовать вывод на цифровой жидкокристаллический экран суммарный расход двух датчиков. Соберите схему, подключив к микроконтроллеру: индикатор, клавиатуру, звуковую сигнализацию. Изобразите электрическую схему подключения всех элементов.

2) Запишите программу 6.1. Предполагая,  что два слагаемых это цифровые коды аналоговых сигналов датчиков расхода, исследуйте выполнения по домашнему заданию при задании  слагаемых  до значения FF.

3) Запишите программу 6.2, для этого отредактируйте предыдущую. Предполагая,  что два слагаемых это цифровые коды аналоговых сигналов датчиков расхода, исследуйте выполнения по домашнему заданию при задании  слагаемых  до значения FF. Звуковая сигнализация используется для контроля правильности выполнения сложения.

4) На входе микроконтроллера подключены два аналоговых сигнала с датчиков расхода жидкости. Необходимо организовать вывод на цифровой жидкокристаллический экран разницу показаний двух датчиков. Соберите схему, подключив к микроконтроллеру: индикатор, клавиатуру, звуковую сигнализацию. Изобразите электрическую схему подключения всех элементов. Запишите и выполните  программу 6.3, задавая на входе различные цифровые коды аналоговых датчиков, и обязательно исследуйте результат выполнения программы при задании   вычитаемого больше уменьшаемого.

5) Запишите и выполните программу 6.4, наблюдая результат по индикатору. Звуковая сигнализация срабатывает при отрицательном значении результата, то есть расход жидкости второго датчика больше первого. Сравните Ваши результаты с программами в приложении 2.

 

Лабораторная работа № 7. Программирование арифметического умножения и деления много байтовых слов

 

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

 

7.1 Задание для домашней подготовки

 

1)       Изучите алгоритм умножения  данных с получением двух байтового результата [1,2,4].

2)       Составьте программу умножения двух чисел с выводом двух байтового результата на индикацию в десятичном виде (программа 7.1).

3)       Дополните программу 7.1 включением светодиодов при выходе результата умножения за пределы двух байт (программа 7.2).

4)       Напишите программу деления двух чисел с выводом на индикацию (программа 7.3).

5)       Дополните программу деления вводом данных с клавиатуры и выходом в режим прерывания при делении на 0 (программа 7.4).

 

7.2 Задание к лабораторной работе

 

1) Организуйте умножение цифрового кода аналогового значения датчика на коэффициент нормирования. Запишите программу 7.1, отладьте её и исследуйте при различных данных, обязательно при числах FF.

2) Организуйте умножение цифрового кода аналогового значения датчика на коэффициент нормирования с сигнализацией ошибки вычисление из-за превышения сетки цифровых значений. Запишите программу 7.2, исследуйте её выполнение при тех же данных.

3) Организуйте вычисление коэффициента нормирования аналогового датчика при различных пределах измеряемых и нормируемых значений. Запишите программу 7.3, исследуйте её выполнение при различных данных.

4) Организуйте вычисление коэффициента нормирования аналогового датчика при различных пределах измеряемых и нормируемых значений. Исследуйте последовательно результат выполнения программы 7.4, задавая различные варианты данных: положительные числа, отрицательные числа и деление на ноль. Сравните результаты с программами в приложении 3.

 

Лабораторная работа № 8. Программирование математических функций

 

Цель работы: изучение алгоритмов формирования подпрограмм для вычисления математических функций, приобретение навыков программирования функций математической обработки сигналов на микроконтроллерах.

 

8.1.1   Задание для домашней подготовки

 

1) Изучите следующие рекомендации по программированию стандартных математических функций. Функции sin x, cos x, ln x можно вычислить, воспользовавшись их разложением в ряд:

 

для любого х (рад)

для любого х (рад)

 

        для 1³x>0

 

 

 

 

 

 

Число членов ряда определяется из условия получения требуемой точности.

Для вычисления функции Öх с точностью до целых чисел можно применить алгоритм, основанный на том, что квадрат числа можно определить сложением последовательно нечетных чисел (см. таблицу 8.1).

 

Таблица 8.1

Число

Сумма нечетных чисел

Результат

1

1

1

2

1+3

22

3

1+3+5

32

4

1+3+5+7

42

5

1+3+5+7+9

52

 

Исходя из приведенных примеров видно, что какое число необходимо возвести в квадрат, такое же количество последовательных нечетных чисел начиная с 1 необходимо сложить.

2)       По заданию преподавателя составьте программу вычисления одной из перечисленных функций, используя подпрограммы (программа 8.1). Ввод организуйте с клавиатуры, а вывод на индикацию. Продумайте схему клеммных соединений на стенде. Составьте схему схемных соединений.

3)       Изучите другой метод вычисления стандартных функций – вычисление с помощью таблиц по программе 8.2. Эта программа предназначена для вычисления квадрата числа. Число формируется по адресу.

 

Программа 8.2

SQ:   MOVLW    k        ;задать константу, которую нужно

;возвести в квадрат

                   CALL         SQTB         ;вызвать п.п. вычисления квадрата

                   MOVWF    PORTC      ;записать результат п.п. в порт С

                  GOTO        $        ;

         SQTB:        ADDWF     PC     ;вычислить адрес константы

                   RETLW      000h  ; квадрат 00        

                   RETLW      001h  ; квадрат 01        

                   RETLW      004h  ; квадрат 02        

                   RETLW      009h  ; квадрат 03        

                   RETLW      010h  ; квадрат 04        

                   RETLW      019h  ; квадрат 05        

                   RETLW      024h  ; квадрат 06        

                   RETLW      031h  ; квадрат 07        

                   RETLW      040h  ; квадрат 08        

                   RETLW      081h  ; квадрат 09        

                   RETLW      064h  ; квадрат 0A       

 

8.2 Задание к лабораторной работе

 

1) Соберите схему выполнения программы, подключив для ввода клавиатуру, а для вывода индикатор.

2) Запишите программу 8.1 из домашней подготовки, отладьте программу, используя пошаговый режим работы, используйте окна наблюдения.

3) Для той функции, что и в предыдущем задании составьте таблицу вычислений, запишите её как подпрограмму, напишите основную программу, исследуйте выполнение программы для тех же данных, оцените точность реализованных в программе 8.1 алгоритмов.

 

Список литературы

 

1.        Тавернье К. PIC- микроконтроллеры. Практика применения: Пер. с фр.-М.:ДМК Пресс,2003. -272 с.:ил.(Серия «Справочник»).

2.        PIC1.HTML файл на сайте microchip.ru

3.        М.С.Голубцов, А.В. Кириченкова. Микроконтроллеры AVR:от простого к сложному. Изд. 2-ое испр. и доп. – М.:СОЛОН-Пресс,2004.304 с. – (Серия «Библиотека инженера»)

4.        Микроконтроллер PIC 16X7XX. Под ред. С.К. Корякина-Черняка, М.:ДОДЭКА, 2005г.

5.        Цифровая и вычислительная техника: Учебник для вузов/Э.В Евреинов, Ю.Т. Бутыльский, И.А.Мамзелев и др.; Под ред.Э.В.Евреинов. – М.:Радио и связь, 1991. – 464 с.:ил.

6.        Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования / Под ред. Проф. В.П. Дьяконова.-М.:СОЛОН-Пресс, 2004. – 256 с.:ил. – (Серия «Библиотека инженера»).

7.        А.А.Копесбаева Микропроцессорные комплексы в системах управления.  Учебное пособие /Алматы, АИЭС, 2010 г. 121с.

8.        Э.Парр. Программируемые контроллеры: руководство для инженера. – М.:БИНОМ. Лаборатория знаний, 2007. – 516 с.:ил

9.        Сайт http://www.intuit.ru/-  электронный учебник «Архитектура микропроцессорных устройств», Гуров Л.

10.    А.А.Копесбаева Микропроцессорные средства и программно-технические комплексы. Методические указания к лабораторным работам (для студентов специальности 36.03 Автоматизация технологических процессов и слушателей ФПК) – АИЭС, Алматы 2001 год.

11.   А.А.Копесбаева, А.Б.Файзулина, А.А.Рябцев. Микропроцессорные средства и программно-технические комплексы. Методические указания к выполнению лабораторных и семестровых работ (для студентов специальности 36.03 Автоматизация технологических процессов), Часть 2 – АИЭС, Алматы 2001 год.

12.   Микропроцессорные средства в системах управления./ Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 050702 – Автоматизация и управление. Копесбаева А.А., Ибрашева А.Т., Алматы, АИЭС, 2008. - 46 с.

13.    А.А.Копесбаева Микропроцессорные комплексы в системах управления. Конспект лекций для студентов всех форм обучения специальностей 050702 – Автоматизация и управление – Алматы .:АИЭС, 2009 – 47 с.

14.   А.А.Копесбаева Программно-технические комплексы в системах управления. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальностей 050702 – Автоматизация и управление – Алматы .:АИЭС, 2009 – 45

15.   Сайт www.telesys.ru/electronics/

 

 

Приложение 1

;******************************************************************

; Retr_1.asm ВАРИАНТ С ПРЕРЫВАНИЯМИ

; Сканер для ретранслятора VERTEX-7000VXR.

;******************************************************************

; Позволяет перевести VERTEX-7000VXR и другие подобные ретрансляторы ;из режима односторонней ретрансляции в режим двухсторонней ;ретрансляции без потери качества работы.

;******************************************************************

; Используется микроконтроллер PIC16F84A. Частота кварца 4000кГц.

;******************************************************************

LIST p=16F84a ; Используется PIC16F84A.

__CONFIG 03FF5H ; WDT включен, бит защиты не установлен.

;===========================================================

; Определение положения регистров специального назначения.

;===========================================================

OptionR equ 01h ; Option - банк1

Status equ 03h ; Регистр Status

PortB equ 06h ; Порт B

TrisB equ 06h ; Tris B - Банк1

IntCon equ 0Bh ; Регистр IntCon

;=========================================================

; Определение названия и положения регистров общего назначения.

;=========================================================

Trigg equ 0Ch ; Переключатель направления ретрансляции.

W_Temp equ 0Eh ; Регистр сохранения содержимого W в

; прерываниях.

Stat_Temp equ 0Fh ; Регистр сохранения содержимого STATUS в

; прерываниях.

SecH equ 1Eh ; Старший байт счетчика времени сканирования.

SecL equ 1Fh ; Младший байт счетчика времени сканирования.

SecH_1 equ 1Ch ; Старший байт счетчика защитного интервала

; времени.

SecL_1 equ 1Dh ; Младший байт счетчика защитного интервала

; времени.

SecH_2 equ 1Ah ; Старший байт счетчика задержки рабочей точки

; программы в прерывании.

SecL_2 equ 1Bh ; Младший байт счетчика задержки рабочей точки

; программы в прерывании.

;=========================================================

; Определение места размещения результатов операций.

;=========================================================

W equ 0 ; Результат направить в аккумулятор.

F equ 1 ; Результат направить в регистр.

;=========================================================

; Определение положения флагов и бита выбора банка в регистре STATUS.

;=========================================================

RP0 equ 5 ; Бит выбора банка.

;=========================================================

; Точка входа в программу.

;=========================================================

;141

org 0 ; Начать выполнение программы с нулевого

goto START ; адреса PC.

;========================================================

; Точка входа в прерывание.

;=======================================================

org 4 ; Назначение вектора прерывания (назначается,

; если в программе используются прерывания).

;======================================================

; Объем программы: 63 слова в памяти программ.

;**************************************************************

;**************************************************************

; НАЧАЛО ПРЕРЫВАНИЯ.

;=======================================================

; Сохранение содержимого регистров STATUS и W в ОЗУ.

;--------------------------------------------------------------------------------

INT movwf W_Temp ; Скопировать содержимое регистра W

; в регистр W_Temp.

movf Status,W ; Скопировать содержимое регистра Status

; в регистр W.

movwf Stat_Temp ; Скопировать содержимое регистра W

; в регистр Stat_Temp.

;--------------------------------------------------------------------------------

; Проверка наличия несущей (опрос клавиатуры).

;--------------------------------------------------------------------------------

CYCLE btfsc PortB,0 ; Проверка состояния нулевого бита

; регистра PortB.

goto EndInt ; Если он =1 (несущей нет), то уход

; в ПП выхода из прерывания.

; Если он =0 (несущая есть), то программа

; исполняется далее.

;--------------------------------------------------------------------------------

; Формирование времени одного цикла задержки рабочей точки программы в ;прерывании

;--------------------------------------------------------------------------------

movlw .250 ; Закладка константы .250 в регистр W.

movwf SecH_2 ; Копирование .250 из регистра W

; в регистр SecH_2.

movlw .120 ; Закладка константы .120 в регистр W.

movwf SecL_2 ; Копирование .120 из регистра W

; в регистр SecL_2.

PAUSE_2 clrwdt ; Сброс WDT.

decfsz SecL_2,F ; Декремент содержимого младшего разряда

; счетчика SecL_2.

goto PAUSE_2 ; Если результат декремента не =0, то переход

; в ПП PAUSE_2.

incfsz SecH_2,F ; Если результат декремента =0, то инкремент

; старшего разряда счетчика SecH_2.

goto PAUSE_2 ; Если результат инкремента не=0, то переход

; в ПП PAUSE_2.

goto CYCLE ; Если результат инкремента =0, то переход на

; следующий цикл задержки рабочей точки

; программы в прерывании.

;===================================================

; Восстановление содержимого регистров STATUS и W с последующим ;выходом из прерывания.

;--------------------------------------------------------------------------------

EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.

movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp

; в регистр W.

movwf Status ; Скопировать содержимое регистра W

; в регистр Status.

swapf W_Temp,F ; Поменять местами старший и младший полубайты

; регистра W_Temp с сохранением результата

; операции в нем же.

swapf W_Temp,W ; Поменять местами старший и младший полубайты

; регистра W_Temp с сохранением результата 142

; операции в регистре W.

retfie ; Возврат из прерывания по стеку.

;**************************************************************

; КОНЕЦ ПРЕРЫВАНИЯ

;**************************************************************

;**************************************************************

; СКАНИРОВАНИЕ

;**************************************************************

; Подготовительные операции.

;--------------------------------------------------------------------------------

START clrf IntCon ; Запретить все прерывания.

clrwdt ; Сбросить сторожевой таймер WDT.

bsf Status,RP0 ; Установить банк 1.

movlw .1 ; RB0 работает на вход,

movwf TrisB ; остальные - на выход.

movlw .0 ; Включить подтягивающие резисторы порта В.

movwf OptionR ; На входе INT прерывания - по заднему фронту.

bcf Status,RP0 ; Установить банк 0.

;--------------------------------------------------------------------------------

; Выбор направления ретрансляции.

;--------------------------------------------------------------------------------

TRIGGER btfsc Trigg,0 ; Проверка значения нулевого бита

; регистра Trigg.

goto Metka148 ; Если это значение =1, то переход

; на метку Metka148.

; Если это значение =0, то программа

; исполняется далее.

movlw .251 ; Закладка константы .251 (1111 1011)

; в регистр W.

movwf PortB ; Копирование .251 из регистра W

; в регистр PortB (выбор прямого направления

; ретрансляции: ПРМ-X, ПРД-Y).

goto Metka_1 ; Безусловный переход на метку Metka_1.

Metka148 movlw .255 ; Закладка константы .255 (1111 1111)

; в регистр W.

movwf PortB ; Копирование .255 из регистра W

; в регистр PortB (выбор обратного направления

; ретрансляции: ПРМ-Y, ПРД-X).

;--------------------------------------------------------------------------------

; Формирование защитного интервала времени (ожидание окончания ;переходных процессов, возникающих при смене направлений ретрансляции) ;равного, примерно, 60 мс.

;--------------------------------------------------------------------------------

Metka_1 movlw .197 ; Закладка в регистр W константы .197

movwf SecH_1 ; Копирование константы .197 из регистра W

; в регистр SecH_1.

movlw .121 ; Закладка в регистр W константы .121

movwf SecL_1 ; Копирование константы .121 из регистра W

; в регистр SecL_1.

PAUSE_D clrwdt ; Сброс WDT.

decfsz SecL_1,F ; Декремент содержимого младшего разряда

; счетчика SecL_1.

goto PAUSE_D ; Если результат декремента не =0,

; то переход в ПП PAUSE_D.

incfsz SecH_1,F ; Если результат декремента =0, то инкремент

; старшего разряда счетчика SecH_1.

goto PAUSE_D ; Если результат инкремента не=0,

; то переход в ПП PAUSE_D.

; Если результат инкремента =0, то программа

; исполняется далее.

;=====================================================

; Формирование интервала времени сканирования.

;=====================================================

movlw .245 ; Закладка константы .245 в регистр W.

movwf SecH ; Копирование .245 из регистра W 143

; в регистр SecH.

movlw .255 ; Закладка константы .255 в регистр W.

movwf SecL ; Копирование .255 из регистра W

; в регистр SecL.

;--------------------------------------------------------------------------------

; Разрешение прерываний INT.

;--------------------------------------------------------------------------------

movlw .144 ; Закладка константы .144 в регистр W.

movwf IntCon ; Копирование .144 (1001 0000) из регистра W

; в регистр IntCon

; (разрешение прерываний по входу INT).

;--------------------------------------------------------------------------------

PAUSE clrwdt ; Сброс WDT.

decfsz SecL,F ; Декремент содержимого младшего разряда

; счетчика SecL.

goto PAUSE ; Если результат декремента не=0,

; то переход в ПП PAUSE.

incfsz SecH,F ; Если результат декремента =0, то инкремент

; старшего разряда счетчика SecH.

goto PAUSE ; Если результат инкремента не=0,

; то переход в ПП PAUSE.

; Если результат инкремента =0,

; то программа исполняется далее.

;--------------------------------------------------------------------------------

; Изменение направления ретрансляции.

;--------------------------------------------------------------------------------

clrf IntCon ; Запрет всех прерываний.

incf Trigg,F ; Увеличение на 1 (инкремент) содержимого

; переключателя направления ретрансляции.

goto START ; Переход на новый цикл сканирования.

;*********************************************************

End

;*********************************************************

;Программа организации прерывания по входу RB0

;*******************************************************************

; Begin

             R0L      EQU     0xC

             R0H      EQU     0xD

             R1L      EQU     0xE

             R1H      EQU     0xF

             R2L      EQU     0x10

             R2H      EQU     0x11

             R3L      EQU     0x12

             R3H      EQU     0x13

             R4L      EQU     0x14

             R4H      EQU     0x15

             R5L      EQU     0x16

             R5H      EQU     0x17

             W_TEMP          EQU     0x4F

             STATUS_TEMP            EQU     0x4E

             ORG     0x0000

             BCF      PCLATH,3

             BCF      PCLATH,4

             GOTO L0001

             ORG     0x0004

             MOVWF           W_TEMP

             SWAPF             STATUS,W

             CLRF                STATUS

             MOVWF           STATUS_TEMP

             CALL                L0002

             SWAPF             STATUS_TEMP,W

             MOVWF           STATUS

             SWAPF             W_TEMP,F

             SWAPF             W_TEMP,W

             RETFIE

L0001:

; 1: TRISA = 0x00 'set all PORTA pins as outputs

             BSF                   STATUS,RP0

             CLRF                0x05

             BCF                  STATUS,RP0

; 2: PORTA = 0xff 'make all PORTA pins high

             MOVLW           0xFF

             MOVWF           0x05

; 3: INTCON.INTE = 1 'enable RB0/INT interrupts

             BSF      0x0B,4

; 4: INTCON.GIE = 1 'enable all un-masked interrupts

             BSF      0x0B,7

; 5: End

L0003:   GOTO L0003

; 6:

; 7: On Interrupt 'interrupt routine

L0002:

; 8: PORTA = PORTA - 1 'decrement the value on PORTA

             MOVLW           0x01

             SUBWF             0x05,W

             MOVWF           0x05

; 9: INTCON.INTF = 0 'enable new RB0/INT interrupts

             BCF      0x0B,1

; 10: Resume

             RETURN

; End of program

L0004:   GOTO               L0004

; End of listing

             END

Приложение 2

 

;****************************************************************************

;Сложение и вычитание с двойной точностью

;*****************************************************************************

;Сложение: АССb (16 бит)+АССа (16 бит) =АССb (16 бит)

;(А) Первый операнд помещается в байты АССаL0 и АССаHI (16 бит)

;(В) Второй операнд помещается в байты АССbL0 и АССbHI (16 бит)

;(C) Вызов D_add

;(D) Результат помещается в байты АССbL0 и АССbHI (16 бит)

;Показатели

;размер памяти: 07

;Количество циклов: 08

;*****************************************************************************

;Вычитание: АССb (16 бит)-АССа (16 бит) =АССb (16 бит)

;(А) Первый операнд помещается в байты АССаL0 и АССаHI (16 бит)

;(В) Второй операнд помещается в байты АССbL0 и АССbHI (16 бит)

;(C) Вызов D_add

;(D) Результат помещается в байты АССbL0 и АССbHI (16 бит)

;Показатели

;размер памяти: 14

;Количество циклов: 17

;****************************************************************************

ACCaL0     EQU           H’20’

ACCaHI      EQU           H’21’

ACCbL0     EQU           H’22’

ACCbHI     EQU           H’23’

;

         include <p16f877.inc>

         org    0x00h

;****************************************************************************

;Вычитание с двойной точностью (ACCbACCa =ACCb)

D_sub         call neg_A; инверсия знака байта АССа, затем сложение

;****************************************************************************

;Сложение с двойной точностью (АССb+ACCa=ACCb)

D_add         MOVF        ACCaL0,0

                   ADDWF     ACCbL0,1  ;прибавление младшего байта

                   BTFSC       STATUS,C;добавление переноса

INCF          ACCbHI

                   MOVF        ACCaHI,0

                   ADDWF     ACCbHI,1  ;прибавление старшего байта

                   RETLW      0

;

neg_a          COMF        ACCaL0     ;Меняем знак байта АССа(-АССа=АССа)

                   INCF          ACCaL0

                   BTFSC       STATUS,Z

                   DECF         ACCaHI

                   COMF        ACCaHI

                   RETLW      0

;*****************************************************************************

;Тестовая программа

;*****************************************************************************

;Загрузка  констант в АССа и АССb для тестирования

loadAB       MOVLW    1

                   MOVWF    ACCaHI

                   MOVLW    0FF

                   MOVWF    ACCaL0

                   MOVLW    07F

                   MOVWF    ACCbHI

                   MOVLW    0FF

                   MOVWF    ACCbL0

                  RETLW      0

main            NOP

                   CALL         loadAB       ;ACCb+ACCa=ACCb

                   CALL         D_add         ;ACCb=81FE

                   CALL         loadAB       ;ACCb-ACCa=ACCb

                   CALL         D_sub         ;ACCb=7E00

                   GOTO        main

                   END          

 

 

Приложение 3

;беззнаковое умножение 8-разрядных чисел

MN1  EQU  H'20'  ;МНОЖИМОЕ

MN2  EQU  H'21'  ;МНОЖИТЕЛЬ

H_BYTE     EQU  H'22'  ;старший байт результата

L_BYTE     EQU  H'23'  ;младший байт результата

COUNT      EQU  H'24'  ;счетчик разрядов

START

         MOVLW    0FF   ;контрольная константа = 255

         MOVWF    MN2  ;записать в множимое

         MOVLW    0FF   ;контрольная константа = 255

         MOVWF    MN1  ;записать в множитель

         CALL         UMN ;перейти на подпрограмму умножения

         GOTO        $

;

UMN

         CLRF         STATUS

         MOVLW    D'08'

         MOVWF    COUNT      ;загрузить количество разрядов

         CLRF         H_BYTE     ;очистить регистры результата

         CLRF         L_BYTE

         MOVF        MN1,0        ;множимое в аккумулятор

         BCF  STATUS,C;очистить бит переполнения

CYC

         RRF  MN2,1        ;сдвиг множителя вправо

         BTFSC       STATUS,C;если не было переполнения пропустить

         ADDWF     H_BYTE,1;иначе сложить MN1+MN2

         RRF  H_BYTE,1;сдвиг вправо стврший байт результата

         RRF  L_BYTE,1;сдвиг вправо младший байт результата

         DECFSZ     COUNT,1   ;если все 8 бит опрошены пропустить

         GOTO        CYC  ;иначе повторить цикл

         RETLW      0        ;возврат из подпрограммы с 0 в аккумуляторе

         END 

;деление 16-разрядных чисел

; АССВ(16 БИТ)/АССА(16 БИТ)=АССВ(16 БИТ)

;остаток помещается в АССС(16 бит)

;SIGNED определяет версию деления-

;SIGNED=1 - для версии деления со знаком

;SIGNED=0 - для версии деления без знака

; деление с двойной точностью (16 бит/16 бит=16 бит) b=b/a+c

; предварительно надо убедиться, что делимое больше, чем делитель

ACCAL0    EQU  H'20'

ACCAHI     EQU  H'21'

ACCBL0     EQU  H'22'

ACCBHI     EQU  H'23'

ACCCL0    EQU  H'24'

ACCCHI     EQU  H'25'

ACCDL0    EQU  H'26'

ACCDHI     EQU  H'27'

TEMP         EQU  H'28'

SIGN EQU  H'29'

SIGNED     EQU  H'01'

         ORG H'00'

         GOTO        MAIN

D_DIVS

         BTFSC       SIGNED,0;если  дел без зн, пропустить следующую команду

         CALL         S_SIGN;если со зн. перейти на определение знака результата

;

         CALL         SETUP;к подпр записи делимого во временный регистр АССD

         CLRF         ACCCHI     ;очистить регистр остатка

         CLRF         ACCCL0

DLOOP      BCF  STATUS,C;очистить бит переполнения

         RLF  ACCDL0,1;сдвиг влево делимого

         RLF  ACCDHI,1

         RLF  ACCCL0,1;сдвиг влево остатка

         RLF  ACCCHI,1

         MOVF        ACCAHI,0;делитель в аккумулятор

         SUBWF      ACCCHI,0;вычесть из остатка делитель,проверяем а>c?

         BTFSS       STATUS,Z;если a=c пропустить следующую команду

         GOTO        NOCHK      ;перейти к подпрограмме деления

         MOVF        ACCAL0,0

         SUBWF      ACCCL0,0;вычесть из остатка делитель для сташего байта

NOCHK      BTFSS       STATUS,C; если с>а, пропустить следующую команду

         GOTO        NOGO        ;перейти к порограмме деления

         MOVF        ACCAL0,0;

         SUBWF      ACCCL0,1;выч из остатка делитель для младшего байта (с-а)=с

         BTFSS       STATUS,C;

         DECF         ACCCHI,1

         MOVF        ACCAHI,0

         SUBWF      ACCCHI,1

BSF   STATUS,C; устанавливаем бит переноса и сдвигаем в младший разряд

NOGO        RLF  ACCBL0,1

         RLF  ACCBHI,1

         DECFSZ     TEMP,1      ;организация цикла по всем 16-ти разрядам

         GOTO        DLOOP

BTFSC       SIGNED,0;если беззнак деление пропустить следующую команду

BTFSS       SIGN,7;если знаковое деление проверить знак отрицательный?

         RETLW      0        ;"нет", то возврат с 0 в аккумуляторе

         GOTO        NEG_A       ;"да", то перейти на изменение знака

 

;подпрограмма установки начальных условий

SETUP

         MOVLW    D'16'  ;количество битов 16

         MOVWF    TEMP

         MOVF        ACCBHI,0;переписать делимое в регистр D

         MOVWF    ACCDHI

         MOVF        ACCBL0,0

         MOVWF    ACCDL0

         CLRF         ACCBHI     ;очистить регистр В для результата (частного)

         CLRF         ACCBL0

         RETLW      0

;подпрограмма изменения знака -а=а

NEG_A       COMF        ACCAL0,1

         INCF ACCAL0,1

         BTFSC       STATUS,Z

         DECF         ACCAHI,1

         COMF        ACCAHI,1

         RETLW      0

;подпрограмма деления со знаком

S_SIGN      MOVF        ACCAHI,0

         XORWF     ACCBHI,0

         MOVWF    SIGN

         BTFSS       ACCBHI,7;если "-" меняем знак байта А0СВ

         GOTO        CHEK_A

         COMF        ACCBL0,1;меняем знак

         INCF ACCBL0,1

         BTFSC       STATUS,Z

         DECF         ACCBHI,1

         COMF        ACCBHI,1

CHEK_A    BTFSS       ACCAHI,7;если "-" то меняем знак байта АССА

         RETLW      0

         GOTO        NEG_A

;тестовая программа

MAIN

         MOVLW    H'80'

         MOVWF    ACCAHI     ;загрузка "-2" ACCA

         MOVLW    H'02'

         MOVWF    ACCAL0

         MOVLW    H'00'

         MOVWF    ACCBHI

         MOVLW    H'08'

         MOVWF    ACCBL0     ;загрузка "8" в АССВ

         CALL         D_DIVS      ;перейти к подпрограмме деления

         GOTO        $

         END

 

Содержание 

Лабораторная работа 1                                                                                              3

Лабораторная работа 2                                                                                            13

Лабораторная работа 3                                                                                            15

Лабораторная работа 4                                                                                            21

Лабораторная работа 5                                                                                            31

Лабораторная работа 6                                                                                            32

Лабораторная работа 7                                                                                            33

Лабораторная работа 8                                                                                            34

Список литературы                                                                                                 36

Приложение 1                                                                                                          38

Приложение 2                                                                                                          44

Приложение 3                                                                                                          46 

 

Сводный план 2011 г., поз. 23