Связь МК с ПК через RS-232


• О проекте
• Обратная связь
• Полезные ссылки
• Полезные программы
• Друзья сайта


Последние комментарии

Аби: Подключение микроконтроллеров к шине RS-485
написано просто о...

Анатолий: Джойстик для денди на stm32
Автору 100500 рес...




           

Библиотека для AVR





AXLIB Генератор





Помощь сайту


				

Связь МК с ПК через RS-232

	
	
	

Дата: 5 Февраля 2013. Автор: КонтроллЁр

	
	
Здравствуйте уважаемые посетители сайта. Как-то я начал уж слишком торжественно) Значит решил я поделиться своими попытками освоить RS-232. Кто не знает, это COM-порт который торчит сзади у любого ПК. (Ну не у любого...) Если вдруг у вас нет такого порта, то можно воспользоваться переходником USB-RS232. Коих сейчас навалом и работают они довольно сносно. Далее давайте взглянем на схему.


Что я тут изобразил. А вот что. Здесь "классическая" схема LM7805+ATtiny2313+MAX232. Что это такое? Да все просто, чтобы соединить МК с СОМ-портом нужно три провода. RXD - принимает данные, TXD - передает данные и GND - объяснения не требует) Но тут есть одно НО... Уровни сигналов МК не превышают +5вольт, а вот на СОМ-порту мы встретим +12в и -12в. Ну как-то МК будет жарковато от такого. Что же делать? Для сопряжения МК с СОМ-портом была придумана замечательная микросхема фирмы "Maxim" MAX232. Что в ней хорошего. А вот что. Для ее включения нам потребуется лишь пять конденсаторов на 1 мкФ и все. (Смотрим схему выше) Дальше просто через микросхему пропускаем наши провода и все, микросхема сама разберется какие где уровни выставить. На схеме показан разъем DB-9 уже перевернутый. То есть TXD(МК) идет на RXD(ПК), а RXD(МК) идет на TXD(ПК). Можно конечно и прямой спаять но тогда нужен будет нуль-модемный кабель. Ну вроде с железом разобрались, давайте перейдем к программе.

Сначала перейдем к настройке среды программирования. Запускаем CodeVisionAVR. (Надеюсь он у вас установлен) Далее выбираем новый проект и соглашаемся с созданием визордом начального кода. Далее выбираем наш МК и частоту кварца.


Теперь переходим на вкладку USART и заполняем как на рисунке ниже.


Теперь отвечу на вопрос самых не терпеливых, почему такое смешное значение кварца мы выбрали на вкладке Chip. Если взглянуть на вкладку USART на надпись "Boud Rate Error: 0,0%", то должно стать понятно почему. Для работы UART требуется указать битрейт (сколько бит пробежит за секунду) Мы выбрали 38400. Теперь нам надо рассчитать частоту кварца. Для этого есть формула:
BOUD = fck/16(UBRR+1)
То есть битрейт равен частоте кварца деленной на 16 и сумму UBRR с 1. Вроде все ясно, кроме регистра UBRR который отвечает за контроль скорости передачи. Можно конечно в лоб поставить кварц на 4МГц и посчитать UBRR, но он получится не целым числом и при передаче будут возникать ошибки. Вот поэтому и есть в природе такие смешные кварцы. Ну чтож, давайте посчитаем наш UBRR. Судя из формулы после долгих школьных выводов алгебры мы получаем:
UBRR = (fck/(16*BOUD))-1
Подставляем наши значения:
UBRR = (3686400/(16*38400))-1 = 5
Замечательно, а теперь давайте взглянем на то что нам сгенерил визард.


А теперь давайте попробуем посчитать, если бы мы выбрали 4МГц.
UBRR = (4000000/(16*38400))-1 = 5,51
Ну вот видите какое число получили. Ну с этим разобрались, поехали дальше. После долгих расчетов давайте попробуем что-нибудь вывести на ружу. Поднимитесь на самый верх и найдите строку:

// Declare your local variables here

После этого комментария допишите следующею строку:

char x, y;

Этой строкой мы про инициализировали две локальные переменные х и у. Теперь идем вниз и в тело основного цикла впишем такой код:


if(x == y)     
    { 
        x = getchar();  
    }
else
    { 
        putchar(x); 
        y = x;
    }


Что мы тут получили. Сначала мы сравниваем значение х и у. Если они равны, то в переменную х пытаемся занести данные из UART, а если не равны, то вычитываем значение из порта и приравниваем значения у к новому х. Решение конечно не из лучших, но для понимания и визуализации проекта допустимо. Как вы заметили для записи значения в СОМ-порт нужно лишь вызвать функцию putchar(char x); и передать ей передоваемое значение вида char. Для чтения из СОМ-порта, нужно вызвать функцию getchar(); которая вернет текущее значение из СОМ-порта. Вот как это выглядит в терминале Proteus.


Помните что UART это по сути 8-битные сдвиговый регистр. И вталкивать туда int-ы бессмысленно. Вот вроде и все, пишите в коменты если что непонятно.



Денис    14.12.13

Частота 3,686400 МГц где-то в коде указывается? Или нужно искать кварц с такой частотой?

Алексей    15.12.13

Нужен кварц такой. Такая частота нужна для минимизации ошибок. Продаётся в любом радио магазине.

Денис    16.12.13

А если без кварца задать такую частоту у МК, то работать будет без ошибок? Или МК только на фиксированной частоте работает?

Алексей    16.12.13

Внутренний генератор сильно плавает, а для UART это не приемлемо. Установка кварца обязательно!

Calc    29.01.14

искать например HC49S-7.3728MHZ

Павел    26.09.16 13:00

Хорошая статья, сразу все дошло, спасибо)




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  







Рейтинг@Mail.ru Яндекс.Метрика