Автор работы: Пользователь скрыл имя, 09 Января 2012 в 22:12, курсовая работа
Целью данной работы является проектирование и реализация устройства, способного осуществлять сбор и накапливание информации, передаваемой по последовательной линии с неизвестной скоростью.
Введение 2
1. Теоретические основы 2
2. Методика работы 6
2.1. Сбор информации 6
2.2. Взаимодействие с компьютером 9
3. Код программы 12
4. Анализ результатов 28
Заключение 30
Список литературы
.include "m8def.inc";
.def temp=r16; рабочая переменная
.def count=r20; количество записей в память
.macro tune_usart; настройка USART
ldi temp, 12
out ubrrl, temp
ldi temp, (1<<rxen)|(1<<txen)
out ucsrb, temp
ldi temp, (1<<ursel)|(3<<ucsz0)
out ucsrc, temp
.endm
.macro hex_to_strl; преобразование младшей тетрады в символьную информацию
cbr temp, 0b11110000
cpi temp, 10
brlo m
subi temp, -0x07
m:
subi temp, -0x30
.endm
.macro hex_to_strh; преобразование старшей тетрады в символьную информацию
swap temp
cbr temp, 0b11110000
cpi temp, 10
brlo m
subi temp, -0x07
m:
subi temp, -0x30
.endm
.macro send_usart; функция отправки данных посредством USART
m:
sbis ucsra, udre
rjmp m
out udr, @0
.endm
.macro sbisl; функция пропуска следующей команды, если был захват таймера
in r23, tifr
sbrs r23, 5
.endm
.macro cbil; функция сброса флага захвата
in r23, tifr
cbr r23, 5
out tifr, r23
.endm
tune_usart; настройка USART
ldi temp, low(RAMEND); загрузка указателя стека
out spl, temp
ldi temp, high(RAMEND); загрузка указателя стека
out sph, temp
//////////////////////////////
///////////////////ОСНОВНАЯ
ПРОЦЕДУРА/////////////////////
//////////////////////////////
main:
rcall Str_start; вызов процедуры вывод строки "Press 0 to begin"
rcall in_com; вызов процедуры ввода команды
send_usart temp;
ldi r22, 0x0d ;
send_usart r22; переход на следующую строчку
ldi r22, 0x0a ;
send_usart r22;
ldi r17, '0'; анализ полученной команды
cp temp, r17;
brne unknown; переход к выводу строки "Unknow command!!!"
rcall work_timer; вызов процедуры сбора информации
rcall str_show; вызов процедуры вывода строки "Press 2 to show results"
rcall in_com; вызов процедуры ввода команды
send_usart temp
ldi r22, 0x0d ;
send_usart r22; переход на следующую строчку
ldi r22, 0x0a ;
send_usart r22;
ldi r17, '2'; анализ полученной команды
cp temp, r17;
brne unknown; переход к выводу строки "Unknow command!!!"
rcall out_com; вызов процедуры вывода результатов работы
rjmp begin; переход в начало основной процедуры
unknown:
rcall Str_unknown; вызов процедуры вывода строки "Unknow command!!!"
begin:
rjmp main; переход в начало основной процедуры
//////////////////////////////
/////////////////КОНЕЦ
ОСНОВНОЙ ПРОЦЕДУРЫ////////////
//////////////////////////////
in_com:; процедура ввода команды с клавиатуры
sbis ucsra, rxc;
rjmp in_com
in temp, udr
ret
work_timer:; процедура сбора информации
ldi count, 1; счетчик количества записей в память
ldi xl, 0x60; ввод адреса ячейки памяти, с которой начнется запись
ldi xh, 0x00;
clr temp ; очистко рабочего регистро
out TCNT1H, temp; установка нуля таймера
out TCNT1L, temp;
rcall str_stop; вызов процедуры вывода строки "Press 1 to stop"
ldi temp, 0xc1 ; настройка Т1 на захват по
out tccr1b, temp; нарастающему фронту сигнала
start:
wait:
in temp, udr; ввод команды
ldi r17, '1'
clz
cp temp, r17; анализ полученной команды
brne not_cp ; пропуск следующей команды, если не поступало команды на остановку
rjmp timer_stopped; переход в конец процедуры сбора информации
not_cp:
sbisl ; вызов функция пропуска следующей команды, если был захват таймера
rjmp wait
in yl, icr1l; запись в РОН значение регистра захвата
in yh, icr1h; запись в РОН значение регистра захвата
st x, yh; запись в память старшего байта регистра захвата
inc xl; переход на следующий адрес памяти
st x, yl; запись в память младшего байта регистра захвата
inc xl; переход на следующий адрес памяти
inc count; увеличение счетчика количества записей в память
pinb00: ; определение момента времени, когда
sbic pinb, 0; произошел спад фронта сигнала
rjmp pinb00 ;
in yl, icr1l; запись в РОН значение регистра захвата
in yh, icr1h; запись в РОН значение регистра захвата
st x, yh; запись в память старшего байта регистра захвата
inc xl; переход на следующий адрес памяти
st x, yl; запись в память младшего байта регистра захвата
inc xl; переход на следующий адрес памяти
inc count; увеличение счетчика количества записей в память
cbil ; вызов функции сброса флага захвата
rjmp start; возврат в начало цикла
timer_stopped:
ret; возврат из процедуры сбора информации
Out_com:; процедура вывода результатов работы
ldi xl, 0x60; ввод адреса ячейки памяти, с которой начнется запись
ldi xh, 0x00;
mov r19, count
lsr count; определение количества строк в выводимой таблице
lsr count;
lsr count;
cbr r19, 0b11111000; определение остатка от деления на 8
to_com:
ldi r17, 8; количество столбцов 8
oct:; начало вывода строки данных
ldi r22, ' '
send_usart r22
ld temp, x; чтение из памяти
hex_to_strh; преобразование в смвольную форму старшей тетрады
send_usart temp; вывод старшей тетрады
ld temp, x; чтение из памяти
hex_to_strl; преобразование в смвольную форму младшей тетрады
send_usart temp; вывод младшей тетрады
inc xl; переход на следующий адрес памяти
dec r17; уменьшение на один столбец
brne oct; переход в начало цикла, пока не выведены все столбцы
clz; сброс флага Z
ldi r22, 0x0d ;
send_usart r22; переход на следующуую строчку
ldi r22, 0x0a ;
send_usart r22;
dec count ; уменьшение на одну строку
brne to_com; переход в начало цикла, пока не выведены все строки
clz; сброс флага Z
ost:; начало вывода остатка
ldi r22, ' '
send_usart r22
ld temp, x
hex_to_strh
send_usart temp
ld temp, x
hex_to_strl
send_usart temp
inc xl
dec r19; уменьшение остатка на один
brne ost; переход в начало цикла, пока не будет выведен весь остаток
ldi r22, 0x0d ;переход на следующуую строчку
send_usart r22;
ldi r22, 0x0a ;
send_usart r22;
ret; возврат из процедуры вывода результатов работы
Str_start:; процедура вывода строки "Press 0 to begin"
ldi r22, 'P'
send_usart r22
ldi r22, 'r'
send_usart r22
ldi r22, 'e'
send_usart r22
ldi r22, 's'
send_usart r22
ldi r22, 's'
send_usart r22
ldi r22, ' '
send_usart r22
ldi r22, '0'
send_usart r22
ldi r22, ' '
send_usart r22
ldi r22, 't'
send_usart r22
ldi r22, 'o'
send_usart r22
ldi r22, ' '
send_usart r22
ldi r22, 'b'
send_usart r22
ldi r22, 'e'
send_usart r22
ldi r22, 'g'
send_usart r22
ldi r22, 'i'
send_usart r22
ldi r22, 'n'
send_usart r22
ldi r22, ':'
send_usart r22
ldi r22, 0x0d
send_usart r22
ldi r22, 0x0a
send_usart r22
ret; возврат из процедуры вывода строки "Press 0 to begin"
Str_unknown:; процедура вывода строки "Unknow command!!!"
ldi r22, 'U'
send_usart r22
ldi r22, 'n'
send_usart r22
ldi r22, 'k'
send_usart r22
ldi r22, 'n'
send_usart r22
ldi r22, 'o'
send_usart r22
ldi r22, 'w'
send_usart r22
ldi r22, 'n'
send_usart r22
ldi r22, ' '
send_usart r22
ldi r22, 'c'
send_usart r22
ldi r22, 'o'
send_usart r22
ldi r22, 'm'
send_usart r22
ldi r22, 'm'
send_usart r22
ldi r22, 'a'
send_usart r22
ldi r22, 'n'
send_usart r22
ldi r22, 'd'
send_usart r22
ldi r22, '!'
send_usart r22
ldi r22, '!'
send_usart r22
ldi r22, '!'
send_usart r22
ldi r22, 0x0d
send_usart r22
ldi r22, 0x0a
send_usart r22
ret; вохврат из процедуры вывода строки "Unknow command!!!"
str_stop:; процедура вывода строки "Press 1 to stop"
ldi r22, 'O'
send_usart r22
ldi r22, 'p'
send_usart r22
ldi r22, 'e'
send_usart r22
ldi r22, 'r'
send_usart r22
ldi r22, 'a'
send_usart r22
ldi r22, 't'
send_usart r22
ldi r22, 'i'
send_usart r22
ldi r22, 'o'