Рефераты. Цифровые вычислительные устройства и микропроцессоры приборных комплексов

Покажем действия по переводу чисел из десятичной системы счисления в шестнадцатеричную на примере преобразования десятичного числа 3951910 в шестнадцатеричную систему счисления

39519      |16

39504      2469        |16

15            2464        154      |16

F             5            144      9

                               10

                               A

Отсюда 3951910 = 9A5F16. Таким образом, последовательно деля на 16 целую часть десятичного числа и образующиеся частные, получаем в последнем частном и остатках цифры всех разрядов шестнадцатеричного представления числа.

Пример 2.5. Преобразование кодов из одной системы счисления в другую. Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 10 (10102). Деление должно осуществляться по правилам двоичной арифметики.

Пусть требуется выполнить преобразование 8-битного двоичного числа в двоично-десятичное. Исходный двоичный код хранится в аккумуляторе. Результат преобразования состоит из 12 бит: младшие 4 бита – единицы, представляют собой остаток от деления исходного числа на 10; следующие 4 бита – десятки, представляют собой остаток от деления на 10 полученного частного; старшие 4 бита – сотни, являются частным от второго деления:

BBD:     CALL    DIV10           ; деление исходного кода на 10

             MOV     R7,A             ; сохранение остатка в R7

             MOV     A,R1             ; загрузка в аккумулятор частного

             CALL    DIV10           ; деление частного на 10

             SWAP   A                  ; передача остатка в старшую тетраду A

             ORL      A,R7             ; передача R7 в младшую тетраду A

             JMP       EXIT            ; выход из процедуры

; подпрограмма деления на 10

; исходный двоичный код в аккумуляторе

; результат: в R1 – частное, в аккумуляторе – остаток

DIV10:  MOV     R1,#0            ; сброс R1

SUB10:  ADD      A,#(NOT(10)+1)     ; вычитание 10 из делимого

             INC       R1                ; инкремент частного

             JC         SUB10          ; цикл, если остаток >= 0

             DEC      R1                ; восстановление частного

             ADD      A,#10            ; восстановление остатка

             RET                           ; возврат

EXIT:    …                               ;

В результате выполнения процедуры в младшей тетраде R1 хранятся сотни, в аккумуляторе – десятки и единицы двоично-десятичного эквивалента исходного двоичного числа.

3.4.3. Изучение аппаратных и программных средств ввода/вывода информации микроконтроллера ВЕ48

1) Изучить организацию каналов ввода/вывода информации микроконтроллера ВЕ48, интерфейс расширения ввода/вывода;

2) Рассмотреть команды, которые обслуживают пространство ввода/вывода;

3) Ознакомиться с приведенными ниже примерами программ на языке ассемблера;

4) Произвести ввод, отладку и трансляцию в объектный код этих программ;

5) Выполнить программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.

Пример 3.1. Ввести байт из порта 1 и передать его в порт 2:

TRAN:  MOV     A,#0FF         ; настройка порта 1 на ввод

             OUTL   P1,A             ;

             IN          A,P1             ; ввод байта из порта 1

             OUTL   P2,A             ; вывод байта в порт 2

Пример 3.2. Ввести данные из порта P7:

INPUT: MOVD  A,P7             ; пересылка четырех битов из порта 7

                                               ; в младшую тетраду аккумулятора

Пример 3.3. Маскирование при вводе. Ввести в регистр R7 информацию из линий 0, 1, 3, 4 и 7 порта 1:

             IN          A,P1             ; ввод байта из порта 1

             ANL      A,#10011011B  ; маскирование

             MOV     R7,A             ; передача

Пример 3.4. Ввести в аккумулятор данные из порта 2 и выделить требуемые биты по маске, находящейся в R0:

             IN          A,P2             ; ввод байта из порта 2

             ANL      A,R0             ; маскирование

Пример 3.5. Выдать содержимое аккумулятора в последовательном коде через нулевую линию порта 1, оставляя без изменения остальные биты порта. Передачу вести, начиная с младшего бита:

             MOV     R1,#8            ; счетчик бит

LOOP:  JB0        ONE             ; переход, если бит A.0 = 1

             ANL      P1,#(NOT 1) ; сброс P1.0

             JMP       NEXT           ;

ONE:     ORL      P1,#1            ; установка P1.0

             JMP       NEXT           ; избыточная команда для выравнивания

                                               ; времени передачи 0 и 1

NEXT:   RR        A                  ; сдвиг аккумулятора вправо (подготовка к

             DJNZ     R1,LOOP     ; передаче очередного бита)

Пример 3.6. Настроить биты 0–3 порта 1 на ввод:

             ORL      P1,#0F          ; установка битов P1.0… P1.3

Пример 3.7. Очистить биты 4–7 порта 2:

             ANL      P2,#0F          ; сброс битов P2.4… P2.7

Пример 3.8. Организовать ожидание появления нулевого уровня на входе T0:

WAIT:   JT0        WAIT           ; переход на WAIT, если на входе T0 единица

Пример 3.9. Организовать ожидание появление единичного уровня на входе  в предположении, что внешние прерывания запрещены:

DIS       I                                 ; запрет прерываний по INT

WAIT:   JNI        WAIT           ; переход на WAIT, если на входе INT нуль

3.4.4. Изучение средств реального времени микроконтроллера ВЕ48

1) Изучить организацию таймера/счетчика и системы прерываний микроконтроллера ВЕ48;

2) Рассмотреть команды управления средствами реального времени;

3) Ознакомиться с приведенными ниже примерами программ на языке ассемблера;

4) Произвести ввод, отладку и трансляцию в объектный код этих программ;

5) Выполнить программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.

Пример 4.1. Дождаться поступления на вход T1 100 импульсов и перейти по метке PULSE:

             MOV     A,#156D       ; A = (256-100)

             MOV     T,A               ; предустановка счетчика

             STRT    CNT             ; запуск счетчика

WAIT:   JTF       PULSE         ; переход, если прошло 100 импульсов

             JMP       WAIT           ;

PULSE: …

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

START:              DIS               TCNTI         ; запрет прерываний от таймера

             CLR      A                  ; сброс аккумулятора

             MOV     T,A               ; сброс таймера

             MOV     R5,A             ; сброс регистра R5

             STRT    T                  ; запуск таймера

M1:       JTF       COUNT        ; если TF=1, то переход к COUNT и сброс TF

             JMP       M1                ; цикл

COUNT:             INC              R5      ; инкремент регистра R5

             MOV     A,R5             ; пересылка содержимого R5 в аккумулятор

             JB3        INT               ; переход к подпрограмме обслуживания

                                                ; прерывания INT, если бит A.3 равен 1

             JMP       M1                ; переход, если бит A.3 не равен 1

             …                              ;

INT:      STOP    TCNT           ; останов таймера

             JMP       07                  ; переход к ячейке 7 (вектор прерывания

                                               ; от счетчика событий)

Пример 4.3. Программное формирование временной задержки. Предположим, что в управляющей программе необходимо реализовать временную задержку 100 мкс. Подпрограмма формирования временной задержки будет иметь вид:

DELAY:              MOV            R2,#X ; (R2) ← X

COUNT:             DJNZ            R2,COUNT  ; декремент R2 и цикл, если не нуль

RET                   ; возврат

Для получения требуемой временной задержки необходимо определить число X, загружаемое в рабочий регистр. Определение числа X выполняется на основе расчета времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В описании команд микроконтроллера указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих данных определяется суммарное число машинных циклов в подпрограмме: CALL – 2 МЦ, MOV – 2 МЦ, DJNZ – 2 МЦ, RET – 2 МЦ.

При тактовой частоте 6 МГц каждый машинных цикл выполняется за 2,5 мкс. Таким образом, подпрограмма выполняется за время 5+5+5X+5=15+5X мкс. Для реализации временной задержки 100 мкс число X = (100-15)/5 = 17.

Пример 4.4. Временная задержка большой длительности. В качестве примера рассмотрим подпрограмму, реализующую временную задержку 100 мс:

DELAY:              MOV            R1,#84         ; загрузка X

LOOPEX:           MOV            R2,#236       ; загрузка Y

LOOPIN:            DJNZ            R2,LOOPIN ; декремент R2 и внутренний цикл,

                                               ; если R2 не равно нулю

             DJNZ     R1,LOOPEX ; декремент R1 и внешний цикл,

                                               ; если R1 не равно нулю

             MOV     R3,#4            ; точная подстройка временной задержки

LOOPAD:           DJNZ            R3,LOOPAD         ;

             RET                           ;

Числа X и Y выбираются из соотношения T = 5+5+X(5+5Y+5)+5, где T – реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким образом, при X=Y=255 составляет 327,69 мс, т.е. приблизительно 0,3 с.

В примере два вложенных цикла реализуют временную задержку длительностью 15+84(10+5*236)=99975 мкс, а дополнительный цикл LOOPAD реализует задержку 25 мкс и тем самым обеспечивает точную подстройку временного интервала.

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

ONESEC:           MOV            R3,#10         ; загрузка в R3 числа вызовов

                                               ; подпрограммы DELAY

LOOP:  CALL    DELAY         ; задержка 100 мс

DJNZ    R3,LOOP                   ; декремент R3 и цикл, если R3 не равно 0

Погрешность программы составляет 55 мкс.

Пример 4.5. Формирование временной задержки на основе таймеров. Недостатком программной реализации временной задержки является нерациональное использование ресурсов микроконтроллера: во время формирования задержки микроконтроллер практически простаивает, так как не может решать задачи управления объектом. В то же время аппаратурные средства микроконтроллера позволяют реализовать временные задержки на фоне основной программы работы.

При использовании таймера в МК48 можно получить временные задержки длительностью от 80 мкс до 20 мс.

Например, для реализации временной задержки 240 мкс необходимо выполнить следующие действия:

             MOV     A,#NOT(240/80-1)  ; загрузка таймера

             MOV     T,A               ;

             STRT    T                  ; запуск таймера

             EN         TCNTI          ; разрешение прерывания

Появление сигнала прерывания от таймера соответствует истечению временного интервала 240 мкс. Погрешность будет составлять 7,5 мкс (время выполнения команды передачи управления по вектору прерывания и команды STOP TCNT).

Вывод: изучил структурную схему однокристального микроконтроллера ВЕ48, его центральный процессор, организацию памяти программ и данных, средства расширения памяти программ и данных; рассмотрел систему команд по пересылке и обработке данных; ознакомился с приведенными ниже примерами программ на языке ассемблера; произвел ввод, отладку и трансляцию в объектный код этих программ; выполнил программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.


Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.