2. Написать программу перекодировки восьмиразрядного или шестнадцатиразрядного двоичного числа в упакованное двоично-десятичное число.
3. Написать программу перекодировки двухразрядного или пятиразрядного двоично-десятичного числа в двоичное.
4. Написать программу сложения или вычитания двух двухразрядных десятичных чисел
5. Дан массив А из 8 (или др.) однобайтовых или двухбайтовых кодов. Определить, содержит ли он код 0хАС или 0хАFВС. Если "да", то в регистр Rn занести число таких кодов.
6. Дан массив А из 10 однобайтовых (или др.) чисел. Переписать его в массив В, упорядочив числа по возрастанию (или по убыванию).
7. Дан массив А из 10 однобайтовых чисел. Переписать в массив В только числа, содержащие четное (или нечетное) количество единиц (или нулей).
8. Зашифровать содержащиеся в массиве А коды 10 букв или цифр по следующему правилу: а) циклический сдвиг влево на 5 (или др.) разрядов и побитовая инверсия; б) прибавить константу 2 (или др.) и циклический сдвиг вправо на 3 разряда.
9. Дан массив А из 5 однобайтовых чисел. Определить, содержит ли он число 0х1F (или др.). Если да, то выполнить операцию "логическое И" (или др.) над всеми числами массива А.
10. Переписать в стек, расположенный в памяти с адреса С, массив А из 10 восьмиразрядных (или др.) чисел. Выполнить операцию суммирования (или др.) над ними.
11. Дан массив А из 10 однобайтовых чисел, содержащий число 0хАА. Выполнить операцию "логическое И" (или др.) над всеми числами до 0xАА и операцию "логическое ИЛИ" (или др.) над всеми числами после него.
12. Написать программу вычисления логической функции V=X*(NOT.Y*Z+NOT.W) (или др.) ,где + - знак операции ИЛИ,* - знак операции И, X,Y,Z,W-логические переменные, хранимые в разрядах 3-0 ячейки памяти EEPROM по адресу 0x00.
13. Написать программу сложения или вычитания двух 8 разрядных (или др.) двоичных чисел со знаком (или без).
14. Дан массив А из 10 однобайтовых чисел. Переписать в массив В все числа, большие (или меньшие) 0х20, и записать в регистр Rn (или вывести на индикатор) число таких чисел.
15. Определить четное или нечетное число единиц (или нулей) в 8 двоичных кодах, записанных в массиве А, и вывести на индикатор сообщение «Ч» или «Н» (или число единиц).
16. Дан массив А из 10 однобайтовых чисел. Переписать в массив В все числа, лежащие в диапазоне 0х0F – 0хF0 (или др.). Вывести на индикатор число таких чисел.
17. Дан массив А из 8 однобайтовых чисел, содержащий число 0хА1. Необходимо найти сумму всех чисел массива А, находящихся до этого числа. Результат вывести на индикатор.
18. В массиве А хранится 8 показаний температуры больных .Проверить, нет ли среди них значений выше 37 и ниже 36 и вывести на индикатор соответственно два числа через пробел.
19. Разработать программу вывода на индикатор отладочного устройства последовательности цифр 1-8,образовав ряд 12345678.
20. Разработать программу вывода на индикатор всех битов регистра состояния процессора SREG в формате: каждому флагу (биту)- один разряд индикатора.
21. Разработать программу для последовательного вывода всех цифр на один семисегментный индикатор с интервалом вывода -1с.
22. Разработать программу мигания одного (или др.) разряда дисплея с интервалом 3сек. (или др.).
23. Разработать программу последовательного гашения всех индикаторов дисплея после его включения.
24. Разработать программу циклического перемещения одного символа, хранимого в ячейке памяти, вдоль индикатора (бегущий символ).
25. Разработать программу для циклического перемещения набора цифр или символов вдоль индикатора в направлении справа налево (или наоборот).
26. Разработать программу "Электронные часы", используя для индикации семи сегментный индикатор. Формат вывода «22.15.30» или «22.15», обеспечив мигание точки с интервалом 1с.
27. Разработать программу, чередующую вывод на индикатор сообщений «1C», «2C» и «4C» (или др.) удерживаемых соответственно 1сек, 2сек и 4сек.
28. Используя матричную клавиатуру 3х3 и светодиод разработать программу и устройство, которое обеспечивало мигание светодиода такое количество раз равное номеру нажатой клавиши (1 – 9).
29. Используя матричную клавиатуру 4х4 (или др.) и систему индикации разработать программу и устройство кодового замка из 4 (или др.) цифр кода.
30. Используя матричную клавиатуру 4х4 (или др.) и семи сегментные индикаторы разработать программу и устройство калькулятора, которое обеспечивает сложение, вычитание, умножение и делание 16-ти разрядных чисел.
31. Используя генератор звуковых колебаний и несколько разрядов ССИ разработать программу и устройство измерения частоты в диапазоне 20 Гц – 20 КГц.
Основные принципы выполнения заданий.
Предполагается, что обучающийся должен иметь представление об архитектуре и системе команд микроконтроллеров AVR. При выполнении задания необходимо придерживаться следующих правил:
1) уяснить поставленную задачу, понимая, что должно являться результатом;
2) выбрать соответствующий микроконтроллер, исходя из требования задания;
3) составить подробное (побитовое) описание необходимых для выполнения задания регистров имея перед собой таблицу всех регистров ввода/вывода (см. ПРИЛОЖЕНИЕ 2);
4) определить необходимые векторы прерываний и составить алгоритмы соответствующих обработчиков векторов прерываний;
5) составить алгоритм основной программы, учитывая особенности МК (стек и т.д.);
6) приступить к написанию программы, выбирая необходимые команды ассемблера.
На рис. 3.15.1 изображена структурная схема процесса обучения. Она включает:
1) Написание программы прошивки микроконтроллера, для решения поставленной задачи;
2) Контроль правильности разработанной программы на симуляторе с помощью компьютера (первая петля обратной связи);
3) Прошивка микроконтроллера и сопряжение с системой индикации (внешними устройствами) для окончательного контроля правильности выполненной задачи (вторая петля обратной связи).
Рис. 3.15.1 Структурная схема процесса обучения.
3.2.2. Рассмотрение типовых примеров
В качестве примера работы с памятью рассмотрим следующее задание: Требуется написать программу копирования таблицы из 20 восьмибитных чисел данных из памяти программ (Program Memory) в оперативную память (SRAM) начиная с адреса 0х80.
Рассмотрим выполнение данной программы в соответствии с предложенными выше правилами.
В данном примере нам необходимо работать с оперативной памятью SRAM. Так как в МК AT90S1200 её нет, то выбираем к примеру AT90S8515 (или др). Теперь нам надо позаботиться о правильной инициализации стека, загрузив в указатель стека адрес старшей ячейки оперативной памяти. Данную программу можно полностью реализовать на симуляторе AVR Studio Simulator, где наглядно будет видна вся карта памяти. Ниже приведем программу с некоторыми пояснительными комментариями.
Программа копирования таблицы данных:
;********************************************************************
.include "8515def.inc"
.equ BLOCK1 =$80 ;начальный адрес копируемой таблицы данных в SRAM
;памяти
.def flashsize =r16 ;РОН хранящий размер таблицы
.def temp =r16 ;РОН для промежуточных действий
rjmp RESET ;вектор прерывания по включению питания, сбросу
;RESET или сбросу от сторожевого таймера
;**********************************************************************
;* Подпрограмма копирования таблицы данных из памяти программ в SRAM
flash2ram:
lpm ;загружаем из памяти программ в R0 байт адрес
;которого указан в Z
st Y+,r0 ;сохраняем его в SRAM памяти с постинкрементом
;регистра Y
adiw ZL,1 ;инкремент Z
dec flashsize ;декремент flashsize
brne flash2ram ;если предыдущая операция не равна 0 то перейти на
;метку
ret ;возврат в основную программу
;***********************************************************************
;* Основная программа
RESET:
ldi temp, low(RAMEND) ; инициализируем указатель стека
out SPL, temp ;
ldi temp, high(RAMEND) ;
out SPH, temp ;
ldi ZH, high(F_TABLE*2) ;загружаем в регистр Z удвоенный адрес
ldi ZL, low(F_TABLE*2) ; начала таблицы данных
ldi YH, high(BLOCK1) ;загружаем в регистр Y адрес начала
ldi YL, low(BLOCK1) ; таблицы данных в SRAM памяти
ldi flashsize,20 ;определяем размер таблицы
rcall flash2ram ;вызываем подпрограмму копирования таблицы данных
;из памяти программ в SRAM память
forever:rjmp forever ;бесконечный цикл
F_TABLE:
.db 0,1 ;начало таблицы из 20 восьмибитных чисел
.db 2,3
.db 4,5
.db 6,7
.db 8,9
.db 10,11
.db 12,13
.db 14,15
.db 16,17
.db 18,19
;**********************************************************************
В качестве примера задачи по индикации рассмотрим второй пример:
Используя два светодиода и кнопку разработать программу и устройство которое вызывает мигание одного светодиода, подключенного к выводу PB0, и с помощью кнопки, подключенной к выводу PD5, зажигает светодиод, подключенный к выводу PB4. Частоту мигания светодиода порядка 2-3 Гц задать с помощью обработчика прерывания от таймера Т0.
Данное устройство можно реализовать на МК AT90S1200. Для обеспечения заданной частоты мигания светодиода коэффициент предварительного деления тактовой частоты (4Гц) для таймера Т0 будет равен 1024. Подпрограмма обработки прерывания по переполнению таймера Т0 инвертирует значение логического уровня (0 или 1) на 0 выводе порта В, обеспечивая тем самым мигание подключенного светодиода. Светодиоды подключаются согласно разделу «1.4.2 Световая индикация». Исходный текст программы цифрового частотомера:
;********************************************************************
.include "1200def.inc"
rjmp Start ;вектор прерывания по включению питания, сбросу
;RESET или сбросу от сторожевого таймера
nop ;вектор внешнегго прерывания неиспользуется
rjmp TmrInt ;вектор прерывания по переполнению таймера Т0
;**********************************************************************
;* Подпрограмма обработки прерывания по переполнению таймера Т0