контроллер ATmega8535 (Всё по лабораторным работам БМТ)
Описание файла
Файл "контроллер ATmega8535" внутри архива находится в следующих папках: Всё по лабораторным работам БМТ, 3. Документ из архива "Всё по лабораторным работам БМТ", который расположен в категории "". Всё это находится в предмете "электроника" из , которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "электроника и микропроцессорная техника" в общих файлах.
Онлайн просмотр документа "контроллер ATmega8535"
Текст из документа "контроллер ATmega8535"
Проверка работы программы.
Поскольку в сравнении с предыдущей лабораторной работой изменилась только процедура реализации задержки, проверку будем вести именно по реализации программной задержки. Для этого проверим за какое время контроллер достигает строчек:
trans1:
rcall opros_klavy
rjmp m2
trans2:
rcall vyvod;
rjmp m3
Результаты тестов:
для процедуры вывода: - Частота примерно 30 Гц
для процедуры опроса: - Частота примерно 10Гц
Временные задержки получены правильно
Листинг:
;контроллер ATmega8535
;подключение файла заголовков регистров ввода вывода
.include "8535def.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; регистр для хранения кода для цифры индикации
.DEF ch=R18; регистр для хранения значения делителя для клавы
.DEF ch1=R19; регистр для хранения значения делителя для вывода
.org 0 ;в точку 0 __ памяти попадает микроконтроллер при перезагрузке
;или старте. При этом выполняется следующая за директивой ;.org строка
rjmp start
.org OVF0addr ; Адрес вектора прерывания по переполнению первого счетчика
; контроллера. По переполнению, программа попадает по ;метке tim0
rjmp tim0 ; (имя OVF0addr определено в файле m8535def.inc)
start:
;инициализация указателя стека
ldi r25, LOW(RAMEND); в регистр R25 загружается начальный байт указателя стека
out spl, r25; по адресу регистра SPL записывается значение
; начального байта указателя стека
ldi r25, HIGH(RAMEND); в регистр R25 загружается конечный байт указателя стека
out sph, r25; по адресу регистра SPL записывается значение
; конечного указателя стека
;инициализация портов
rcall port_init;
;инициализация таймера
rcall tim0_init;
;загрузка в регистры информации по числам
rcall load_num;
;загрузка в регистры ch и ch1 значений 2 и 6 для дополнительного увеличения
; времени задержки
ldi ch, $06;
ldi ch1, $02
;опрос клавиатуры
rcall opros_klavy;
;вывод значений на индикаторы
rcall vyvod;
sei ;установка глобального флага прерываний в истинное значение
loop:
rjmp loop; бесконечный цикл, который крутится, когда контроллер не выполняет
; процедуру прерывания
tim0:
;здесь выполняются процедуры опроса клавиатуры и вывода на индикаторы
;Делителя счетчика в 256 единиц не хватает для обеспечения необходимой
;задержки (30 и 10Гц). В реальности получается 60Гц. Поэтому мы ;дополнительно
;вводим коэффициент деления в 6 и 2 единицы для опроса клавы и вывода на
;индикаторы соответственно
;Далее в соответствующих процедурах эти значения восстанавливаются
dec ch
breq trans1; переход происходит на метку trans1, поскольку без этого возникала
; ошибка по условному переходу на метку. Переход на опрос клавы
m2:dec ch1;
breq trans2; переход на вывод на индикаторы
m3:reti
tim0_init:
ldi temp,$04 ; 04 грузится в регистр управления таймера-счётчика
out tccr0,temp; коэффициент делителя - 256
; Это мы выбрали частоту, с которой будет считать таймер-счётчик
ldi temp,(1<<toie0)
out timsk,temp ; в поле toie0 регистра timsk будет записана 1
;Устанавливается возможность счетчика формировать запрос
; на прерывание по переполнению
ret
trans1:
rcall opros_klavy
rjmp m2
trans2:
rcall vyvod;
rjmp m3
port_init:
;инициализация портов ввода вывода
ldi temp, 0xff; в регистр temp заносится число ff.
out ddrb, temp; порт B программируется на вывод
; записью в регистр DDRB числа FF
out ddrc,temp; порт C программируется на вывод
;
clr temp;
out ddrd, temp; записью в регистр DDRC числа FF
; порт D программируется на вывод
; записью в регистр DDRD числа 00
ret;
load_num:
;запись чисел для вывода в регистры
;день лабы
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
ret;
;подпрограмма опроса состояния порта ввода (состояния нажатия каких-либо кнопок)
opros_klavy:
clr klav;
in temp, portd; в регистр temp записывается значение на выводах порта D
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;
ldi ch, 6; восстановление значения ch для дальнейшей правильной работы по
; по прерываниям
ret;
b1: ;метка для подготовки регистров для вывода года рождения
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ldi what, 1; в регистр what загружается информация о номере нажатой кнопки
ldi ch, 6; восстановление значения ch для дальнейшей правильной работы по
; по прерываниям
ret;
b2: ;метка для подготовки регистров для вывода дня рождения
ldi klav, 1; в регистр klav записывается единица - индикатор нажатия кнопки
ldi what, 2; в регистр what загружается информация о номере нажатой кнопки
ldi ch, 6; восстановление значения ch для дальнейшей правильной работы по
; по прерываниям
ret;
b3: ;
ldi klav, 1; ldi what, 3; ldi ch, 6; метка для подготовки регистров для вывода месяца рождения
в регистр klav записывается единица - индикатор нажатия кнопки
в регистр what загружается информация о номере нажатой кнопки
восстановление значения ch для дальнейшей правильной работы по
; по прерываниям
возвращение
ret;
;подпрограмма вывода на порты вывода определенной информации
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 portb, temp; в порт B заносится номер индикатора на который пойдет отображение - 01
out portc, ind2; в порт С заносится код числа для отображения
mov ind, day_m; в регистр ind заносится информация о второй цифре дня выполнения лабы
rcall cod7; вызов процедуры генерации кода цифры для отображения
ldi temp, 0xfd; в регистр temp заносится число которое используется для выбора
; второго регистра
out portb, temp; в порт B заносится номер индикатора на который пойдет отображение - 02