Методические указания для практических занятий по дисциплине мдк. 02. 01
Скачать 7.37 Mb.
|
Рассмотрим случай, когда не было ошибки при передаче кода. Тогда точно такой же код принял приемник. Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 =0 ⊕1⊕0⊕1=0; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 =1 ⊕1⊕1⊕1=0; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕0⊕1⊕1=0. Поскольку значение, составленное из контрольных битов, равно нулю, ошибки нет, и код передается от приемника далее. Рассмотрим случай, когда была ошибка при передаче кода. Пусть ошибка произошла в третьем бите, т.е. принят код: M 4 M 3 M 2 C 3 M 1 C 2 C 1 307 4 3 2 3 1 2 1 1 1 0 0 0 1 0 Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 =0 ⊕0⊕0⊕1=1; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 =1 ⊕0⊕1⊕1=1; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕0⊕1⊕1=0. Поскольку, значение, составленное из контрольных разрядов, равно 011 2 , ошибка в бите № 3. Приемник меняет значение этого бита на противоположное. Теперь рассмотрим код (11,7). Пример. В канал связи нужно передать следующий блок информации: 1101010 2 Передатчик формирует код Хэмминга: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 1 1 0 * 1 0 1 * 0 * * С 1 =М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =0 ⊕1⊕1⊕0⊕1=1; С 2 =М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1⊕1=1; С 3 =М 2 ⊕М 3 ⊕М 4 =1 ⊕0⊕1=0; С 4 =М 5 ⊕М 6 ⊕М 7 =0 ⊕1⊕1=0, тогда код, передаваемый в канал, будет: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 1 1 0 0 1 0 1 0 0 1 1 Рассмотрим случай, когда не было ошибки при передаче кода. Тогда точно такой же код принял приемник. Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =1 ⊕0⊕1⊕1⊕0⊕1=0; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =1 ⊕0⊕0⊕1⊕1⊕1=0; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕1⊕0⊕1=0; С 14 =С 4 ⊕М 5 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1=0. Поскольку значение, составленное из контрольных битов, равно нулю, ошибки нет, и код передается от приемника далее. Рассмотрим случай, когда была ошибка при передаче кода. Пусть ошибка произошла во втором бите, т.е. принят код: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 1 1 0 0 1 0 1 0 0 0 1 Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =1 ⊕0⊕1⊕1⊕0⊕1=0; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =0 ⊕0⊕0⊕1⊕1⊕1=1; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕1⊕0⊕1=0; С 14 =С 4 ⊕М 5 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1=0. Поскольку значение, составленное из контрольных битов, равно 0010 2 , ошибка во втором бите. Приемник меняет значение этого бита на противоположное. Код Хэмминга является равномерно защищенным, исправляет ошибки как в информационных, так и в контрольных битах. С его помощью возможно исправление одиночной и обнаружение двойной ошибки. Для того чтобы обнаружить двойную ошибку, в код Хэмминга 308 вводят дополнительный контрольный бит E 0 . Значение E 0 вычисляется как сумма по модулю 2 всех разрядов кода Хэмминга, т.е. он дополняет код Хэмминга по четности. На стороне приемника, кроме получения контрольных разрядов, которые определяют позицию с ошибкой, вычисляется контрольный разряд E 10 : E 10 =Е 0 ⊕<сложенные по модулю 2 все остальные биты принятого кода>. Если E 10 =0, то ошибок нет. Если значение, полученное из контрольных разрядов, не равно 0 и E 10 =1, то имеет место одиночная ошибка, позиция которой определяется значением контрольных разрядов. Если значение С≠0 и E 10 =0 , то имеет место двойная ошибка. Рассмотрим пример для кода, исправляющего одиночную ошибку и обнаруживающего двойную. Для кода (11,7) формат блока информации: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 Е 0 Пример. В канал связи нужно передать следующий блок информации: 1101010 2 Передатчик формирует код Хэмминга: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 Е 0 1 1 0 * 1 0 1 * 0 * * * С 1 =М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =0 ⊕1⊕1⊕0⊕1=1; С 2 =М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1⊕1=1; С 3 =М 2 ⊕М 3 ⊕М 4 =1 ⊕0⊕1=0; С 4 =М 5 ⊕М 6 ⊕М 7 =0 ⊕1⊕1=0, Е 0 =С 1 ⊕С 2 ⊕М 1 ⊕С 3 ⊕М 2 ⊕М 3 ⊕М 4 ⊕С 4 ⊕М 5 ⊕М 6 ⊕М 7 =1 ⊕1⊕0⊕0⊕1⊕0⊕⊕1⊕0⊕0⊕ 1 ⊕1=0, тогда код, передаваемый в канал, будет: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 Е 0 1 1 0 0 1 0 1 0 0 1 1 0 Рассмотрим случай, когда не было ошибки при передаче кода. Тогда точно такой же код принял приемник. Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =1 ⊕0⊕1⊕1⊕0⊕1=0; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =1 ⊕0⊕0⊕1⊕1⊕1=0; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕1⊕0⊕1=0; С 14 =С 4 ⊕М 5 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1=0, Е 10 = Е 0 ⊕С 1 ⊕С 2 ⊕М 1 ⊕С 3 ⊕М 2 ⊕М 3 ⊕М 4 ⊕С 4 ⊕М 5 ⊕М 6 ⊕М 7 = =0 ⊕1⊕1⊕0⊕0⊕1⊕0⊕1⊕0⊕0⊕1⊕1=0. Поскольку значение, составленное из контрольных битов, равно 0, и Е 10 =0, ошибки нет, и код передается от приемника далее. Рассмотрим случай, когда была одиночная ошибка при передаче кода. Пусть ошибка произошла во втором бите (не считая Е 0 , т.е. в С 2 ) и принят код: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 Е 0 1 1 0 0 1 0 1 0 0 0 1 0 Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =1 ⊕0⊕1⊕1⊕0⊕1=0; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =0 ⊕0⊕0⊕1⊕1⊕1=1; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕1⊕0⊕1=0; С 14 =С 4 ⊕М 5 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1=0, Е 10 = Е 0 ⊕С 1 ⊕С 2 ⊕М 1 ⊕С 3 ⊕М 2 ⊕М 3 ⊕М 4 ⊕С 4 ⊕М 5 ⊕М 6 ⊕М 7 = 309 =0 ⊕1⊕0⊕0⊕0⊕1⊕0⊕1⊕0⊕0⊕1⊕1=1. Поскольку значение Е 10 =1 и значение, составленное из контрольных разрядов, равно 0010 2 , то ошибка во втором бите. Приемник меняет значение этого бита на противоположное. Рассмотрим случай, когда была двойная ошибка при передаче кода. Пусть ошибка произошла во втором (т.е. в С 2 ) и в пятом битах (т.е. М 2 ) и принят код: M 7 M 6 M 5 C 4 M 4 M 3 M 2 C 3 M 1 C 2 C 1 Е 0 1 1 0 0 1 0 0 0 0 0 1 0 Теперь приемник проверяет правильность передачи кода, вычисляя следующие выражения: С 11 =С 1 ⊕М 1 ⊕М 2 ⊕М 4 ⊕М 5 ⊕М 7 =1 ⊕0⊕0⊕1⊕0⊕1=1; С 12 =С 2 ⊕М 1 ⊕М 3 ⊕М 4 ⊕М 6 ⊕М 7 =0 ⊕0⊕0⊕1⊕1⊕1=1; С 13 =С 3 ⊕М 2 ⊕М 3 ⊕М 4 =0 ⊕0⊕0⊕1=1; С 14 =С 4 ⊕М 5 ⊕М 6 ⊕М 7 =0 ⊕0⊕1⊕1=0, Е 10 = Е 0 ⊕С 1 ⊕С 2 ⊕М 1 ⊕С 3 ⊕М 2 ⊕М 3 ⊕М 4 ⊕С 4 ⊕М 5 ⊕М 6 ⊕М 7 = =0 ⊕1⊕0⊕0⊕0⊕0⊕0⊕1⊕0⊕0⊕1⊕1=0. Поскольку значение Е 10 =0 и значение, составленное из контрольных разрядов, равно 0111 2 ≠0, то произошла двойная ошибка. Приемник не передает код далее, а запрашивает от источника повторную передачу этого блока информации. Практическая работа №69. Элементарные приемы программирования (ветвления и циклы). Цель работы: изучение принципов реализации типовых алгоритмических структур на примере ветвлений и циклических программ. Основные сведения. Любая процедура управления или обработки данных представляет собой совокупность некоторых алгоритмических структур, с помощью которых выполняются требуемые операции. Наиболее распространёнными алгоритмическими структурами являются ветвления (branching) и циклы (loop). Ветвления используются для выполнения различных частей программы (разделения ветвей алгоритма) в зависимости от некоторых условий. В циклах одна и та же операция выполняется над содержимым нескольких последовательно расположенных в памяти ячеек или элементов данных. Использование циклических программ целесообразно при обработке массивов, таблиц и подобных по структуре данных. Числом повторений цикла управляют счётчики, а обрабатываемый при данном проходе цикла элемент определяется с помощью индекса или указателя. В циклической программе можно выделить четыре основных блока. 1. Блок инициализации (от лат. initium – начало), в котором производится присвоение начальных значений переменным, счётчикам, индексам и указателям. Указатели представляют собой адреса данных в памяти. 2. Блок обработки, в котором выполняются требуемые вычисления, т. е. одинаковые повторяющиеся действия над различными последовательно расположенными в памяти данными. 3. Блок управления циклом, в котором изменяются значения счётчиков и индексов (указателей) перед выполнением следующей повторяющейся операции, а также производится проверка условия выхода из цикла. 4. Заключительный блок, в котором производится сохранение полученных результатов. Блоки 2 и 3 составляют тело цикла (loop body). Для повышения быстродействия и сокращения размера циклических программ следует разгружать тело цикла от операций, которые могут быть выполнены за его пределами. Для организации циклических программ, а также ветвлений в программах используются команды безусловных и условных переходов. Кроме того, для построения циклов могут 310 применяться специальные команды циклов, выполняющие несколько действий одновременно (в системе команд AVR- микроконтроллеров отсутствуют). Команды безусловных переходов JMP, RJMP, IJMP и EIJMP передают управление по указанному в команде адресу памяти программ. Команда JMP (Jump – переход) позволяет передавать управление внутри всего объёма памяти программ. Команда RJMP (Relative Jump – относительный переход) обеспечивает переход в пределах ±2К слов (±4К байт) относительно текущего содержимого программного счётчика. По команде IJMP (Indirect Jump – косвенный переход) выполняется косвенный переход по адресу, указанному регистром Z; максимальное смещение составляет 64К слов (128К байт). Команда EIJMP (Extended Indirect Jump – расширенный косвенный переход) обеспечивает косвенный переход по всему объёму памяти программ; для расширения программного счётчика используется регистр EIND. При выполнении команд безусловных переходов в программный счётчик загружается адрес ячейки памяти программ, на которую передаётся управление. Команды условных переходов передают управление по указанному адресу памяти программ в случае выполнения некоторых условий. Команды BRхх (Branch if … – перейти, если …) выполняют переход на расстояние – 64…+63 слова относительно текущего содержимого программного счётчика по результатам проверки разрядов регистра состояния SREG (кодов или флагов условий). Регистр состояния SREG находится в адресном пространстве регистров ввода-вывода. Коды условий (C, Z, N, V, S, H) формируются в регистре состояния при выполнении арифметических, логических команд и команд работы с битами и представляют собой признаки результата операции. Разряд С (carry – перенос) устанавливается, если при выполнении команды был перенос из старшего разряда результата. Разряд Z (zero – нуль) устанавливается, если результат выполнения команды равен нулю. Разряд N (negative – отрицательный результат) устанавливается, если старший значащий разряд результата равен 1 (правильно показывает знак результата, если не было переполнения разрядной сетки числа со знаком). Разряд V (overflow – переполнение) устанавливается, если при выполнении команды произошло переполнение разрядной сетки числа со знаком. Разряд S = N ⊕ V (sign – знак) правильно показывает знак результата при переполнении разрядной сетки числа со знаком. Разряд H (half carry – полуперенос) устанавливается, если при выполнении команды был перенос из третьего разряда результата. Для организации ветвлений при сравнении операндов команды BRхх ис- пользуются совместно с командами CP (Compare) сравнения содержимого двух РОН, CPC (Compare with Carry) сравнения с учётом признака переноса и CPI (Compare with Immediate) сравнения с константой. Команды ветвления BRхх отличаются для операндов без знака и со знаком. Числа без знака представляются прямым кодом, числа со знаком – дополнительным кодом. Команды условных переходов, используемые для ветвлений при сравнении операндов, сведены в следующей таблице. 311 К командам условных переходов также относится команда CPSE (Compare and Skip if Equal – сравнить и пропустить, если равно), которая сравнивает содержимое двух РОН и пропускает следующую за ней команду, если содержимое одинаково. Команды SBRS, SBRC, SBIS, SBIC (Skip if Bit in Register [I/O Register] is Set [Cleared] – пропустить, если разряд в регистре общего назначения [ввода- вывода] установлен [сброшен]) пропускают следующую команду в случае выполнения соответствующего условия. При обработке массивов в циклических программах эффективно использование косвенной адресации памяти данных с предекрементом и постинкрементом, а также косвенной адресации памяти дан- ных со смещением. На рисунке ниже приведён фрагмент программы, в которой число 100 заносится в ячейки массива из пяти байт. Для проверки условия выхода из цикла и передачи управления используется команда BRNE. Предел повторений цикла равен 5, шаг равен –1, параметр цикла (счётчик) содержится в регистре R16. Практическая часть. 1. Дополнить фрагмент программы необходимыми директивами. Изменить число, заносимое в ячейки массива, в соответствии с заданным вариантом. Выполнить программу в пошаговом режиме с помощью симулятора-отладчика. 2. Произвести изменения в программе: заменить команды ADD (сложение) и SUB (вычитание) на INC (инкремент) и DEC (декремент) соответственно. 312 3. В последнем варианте программы исключить команду INC за счёт использования косвенной адресации памяти данных с постинкрементом. 4. Изменить порядок подсчёта числа проходов цикла, задав изменение параметра цикла (счётчика) не с предела, а с нуля. 5. Составить программу пересылки массива из памяти программ в память данных. Массив в памяти программ задать в директиве .db; значения элементов массива взять из таблицы (Массив I) в соответствии с заданным вариантом. 6. Составить программу суммирования элементов массива. Значения элементов массива задать аналогично п. 5. 7. Составить программу поэлементного сложения двух массивов. Значения элементов массивов взять из таблицы (Массив I и Массив II) в соответствии с заданным вариантом. 8. Составить программу слияния двух массивов, где в результате попарного сравнения двух элементов из разных массивов образуется новый массив из наибольших элементов. Значения элементов массивов взять аналогично п. 7. 9. Оформить отчет. Отчёт должен содержать: титульный лист с указанием номера и названия работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием. |