контроллер ATmega1281 (Всё по лабораторным работам БМТ)
Описание файла
Файл "контроллер ATmega1281" внутри архива находится в следующих папках: Всё по лабораторным работам БМТ, 2. Документ из архива "Всё по лабораторным работам БМТ", который расположен в категории "". Всё это находится в предмете "электроника" из , которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "электроника и микропроцессорная техника" в общих файлах.
Онлайн просмотр документа "контроллер ATmega1281"
Текст из документа "контроллер ATmega1281"
;контроллер ATmega1281
;подключение файла заголовков регистров ввода вывода
.include "m128def.inc"
;.include "" ;файл куда можно записать изменения на портах ввода вывода
;определение имен некоторых регистров для дальнейшего использования их псевдонимов
.DEF klav=R20; регистр для сигнала нажатой кнопки
.DEF temp=R21; регистр для временной информации
.DEF what=R22; регистр для номера нажатой кнопки
.DEF for_trans=R17; регистр для числа, которое будет разбито на
; десятки и единицы
.DEF day_s=r2; регистр для хранения цифры десятков дня выполнения лабы
.DEF day_m=r3; регистр для хранения цифры единиц дня выполнения лабы
.DEF birth_s=r4; регистр для хранения цифры десятков дня рождения
.DEF birth_m=r5; регистр для хранения цифры единиц дня рождения
.DEF mes_s=r6; регистр для хранения цифры десятков месяца рождения
.DEF mes_m=r7; регистр для хранения цифры единиц месяца рождения
.DEF year1_s=r8; регистр для хранения цифры десятков первых двух цифр
; года рождения
.DEF year1_m=r9; регистр для хранения цифры единиц первых двух цифр
; года рождения
.DEF year2_s=r11; регистр для хранения цифры десятков вторых двух цифр
; года рождения
.DEF year2_m=r12; регистр для хранения цифры единиц вторых двух цифр
; года рождения
.DEF ind=R24; регистр для хранения цифры для индикации
.DEF ind2=R25; регистр для хранения кода для цифры индикации
;инициализация указателя стека
ldi r25, LOW(RAMEND); в регистр R25 загружается начальный байт указателя стека
out $3d, r25; по адресу регистра SPL записывается значение
; начального байта указателя стека
ldi r25, HIGH(RAMEND); в регистр R25 загружается конечный байт указателя стека
out $3e, r25; по адресу регистра SPL записывается значение
; конечного указателя стека
;инициализация портов ввода вывода
ldi temp, 0xff; в регистр temp заносится число ff.
out $04, temp; порт B программируется на вывод
; записью в регистр DDRB числа FF
out $07,temp; порт C программируется на вывод
; записью в регистр DDRC числа FF
clr temp;
out $0a, temp; порт D программируется на вывод
; записью в регистр DDRD числа 00
;запись чисел для вывода в регистры
;день лабы
ldi temp, 06; в регистр temp записывается число для дня лабы
mov for_trans, temp; копирование этого значения в регистр for_trans для
; дальнейшего преобразования
rcall translation; вызов процедуры выделения десятков и единиц из числа
mov day_s, r14; в регистр day_s копируется значение первой цифры числа
; дня выполнения лабы
mov day_m, r15; в регистр day_m копируется значение второй цифры числа
; дня выполнения лабы
;день рождения
ldi temp, 21; в регистр temp записывается число для дня рождения
mov for_trans, temp; копирование этого значения в регистр for_trans для
; дальнейшего преобразования
rcall translation; вызов процедуры выделения десятков и единиц из числа
mov birth_s, r14; в регистр birth_s копируется значение первой цифры ; числа дня рождения
mov birth_m, r15; в регистр birth_m копируется значение второй цифры ; числа дня рождения
;месяц рождения
ldi temp, 12; в регистр temp записывается число для месяца рождения
mov for_trans, temp; копирование этого значения в регистр for_trans для
; дальнейшего преобразования
rcall translation; вызов процедуры выделения десятков и единиц из числа
mov mes_s, r14; в регистр birth_s копируется значение первой цифры ; числа месяца рождения
mov mes_m, r15; в регистр birth_m копируется значение второй цифры ; числа месяца рождения
;первые две цифры года рождения
ldi temp, 19; в регистр temp записывается число первых двух цифр года
; рождения
mov for_trans, temp; копирование этого значения в регистр for_trans для
; дальнейшего преобразования
rcall translation; вызов процедуры выделения десятков и единиц из числа
mov year1_s, r14; в регистр year1_s копируется значение первой цифры ; первых двух цифр года рождения
mov year1_m, r15; в регистр year1_m копируется значение второй цифры ; первых двух цифр года рождения
;вторые две цифры года рождения
ldi temp, 86; в регистр temp записывается число вторых двух цифр года
; рождения
mov for_trans, temp; копирование этого значения в регистр for_trans для
; дальнейшего преобразования
rcall translation; вызов процедуры выделения десятков и единиц из числа
mov year2_s, r14; в регистр year2_s копируется значение первой цифры ; вторых двух цифр года рождения
mov year2_m, r15; в регистр year2_m копируется значение второй цифры ; вторых двух цифр года рождения
clr r15; очитска регистра r15
clr r14; очистка регистра r14
;основной блок программы
main:
;в данной программе происходит программная задержка микроконтроллера.
;задержка опроса клавиатуры составляет 1/10c. Достигается она с помощью
;вызова процедуры wait 3 раза, что обеспечивает загрузка в регистр R16
;числа 3. Процедура wait написана для обеспечения задержки порядка 1/30с.
;таким образом вызывая процедуру wait 3 раза с помощью меток w1 и rm
;можно обеспечить требуемое время задержки.
rcall opros_klavy; вызов процедуры опроса клавиатуры на нажатие одной
; или нескольких клавиш
ldi R16, 3 ; загрузка в регистр r16 числа 3 для обеспечения задержки
; опроса клавы
w1: cpi klav,1 ; сравнение регистра klav с 1
breq vyvod ; если в регистре состояния Z записана 1, то переход
; на процедуру вывода
rc: rcall wait ; вызов процедуры ожидания
rm: dec R16 ; уменьшение содержания регистра R16 на 1
brne w1 ; проверка последней операции на равенство 0. Если выполнено
; то переход на строчку вниз
rjmp main ; зацикливание программы
; процедура загрузки процессора вычислениями для отработки времени ожидания
; 3-ной вложенный цикл
wait:
; формирование задержки
; частота микроконтроллера равна 4 МГц. Следовательно на один такт тратится
; (1/40*10^6)c. для реализации задержки в 1/30c необходимо:
; (1/40*10^6)c/30=133000 тактов
; операции dec и brne занимают 1 такт. Следовательно для одного блока вложенного
; цикла требуется два такта. (пренебрегаем тем, что brne при выполнении условия
; занимает 2 такта)
; тогда 133000/(255*2)=261.
; Поучили максимальное значение внутреннего цикла R19=$ff
; 261/(65*2)=2
; Получили максимальные значения среднего и внешнего циклов R18=65, R20=2
;
ldi R19, 0xff ; загрузка в регистр r19 начального значения
; счетчика внутреннего цикла
ldi R18, 0x41 ; загрузка в регистр r18 начального значения счетчика
; среднего цикла
ldi R20, 0x02 ; загрузка в регистр r20 начального значения счетчика
; внешнего цикла
m2:
dec R19 ; уменьшение на 1 значение регистра r19
brne m2 ; если результат предыдущей операции равен 0,
; то переход на метку m2
ldi R19, 0xff; загрузка в регистр r19 начального значения счетчика
; внешнего цикла
dec R18 ; уменьшение на 1 значение регистра r18
brne m2 ; если результат предыдущей операции равен 0,
; то переход на метку m2
ldi R18, 0xff; загрузка в регистр r18 начального значения счетчика
; внешнего цикла
dec R20 ; уменьшение на 1 значение регистра r17
brne m2 ; если результат предыдущей операции равен 0,
; то переход на метку m2
=примерно 61000мкс=61мс=0.061с=16Гц
rjmp rm ; переход на метку rm (зацикливание программы)
;подпрограмма опроса состояния порта ввода (состояния нажатия каких-либо кнопок)
opros_klavy:
in temp, $0b; в регистр temp записывается значение на выводах порта D ($0b)
cpi temp, 0xfe; сравнение полученного значения с 1 - условие нажатия
; первой кнопки
breq b1 ; если результат выполнения предыдущей операции равен 0
; то переход на метку b1
cpi temp, 0xfd; сравнение полученного значения с 2 - условие нажатия
; второй кнопки
breq b2 ; если результат выполнения предыдущей операции равен 0
; то переход на метку b2
cpi temp, 0xfb; сравнение полученного значения с 3 - условие нажатия
; третьей кнопки
breq b3 ; если результат выполнения предыдущей операции равен 0
; то переход на метку b3
rjmp b0; в любом другом случае переход на метку b0
b0: ; метка для подготовки регистров для вывода дня выполнения лабы
ldi what, 0; в регистр what загружается информация о номере нажатой кнопки
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ret;
b1: ; метка для подготовки регистров для вывода года рождения
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ldi what, 1; в регистр what загружается информация о номере нажатой кнопки
ret;
b2: ; метка для подготовки регистров для вывода дня рождения
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ldi what, 2; в регистр what загружается информация о номере нажатой кнопки
ret;
b3: ; метка для подготовки регистров для вывода месяца рождения
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ldi what, 3; в регистр what загружается информация о номере нажатой кнопки
ret; возвращение в main
;подпрограмма вывода на порты вывода определенной информации
vyvod:
cpi what, 0 ; сравнение номера нажатой кнопки с 0 - выяснение какая
; кнопка нажата
breq no ; если результат выполнения предыдущей операции равен 0,
; то происходит переход на метку no
cpi what, 1 ; сравнение номера нажатой кнопки с 1 - выяснение какая
; кнопка нажата
breq s1 ; если результат выполнения предыдущей операции равен 0,
; то происходит переход на метку s1
cpi what, 2 ; сравнение номера нажатой кнопки с 2 - выяснение какая
; кнопка нажата
breq s2 ; если результат выполнения предыдущей операции равен 0,
; то происходит переход на метку s2
cpi what, 3 ; сравнение номера нажатой кнопки с 3 - выяснение какая
; кнопка нажата
breq s3 ; если результат выполнения предыдущей операции равен 0,
; то происходит переход на метку s3
no:
;вывод дня лабы
mov ind, day_s; в регистр ind заносится информация о первой цифре
; дня выполнения лабы
rcall cod7 ; вызов процедуры генерации кода цифры для отображения
ldi temp, 0xfe; в регистр temp заносится число, которое используется для ; первого регистра
out $05, temp; в порт B ($05) заносится номер индикатора
; на который пойдет отображение - 01
out $08, ind2; в порт С ($08) заносится код числа для отображения
mov ind, day_m; в регистр ind заносится информация о второй цифре дня
; выполнения лабы
rcall cod7 ; вызов процедуры генерации кода цифры для отображения
ldi temp, 0xfd; в регистр temp заносится число которое используется для ; выбора второго регистра
out $05, temp; в порт B ($05) заносится номер индикатора на который
; пойдет отображение - 02
out $08, ind2; в порт С ($08) заносится код числа для отображения
rjmp rc; переход на метку rc в основном блоке программы
s1:
;год рождения
mov ind, year1_s; в регистр ind заносится информация о первой цифре первых
; двух цифр года рождения
rcall cod7 ; вызов процедуры генерации кода цифры для отображения
ldi temp, 0xfe ; в регистр temp заносится число которое используется для ; выбора первого регистра
out $05, temp ; в порт B ($05) заносится номер индикатора на который
; пойдет отображение - 01
out $08, ind2 ; в порт С ($08) заносится код числа для отображения
mov ind, year1_m; в регистр ind заносится информация о второй цифре первых
; двух цифр года рождения
rcall cod7 ; вызов процедуры генерации кода цифры для отображения
ldi temp, 0xfd ; в регистр temp заносится число которое используется для ; выбора второго регистра
out $05, temp ; в порт B ($05) заносится номер индикатора на который
; пойдет отображение - 02