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

МИКРОКОНТРОЛЛЕР ATmega8

        Цель работы. Целью лабораторной работы является отладка прикладных программ для микроконтроллера AVR семейства Mega с помощью персонального компьютера и программных средств отладки.

Программа работы

        1. Получив у преподавателя номер варианта (от N=1 до N=9), загрузить для отладки программу преобразования двоично-десятичного кода числа (байт) в двоичный (программа decbin_to_bin).
;****** Программа decbin_to_bin
    
  mov r17,r16 ; Исходное двоично-десятичное число
      ; хранится в r16
  andi r17,0xF0 ; Выделение старшей тетрады (десятков)
  swap r17 ;
  ldi r18,10 ; Умножение десятков на десять
  mul r17,r18 ;
  mov r17,r16 ; Выделение младшей тетрады (единиц)
  andi r17,0x0F ;
  add r17,r0 ; Сложение результатов. Результат остаётся в r17

        Перед выполнением программы необходимо в окне "Workspace" загрузить в регистр r16 число 10N+N в двоично-десятичном виде, которое подвергнется преобразованию.

        При выполнении программы число копируется в регистр r17, там на него накладывается маска 0b11110000 при помощи команды логического умножения (andi), которая выделяет десятки десятичного кода. После этого результат перемещается в младшую тетраду и умножается на 10. Результат умножения сохраняется в регистровой паре r1:r0. Т.к. наше число не может быть больше 99, то оно целиком поместится в младший байт результата, т.е. в r0. После этого повторно загружаем исходное число в r17, ещё раз накладываем маску, только на этот раз для выделения младшей тетрады, и суммируем результат с содержимым регистра r0, в котором хранились десятки. Конечный результат будет представлен в регистре r17.

        Проследите процесс выполнения программы в пошаговом и автоматическом режиме. Поясните содержимое строк окна "Disassembler".

        Внести ошибки в программу (неверная мнемоника команды, неверный операнд и т.п.) и проследить сообщения ассемблера при этом в окне View Output.

        Модифицировать программу в соответствии со своим вариантом индивидуального задания:

  1. Преобразовать дополнительный код числа (байт) в прямой.
  2. Преобразовать двоичный код (от 0 до 99) в двоично-десятичный.
  3. Просуммировать два числа в двоичном коде. Сумму, большую 255, заменить байтом единиц.
  4. Вычесть два числа в двоичном коде. Разность, меньшую нуля, заменить байтом нулей.
  5. Умножить на два двухбайтовое содержимое регистров R9..R10 (меньшее 32000).
  6. Сложить два двухбайтовых числа.
  7. Сложить два десятичных числа (байт) в двоично-десятичном коде.
  8. Реализовать суммирующий двоично-десятичный счетчик.
  9. Реализовать вычитающий двоично-десятичный счетчик.

        2. Загрузить для отладки программу определения максимального элемента массива 8-разрядных чисел SRAM (программа max_el_mass).

        Перед выполнением программы необходимо заполнить область памяти данных случайными числами, начиная с адреса 0x60. Количество элементов определяется числом, загружаемым в начале программы в r18.

        Для обращения к памяти с адресом более 8 разрядов программа использует специально для этого предназначенный Z-регистр. Он состоит из пары регистров r31:r30. В начале выполнения программа копирует первый элемент массива в r16, а адрес этого элемента в Х (регистровая пара r27:r26). После этого каждый элемент сравнивается со значением в r16, и в том случае, если элемент окажется больше содержимого r16, то он замещает собой предыдущее значение в r16, а также адрес нового наибольшего элемента копируется в пару Х. Каждый раз при сравнении, из количества элементов вычитается единица. Как только содержимое r18 станет равным 0, выполнение программы можно прекращать в связи с перебором всех элементов. В итоге получим наибольший элемент в r16, его адрес в Х.

        
   ;****** Программа max_el_mass
   
  ldi r30,low($100) ;Загрузка в регистр Z начального адреса
  ldi r31,high($100) ;массива чисел
  ldi r18,12 ;Загрузка количества элементов массива
  ld r16,z ;Загрузка в регистр r16 первого элемента массива
  mov r26,r30 ;Загрузка в X адреса первого элемента
  mov r27,r31  
  dec r18  
m1: inc r30 ;Увеличение Z на единицу для загрузки
    ; следующего элемента
  ld r17,z ;Загрузка элемента для сравнения
  cp r16,r17 ;Сравнение максимального (или первого) элемента
    ;с только что загруженным
  brsh m2  
  mov r16,r17 ;его перезапись в r16 в случае, если больше
  mov r26,r30 ;и сохранение адреса в X
  mov r27,r31  
m2: dec r18 ;Уменьшение счётчика количества элементов
  brbc 1,m1 ;Если не все элементы перебраны, переход на m1
m3: jmp m3 ;Зацикливание по завершении

        Модифицировать программу в соответствии со своим вариантом индивидуального задания:

  1. Определить минимальный элемент массива SRAM.
  2. Сформировать массив 3, элементы которого определяются как разность соответствующих элементов массивов 1 и 2. Отрицательную разность заменить нулем.
  3. Сформировать массив 3, элементы которого определяются как сумма соответствующих элементов массивов 1 и 2. Сумму, большую 255, заменить байтом единиц.
  4. Количество одинаковых элементов массивов 1 и 2 поместить в регистр R0.
  5. Количество чисел массива 1, совпадающих с содержимым регистра R1, поместить в регистр R0.
  6. Двоичные числа массива преобразовать в двоично-десятичные.
  7. Двоично-десятичные числа массива (меньшие 99) преобразовать в двоичные.
  8. Сформировать массив 2, элементы которого представляют дополнительный код восьмиразрядных чисел со знаком массива 1.
  9. Отсортировать массив по возрастанию элементов.

        3. Набрать и отладить прикладную программу fairy, позволяющую получить эффект бегущей 1 на линиях порта.

        
  ;****** Программа fairy
   
  .INCLUDE "C:\Program Files\Atmel\AVR
  Tools\AvrAssembler\Appnotes\m8def.inc"
  ; Подключение файла определения адресов
     
  ldi r16,0xFF
  out DDRB,r16
  sec  
  clr r16
m1: rol r16
  out PORTB,r16
  rjmp m1

        Ввести код программы в отладчик AVRStudio и проверить ее работу в пошаговом режиме. Проследить изменения, происходящие в регистрах SREG, PORTВ и PINВ по мере выполнения программы. Для чего в регистр DDRВ заносится 0xFF? Чем отличается команда rol от команд lsl и asr?

        Дополните программу подпрограммой задержки "Delay" таким образом, чтобы содержимое r17 определяло длительность паузы между сменой состояния на выводах порта.

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

        Модифицировать программу в соответствии со своим вариантом индивидуального задания и произвести ее отладку:

  1. Мультивибратор (тетрады порта D заполняются либо единицами, либо нулями в цикле, скорость миганий можно изменять с помощью порта В).
  2. Бегущий огонек со сменой направления на линиях порта С.
  3. Елочка 1 (линейка светодиодов, подключенная к линиям порта В, последовательно заполняется огнями и затем гаснет, после чего эффект периодически повторяется).
  4. Бегущий огонек на линиях порта C должен сменить направление, если на пяти линиях порта В установлены логические единицы.
  5. Елочка 2 (линейка светодиодов, подключенная к линиям порта, последовательно заполняется огнями и постоянно горит, а звезда - старший бит - моргает).
  6. Если на выводы порта D пришло число с нечётным количеством единиц, то оно передаётся через порт В, если с чётным - через порт С.
  7. "Бегущий огонёк" в одну сторону бежит по выводам порта B, в другую - порта В.
  8. Одна тетрада поступающего на выводы порта D числа должна быть отправлена через порт B, другая через С.
  9. Если поступившее на выводы порта D число чётное, то должны "мигать" выводы порта В, если нет - то порта С.

        4. Напишите программу, которая бы считывала число в двоично-десятичном коде с контактов порта В, преобразовывала его в двоичную форму и передавала в порт D.

        Примечание: для установки числа на входе порта необходимо после нажатия кнопки "Start Debugging" при помощи мыши установить единичные уровни в нужных разрядах PINB.

        5. Составить комментарии к программе Timer_interrupt.

        
;****** Программа Timer_interrupt
   
  ; Подключение файла определения адресов регистров ввода-вывода
  .INCLUDE "C:\Program Files\Atmel\AVR
  Tools\AvrAssembler\Appnotes\m8def.inc"
   
.org 0    
  jmp $0030
.org $0030    
  ldi r16,0x80
  out SREG,r16
  ldi r16,high (RAMEND)
  out SPH,r16
  ldi r16,low (RAMEND)
  out SPL,r16
  ldi r16,0x04
  out TIMSK,r16
  ldi r16,0xFF
  out TCNT1H,r16
  ldi r16,0xF0
  out TCNT1L,r16
  ldi r16,0x02
  out TCCR1B,r16
m1: rjmp m1
     
.org ovf1addr    
  ldi r16,0xFF
  out TCNT1H,r16
  ldi r16,0xF0
  out TCNT1L,r16
  reti  

        Ввести код программы в отладчик AVRStudio и проверить ее работу в пошаговом режиме. Объяснить данные, вводимые в регистры. Как можно изменить частоту переполнения счётчика?

        6. Загрузить для отладки программу генерации сигнала заданной частоты (программа Generator).

        
  ;****** Программа Generator
  ; Генератор импульсов с программируемым периодом Т=2n(1+X), где
  ; Х – число в регистре OCR1A, n – коэффициент деления предделителя
   
  .INCLUDE "C:\Program Files\Atmel\AVR
  Tools\AvrAssembler\Appnotes\m8def.inc"
  ldi r16,0x02 ; Линию РВ1 на вывод
  out DDRB,r16 ;
  ldi r16,0b01000000 ; Режим СТС таймера T1, состояние
      ; вывода РВ1 при сравнении меняется
  out TCCR1A,r16 ; на противоположное
  ldi r16,0b00001001 ; Режим СТС таймера T1 на частоте
  out TCCR1B,r16 ; тактирования (n=1)
  ldi r16,99 ; Модуль счета Х=99 для
  out OCR1AL,r16 ; периода Т=200 тактов
m1: rjmp m1  

        Изменить программу так, чтобы период генерируемых прямоугольных импульсов на выводе РВ1 составил N секунд при использовании кварцевого резонатора на 16 МГц (N - вариант задания).

        7. Составить комментарии к программе PWM2.

        
;****** Программа PWM2
.INCLUDE "C:\Program Files\Atmel\AVR
Tools\AvrAssembler\Appnotes\m8def.inc"
  ldi r16,0x02
  out DDRB,r16
  ldi r16,0x7F
  out OCR1AL,r16
  ldi r16,0b11000001
  out TCCR1A,r16
  ldi r16,0b00000010
  out TCCR1B,r16
m1: rjmp m1

        Ввести код программы в отладчик AVR Studio и проверить ее работу в пошаговом режиме. Какой режим ШИМ выбран в данном случае? Какова относительная длительность импульсов на выводе OC1A? С какой частотой относительно частоты кварца поступают импульсы синхронизации на таймер/счётчик?

Контрольные вопросы

        

Содержание отчета

        Отчет должен содержать листинги отлаживаемых программ (в том числе и по индивидуальным заданиям), комментарии по ходу выполнения пунктов работы и рисунки, вставляемые в текст формата WORD, отображающие окна регистров и памяти.