Методические указания для практических занятий по дисциплине мдк. 02. 01
Скачать 7.37 Mb.
|
Цель работы: изучить и приобрести практические навыки с командами организации циклов и инструкциями сравнения. Теоретическая часть Организация цикла К основным командам организации циклов относятся 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. Задание: Разработать программу, формирующую новую строку их заданной строки. Каждый символ из заданной строки в новой строке удваивается. |