Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Интерфейсы связи. Сопряжение МК с компьютером через 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 проводников.
При соединении происходит передача данных по линиям 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, 6, 5 могут использоваться для генерации прерываний. Обычно делают прерывание по приему данных. Многопроцессорный режим используется, когда к одному СОМ-порту цепляются сразу несколько МК. Например, Вы подключаете к компьютеру (или другому МК) устройство, в котором есть несколько МК, подключенных к одному интерфейсу RS-232C. Тогда обычно используют 9 битов данных, при этом первый бит сигнализирует о передаче адреса (если установлен) либо данных. МК, принимая остальные биты, если они являются адресом, сравнивает их со своим адресом. В случае совпадения он принимает кадры данных и отвечает на них, а все остальные МК " помалкывают". Если адрес не совпадает, МК реагирут только на первый бит, что уменьшает нагрузку на процессор. UCSRB.
# Решеткой отмечен бит, доступный только для чтения. Все остальные доступны для чтения/записи. UCSRC.
Чем же так страшен этот регистр управления 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; Нарушение авторского права страницы