Анализатор последовательной линии
Анализатор
последовательной линии
Содержание
Введение 2
1. Теоретические основы 2
2. Методика работы 6
2.1. Сбор информации 6
2.2. Взаимодействие с компьютером 9
3. Код программы 12
4. Анализ результатов 28
Заключение 30
Список литературы 31
Введение
Целью данной работы является проектирование и реализация устройства, способного осуществлять сбор и накапливание информации, передаваемой по последовательной линии с неизвестной скоростью.
1. Теоретические основы работы
Последовательные
интерфейсы используются для связи
двух или более устройств между
собой. Характерная черта таких
интерфейсов – использование
последовательного метода передачи
цифровой информации, при котором
данные передаются последовательно
бит за битом, для чего используется
всего лишь одна линия. При этом физическая
реализация двустороннего обмена может
осуществляться с помощью 2 – 3 проводов.
Значительное (по сравнению с параллельными
интерфейсами) сокращение числа каналов
передачи и проводов позволило упростить
и удешевить приемопередающие устройства
и кабельные системы. В общем,
последовательные интерфейсы отличаются
лучшей помехоустойчивостью [здесь
не учитывается влияние типа линий
передачи], поскольку в них исключено
взаимное влияние между линиями
данных (фактически, линия данных всего
одна, а, например, в 8-разрядном параллельном
интерфейсе – 8). Сравнительная простота
и низкие аппаратные требования обусловили
широкое использование
Основой
устройства, работающего с последовательной
линией, будет микроконтроллер AVR семейства
Mega. Почему AVR? одним из существенных преимуществ
AVR стало применение конвейера. В результате
для AVR не существует понятия машинного
цикла: большинство команд выполняется
за один такт. Для сравнения отмечу, что
пользующиеся большой популярностью МК
семейства PIC выполняют команду за 4 такта,
а классические 8051 — вообще за 12 тактов
(хотя есть и современные модели x51 с машинным
циклом в один такт). Огромное преимущество
AVR-архитектуры — наличие 32 оперативных
регистров, не совсем равноправных, но
позволяющих в ряде случаев вообще не
обращаться к оперативной памяти и не
использовать стек (что в принципе невозможно
в том же семействе x51). Еще одна особенность
AVR со схемотехнической точки зрения—
все выводы в них могут пребывать в трех
состояниях (вход — отключено — выход)
и электрически представляют собой
КМОП-структуры (т. е. имеет место симметрия
выходных сигналов и высокое сопротивление
для входных). В общем случае это значительно
удобнее портов х51 (двустабильных и TTL-совместимых)
и предполагает лучшую помехозащищенность
(по крайней мере, от помех по шине "земли").
Как и все микроконтроллеры AVR фирмы «Atmel»,
микроконтроллеры семейства Mega являются
8-разрядными микроконтроллерами, предназначенными
для встраиваемых приложений. Они изготавливаются
по малопотребляющей КМОП-технологии, которая
в сочетании с усовершенствованной RISC-архитектурой
позволяет достичь наилучшего соотношения
быстродействие/
• FLASH-память программ объемом 8…128 Кбайт (число циклов стирания/записи не менее 1000);
• оперативная память (статическое ОЗУ) объемом 1…4 Кбайт;
• память данных на основе ЭСППЗУ (EEPROM) объемом 512 байт…4 Кбайт (число циклов стирания/записи не менее 100000);
• возможность защиты от чтения и модификации памяти программ и данных;
• возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;
• возможность самопрограммирования;
• возможность внутрисхемной отладки в соответствии со стандартом IEEE 1149.1 (JTAG);
• различные способы синхронизации: встроенный RC-генератор с внутренней или внешней времязадающей RC-цепочкой или с внешним резонатором (пьезокерамическим или кварцевым); внешний сигнал синхронизации;
• наличие нескольких режимов пониженного энергопотребления;
• наличие детектора снижения напряжения питания (brownout detector, BOD);
• возможность программного снижения частоты тактового генератора.
В микроконтроллерах
AVR реализована Гарвардская
2. Методика работы
Задачу можно условно разделить на две: организация работы устройства по сбору информации с последовательной линии и организация взаимодействия устройства с компьютером. При этом, сбор информации с последовательной лини будет осуществляться с использованием одного из трех таймеров/счетчиков общего назначения имеющихся в ATmega8, а взаимодействие с компьютером будет реализовано посредством модуля универсального синхронно/асинхронного приемопередатчика (USART).
2.1. Сбор информации
Микроконтроллеры семейства в зависимости от модели имеют в своем составе от двух до четырех таймеров/счетчиков общего назначения. В ATmega8 их три (T0, T1, T2). Таймер/счетчик T1 может использоваться для отсчета временных интервалов и как счетчик внешних событий. Кроме того, он может выполнять запоминание своего состояния по внешнему сигналу. Упрощенная схема 16-и разрядного таймера/счетчика представлена на рисунке ниже (рис.1).
Рис.1. Упрощенная схема 16-и разрядного таймера/счетчика.
В состав каждого таймера/счетчика входят следующие регистры ввода/вывода:
• 16-разрядный счетный регистр TCNT1 (TCNT3);
• 16-разрядный регистр захвата ICR1 (ICR3);
• два или три 16-разрядных регистра сравнения OCR1A, OCR1B, OCR1C (OCR3A, OCR3B, OCR3C);
• два или три 8-разрядных регистра управления TCCR1A, TCCR1B, TCCR1C (TCCR3A, TCCR3B, TCCR3C).
Каждый
из 16-разрядных регистров
2.2. Взаимодействие с компьютером
Передача данных.
Работа
передатчика разрешается
Рис. 2.Изменение состояния вывода TXD.
Если во время передачи в регистр UDR было записано новое слово данных, то после передачи последнего стоп-бита оно пересылается в сдвиговый регистр. Если же к моменту окончания передачи кадра такой записи выполнено не было, устанавливается флаг прерывания «Передача завершена» TXC (TXCn) регистра UCSRA (UCSRnA). Сброс флага осуществляется аппаратно при входе в подпрограмму обработки соответствующего прерывания или программно, записью в этот разряд лог. 1. Выключение передатчика осуществляется сбросом разряда TXEN (TXENn) регистра UCSRB (UCSRnB). Если в момент выполнения этой команды осуществлялась передача, сброс разряда произойдет только после завершения текущей и отложенной передач, т. е. после очистки сдвигового и буферного регистров передатчика. При выключенном передатчике вывод TXD (TXDn) может использоваться как контакт ввода/вывода общего назначения.
Прием данных.
Работа
приемника разрешается
корректного старт-бита. Каждый разряд содержимого кадра затем считывается с частотой, определяемой установками контроллера скорости передачи или тактовым сигналом XCK (XCKn). Считанные разряды данных последовательно помещаются в сдвиговый регистр приемника до обнаружения первого стоп-бита кадра. После этого содержимое сдвигового регистра пересылается в буфер приемника, из которого принятое значение может быть получено путем чтения регистра данных модуля. Для индикации состояния приемника в модулях USART/UART используется флаг прерывания «Прием завершен» RXC (RXCn) регистра UCSRA (UCSRnA). Этот флаг устанавливается в «1» при наличии в буфере приемника непрочитанных данных. В модулях UART этот флаг сбрасывается после прочтения регистра данных, а в модулях USART — при опустошении буфера (после считывания всех находящихся в нем данных).
Выключение приемника осуществляется сбросом разряда RXEN (RXENn) регистра UCSRB (UCSRnB). В отличие от передатчика приемник выключается сразу же после сброса разряда, т. е. кадр, принимаемый в этот момент, теряется. В модулях USART, кроме того, при выключении приемника очищается его буфер, т. е. теряются также все непрочитанные данные. При выключенном приемнике вывод RXD (RXDn) может использоваться как контакт ввода/вывода общего назначения.
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'

- Анализаторы и рецепторы
- Анализа трудовых ресурсов предприятия
- Анализ аттестации рабочих мест
- Анализ аудита долгосрочных кредитов и займов на примере ОО «Медея»
- Анализ аудитории Интернета
- Анализ аудиторской деятельности
- Анализ аудиторской деятельности
- Анализ ассортиментной политики предприятия ООО «Эстри-Лайф»
- Анализ ассортиментной политики торговой фирмы
- Анализ ассортиментной политики торговых организаций
- Анализа стратегических факторов внешней среды
- Анализ АСУ ТП
- Анализ (асутп) системы контроля качества вырабатываемой электроэнергии
- Анализа терминообразования