Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения
 

Разработка контроллера управления последовательным портом

Работа из раздела: «Коммуникации, связь, цифровые приборы и радиоэлектроника»

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ ПРИКЛАДНОЙ МАТЕМАТИКИ И ТЕЛЕКОММУНИКАЦИЙ

КАФЕДРА РАДИОЭЛЕКТРОННЫХ СРЕДСТВ

Курсовая работа

Разработка контроллера управления последовательным портом

Разработал студент

Панфилова К.В.

Введение

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

Стандартизации в интерфейсе подлежат состав и тип линий связи, электрические и временные параметры сигналов, форматы передаваемой информации, команды и состояния, алгоритмы функционирования, конструктивное исполнение соединений.

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

По способу передачи информации интерфейсы подразделяются на параллельные и последовательные. В параллельном интерфейсе все биты передаваемого слова (обычно байта) выставляются и передаются по соответствующим параллельно идущим проводам одновременно. В последовательном интерфейсе биты передаются друг за другом, обычно по одной (возможно, и двухпроводной) линии. Последовательная передача данных может осуществляться в синхронном и асинхронном режимах.

Среди различных типов встроенных контроллеров последовательного обмена, которые входят в состав микроконтроллеров (МК), сложился стандарт «де-факто» - модуль UART (Universal Asynchronous Receiver and Transmitter). В переводе с английского UART - универсальный асинхронный приемопередатчик.

Не все производители МК используют термин UART для обозначения типа модуля контроллера последовательного обмена. Так, в МК фирмы Motorola модуль асинхронной приемопередачи, который поддерживает те же режимы асинхронного обмена, что и UART, принято называть SCI (Serial Communication Interface).

1. Теоретические аспекты последовательной передачи данных

1.1 Последовательный связной интерфейс

Последовательный связной интерфейс (SCI) является подсистемой последовательного ввода / вывода, доступной во многих микроконтроллерах производства фирмы Motorola. Контроллер последовательного асинхронного интерфейса SCI по функциональному назначению можно отнести к модулям типа UART.

Модуль SCI обеспечивает полнодуплексный асинхронный режим обмена, при котором прием и передача данных могут происходить одновременно.

Линии приема и передачи физически разделены. Модуль состоит из двух независимых подсистем: приемника (Transmitter) и передатчика (Receiver). Каждое из устройств имеет свой бит разрешения работы: TE и RE соответственно. Основу каждой подсистемы составляет сдвиговый регистр и параллельный регистр буфера данных.

Модуль SCI допускает различные скорости приема и передачи данных. Скорость передачи данных определяется генератором модуля SCI. Этот генератор состоит из общего для приемника и передатчика предварительного делителя частоты тактирования межмодульных магистралей и двух независимых делителей частоты приемника и передатчика. Вследствие этого, скорости передачи и приема данных могут различаться. Скорость передачи данных следует определить по формуле:

, где

NP-коэффициент деления предварительного делителя, NP=1,3,4,13;

NT-коэффициент деления делителя передатчика, NT=1,2,4,8,16,32,64,128.

Значения коэффициентов NP и NT определяются установкой соответствующих разрядов в регистре скорости передачи BAUD.

Обеспечивает два стандартных кадра обмена в асинхронном режиме: 10-битный и 11-битный. На рис. 1.1 представлена временная диаграмма 10-битного кадра: 8 бит данных передаются вслед за стартовым битом, начиная с младшего D0; завершает передачу стоповый бит. Логические уровни для передачи стартового бита (низкий) и стопового бита (высокий) формируются аппаратными средствами передатчика. Приемник распознает начало передачи нового кадра по изменению уровня сигнала на входе RXD с высокого, который может длиться сколь угодно долго, на низкий.

Рисунок 1.1 - Временная диаграмма 10-битного кадра

Передаваемая в кадре полезная информация длиною в один байт кодируется с использованием без возвращения к нулю (БВН) кода.

Рисунок 1.2 - Пример представления двоичной последовательности в коде БВН

Код без возвращения к нулю отображает последовательность двоичных битов последовательностью уровней напряжения, постоянных на интервале каждого передаваемого двоичного разряда (рис. 1.2).

Однако может быть использовано решение, при котором информация кодируется семью битам D6…D0, а старший бит D7 используется для контроля правильности приема. С этой целью передающий МК кодирует бит паритета D7 из условия четного (контроль на четность) и нечетного (контроль на нечетность) числа единиц в передаваемом слове, а принимающий МК производит проверку принятого кода. Следует заметить, что не все модули типа UART 8-разрядных МК имеют опцию автоматического формирования бита паритета.

Временная диаграмма 11-битного кадра асинхронного обмена представлена на рис. 1.3: 9 бит данных обрамляются одним стартовым и одним стоповым битом. Старший бит D8 помещается или передается в один из регистров управления модулем. Рассматриваемый формат представления кадра обычно используется для организации протокола обмена верхнего уровня в локальных сетях на основе нескольких МК.

Рисунок 1.3 - Временная диаграмма 11-битного кадра

Аппаратные средства приемника диагностируют три типа ошибок: наличие шума на линии RXD, нарушение формата принимаемого кадра, попытка записи очередного принятого байта в буферный регистр данных приемника, в то время как предыдущие данные из буферного регистра еще не считаны.

Для повышения достоверности приема каждого разряда аппаратные средства модуля SCI считывают уровень сигнала на входе RXD три раза в течение интервала присутствия бита. Значение бита, которое будет занесено в младший разряд сдвигового регистра приемника, определяется мажоритарным способом: по принципу два из трех. Модули SCI сообщают пользователю о наличии шума на линии приема: если не все три значения при приеме любого из битов кадра совпали, то устанавливается флаг NE (Noise Error).

В процессе выполнения подпрограммы обработки прерывания принятый байт данных считывается из регистра данных приемника в память МК. Сразу после копирования байта данных из сдвигового регистра в буфер приемник может начать формирование следующего байта данных, отдельные биты которого продолжают поступать на вход RXD. Однако необходим, чтобы центральный процессор МК успел считать данные из буферного регистра до завершения формирования в сдвиговом регистре следующего принятого байта. Если этого не произошло, то возникает аварийная ситуация. В модулях SCI фирмы Motorola запись следующего байта в буферный регистр данных не производится и устанавливается флаг ошибки OR (Overrun). Этот флаг может генерировать запрос на прерывание от приемника. Стоповому биту соответствует уровень логической единицы. Если оказалось, что на месте стопового бита обнаружен сигнал логического нуля, то произошла ошибка кадра. Наиболее часто ошибки кадра появляются тогда, когда приемник ошибочно синхронизирован с битом 0, который в действительности не является стартовым битом.

1.2 Интерфейс RS-232C

Модули типа UART в асинхронном режиме работы позволяют реализовать протокол обмена для интерфейсов RS-232C, RS-422A, RS-485. Последовательный интерфейс передачи данных RS-232C остается распространенным интерфейсом периферийного оборудования компьютеров. Но на смену ему все активнее внедряется интерфейс USB.

Аббревиатура RS-232C буквально означает: Рекомендуемый Стандарт 232 версия С (Recommended Standard 232 revision C). Он определен стандартом Ассоциации электронной промышленности (ЕIА) и подразумевает наличие оборудования двух видов: терминального (DTE- Data Terminal Equipment) и связного (DCE- Data Communication Equipment). В качестве терминального оборудования может быть использован персональный компьютер, способный производить прием или передачу данных по последовательному интерфейсу. Под связным оборудованием понимаются устройства, которые могут упростить последовательную передачу данных совместно с терминальным оборудованием. Наглядным примером связного оборудования служит модем. Также интерфейс используется в самых различных устройствах, в том числе для обеспечения коммуникаций между компьютером и встраиваемой МП-системой управления.

Обмен данными производится по двум линиям: линия RXD используется для приема данных, линия TXD -- для передачи данных. Линия передачи одного устройства соединяется с линией приема другого, и наоборот (полный дуплекс). Для управления соединенными устройствами используется программное подтверждение (введение в поток передаваемых данных соответствующих управляющих символов). Возможна организация аппаратного подтверждения путем организации дополнительных линий RS-232 для обеспечения функций определения статуса и управления. Максимальная скорость передачи данных по линиям шины RS-232C составляет 115 кбит/с. Максимальная протяженность линии связи, по которым может быть осуществлена передача данных, составляет 15 м.

Большинство систем используют асинхронный режим передачи данных интерфейса RS-232, несмотря на то, что его спецификация предусматривает также синхронный режим. В асинхронном режиме каждый пакет содержит один символ кода ASCII или один байт произвольно закодированной информации. ASCII (American Standard Code for Information Interchange) -- американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов. ASCII представляет собой кодировку для представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. Изначально разработанная как 7-битная, с широким распространением 8-битного байта ASCII стала восприниматься как половина 8-битной. В компьютерах обычно используют расширения ASCII с задействованным 8-м битом и второй половиной кодовой таблицы (например КОИ-8). КОИ-8 (код обмена информацией, 8 битов), KOI8 -- восьмибитовая ASCII-совместимая кодовая страница, разработанная для кодирования букв кириллических алфавитов.

Сигналы интерфейса RS-232C делят на следующие классы:

Последовательные данные (например, TXD, RXD). Интерфейс RS-232C обеспечивает два независимых последовательных канала данных: первичный (главный) и вторичный (вспомогательный). Оба канала могут работать в дуплексном режиме, т.е. одновременно осуществлять передачу и прием информации.

Управляющие сигналы квитирования (например, RTS, CTS). Сигналы квитирования -- это средство, с помощью которого обмен сигналами позволяет DTE начать диалог с DCE до фактических передачи или приема данных по последовательным линиям связи.

Сигналы синхронизации (например, ТС, RC). В синхронном режиме (в отличие от более распространенного асинхронного) между устройствами необходимо передавать сигналы синхронизации, которые осуществляют тактирование принимаемого сигнала в целях его декодирования.

На практике вспомогательный канал RS-232C применяется редко, и в асинхронном режиме из 25 сигнальных линий интерфейса обычно используются только девять, которые приведены в Табл. 1.

Таблица 1.

Номер контакта

Сигнал

Выполняемая функция

1

FG

Основная или защитная земля, подключаемая к стойке или шасси оборудования

2

TxD

Последовательные данные, передаваемые от DTE к DCE

3

RxD

Последовательные данные, принимаемые от DTE к DCE

4

RTS

Запрос передачи. Активным уровнем этого сигнала DTE указывает, что оно хочет послать данные в DCE

5

CTS

Сброс передачи. Активным уровнем этого сигнала DCE сообщает, что связь установлена

6

DSR

Готовность модема. Активным уровнем этого сигнала DCE сообщает, что связь установлена

7

SG

Возвратный тракт общего сигнала (сигнальная земля)

8

DCD

Обнаружение несущей данных. Активным уровнем этого сигнала DTE показывает, что оно работает и DCE может подключиться к каналу связи

9

-

Не задействован

2. Программная эмуляция SCI

Модуль SCI обрабатывает все команды передачи и приема и тем самым освобождает центральный процессор (CPU) от выполнения этих функций. Модуль SCI является программируемым для различных скоростей передачи. Приемник может обнаружить автоматически ошибки формата, такие как кадрирование, шум и переполнение.

Наличие в составе 8-разрядного МК модуля контроллера последовательного ввода/вывода стало настолько обычным явлением, что лишь самые простые, маловыводные МК в корпусах DIP-16 и DIP-20 не имеют портов последовательного обмена, такие как микроконтроллеров MC68HC705J1A. Для выполнения асинхронной последовательной связи используется программная эмуляция SCI. В этом случае процессор будет контролировать контакты портов ввода / вывода, выполняя те же функции, что и линии приема данных (RXD) и передачи данных (TXD) истинного аппаратно-управляемого SCI.

Требования для применения программной эмуляции SCI :

Оптимизация скорости для максимальной скорости передачи;

Минимальный размер кода;

Простота настройки для различных скоростей передачи;

Возможность обнаружения шума и ошибок кадра при получении.

Поскольку процессор не так эффективен, как специализированные аппаратные SCI, программная эмуляция имеет ограничения:

Очень высокая скорость передачи данных не является достижимой;

Программная эмуляция SCI потребляет память и пропускную способность ЦП;

Гибкость и функциональность МК снижаются.

Если перечисленные ограничения являются существенными для приложения, то использование микроконтроллера с модулем SCI было бы более уместно. Однако, многие приложения не требуется производительности и гибкости SCI, и в тех случаях, программная эмуляция является экономически выгодным решением.

При программной эмуляции SCI не возможна реализация полнодуплексного режима. Это программное решение работает только в полудуплексном режиме.

3. Описание используемого оборудования

3.1 Микроконтроллер MC68HC705J1A

MC68HC705J1A относится к семейству МК HC05 производства фирмы Motorola. Год рождения семейства - 1980-й. Количество различных модификаций МК с процессорным ядром HC05 составляет около 180. МК семейства HC05 отличаются очень точной ориентацией на различные сектора рынка массового потребления.

МК семейства HC05 объединены в серии. Каждая серия имеет буквальное обозначение, общее число серий равно 15. MC68HC705J1A относится к серии J. Данная серия включает в себя недорогие 20-выводные МК, содержащие ПЗУ, многофункциональный таймер с функцией прерывания реального времени.

ЦП семейства HC05 имеют CISC-архитектуру с развитой системой команд, на основе которой удобно программировать даже на ассемблере (делается мало ошибок).

Из периферийных устройств HC705J1AT содержит многофункциональный таймер (MFT), сторожевой таймер и 2 двунаправленных параллельных порта. Таймер MFT содержит 15 разрядов и обеспечивает формирование запросов прерывания процессора с заданной периодичностью. Структурная схема микроконтроллера MC68HC705J1A приведена на рис. 3.1.

Он имеет общее количество памяти равное 1240 байтов в стираемом программируемом постоянном запоминающем устройстве (ПЗУ), а также 64 Байт в ОЗУ. MC68HC705J1A состоит из 20 выводов, 14 из которых «ножки» ввода - вывода.

Рисунок 3.1. Структурная схема МК MC68HC705J1A

Назначение выводов контроллера HС705J1AP приведено в таблице.

Таблица 2 - Описание выводов микроконтроллера MC68HC705J1AP

Вывод

Название

Назначение

9

VDD

Напряжение питания

10

VSS

Напряжение 0В

20

Сброс

19

Управление запросом на аппаратное прерывание

3-8

PB5-PB0

Шестибитный параллельный порт

11-18

PA7-PA0

Восьмибитный параллельный порт ввода-вывода.

1, 2

OSC1, OSC2

Р32 - защита от перегрузок по току

3.2 Микросхема МС145407

MC145407 кремниевая, КМОП - микросхема (КМОП - комплементарная логика на транзисторах металл-оксид-полупроводник). В технологии КМОП используются полевые транзисторы с изолированным затвором с каналами разной проводимости. Отличительной особенностью схем КМОП по сравнению с биполярными технологиями является очень малое энергопотребление в статическом режиме (в большинстве случаев можно считать, что энергия потребляется только во время переключения состояний).

MC145407 - интерфейсный приемопередатчик последовательных данных стандартов EIA/TIA-232E и CCITT V.28 с напряжением питания +5В. Микросхема содержит 3 передатчика и 3 приемника последовательных данных стандарта RS-232.

При разработке интерфейсных микросхем основными критериями являлось минимальное энергопотребление и максимальная экономия места на печатной плате. Поэтому практически сразу же пришлось отказаться от стандартных микросхем приемопередатчиков RS-232, требующих использования трех различных источников питания +5 В и ±12 В.

На первом этапе для питания микросхем стал использоваться один источник питания +5 В. А поскольку для соответствия стандарту RS-232 необходимо обеспечить размах выходного сигнала порядка ±7 В, то в состав микросхемы вошли удвоитель напряжения и инвертор на переключаемых конденсаторах. Теперь для питания микросхемы стало достаточно подвести только +5 В и установить 4 конденсатора номиналом по 1 мкФ.

MC145407 обеспечивает высокую производительность и низкое энергопотребление. На рисунках 3.2, 3.3 и 3.4 изображены схемы основных элементов MC145407. На рисунке 3.5. представлено назначение контактов микросхемы.

Рисунок 3.2. Схема преобразования напряжения питания

Рисунок 3.3. Схема приемника (*Схема защиты)

Рисунок 3.4. Схема передатчика

Рисунок 3.5. Назначение контактов микросхемы MC145407

3.3 Микросхема MC34064

Микросхема MC34064 представляет собой детектор понижения напряжения ниже допустимого уровня. Микросхема предназначена для использования в микропроцессорных системах с 5-ти вольтовым питанием для формирования сигнала Reset во всех случаях, когда напряжение питания снижается до опасного, с точки зрения безошибочной работы системы уровня. Области применения MC34064:

Запоминающие устройства (ОЗУ) с аварийным батарейным питанием;

Средства защиты от неправильного функционирования микропроцессорной системы при включениях/выключениях питания;

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

Как компонент средств установки в исходное состояние микропроцессорного оборудования: персональных компьютеров, принтеров, видеомагнитофонов, автомобильных контролеров и др.

На рисунке 3.6 представлена блок-схема MC34064. Микросхема имеет 3 вывода: 1 - сброс; 2 - вход (подключается к источнику питания); 3 - земля.

Рисунок 3.6. Блок-схема MC34064

Особенности микросхемы:

Компаратор с температурно-компенсированным порогом и гистерезисом, для предотвращения неустойчивости в пороговой зоне;

Порог срабатывания компаратора 4.6+/-0.1В гарантируется в полном рабочем диапазоне температур;

Напряжение гистерезиса 20 мВ;

Нагрузочная способность выхода Reset на втекающий ток не менее 10 мА;

Гарантия правильной работы сигнала Reset при входном напряжении начиная с 1 В;

Внутренний защитный диод для разряда конденсатора задержки;

Низкий ток потребления в режиме ожидания.

4. Анализ работы устройства

4.1 Структурная схема устройства

Структурная схема контроллера управления последовательным портом приведена на рисунке 4.1. Она состоит из 5 основных блоков.

Рисунок 4.1. Структурная схема контроллера

Центральным элементом схемы управления последовательным портом является однократно программируемый контроллер MC68HC705J1A (Motorola). Напрямую контроллер подключать к com-порту, конечно же, нельзя. Для сопряжения используют микросхему MC145407, представляющую собой интерфейсный приемопередатчик последовательных данных стандартов EIA/TIA-232E и CCITT V.28. Сигнальные линии соединяются крест-накрест, то есть RxD МК на TxD ИС, а RxD ИС на TxD МК. Шлейф (Flat Ribbon Cable) соединяет MC145407 с последовательным портом.

Детектор понижения напряжения MC34064 был использован, чтобы показать самую надежную схему сброса. ИС формирует сигнал Reset при понижении напряжения питания до 4.5-4.7В. Это обеспечивает защиту от медленного линейного изменения питания. Когда напряжение питание опускается ниже этого уровня, CPU может начать выполнять некоторые инструкции неправильно. В результате могут происходить не запланированные процессы во внутренней памяти и на линиях управления. Это может привести к повреждению информации в регистрах CPU, I/O регистрах и в памяти данных. Детектор обеспечивает защиту от провалов напряжения ('Brown-Outs' - когда напряжение питания ниже допустимого уровня, или 'Black-Outs' - когда на какое-то время оно полностью пропадает).

Кварцевый генератор с частотой 4 МГц тактирует микроконтроллер.

Если присутствует шум или произошла ошибка кадра во время приема символа, горят соответствующие светодиоды (LED1 и LED2), сигнализируя об ошибке.

4.2 Описание программного обеспечения

Блок-схема управления приведена в приложении В, а фактический ассемблерный код - в приложении Г.

Программное обеспечение SCI состоит из двух основных подпрограмм, которые вызываются главной программой. Процедура приема get_char получает один байт данных по линии приема данных (RXD) и помещает его в тип char. Процедура get_char вызывает подпрограмму get_bit, которая фиксирует три значения состояния RXD, из которых получают бит данных и информацию о наличии шума. При выходе из get_char, если не все три значения при приеме любого из битов кадра совпали, то устанавливается флаг наличия шума NE=1; в противном случае он будет обнулен. Если оказалось, что на месте стопового бита обнаружен сигнал логического нуля, то произошла ошибка кадра (FE=1). Если шум или кадр ошибки присутствуют во время приема символа, то загораются соответствующие светодиоды, сигнализируя об ошибке.

Процедура передачи put_char передает последовательно содержание char, используя линию передачи данных (TXD).

Обе процедуры get_char и put_char вызывают delay_13a, подпрограмму, которая производит задержку 13 * ACC + 12 циклов ЦП, где ACC - это значение в накапливающем сумматоре во время вызова подпрограммы delay_13a.

Скорость передачи данных как для приемника, так и для передатчика выбирается путем изменения BAUD_SEL на 4, 8, 16, 32, 64 или 128, который совместно с кварцевым генератором с частотой 4 МГц дает скорость 19200, 9600, 4800, 2400 , 1200 и 600 бод соответственно. Скорость передачи данных для приемника и передатчика будет та же самая. Приложение D определяет допуск приемника и точность передатчика для каждой скорости.

интерфейс микросхема контроллер порт

Заключение

В ходе курсовой работы был детально изучен контроллер управления последовательным портом. Основным элементом, координирующим работу всех узлов схемы, является микроконтроллер МС68HC705J1A. Данный МК не имеет последовательных портов.

Поэтому в устройстве применяется программная эмуляция последовательной передачи данных SCI через выводы параллельных двунаправленных портов. Этот вариант схемы довольно дешёв, поскольку используется самый простой МК фирмы Motorola. Эта особенность позволяет использовать её повсеместно. Программная эмуляция интерфейса SCI предлагают разработчику приложений альтернативу использования аппаратных SCI.

Библиографический список

1. Ремизевич Т.В. Микроконтроллеры для встраиваемых приложений: от общих подходов - к семействам НС05 и НС08 фирмы Motorola/под ред. Кирюхина И.С. ДОДЭКА, 2000. - 272 с.

2. Шагурин И.И. “Микропроцессоры и микроконтроллеры фирмы Motorola”. Справочное пособие. М.: Радио и связь. 1998. 560с.

Приложение А

Приложение Б

Обозначение

Наименование

кол

Конденсатор

С1,С2

К50-16 100 Мкф +- 10%

2

Транзисторы

VT2,VT3

КТ315Г

2

VT1

КТ361Г

3

Микросхемы

U1,

PIC16F84

1

U1,

74247

1

U1,

7401

1

Диод

VD1, VD2, VD3, VD4

КД522

4

Приложение В

На рисунках В1, В2, В3,В4 представлены блок-схемы основной программы Main, подпрограммы Put_Char , подпрограммы GET_CHAR и подпрограммы GET_BIT соответственно.

Рисунок В1. Блок-схема программы Main

Рисунок В2 - Блок схема программы PUT_CHAR

На рисунке B3 - Блок схема подпрограмма GET_CHAR

На рисунке В4 - схема подпрограммы GET_BIT

Приложение Г

Main Routine SCI_01 - SCI Software Transmit/Receive Routines *

* *

*****************************************************************************

* *

* File Name: SCI_01.RTN Copyright (c) Motorola 1995 *

* *

* Full Functional Description of Routine Design: *

* Program flow: *

* Reset: Call init to initialize port pins *

* Call get_char to receive a byte of data *

* Light frame error LED if frame error occurred *

* Light noise LED if frame error occurred *

* Call put_char to transmit the received byte of data *

* Loop back to get_char call (endless loop) *

* *

*****************************************************************************

* *

* Part Specific Framework Includes Section *

* *

*****************************************************************************

#INCLUDE 'H705J1A.FRK' ; Include the equates for the

; HC705J1A so all labels can

; be found.

MOR Bytes Definitions for the Main Routine *

* *

*****************************************************************************

org MOR

fcb $20

******************************************************************************

* *

* Equates and RAM Storage *

* *

******************************************************************************

*** I/O Pin Equates:

serial_port equ $01 ; port used for serial port

; pins

status_port equ $00 ; port used for driving LED's.

noise equ 4 ; pin # for noise LED

frame equ 5 ; pin # for frame LED

rxd equ 0 ; pin # for receive data pin

txd equ 1 ; pin # for transmit data pin

*** Program Constant Equates: ; Baud rate select table:

BAUD_SEL equ $08 ; BAUD_SEL 4MHz osc 2MHz osc

; $04 19.2k 9600

; $08 9600 4800

; $10 4800 2400

; $20 2400 1200

; $40 1200 600

; $80 600 300

*** RAM variable allocation:

org RAM

char rmb 1 ; data register for sci

count rmb 1 ; temp storage variable* main - example program that continually echoes back received characters. *

* *

* input cond. - reset *

* output cond. - none (infinite loop) *

* stack used - 4 bytes *

* variables used - none *

* ROM used - 28 bytes *

*****************************************************************************

org ROM ; start at the top of ROM

main rsp ; reset the stack pointer

jsr init ; initialize port pins

main_loop jsr get_char ; receive one byte of data

; from rxd pin

bcc no_frame_error ; branch if no noise occured

bclr frame,status_port ; turn on frame LED

bra continue ; don't check for noise --

; it's undefined

no_frame_err bset frame,status_port ; turn off frame LED

bhcs noise_error ; branch if noise occured

bset noise,status_port ; turn off noise LED

bra continue ; skip next line of code

yes_noise_err bclr noise,status_port ; turn on noise LED

continue jsr put_char ; transmit the received byte

bra main_loop ; and prepare for next

; reception.

* init - initialize port pins for sci operation and for driving LEDs; *

* called by main *

* *

* input cond. - none *

* output cond. - TXD = output initialize to 1, RXD = input, noise LED = *

* off, frame LED = off. *

* stack used - 0 bytes *

* variables used - none *

* ROM used - 15 bytes *

******************************************************************************

init bset txd,serial_port ; init txd = 1

bset txd,serial_port+4 ; txd = output

bclr rxd,serial_port+4 ; rxd = input

bset noise,status_port ; noise LED = off

bset noise,status_port+4 ; noise = output

bset frame,status_port ; frame LED = off

bset frame,status_port+4 ; frame = output

rts ; exit (init)

******************************************************************************

* get_char - receive one byte of data from RXD pin; called by main *

* *

* input cond. - RXD pin defined as an input pin * output cond. - char contains received data; X,ACC undefined; *

* half carry = 1 (frame occured) or 0 (no frame error); *

* carry = 1 (noise and/or frame error occured) or 0 *

* (no noise). *

* stack used - 2 bytes *

* variables used - char: storage for received data (1 byte) *

* count: temporary storage (1 byte) *

* ROM used - 63 bytes *

get_char lda #8 ;[2] receiving 8 data bits

sta count ;[4] store value into RAM

clrx ;[3] used to store noise data

get_start_bit brclr rxd,serial_port,* ;[5] wait until rxd=1

brset rxd,serial_port,* ;[5] wait for start bit

lda #BAUD_SEL-3 ;[2] prepare for 1/2 bit delay

bsr delay_13a ;[13a+12] execute delay routine

bsr get_bit ;[39] sample start bit

lsra ;[3] noise bit -> carry;

; acc=filtered start bit

bne get_start_bit ;[3] if false start, start over

tsta ;[3] for timing purposes only

tsta ;[3] for timing purposes only

lda #2*(BAUD_SEL-2) ;[2] prepare for 1 bit delay

bsr delay_13a ;[13a+12] execute delay routine

get_data_bits bsr get_bit ;[39] sample data bit

rora ;[3] noise bit -> carry

rorx ;[3] carry -> noise data reg

rora ;[3] filtered data bit -> carry

ror char ;[5] carry -> char

lda #2*(BAUD_SEL-3) ;[2] prepare for 1 bit delay

bsr delay_13a ;[13a+12] execute delay routine

tsta ;[3] for timing purposes only

dec count ;[5] bit received, dec count

bne get_data_bits ;[3] loop if more bits to get

get_stop_bit bsr get_bit ;[39] sample stop bit

lsra ;[3] noise bit -> carry

; acc=filtered stop bit

sta count ;[4] store stop bit in count

bcc yes_noise ;[3] if noise, then branch

txa ;[2] noise data -> acc

eor char ;[3] XOR noise with char,

beq no_noise ;[3] and if result=0,

; then no noise in data

; reception

yes_noise lda #$08 ;[2] set noise bit (half carry)

add #$08 ;[2] by adding $8 to $8

no_noise lda count ;[3] retrieve stop data bit,

coma ;[3] complement it,

lsra ;[3] and shift it into carry

; for frame error bit

rts ;[6] exit (get_char)

*****************************************************************************

******************************************************************************

* get_bit - receive one bit of filtered data and noise info; called by *

* get_char *

* *

* input cond. - RXD pin defined as an input pin *

* output cond. - ACC = 000000dn, where d = filtered data, n = noise info *

* stack used - 0 bytes *

* variables used - none *

* ROM used - 17 bytes *

******************************************************************************

get_bit clra ;[3] used to add sampled bits

brset rxd,serial_port,samp_1 ;[5] sample 1st bit into carry

samp_1 adc #0 ;[3] add it to acc

brset rxd,serial_port,samp_2 ;[5] sample 2nd bit into carry

samp_2 adc #0 ;[3] add it to acc

brset rxd,serial_port,samp_3 ;[5] sample 3rd bit into carry

samp_3 adc #0 ;[3] add it to acc

rts ;[6] exit (get_bit)

* put_char - transmit data byte in char out onto TXD pin; called by main *

* *

* input cond. - TXD pin defined as an output pin and TXD = 1; *

* char contains byte to be tranmitted. *

* output cond. - X,ACC,char = undefined; *

* stack used - 2 bytes *

* variables used - char: storage for transmitted data (1 byte) *

* ROM used - 31 bytes (35 if sending two stop bits) *

*****************************************************************************

put_char ldx #9 ;[2] be sending 8 data bits

clc ;[2] clear carry for start bit

put_data_bits bcc send_0 ;[3] if carry<>0, then

bset txd,serial_port ;[5] send out a 1

bra jmp_bit ;[3] finished sending a 1

send_0 bclr txd,serial_port ;[5] else send a 0

bra jmp_bit ;[3] finished sending a 0

jmp_bit lda #2*(BAUD_SEL-1)-1 ;[2] prepare for a 1 bit delay

bsr delay_13a ;[13a+12] execute delay routine

tsta ;[3] for timing purposes only

ror char ;[5] get next data bit to send

decx ;[3] one bit sent, so dec count

bne put_data_bits ;[3] loop if more bits to send

put_stop_bit nop ;[2] for timing purposes only

bset txd,serial_port ;[5] send out a one

lda #2*(BAUD_SEL-1) ;[2] prepare for a 1 bit delay

bsr delay_13a ;[13a+12] execute delay routine

* add the next two lines to guarantee sending two stop bits:

* lda #2*(BAUD_SEL-1)+1 ;[2] prepare for a 1 bit delay

* bsr delay_13a ;[13a+12] execute delay routine

rts ;[6] exit (put_char)

* delay_13a - delay for 13*ACC + 12 cycles; called by get_char and put_char *

* *

* input cond. - ACC set to appropriate value (13*ACC + 12 cycles) *

* output cond. - ACC = 0 *

* stack used - 0 bytes *

* variables used - none *

* ROM used - 7 bytes *

******************************************************************************

delay_13a nop ;[2] this is a 13-cycle loop

nop ;[2]

tsta ;[3]

deca ;[3] decrement loop count

bne delay_13a ;[3] loop if count not zero

rts ;[6] exit (delay_13a)

******************************************************************************

* *

* Interrupt and Reset vectors for Main Routine *

* *

******************************************************************************

org RESET

fdb main

ref.by 2006—2019
contextus@mail.ru