Главная страница
Навигация по странице:

  • Задание для самостоятельного выполнения

  • Практическая работа №48. Программирование микроконтроллеров (использование ВУ). Цель работы

  • .include "p33FJ256GP710.inc" .equ a, 0x810 .equ b, 0x812 .equ c, 0x814 .equ d, 0x816 .equ e, 0x818 .text .global ____ reset

  • ; W4:=b add W2, W4, W2 ; W2:=W2+W4 push W2 ; поместить в вершину стека значение W2 mov c, W2 ; W2:=c mov 1, W4

  • Практическая работа №49. Программирование микроконтроллеров. Цель работы

  • Теоретическая часть Понятие рекуррентной зависимости.

  • W4< -0x802

  • Практическая работа №50. Программирование микроконтроллеров (современные микроконтроллеры). Цель работы

  • Теоретическая часть. Таблица ASCII

  • Методические указания для практических занятий по дисциплине мдк. 02. 01


    Скачать 7.37 Mb.
    НазваниеМетодические указания для практических занятий по дисциплине мдк. 02. 01
    Дата09.09.2022
    Размер7.37 Mb.
    Формат файлаpdf
    Имя файлаMetod_Mikroprocessornye-sistemy_PZ_09.02.01_2020.pdf
    ТипМетодические указания
    #669073
    страница30 из 43
    1   ...   26   27   28   29   30   31   32   33   ...   43
    Цель работы: изучить и приобрести практические навыки с командами организации циклов и инструкциями сравнения.
    Теоретическая часть
    Организация цикла
    К основным командам организации циклов относятся DO и REPEAT. Рассмотрим основные отличия данных инструкций.
    В данном примере используется инструкция DO. Первыми двумя командами инициализируются рабочие регистры: W0 обнуляется, а в регистр W1 заносится начальный адрес

    Варианта
    Арифметическая функция
    1 e = ( a + 1 ) * ( b - 100 ) / (c + 1000) * (d - 1000)
    2 e = ( a + b ) * ( c - b ) / (c + d)
    3 e = ( a - b ) * ( c / d) + 12345 4 e = ( 100 - a ) / ( 100 - b ) * (c + d) - 4321 5 e = ( a + b - c ) * d / ( b - a ) + 9876 6 e = ( a * b + c ) * ( b - 100 ) / d
    7 e = a * ( b - c ) / ( c - d ) + 12346 8 e = a* b + b / c - c * d - 13579 9 e = ( a * b + 100 ) / ( c + d - 100 )
    10 e = ( a + 1000 ) * c + ( b - 1000 ) / d
    11 e = ( a - d ) * ( b - c ) / d + 2468 12 e = a *d * ( b + 1000 ) / c - 1357
    mov
    #0, W0
    mov
    #mas, W1
    do #15,
    end
    inc
    W0, W0
    mov
    W0, [W1++]
    end:
    nop

    249
    массива mas. Следующая команда определяет начало цикла DO, количество итераций равное 16
    (нумерация идет с нуля, поэтому в программе указывается #15). Цикл заканчивается меткой end.
    Между началом и концом цикла может находиться необходимое количество команд.
    Следующая команда инкрементирует регистр W0, а далее значение W0 записывается в массив
    mas. Указатель массива W1 инкрементируется в процессе выполнения операции mov. mov #mas1, W1 mov #mas2,
    W2 repeat #15 mov [W1++],
    [W2++] nop
    В примере используется инструкция REPEAT. Основное отличие данной инструкции от
    DO что она выполняет в цикле только следующую за ней инструкцию необходимое количество раз.
    Также компилятор поддерживает другое написание данных инструкций. В них вместо заданного числа (#15) можно использовать рабочий регистр. Но перед использованием данной конструкции команды необходимо предварительно задать значение этого рабочего регистра.
    Инструкции сравнения
    Полный список инструкций сравнения представлен в таблице 7 приложения 1. Рассмотрим некоторые из них. mov #100, W0 mov #-100, W1 cpsgt W0, W1 goto _if_ nop nop _if_: nop nop
    Инструкции переходов
    В примере используется инструкция CPSGT. Если W0 больше W1, то следующая инструкция за командой CPSGT пропускается. Таким образом, в данном примере после выполнения инструкции сравнения, пропускается инструкция безусловного перехода и выполняется операция nop. mov #100, W0 mov #10, W1 cpslt W0, W1 goto _if_ nop nop _if_: nop nop
    В примере используется инструкция CPSLT. Если W0 меньше W1, то следующая инструкция за командой CPSLT пропускается.
    Таким образом, в данном примере после выполнения инструкции сравнения, выполняется инструкция безусловного перехода на метку _if__,далее выполняется операция nop. mov #100, W0 mov #100,
    W1 cpsne W0, W1 goto _if_ nop nop _if_: nop nop
    В примере используется инструкция CPSNE. Если W0 не равно W1, то следующая инструкция за командой CPSNE пропускается. Таким образом, в данном примере после выполнения инструкции сравнения, выполняется инструкция безусловного перехода на метку
    _if_, далее выполняется операция nop.
    Задание для самостоятельного выполнения
    1.
    Создайте новый проект. Процессор - dsPIC33FJ256GP710.
    2.
    Подключите необходимые библиотеки.
    3.
    Подключите отладчик (симулятор), встроенный в среду MPLAB
    IDE.

    250 5.
    Откройте окно Watch и внесите в него все регистры, которые используются в коде. В пошаговом режиме отладьте код, контролируя изменение регистров в окне Watch. После отладки программы, покажите код и результаты работы программы преподавателю.
    4. Выполните задание. Создайте схему алгоритма программы
    № Варианта
    Задание
    1
    Разработать программу, которая находит сумму всех нечётных элементов массива. В массиве 7 элементов.
    2
    Разработать программу, которая находит сумму элементов массива с чётными индексами. В массиве 9 элементов.
    3
    Разработать программу, которая складывает чётные и вычитает все нечётные элементы массива. В массиве 8 элементов.
    4
    Разработать программу, которая находит сумму всех элементов, которые делятся на три без остатка. В массиве 12 элементов.
    5
    Разработать программу, которая находит сумму элементов массива с нечётными индексами. В массиве 11 элементов.
    6
    Разработать программу, для вычисления суммы тех элементов массива, значения которых не меньше двенадцати. В массиве 7 элементов.
    7
    Разработать программу, которая находит сумму всех чётных элементов массива. В массиве 10 элементов.
    8
    Разработать программу для вычисления суммы тех элементов массива, значения которых не больше 47. В массиве 10 элементов.
    9
    Разработать программу, которая складывает элементы массива с чётными индексами и вычитает все элементы с нечётными индексами. В массиве
    12 элементов.
    10
    Разработать программу, которая складывает нечётные и вычитает все чётные элементы массива. В массиве 7 элементов.
    11
    Разработать программу для вычисления суммы элементов массива, значения которых больше 10 и меньше 78. В массиве 9 элементов.
    12
    Разработать программу, которая суммирует каждый третий элемент массива. В массиве 16 элементов.

    251 6.
    Подготовьте отчет в соответствие с требованиями на стр. 21.
    Контрольные вопросы
    1.
    Назовите основные инструкции сравнения.
    2.
    Назовите способы адресации, используемые в командах вашей программы.
    3.
    Назовите количество тактов, за которые выполняются инструкции сравнения.
    4.
    Можно ли использовать цикл REPEAT, если в теле цикла несколько команд?
    5.
    Можно ли использовать цикл DO, если в теле цикла одна команда?
    6.
    Можно ли использовать циклы DO и REPEAT, если заранее неизвестно количество итераций цикла?
    Практическая работа №48. Программирование микроконтроллеров (использование ВУ).
    Цель работы: приобрести практические навыки работы со стеком.
    Теоретическая часть.
    Стеком называют область программы для временного хранения произвольных данных.
    Данные можно сохранять и в сегменте данных, однако в этом случае для каждой сохраняемой на время единицы данных необходимо заводить отдельную именованную ячейку памяти, что увеличивает размер программы и количество используемых имен. Удобство стека заключается в том, что его область используется многократно. Стек традиционно используется, например, для сохранения содержимого регистров, используемых программой, перед вызовом подпрограммы, которая, в свою очередь, будет использовать эти же регистры процессора. Исходное содержимое регистров извлекается из стека после возврата из подпрограммы. Отличительной особенностью стека является своеобразный порядок выборки содержащихся в нем данных: в любой момент времени в стеке доступен только верхний элемент, т.е. элемент, загруженный в стек последним.
    Выгрузка из стека верхнего элемента делает доступным следующий элемент.
    Элементы стека располагаются в области памяти, отведенной под стек, начиная со дна стека
    (т.е. с его максимального адреса) по последовательно уменьшающимся адресам. Адрес верхнего, доступного элемента (вершины стека) хранится в регистре-указателе стека W15. При запуске программы по умолчанию регистр-указатель стека инициализируется адресом начинала сектора
    ОЗУ общего назначения 0x800. Указатель на стек может быть изменен программно, что позволяет реализовывать гибкие системы реального времени.
    К основным операциям работы со стеком относятся.
    -
    PUSH - помещает на вершину стека (TOS) значение операнда. Предыдущее значение, находящееся на вершине стека перемещается на один уровень вниз.
    -
    POP - извлекает значение из вершины стека в операнд, перемещает все содержимое стека на один уровень вверх.
    Синтаксис написания арифметических инструкций приведен в таблице 9 приложении 1.
    Помещение в стек
    Примеры помещения в стек:
    PUSH W1;
    Помещает в вершину стека значение регистра W1 (16-ти битный режим).
    PUSH.D W1;
    Помещает в вершину стека значения регистров W1:W2 (32-х битный режим).
    Извлечение из стека
    Примеры извлечения из стека:
    POP W1;
    Извлекает значение из вершины стека в регистр W1 POP.D W1;
    Извлекает значения из вершины стека в регистры W1:W2 (двойное извлечение).
    Пример программы, реализующий арифметическую функцию:

    252
    e = (a + b) * (c-1) / (d+2) с ограничением числа используемых регистров.
    .include "p33FJ256GP710.inc"
    .equ a, 0x810
    .equ b, 0x812
    .equ c, 0x814
    .equ d, 0x816
    .equ e, 0x818
    .text
    .global ____ reset
    _ reset:
    ; - Инициализация переменных
    mov #1, W2
    mov W2, a
    ; a:=1
    mov #2, W2
    mov W2, b
    ; b:=2
    mov #3, W2
    mov W2, c
    ; c:=3
    mov #4, W2
    mov W2, d
    V
    *

    d
    =
    ■t
    *
    ; - Реализация
    арифметической функции
    mov a, W2
    ; W2:=a
    mov b, W4
    ; W4:=b
    add W2, W4, W2
    ; W2:=W2+W4
    push W2
    ; поместить в вершину стека значение
    W2
    mov c, W2
    ; W2:=c
    mov #1, W4
    ; W4:=1
    sub W2, W4, W2
    ; W2:=W2-W4
    pop W4
    ;извлечь из вершины стека значение в
    W4
    mul.ss W2, W4,
    W2 ; W2:W3=W2*W4
    push.d W2
    ;поместить в вершину стека значение W2
    :W3
    mov d, W2
    ; W2:=d
    mov #2, W4
    ; W4:=2
    add W2, W4, W4
    ; W4:=W2+W4
    pop.d W2
    ; извлечь из стека значение в W2:W3
    repeat #17

    253
    MUL.SS и DIV.S.
    Задание для самостоятельного выполнения
    1.
    Создайте новый проект. Процессор - dsPIC33FJ256GP710.
    2.
    Подключите необходимые библиотеки и перепишите программу, приведенную выше.
    Разберитесь в ее работе.
    3.
    Необходимо подключить отладчик (симулятор), встроенный в среду MPLAB IDE.
    Выберете в меню .
    4.
    Создайте схему алгоритма и напишите программу, выполняющую заданную арифметическую функцию, с использованием минимального количества регистров.
    5.
    Откройте окно Watch и внесите в него все регистры, которые используются в коде. В пошаговом режиме отладьте код, контролируя изменение регистров в окне Watch. После отладки программы, покажите код и результаты работы программы преподавателю.
    div.s W2, W4
    ; W0:W1=W2/W4
    mov W0, e
    ; e:=W0
    nop
    .end
    В рассмотренной программе операции производятся с использованием двух регистров W2 и
    W4. Использование дополнительных регистров W0 и W3 обусловлено спецификой команд
    № Варианта
    Арифметическая функция
    1 e = ( a + 1 ) * ( b - 100 ) / (c + 1000) * (d - 1000)
    2 e = ( a + b ) * ( c - b ) / (c + d)
    3 e = ( a - b ) * ( c / d) + 1234 4 e = ( 100 - a ) / ( 100 - b ) * (c + d) - 4321 5 e = ( a + b - c ) * d / ( b - a ) + 9876 6 e = ( a * b + c ) * ( b - 100 ) / d
    7 e = a * ( b - c ) / ( c - d ) + 12345

    -
    0x800
    -
    0x802
    -
    0x804
    -
    0x806 a_begin, 0x800 a_end, 0x806
    Контрольные вопросы
    1.
    Для чего нужен стек?
    2.
    Что такое вершина стека?
    3.
    Где хранится информация о вершине стека?
    4.
    Назовите основные инструкции работы со стеком?
    5.
    Назовите количество тактов, за которые выполняются операции работы со стеком.
    6.
    В чем отличие операций PUSH и PUSH.D?
    7.
    Приведите пример неявной (подразумеваемой) адресации в вашей программе.
    Практическая работа №49. Программирование микроконтроллеров.
    Цель работы: приобрести практические навыки работы с арифметическими командами, командами передачи управления.
    Теоретическая часть
    Понятие рекуррентной зависимости.
    Основным назначением цифровых процессоров является выполнение задач по обработке информации, в частности реализация цифровой фильтрации сигнала. Цифровые фильтры реализуются и выполняются в микропроцессоре по разностному уравнению. В данной работе предложены различные рекуррентные зависимости, которые являются разновидностью разностных уравнений. В программировании рекурсия - вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия). Основными инструкциями, которыми нужно будет пользоваться в данной лабораторной работе, являются: циклы, операции перемещения, арифметические инструкции.
    Они были рассмотрены в предыдущих работах.
    Расчет зависимости.
    Рассмотрим пример программы вычисляющий следующую рекуррентную зависимость: a(k) = a(k-1) + 2*a(k-2) + a(k-3), k = 1, 2, 3, ... здесь a(k) значение
    последовательности на k шаге, a(k-1)
    -
    на предыдущем шаге выполнения программы и т.д.
    Код программы: include "p33FJ256GP710.inc"
    Определим адреса последовательности a[k] a[k] a[k-1] a[k-2] a[k-3]
    .equ .equ .text
    .global __reset reset:
    Определим назначение рабочих регистры W2
    = a(k)
    W3 = a(k-1)
    W4 = a(k-2)
    W5 = a(k-3)
    W6 - указатель на массив a[k]
    8 e = a* b + b / c - c * d - 13579 9 e = ( a * b + 100 ) / ( c + d - 100 )
    10 e = ( a + 1000 ) * c + ( b - 1000 ) / d
    11 e = ( a - d ) * ( b - c ) / d + 2468 12 e = a *d * ( b + 1000 ) / c - 1357

    255
    mov
    #a_begin, W6
    Инициализация последовательности mov
    #0, W0
    ;
    Определяем количество итераций работы алгоритма do
    #15, l ab_B
    ;
    Чтения из памяти mov
    #a_begin, W6 mov
    [++W6],
    W3 mov
    [++W6],
    W4 mov
    [++W6],
    W5
    ; Вычисление рекуррентной зависимости mul.su
    W4,#2, W0 add
    W3, W0,
    W1 add
    W1, W5,
    W2
    ;
    Запись нового значения в память mov
    W2, a_begi n
    ; Сдвиг информации в памяти mov
    #a_end, W 6 do
    #2, lab_A mov
    [—W6], [++W 6] dec2
    W6,
    W6 lab_A: nop lab_B: nop
    .end
    Данную программу можно записать более компактно:
    Код программы:
    mov
    W0,
    [W6++]

    >
    a[k ] =
    0
    mov
    #7,
    W0
    mov
    W0,
    [W6++]

    >
    a[k -1 ]
    = 7
    mov
    #3,
    W0
    mov
    W0,
    [W6++]

    >
    a[k -2 ]
    = 3
    mov
    #1,
    W0
    mov
    W0,
    [W6++]

    У
    a[k -3 ]
    = 1

    Задание для самостоятельного выполнения
    1.
    Создайте новый проект. Процессор - dsPIC33FJ256GP710.
    2.
    Подключите необходимые библиотеки.
    3.
    Подключите отладчик (симулятор), встроенный в среду MPLAB IDE.
    4.
    Создайте схему алгоритма и разработайте программу, вычисляющую n первых элементов ряда заданного рекуррентной зависимостью.
    .include "p33FJ 256GP710.i nc"
    .equ a_begin, 0x800
    .text
    .global ____ reset
    _ reset :
    ;инициализация, в W4 - адрес будущей прогрессии mov #a_begin, W4
    ;Задаем первые члены прогрессии, W1<-0
    mov #0, W 1 mov W1, [W4++] ;[0x800]< -0,
    W4< -0x802 mov #1, W 1 mov W1, [W4++] ;[0x802]< -1,
    W4< -0x804
    ;основной цикл вычисления прогрессии do #15, c yc_end
    ; W5 ук азывает на т ек ущий эл емент прогрессии
    в памяти mov W4, W5
    ;Помещаем в W2 -1й элемент mov [ --W5], W2
    ;Помещаем в W1 -2й элемент mov [ --W5], W1
    ;W3<-W1+W2 вычи сляем новый эл емен т прогрессии add W1, W 2, W3
    ;и записываем его в память mov W3, [W4++]
    ;конец цикла c yc_end: nop

    257 5.
    Откройте окно Watch и внесите в него все регистры, которые используются в коде. В пошаговом режиме отладьте код, контролируя изменение регистров в окне Watch. После отладки программы, покажите код и результаты работы программы преподавателю.
    6.
    Подготовьте отчет в соответствие с требованиями на стр. 21.
    7.
    Программа должна определять возникновение ошибки переполнения при расчёте произведения элементов.
    8.
    Составьте таблицу результатов работы рекуррентного алгоритма до n = 10. В шапке таблицы должны быть отражены значения: к, a(k), а(к-1), а(к-2).
    Контрольные вопросы
    1.
    Что такое рекурсия?
    2.
    Назовите способы адресации, используемые в командах вашей программы.
    3.
    Можно ли использовать цикл REPEAT, если в теле цикла несколько команд?
    4.
    Можно ли использовать цикл DO, если в теле цикла одна команда?
    5.
    Можно ли использовать циклы DO и REPEAT, если заранее неизвестно количество итераций цикла?
    6.
    Назовите основные арифметические инструкции.
    Практическая работа №50. Программирование микроконтроллеров (современные
    микроконтроллеры).
    Цель работы: приобрести практические навыки по преобразованию строк, познакомиться с ASCII-кодировкой, используемой для представления текстовой информации.
    Теоретическая часть.
    Таблица ASCII
    Хранение текстовой информации и отображение её на мониторе компьютера осуществляется следующим образом. Каждый символ кодируется числом от 0 до 255.
    Таким образом, строка символов в памяти компьютера храниться в виде одномерного массива байт, каждый элемент массива хранит код одного символа. При отображении строки на экране используется знакогенератор, входящий в состав графического адаптера, который по
    № Варианта
    Задание
    1
    а(к) = а(к-1) mod3 + а(к-2) mod 5, к = 1, 2, 3, ...
    2
    а(к) = [а(к-2) + а(к-1)] div 3, к = 1, 2, 3, ...
    3
    а(к) = а(к-1) div 7 + а(к-2) mod 5, к = 1, 2, 3, ...
    4
    а(к) = 12 а(к-2) + а(к-1) mod7, к = 1, 2, 3, ...
    5
    а(к) = а(к-1) mod 7- а(к-2) div 7, к = 1, 2, 3, ...
    6
    а(к) = [7 а(к-2) - а(к-1)] div 2, к = 1, 2, 3, ...
    7
    а(к) = 3 а(к-1) - а(к-2) mod 13, к = 1, 2, 3, ...
    8
    а(к) = [а(к-2) + а(к-1)] mod 17, к = 1, 2, 3, ...
    9
    а(к) = а(к-1) mod5 + а(к-2) div 4, к = 1, 2, 3, ...
    10
    а(к) = а(к-1) div 3 - а(к-2) mod 12, к = 1, 2, 3, ...
    11
    а(к) = [а(к-2) div 7- а(к-1)] mod 11, к = 1, 2, 3, ...
    12
    а(к) = 7 а(к-1) - а(к-2) div 3, к = 1, 2, 3, ...

    258
    коду символа определяет, что должно отображаться на мониторе.
    С целью стандартизации для кодирования символов в ЭВМ используется Американский
    Национальный Стандартный Код для Обмена Информацией - ASCII (American National Standard
    Code for Information Interchange, читается “аски”). Наличие стандартного кода облегчает обмен данными между различными устройствами компьютера (рисунок 9). Восьмибитовый расширенный ASCII-код, используемый в ЭВМ, обеспечивает представление 256 символов, включая символы для национальных алфавитов.
    В семействе dsPIC/PIC24 для работы с памятью программ используется два регистра - 8- битный регистр указания на страницу TBLPAG (который адресует блоки по 64 кБ) и любой из
    16-битных регистров общего назначения W0-W15, адресующий слово в выбранном 64-кБ блоке.
    Величины двух этих регистров формируют так называемый «эффективный адрес» (Effective
    Address - EA). Регистр PSVPAG (Program Memory Visibility Page Address Pointer) позволяет пользователю отобразить страницу памяти программ размером 2 Кбайт на верхние 32 Кбайт адресного пространства памяти данных.
    Инструкции сдвига
    Различают арифметический, логический и циклический сдвиги.
    При логическом сдвиге уходящий бит исчезает, не влияя на оставшиеся биты, а на месте появившегося бита записывается бит 0.
    Арифметический сдвиг при сдвиге влево ведёт себя как логический сдвиг, при сдвиге вправо уходящий бит исчезает, не
    55 влияя на оставшиеся биты, а на месте появившегося бита устанавливается бит, соответствующий знаку.
    При циклическом сдвиге уходящий бит появляется на месте появившегося свободного на другом конце числа.
    Синтаксис инструкций сдвига приведен в таблице 5 приложения
    1.
    Задание: Разработать программу, формирующую новую строку их заданной строки.
    Каждый символ из заданной строки в новой строке удваивается.
    1   ...   26   27   28   29   30   31   32   33   ...   43


    написать администратору сайта