Немного теории
Большинство объектов управления и контроля на производстве в системах автоматики не обходится без телеуправления и телеконтроля. Другими словами современны объекты, механизмы управляются и контролируются посредством персонального компьютера, который может находится далеко от самих объектов. Скажим, такой пример, как управления печами в металлургии. Температура около печей достигает грндиозных отметок, человек в таких условиях не сможет работать, нажимать кнопки, задавать параметры машины. Ну и правильно, зачем пачкать руки и испытывать здоровье, когда есть автомат, при помощи которого можно управлять объектами с теплого кабинета за чашкой чая. Привожу самый примитивный пример, который пришел в голову. Предположим, нужно управлять двигателем в тех самых условиях , возле металлургической печи. Не проблема. Ставим наш контролер (а ядро наша любимая AVR) не далеко от этого двигателя и тащим от контроллера три провода в уютный кабинет к ПК. Отсюда мы и будем управлять нашим двигателем через компьютер. Не только управлять, а и контролировать, например его ток через обмотки. Те три провода + некоторые детали и будут являться неким интерфейсом. Напомню интерфейс- связь, взаимодействие между чем- либо или кем - либо. В данном случае между контроллером и ПК.
В этой статье мы рассмотрим интерфейс RS-232. Протокол обмена данных RS-232 – это последовательный интерфейс, предназначен для организации дуплексной (туда-сюда) связи МК с ПК. Это наиболее применимый интерфейс из всех существующих последовательных интерфейсов. Поскольку это последовательный интерфейс, то биты передаются по одному проводу один за одним: первый идет стартовый бит St (сигнализирует приемнику, что передача данных началась), затем 5-9 бит данных (чаще всего 8, так удобнее), бит проверки четности P (тут проверяется достоверность информации, на наличие ошибки) и наконец стоповый бит Sp (передача прошла успешно, все принято без потерь, приемник ждет новую посылку). Все это дело проиллюстрировано на рисунке 1.
Рисунок 1 Формат пасылки передачи данных в протоколе RS-232.
И так, к главному, во всех микроконтроллерах AVR имеются в качестве периферийного узла блок UART (универсальный асинхронный приемо-передатчик), который и обеспечивает обмен данными по протоколу RS-232. Если микроконтроллеру нужно передать в ПК данное, то он просто засовывает его в специальный регистр UDR блока UART и это данное поступает в ПК бит за битом, последовательно. И наоборот, если ПК хочет передать данное МК, то послав данное оно попадает опять таки в регистр UDR блока UART. А у же дальше МК распоряжается с этим данным так, как диктует ему программа.
Таблица сравнения уровней TTL и уровней RS-232.
Аппаратная часть
Было бы все хорошо, если бы ни одно неудобство. У всех МК используется так называемая TTL логика (Транзисторно-Транзисторная Логика) и соответствующий им уровень напряжения, а в ПК уровень иной (показано в таблице).
То есть, для того чтобы два оконечных устройства поняли друг друга, нужен некий преобразователь. Такой преобразователь есть и называется он микросхема МАХ232. Ее задача прообразовывать уровни TTL логики в уровни COM – порта. Микросхема MAX232 приведена на рисунки 2.
Если эту микросхему подключить так, как показано на рисунке 3, то получится наш RS-232. На рисунке:
выход RXd - вывод приема данных от передатчика;
выход Txd - линия передачи данных от передатчика к приемнику.
Рисунок 2 MAX232 внутренности микросхемы.
Конечно же мало кого интересует , что находится внутри этой микросхему. Поэтому перейдем к практически полезным вещам. Как показано на рисунке 3, линию Txd МК подсоединяем к входу Rxd ПК и наоборот выход Txd ПК подсоединяем ко входу Rxd ПК. Эти подсоединения идут посредством микросхемы MAX232? как это показано на рисунке 4. На этом же рисунки левая часть разем со стороны МК, правая разъем со стороны ПК. Со стороны ПК в качестве разъема используют обычный COM- порт и его 2,3 и 5 вывод. Нумерация выводов COM-порта отмечены на нем же, поэтому здесь приводить не буду. Приобретете, посмотрите. Очень удобно микросхему преобразователя уравней MAX232 брать в смд-исполнении: минимизировать гобориты и упоковать всю эту схему (рисунок 4) в корпус COM -порта.
Рисунок 3 Соединения выводов в RS-232.
Все что было описано выше имеет теоретический интерес. Практический интерес имеет схема на рисунке 4, которая у меня работает без сбоев. Можете распаивать , проверено!
Это все о железках, теперь заставим работать RS-232 как нужно. То есть принимать и передавать данные в ПК.
Рисунок 4 RS-232, аппаратная часть.
Алгоритм работы модуля USART следующий: после инициализации
самого модуля, процессор непрерывно спрашивает «А сейчас пуст буфер?». Имеется
виду буфер приема и передачи данных UDR. И задает он этот вопрос в цикле, непрерывно, пока буфер не очистится. Если он очистился (то есть
письмо ушло к адресату), то процессор загружает туда новое данное и снова
ожидает, когда оно уйдет. Сам буфер UDR представляет собой сдвиговый регистр.
Попадая в него, данное выходит побитно, вперед старшим битом. На
самом деле UDR состоит из двух 8-битных регистров: один работает на прием данных, другой -
на передачу. То есть два разных регистра носят одно и тоже имя и находятся по
одному и тому же адресу пространства ввода/вывода. Аналогично работает USART и по приему данных.
Программаня часть
Мы уже начали говорить о таком блоке МК как UART. Напомню, что это то главный узел в МК, который позволяет организовывать асинхронную последовательную приемо- передачу между МК и ПК. Попробуем как можно полнее
и в тоже время кратко, пояснить работу этой периферии. Блок
USART (UART) состоит из трех
основных частей: блок тактирования, блок
передачи и блок приемника. Сами названия блоков поясняют их назначение. Для
управления блоками USART используют три регистра: UCSRA (UCSRnA), UCSRB (UCSRnB) и UCSRC (UCSRnC). Формат каждого из них приведен на рисунках 5,6,7.
Рисунок 5 Формат регистра UCSRA и его биты Рисунок 6 Формат регистра UCSRB и его биты
Рисунок 5 Формат регистра UCSRC и его биты
Таким образом, ставим нолики и еденички в тех битах, тех регистрах (которые выше) и этим задаем режим работы нашего приемо-передатчика. Есть еще важный регистр, который определяет скорость передачи данных. Называется он, а точнее они регистровой парой UBRRH и UBRRL (старший и младший регистр контроллера скорости передачи). Для того чтобы задать необходимую стандартизированную скорость обмена данных между ПК и МК, нужно записатьь в эту регистровую пару коэффициент. Коэфициент расчитывается по формуле:
BAUD = fck/16(UBRR+1),
где fck - тактовая частота микроконтроллера; BAUD - скорость передачи, бит/с; UBRR - содержимое регистра контроллера скорости передачи (0...4095).
Пример:
Микроконтроллер обменивается данным с ПК. Требуемая скорость обмена 9600 бод. МК тактируется от внешнего кврцевого резонатора 16 МГц. Вопрос: что записать в регистр UBRR, чтобы скорость передачи была 9600 бод?
Все очень просто, из формулы выразим значение UBRR:
UBRR=(fck/(BAUD*16))-1 = (16000000/9600*16)-1=103
теперь получиный коэфициент запишим в регистровую пару UBRRH:UBRRL, как это показано в наше программе ниже. Число 103 в программе указано в хексе 67. Если при всем этом МК вместо правильного кода шлет непонятную ерунду, то этот симптом говорит о том, что ошибка при инициализации скорости. В этом случае перепроверьте верность расчета или инициализации скорости. Сам текст программы поясняю в коментариях к программе. Очень простая программа. Ее алгоритм: МК передает ПК данное "f0", после приема ПК пересылает данное в МК. МК отображает это данное на выходе порта С. Все это дело происходит в бесконечном цикле. Для того, чтобы МК и ПК программно стыковался применяют терминалы. Это программы, с помощью которых вы можите отсылать данное написаное вами, по каналу RS-232, принимать данные от МК и видить их у себя на мониторе. Качаем терминал здесь (COM-porttolkit) и здесь (Terminal).
Текст программы:
.include "m8535def.inc" ; подключаем библиотеку ATmega8535 .list .def INIT1=R16 ; присваиваем РОН имена .def INIT2=R17 .def TEMP=R18 .def A=R19 .def B=R20 .CSEG ; программный код расположется в сегменте памяти программ .ORG 0x0000 ; процессор стартует с нулевого адреса, а дальше пойдут вектора прерывания
rjmp Reset ; прерывания по сбросу. Прыгаем на метку Reset ;================ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЯ================ .org INT0addr ; External Interrupt 0 reti .org INT1addr ; External Interrupt 1 reti .org OC2addr ; Timer/Counter2 Compare Match reti .org OVF2addr ; Timer/Counter2 Overflow reti .org ICP1addr ; Timer/Counter1 Capture Event reti .org OC1Aaddr ; Timer/Counter1 Compare Match A reti .org OC1Baddr ; Timer/Counter1 Compare Match B reti .org OVF1addr ; Timer/Counter1 Overflow reti .org OVF0addr ; Timer/Counter0 Overflow reti .org SPIaddr ; SPI Serial Transfer Complete reti .org URXCaddr ; USART, RX Complete reti .org UDREaddr ; USART Data Register Empty reti .org UTXCaddr ; USART, TX Complete reti .org ADCCaddr ; ADC Conversion Complete reti .org ERDYaddr ; EEPROM Ready reti .org ACIaddr ; Analog Comparator reti .org TWIaddr ; Two-wire Serial Interface reti .org INT2addr ; External Interrupt Request 2 reti .org OC0addr ; TimerCounter0 Compare Match reti .org SPMRaddr ; Store Program Memory Read reti .org INT_VECTORS_SIZE ; size in words reti
;================ НАЧАЛО ИНИЦИАЛИЗАЦИИ ПЕРЕФЕРИИ=================
Reset: ldi temp,high(RAMEND) ; инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp ldi temp, 0xff ; инициализация порта С на выход out DDRC, temp ; -------------------
USART_Init: ; начало инициализации USART ldi init1,0x67 ; скорость передачи даных 9600бод при частоте кварца 16МГц ldi init2,0 out UBRRL,init1 ; установка скорости передачи данных out UBRRH,init2 ldi init1,(1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE) out UCSRB,init1 ; разрешение приемо-передачи данных, запрет прерываний ; установка формата кадра: 8 бит данных, 1 стоповых бита ldi init1,(1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1) out UCSRC,init1 ; посилка даных длинной 8 бит
ldi A,0xf0 ; этот код мы будим пересылать в ПК
USART_Transmit: sbis UCSRA,UDRE ;ожидание, пока буфер данных не очистится rjmp USART_Transmit out UDR,A ; передача кода ; Прием кода данных из ПК Priem_koda: sbis UCSRA,RXC rjmp Priem_koda in B,UDR ; считываем то,что нам прислал ПК out PORTC,B ; принятый код с ПК выводим на выводы порта С rjmp USART_Transmit ;конец цикла, переход на его начало
|