Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Интерфейсы связи. Сопряжение МК с компьютером через COM-порт.



 

Рассмотрим классический вариант связи микроконтроллеров с внешними устройствами с помощью USART - " универсальный синхронный и асинхронный приемник и передатчик" (УСАПП) (" Universal Synchronous and Asynchronous Receiver and Transmitter" ). Так называют устройство, умеющее работать с интерфейсом RS-232 (и его аналогами), на котором и построен СОМ-порт. Помимо этого, существуют еще устройства UART, которые могут работать только в асинхронном режиме. Мы будем использовать только асинхронный, т. к. современные компьютеры имеют 9-контактный СОМ порт без линии автоматических тактовых сигналов.

Напряжениями логического уровня в интерфейсе RS-232C (существуют еще RS-232A и RS-232B, но в компьютере и МК RS-232C) являются +12 В (лог. 0) и -12 В (лог. 1). Состояние 0 В не используется для передачи данных и существует только при отключении питания СОМ-порта. В СОМ порте (на рисунке ниже представлена вилка) 9 проводников.

 

" Ножка" № Название сигнала Описание
1 DCD Обнаружение устройства
2 RXD Прием данных
3 TXD Посылка данных
4 DTR Готовность терминала к передаче данных
5 GND Земля (общий)
6 DSR Data Set Ready. Готовность внешнего устройства к передаче данных
7 RTS Запрос на передачу
8 CTS Разрешение передачи данных терминалу
9 RI Ring Indicator (специализированная сигнальная линия управления)

 

При соединении происходит передача данных по линиям 2 (RXD) и 3 (TXD). Рассмотрим, как это реализовано.

Оба провода передачи данных работают совершенно одинаково. При этом RXD одного устройства соединяется с TXD другого и наоборот, TXD первого устройсва цепляется к RXD второго устройства.

Изначально на линии передачи данных установлена лог. 1 (-12 В). Передача данных осуществляется кадрами по 5-8 бит. Чтобы обозначить начало и конец кадра, используют " старт-бит" и " стоп-бит". Приемник и передатчик заранее должны быть настроены на работу с одинаковыми параметрами для гарантированной передачи данных. Когда нужно передать данные, передатчик меняет состояние линии с лог. 1 на лог. 0 (+12 В). Это стартовый бит. После него начинается передача информационных битов. Этот момент (появление стартового бита) фиксируется приемником и в нем начинают " тикать часы". Биты передаются через одинаковые фиксированные моменты времени с определенной скоростью, называемой битрейтом (baudrate). Например, пусть этот интервал составляет 100 мкс. Передатчик держит стартовый бит (всегда лог. 0) в течение 100 мкс, а затем выставляет на линии первый информационный бит. Еще через 100 мкс он устанавливает второй бит и т.д.. Приемник, в свою очередь, обнаружив стартовый бит, ждет 100 мкс, затем ждет половину этого времени, т.е. 50 мкс (чтобы попасть как раз в середину первого бита), после чего начинает запоминать состояние линии каждые 100 мкс.

За информационными битами следуют бит четности и стоповые биты. Стоповые биты всегда имеют уровень -12 В (лог. 1) и служат одновременно паузой между кадрами данных. Если стоповый бит один, то пауза между кадрами меньше и скорость передачи данных выше. Если их два, то пауза будет дольше. Бит четности (P) служит для контроля правильности передачи данных. Если выставлен параметр четность как Odd (Нечетный), то бит четности будет таким, чтобы сумма всех отправленных информационных битов вместе с ним была обязательно нечетной. Если приемник, приняв кадр, установил, что сумма нечетная, то все верно, если она оказалась четной, значит, была ошибка в одном бите (или в 3-х, 5-ти, 7-ми, 9-ти). Этот способ достаточно примитивен и не обнаружит ошибки в 2-х, 4-х, 6-ти или 8-ми битах. Но наиболее вероятной является ошибка именно в 1 бит, а не в 2 и больше. Если четность установлена как Even (Четная), то сумма всех отправленных битов будет всегда четной.

 

За работу USARTа отвечают несколько специальных регистров (они обозначены жирным шрифтом на рисунке выше). Во первых, следует выделить регистр UDR (USART Data Register). Он используется для хранения принятых/отправляемых данных. Сделан он особым образом, т.к. на самом деле регистров UDR 3 штуки. При записи значения в UDR происходит запись в тот, который изображен на рисунке верхним (UDR (transmit) или TXB). Это значение незамедлительно отправляется другому устройству через COM-порт и регистр очищается. Когда в МК приходит байт информации, он сохраняется в другом UDR-регистре (UDR (receive) или RXB), причем в верхнем RXB-регистре. Как только байт полностью принят, он автоматически копируется в нижний RXB-регистр, откуда его можно уже прочитать, а в верхний при этом принимается следующий байт (чтобы избежать пауз в работе и потери данных). Итак, при чтении данных из UDR берется принятый байт, а при записи в него данные сразу же отправляются через интерфейс приемнику. Если после приема двух байтов в оба RXB-регистра не произошло считывания из нижнего, то третий байт не будет принят USARTом и USART выставит флаг ошибки Data OverRun (DOR).

Существуют регистры управления и статуса USARTом: UCSRA, UCSRB и UCSRC. Рассмотрим в них подробно те биты, которые чаще всего используются.

UCSRA.

  • Бит 7 - RXC (Receive Comlete). Бит завершения приема. Автоматически устанавливается, если принимаются данные. При чтении принятых данных сбрасывается.
  • *Бит 6 - TXC (Transmit Comlete). Бит завершения передачи. Автоматически устанавливается после отправки кадра данных при отсутствии следующих данных для отправки.
  • Бит 5 - UDRE (UDR Empty). Бит отсутствия данных для отправки. Если установлен, нет данных для отправки.
  • Бит 4 - FE (Frame Error). Бит ошибки кадра. Равен единице, если была ошибка в формате принятого кадра.
  • Бит 3 - DOR (Data OverRun). Бит ошибки переполнения буфера. Равен единице, если нет места для приема нового кадра данных.
  • Бит 2 - PE (Parity Error). Бит ошибки четности. Равен единице, если была ошибка четности.
  • *Бит 1 - U2X (Double speed). Бит двойной скорости USARTа. Если установлен, скорость работы и битрейт удваиваются.
  • *Бит 0 - MPCM (Multi-Processor Communication Mode). Бит работы в многопроцессорном режиме. Если равен единице, включен многопроцессорный режим.

* Звездочку я поставил около тех битов, которые доступны для записи. Остальные биты доступны только для чтения. Некоторая информация, думаю, требует пояснения. Биты 7, 6, 5 могут использоваться для генерации прерываний. Обычно делают прерывание по приему данных. Многопроцессорный режим используется, когда к одному СОМ-порту цепляются сразу несколько МК. Например, Вы подключаете к компьютеру (или другому МК) устройство, в котором есть несколько МК, подключенных к одному интерфейсу RS-232C. Тогда обычно используют 9 битов данных, при этом первый бит сигнализирует о передаче адреса (если установлен) либо данных. МК, принимая остальные биты, если они являются адресом, сравнивает их со своим адресом. В случае совпадения он принимает кадры данных и отвечает на них, а все остальные МК " помалкывают". Если адрес не совпадает, МК реагирут только на первый бит, что уменьшает нагрузку на процессор.

UCSRB.

  • Бит 7 - RXCIE (Receive Comlete Interrupt Enable). Бит генерации прерывания при приеме данных. Если установлен, происходит прерывание для немедленной обработки принятых данных.
  • Бит 6 - TXCIE (Transmit Comlete Interrupt Enable). Бит генерации прерывания при завершении передачи. Если установлен, происходит прерывание после отправки данных.
  • Бит 5 - UDRIE (UDR Empty Interrupt Enable). Бит генерации прерывания при отсутствии данных для передачи.
  • Бит 4 - RXEN (Receiver Enable). Бит наличия приемника данных. Если установлен, МК будет принимать данные через RS-232C.
  • Бит 3 - TXEN (Transmitter Enable). Бит наличия передатчика данных. Если установлен, МК будет передавать данные через RS-232C.
  • Бит 2 - UCSZ2 (USART Character SiZe 2). Определяет количество бит в кадре. Работает вместе с битами UCSZ1 и UCSZ0 в UCSRC.
  • #Бит 1 - RXB8 (Receive Data Bit 8). Девятый бит принятых данных (восьмой при нумерации с 0), использующийся в многопроцессорном режиме.
  • Бит 0 - TXB8 (Transmit Data Bit 8). Девятый бит отправляемых данных, использующийся в многопроцессорном режиме.

# Решеткой отмечен бит, доступный только для чтения. Все остальные доступны для чтения/записи.
Наконец, самый " страшный" регистр.

UCSRC.

  • Бит 7 - URSEL (USART Register SELect). Бит выбора регистра. 1 - UCSRC, 0 - UBRRH.
  • Бит 6 - UMSEL (USART Mode SELect). Бит выбора режима работы. 1 - синхронный, 0 - асинхронный.
  • Бит 5 - UPM1 (USART Parity Mode 0). Установка режима четности/нечетности. Оба сброшены - нет контроля.
  • Бит 4 - UPM0 (USART Parity Mode 0). Оба установлены - нечетная сумма. UPM0 = 0 и UPM1 = 1 - четная сумма.
  • Бит 3 - USBS (USART Stop Bit Select). Количество стоп-битов. Если сброшен, то 1 стоп-бит, иначе - 2.
  • Бит 2 - UCSZ1 (USART Character Size 1). Размер кадра данных (вместе с UCSZ2 из UCSRB).
  • #Бит 1 - UCSZ1 (USART Character Size 1). Таблицу возможных значений см. ниже
  • Бит 0 - UCPOL (USART Clock POLarity). Используется в синхронном режиме. Если равен нулю, то тактирование отправляемых данных по переднему фронту импульса, принимаемых - по заднему. Если установлен, то наоборот.

Чем же так страшен этот регистр управления USARTом? Он имеет тот же адрес, что и верхний регистр битрейта (0x80). Это означает, что процессор не видит разницы между этими регистрами. Для того, чтобы их можно было отличать, сделан седьмой бит URSEL. Если он равен единице, процессор работает с UCSRC, иначе с UBRRH. Это, возможно, справедливо не для всех МК серии MEGA, так что читайте Datasheet. Ниже обещанная таблица установки размера кадра данных.

Остались два регистра. Это регистры установки битрейта - UBRRH и UBRRL. В регистре UBRRH доступны биты 0-3 (если в UCSRC URSEL = 0). Регистр UBRRL доступен весь для сохранения восьми младших битов числа. В этих двух регистрах может быть сохранено 12-битное число (От 0 до 4095). Это число вычисляется по следующей формуле:

UBRR = fosc / (X * BAUD) - 1

Здесь X равно 16 при режиме с нормальной скоростью (бит U2X = 0) и 8 в режиме удвоенной скорости (бит U2X = 1), BAUD - нужный битрейт, fosc - частота кварцевого резнонатора. По этой формуле легко вычислить значение регистра самостоятельно, но существуют также специальные таблицы наиболее типичных битрейтов и соответствующих значений UBRR. Такую таблицу из-за её громоздкости приводить не буду. Ее можно найти в Datasheetе к МК. Для AtMega16 таблица находится на стр. 169 его Datasheetа.

В заключение хотелось бы отметить, что COM-порт гарантированно будет работать на больших скоростях (0, 5 - 2 Мбит/с) при длине кабеля до 8 метров. При небольших скоростях длину кабеля можно увеличить до 15 метров. При большей длине, возможно, будут ошибки. Хотя... хотя можно в случае надобности придумывать различные ухищрения и особые алгоритмы, позволяющие увеличить длину кабеля, возможно, в ущерб скорости. Тем не менее, помимо RS-232 есть еще и другие подобные интерфейсы, среди которых есть и низковольтные помехоустойчивые с дифференциальными линиями, где можно использовать провода длиной до километра.

В этой статье попробуем собрать простое устройство на МК, которое будет принимать байт информации через COM-порт и немедленно выводить его на семисегментном индикаторе, а также отправлять подтверждение о доставке обратно в компьютер.

Если Вы читали предыдущую статью (надеюсь на это), то, наверное, заметили, что рабочие напряжения в COM-порту +12 В и -12 В, а МК оперирует напряжениями +5 В и 0 В. Для того, чтобы все работало нормально, нужно установить преобразователь уровней. Рекомендую ставить MAX232. Потребуются, помимо микросхемы, 5 конденсаторов на 1 мкФ.

При работе с COM-портом именно эта микросхема находит наиболее частое применение. Если Вы купили макетную плату с разводкой под СОМ-порт, то там, скорее всего, будет и готовая разводка под установку MAX232 и конденсаторов. Правда, когда я купил свою плату, то сначала припаял МК и цепь питания, потом СОМ-порт. Долго не мог понять, как крепить преобразователь уровня. И тут вдруг выяснилось, что все компоненты я припаял не с той стороны к плате: -). Но не переделывать же все! Поэтому я прицепил СОМ-порт и МАХ232 к " правильной" стороне, а остальное оставил на " неправильной".

У меня в схеме задействованы выводы 11 (T1in) и 12 (R1out). Соответственно, вывод 13 (R1in) подключен к 3-му выводу розетки СОМ-порта (RXD), а 14-й вывод МАХ-232 (T1out) подсоединен ко 2-му выводу розетки СОМ-порта (TXD).

Теперь нужно МАХ232 подсоединить к МК. У ATMEGA16 USART использует 14-й вывод PB0 (RXD) для приема данных и PB1 (TXD) для отправки. Соответственно, PB0 нужно прикрепить к 12-му выводу МАХ232, а PB1 к 11-му.

Остается лишь написать программу для МК (для ПК тоже можно). В данном примере реализована работа с кварцем 11, 0592 МГц, битрейт 115, 2 кбит/с, 8 информационных бит, нет бита четности, 1 стоп-бит, скорость удвоенная. С большим, чем 115, 2 кбит/с битрейтом мой компьютер работает с глюками.

Ниже приведен код программы для МК.

#include " iom16.h"

#define a 1

#define b 4

#define c 16

#define d 64 // Это для индикатора

#define e 128

#define f 2

#define g 8

#define DP 32

 

unsigned char Dig[10];

// В этих переменных хранятся цифры, которые нужно отобразить

char          Disp5, Disp6, Disp7;

 

// Функция выделяет цифры из трехзначного числа Number

void Display (unsigned char Number)

{

unsigned char Num1, Num2, Num3;

Num1=Num2=0;

while (Number > = 100) 

{

Number -= 100;  

Num1++;  

}

while (Number > = 10)

{

Number -= 10;  

Num2++;

}

Num3 = Number;

Disp5 = Dig[Num1];

Disp6 = Dig[Num2];

Disp7 = Dig[Num3];

}

 

void USART_init()

{

UCSRA = (1 < < 1); // Установка двойной скорости

UCSRB |= (1 < < 7) | (1 < < 4) | (1 < < 3); // Прерывание по приему данных, включены приемник и передатчик

UCSRC |= (1 < < 7); // Запись в UCSRC

UCSRC |= (1 < < 1) | (1 < < 2); // Размер кадра данных 8 бит

UCSRC -= 128; // Запись в UBRRH

UBRRH = 0;

UBRRL = 11; // Битрейт равет 115200 бит в секунду

}

 

void Dig_init()

{

Dig[0] = (a+b+c+d+e+f);

Dig[1] = (b+c);

Dig[2] = (a+b+g+e+d);

Dig[3] = (a+b+g+c+d);

Dig[4] = (f+g+b+c);

Dig[5] = (a+f+g+c+d);

Dig[6] = (a+f+g+c+d+e);

Dig[7] = (a+b+c);

Dig[8] = (a+b+c+d+e+f+g);

  Dig[9] = (a+b+c+d+f+g);

}

 

void io_init() // Инициализация портов ввода/вывода

{

DDRA = 0xFF;

PORTA = 0;

DDRC |= (1 < < PINC5) | (1 < < PINC6) |(1 < < PINC7);

PORTC = 0;

DDRB = 1;

}

 

void main()

{

unsigned char j, k = 0;

USART_init();

Dig_init();

Display(0);

SREG |= (1 < < 7);

io_init();

while(1) // Отображение принятого байта

{

for (j = 0; j < = 50; j++){} // Задержка для отображения цифры

(k == 3)? k = 0: k++;

PORTC & = 31; //Очистка PC7, PC6, PC5

for (j = 0; j< =30; j++){} // Задержка для выключения транзистора

switch (k)

{

case 0: PORTC |= (1 < < PINC7); // Единицы

         PORTA = Disp7;

   break;

case 1: PORTC |= (1 < < PINC6); // Десятки

         PORTA = Disp6;

   break;

case 2: PORTC |= (1 < < PINC5); // Сотни

         PORTA = Disp5;

}

}

 

#pragma vector = USART_RXC_vect

__interrupt void Recieve()

{

unsigned char temp = 0;

unsigned char* str = " Hello! My name is AtMega16! "; // Строка данных

char t, l;

temp = UDR; // Чтение принятых данных

Display (temp); // Отображение числа на индикаторе

PORTB = 1 - PORTB; // Зажигаем/гасим светодиод на PB0

if (temp == 5) // Отправка строки, если принятый байт равен 5

{

for (t=0; t < 28; t++)

{

UDR = str[t]; // Отправка строки

for (l=0; l < 200; l++) // Задержка (чтобы успел отправить число)

{ }

}

}

else

UDR = temp; // Отправка обратно принятого числа

}


CAN интерфейс

CAN - последовательный протокол связи, который эффективно поддерживает распределенное управление в реальном масштабе времени с высоким уровнем безопасности.

Область применения - от высокоскоростных сетей до дешевых мультиплексных шин. В автоматике, устройствах управления, датчиках используется CAN со скоростью до 1 Mbit/s.

Для достижения прозрачности проекта и гибкости реализации, CAN был подразделен на различные уровни согласно модели ISO/OSI:

· Уровень передачи данных (Data Link Layer)

· Подуровень логического управления линией (LLC)

· Подуровень управления доступом к среде передачи (MAC)

· Физический Уровень (Physical Layer)

Область LLC подуровня:

обеспечение сервиса для передачи данных и для удалённого запроса данных.

решение, какие сообщения, полученные LLC подуровнем, должны быть фактически приняты.

обеспечение средствами для управления восстановлением и уведомления о перегрузке.

 

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

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

Область физического уровня - фактическая передача битов между различными узлами с соблюдением всех электрических правил.

Внутри одной сети, физический уровень одинаков для всех узлов.

  Основные характеристики

v приоритетность сообщений

v гарантированное время отклика

v гибкость конфигурации

v групповой прием с синхронизацией времени

v система непротиворечивости данных

v multimaster

v обнаружение ошибок и их сигнализация

v автоматическая ретрансляция испорченных сообщений, как только шина снова станет свободной.

v различие между нерегулярными ошибками и постоянными отказами узлов и автономное выключения дефектных узлов

 

Послойная архитектура CAN - сети согласно модели OSI

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

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

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


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 315; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.09 с.)
Главная | Случайная страница | Обратная связь