Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

3.Записать конструкцию множественного ветвления (switch…case). Создать три ветви: 0x04 — буфер приемника заполнен; — 0x02; 0x0C — в буфер приемника поступил, по крайней мере, один байт; 0x02 — буфер передатчика пуст.

4.Если прерывающим событием является получение байта, проверить байт в U0RBR на равенство символу «t».

5–6. Если условие выполнено, передать нулевой элемент массива, записав его в регистр U0THR и присвоить счетчику единицу, так чтобы передача была продолжена с первого элемента массива. Теперь завершение передачи элемента Data[0] приведет к новому прерыванию с идентификатором

0x02.

7.Записать цикл с предусловием для передачи 16 байт подряд. Условие прекращает передачу, когда отправлен последний элемент.

8–10. Тело цикла содержит инкремент счетчика i, а также передачу очередного элемента массива и инкремент счетчика байтов n.

11.Процедура обработки прерывания завершается обнулением реги-

стра VICVectAddr.

3.23 Интерфейс RS-232. Прием пакета переменной длины

3.23.1 Задание

Разработать программу для приема пакета чисел в формате IEEE754 float переменной длины по интерфейсу RS-232 и отображение принятых чисел на ЖКИ в формате X.X.

3.23.2 Основы реализации

Предлагается принимать данные в виде пакета, имеющего структуру, показанную на рисунке 3.23.1. Кадр начинается с известного заголовка 0x7А80A1A2. Заголовок используется для кадровой синхронизации приемниками и передатчика, то есть для обнаружения приемником начала кадра. Вероятность случайного совпадения с заголовком четырехбайтной последовательности внутри кадра очень мала. К тому же, код 0x7А80A1A2 в формате IEEE754 соответствует неопределенности (NaN), которая вряд ли вообще встречается в кадре. Вторым словом передается четырехбайтная константа N, показывающая длину (число четырехбайтных полей) остальной части кадра. Далее следуют числа в формате IEEE754 float.

Номера

 

 

 

 

 

 

 

 

 

 

байтов:

0

3

4

7

8

11

12

15

4N+4

4N+7

 

0x7F80A1A2

unsigned int N

float D[0]

 

float D[1]

...

float D[N-1]

 

 

Заголовок

 

Число слов

Слово 0

 

Слово 1

 

Слово N-1

Рисунок 3.23.1 – Формат кадра

При необходимости можно включить в пакет еще одно целочисленное четырехбайтное слово для контроля ошибок. Например, это может быть циклический код CRC32.

236

3.23.3 Алгоритм программы

Приема и расшифровка кадра расположены в основной программе, поскольку процесс приема протекает достаточно медленно.

К программе подключаются файлы STDIO.h и "LCD.c". В программе объявлены следующие константы:

а) S — строка из трех символов для индикации;

б) N — беззнаковая целочисленная переменная (число полей в кадре); в) i — целочисленный счетчик;

г) k — целочисленный счетчик байтов в кадре (начальное значение 0) д) Frame — структура объединяющего типа следующей структуры:

union

{

unsigned char Bytes[400]; unsigned int Words[100]; float Floats[100];

} Frame;

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

1.Инициализация ЖКИ производится функцией LCDInit(), разработанной ранее.

2.Портовые линии P0.0 и P0.1 необходимо перевести в режим TxD0 и

RxD0.

3.Настройка UART0 состоит в следующем:

а) Разрешить доступ к настройке скорости (бит DLAB регистра

U0LCR);

б) Рассчитать необходимые величины, задающие частоту UART по формулам (1.19.1, 1.19.2). Или воспользоваться таблицей 1.19.1 Результаты занести в регистры U0DLM, U0DLL, U0FDR.

в) включить передачу восьми бит и запретить доступ к защелкам делителя скорости (регистр U0LCR).

г) включить буфер приемопередатчика (младший бит регистра

U0FCR).

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

237

 

Начало

 

 

 

 

 

 

 

Нет

9

 

1

 

 

 

k=8

 

Инициализация

 

 

 

 

 

ЖКИ

 

 

Да

 

 

 

 

 

 

2

 

 

 

10

 

Настройка режима

 

 

Сохранить длину

 

линий P0.0 и P0.1

 

 

N=Words[1]=Bytes[7:4]

 

3

 

 

 

 

 

Настройка UART

 

 

 

 

 

 

 

Нет

11

 

 

 

 

 

k>7+4N

Нет

4

 

 

 

Да

 

Байт принят?

 

 

 

 

 

 

 

 

Да

 

12

k=0

 

 

 

 

 

5

 

 

13

 

 

Сохранение байта

 

 

 

в Bytes[k]

 

Очистить дисплей

 

 

 

 

Да

6

Заг. не

Нет

14

Да

 

 

 

i=0; i<N; i++

 

совпал и k=3

 

 

 

 

 

 

 

Нет

 

15

 

 

8

 

 

 

 

 

 

Формирование строки

 

Инкремент k

 

 

 

на основе Floats[i+2]

 

 

 

 

7

 

 

 

16

 

Сдвиг

 

 

 

 

 

 

 

Индикация строки в

Words[0]=Bytes[3:0]

 

 

 

 

 

позиции 4i

с потерей мл. байта

 

 

 

 

 

 

 

 

 

Рисунок 3.23.2 – Схема программы приема по UART кадра переменной длины

5. Считать байт из регистра U0RBR и поместить его в k-ый байт структуры Frame.

Frame.Bytes[k]=U0RBR;

После сброса k=0, следовательно, начнется заполнения кадра.

6.Условие 6 обнаружит кадровую рассинхронизацию, то есть несовпадение заголовка. Через логическое умножение заголовки сравниваются только при . То есть когда заголовок только что принят.

7.Если заголовок не совпал, требуется сдвинуть последние три байта

спотерей «самого старого» нулевого, освободив третью ячейку. Заметим, что счетчик байтов k при этом не инкрементируется. Значит, следующий принятый байт будет записан в ту же третью ячейку, чтобы с тремя уже имеющимися образовать заголовок. Счетчик как бы зависает на значении «три», а пакет сдвигается побайтно до тех пор, пока не встретятся четыре байта подряд, совпадающие с заголовком. Сдвиг осуществляется обращением к кадру в режиме слова:

Frame.Words[0]>>=8;

238