Анализатор последовательной линии

Автор работы: Пользователь скрыл имя, 09 Января 2012 в 22:12, курсовая работа

Краткое описание

Целью данной работы является проектирование и реализация устройства, способного осуществлять сбор и накапливание информации, передаваемой по последовательной линии с неизвестной скоростью.

Содержание работы

Введение 2
1. Теоретические основы 2
2. Методика работы 6
2.1. Сбор информации 6
2.2. Взаимодействие с компьютером 9
3. Код программы 12
4. Анализ результатов 28
Заключение 30
Список литературы

Содержимое работы - 1 файл

Анализатор последовательной линии.docx

— 262.23 Кб (Скачать файл)

3. Код программы на ассемблере.

.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'

Информация о работе Анализатор последовательной линии