- Изисквания:
- Програмиране на PIC микроконтролер за UART комуникация:
- Симулиране на нашата програма:
- Хардуерна настройка и тестване на изхода:
В този урок се научаваме да активираме UART комуникацията с PIC Microcontroller и как да прехвърляме данни към и от вашия компютър. Досега сме обхванали всички основни модули като ADC, таймери, ШИМ и също така сме се научили как да свързваме LCD и 7-сегментни дисплеи. Сега ще оборудваме себе си с нов инструмент за комуникация, наречен UART, който се използва широко в повечето проекти на микроконтролера. Проверете тук нашите пълни уроци за PIC микроконтролер, използващи MPLAB и XC8.
Тук използвахме PIC16F877A MCU, той има модул, наречен „Адресируем универсален синхронен асинхронен приемник и предавател“, известен накратко като USART. USART е двупроводна комуникационна система, при която данните се предават последователно. USART също е пълнодуплексна комуникация, означава, че можете да изпращате и получавате данни едновременно, които могат да се използват за комуникация с периферни устройства, като CRT терминали и персонални компютри.
В USART може да бъде конфигуриран в следните режими:
- Асинхронен (пълен дуплекс)
- Синхронен - главен (полудуплекс)
- Синхронно - подчинен (полудуплекс)
Има и два различни режима, а именно 8-битов и 9-битов режим, в този урок ще конфигурираме модула USART да работи в асинхронен режим с 8-битова комуникационна система, тъй като това е най-използваният тип комуникация. Тъй като е асинхронен, не е необходимо да изпраща часовник заедно със сигналите за данни. UART използва две линии за данни за изпращане (Tx) и получаване (Rx) данни. Заземяването на двете устройства също трябва да бъде общо. Този тип комуникация не споделя общ часовник, поради което общата основа е много важна за работата на системата.
В края на този урок ще можете да установите комуникация (UART) между вашия компютър и вашия PIC микроконтролер и да превключите светодиод на PIC платката от вашия лаптоп. Състоянието на светодиода ще бъде изпратено на вашия лаптоп от PIC MCU. Ще тестваме изхода, използвайки Hyper Terminal в компютъра. Подробно видео е дадено и в края на този урок.
Изисквания:
Хардуер:
- PIC16F877A Perf Board
- RS232 към USB конвертор Модул
- Компютър
- Програмист PICkit 3
Софтуер:
- MPLABX
- HyperTerminal
За преобразуване на серийните данни в компютърно четима форма е необходим RS232 към USB конвертор. Има начини да проектирате своя собствена схема, вместо да купувате собствен модул, но те не са надеждни, тъй като са подложени на шум. Този, който използваме, е показан по-долу
Забележка: Всеки RS232 към USB конвертор ще изисква инсталиране на специален драйвер; повечето от тях трябва да се инсталират автоматично веднага щом включите устройството. Но, ако не се отпусне !!! Използвайте раздела за коментари и аз ще ви помогна.
Програмиране на PIC микроконтролер за UART комуникация:
Подобно на всички модули (ADC, таймер, ШИМ), ние също трябва да инициализираме нашия USART модул на нашия PIC16F877A MCU и да го инструктираме да работи в UART 8-битов комуникационен режим. Нека дефинираме конфигурационните битове и да започнем с функцията за инициализация на UART.
Инициализиране на UART модула на микроконтролера PIC:
Щифтовете Tx и Rx присъстват физически на щифтовете RC6 и RC7. Според листа с данни нека декларираме TX като изход и RX като вход.
// **** Настройване на I / O щифтове за UART **** // TRISC6 = 0; // TX щифт зададен като изход TRISC7 = 1; // RX Pin зададен като вход // ________ I / O щифтове __________ //
Сега трябва да се настрои скоростта на предаване. Скоростта на предаване е скоростта, с която информацията се прехвърля в комуникационен канал. Това може да е една от многото стойности по подразбиране, но в тази програма ние използваме 9600, тъй като е най-използваната скорост на предаване.
/ ** Инициализирайте регистъра на SPBRG за необходимата скорост на предаване и задайте BRGH за бърза скорост на предаване ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // за висока скорост на предаване // _________ Настройка на края на скоростта на предаване _________ //
Стойността на скоростта на предаване трябва да бъде зададена с помощта на регистъра SPBRG, стойността зависи от стойността на външната кристална честота, формулите за изчисляване на скоростта на предаване са показани по-долу:
SPBRG = ((_XTAL_FREQ / 16) / скорост на предаване) - 1;
Битът BRGH трябва да се повиши, за да се даде възможност за висока скорост на предаване. Според листа с данни (стр. 13) винаги е изгодно да го активирате, тъй като може да премахне грешки по време на комуникация.
Както казахме по-рано, ще работим в асинхронен режим, следователно битът SYNC трябва да бъде нулев, а битът SPEM трябва да бъде висок, за да се даде възможност за серийни пинове (TRISC6 и TRICSC5)
// **** Активиране на асинхронен сериен порт ******* // SYNC = 0; // Асинхронно SPEN = 1; // Активиране на щифтове за сериен порт // _____ Асинхронен сериен порт активиран _______ //
В този урок ще изпращаме и получаваме данни между MCU и компютър, поради което трябва да активираме и TXEN, и CREN бита.
// ** Нека се подготвим за предаване и приемане ** // TXEN = 1; // активиране на предаването CREN = 1; // активиране на приемането // __ UART модул готов и готов за предаване и приемане __ //
В бита TX9 и RX9 трябва да бъдат направени нула, така че ние работим в 8-битов режим. Ако трябва да се установи висока надеждност, тогава може да се избере 9-битов режим.
// ** Изберете 8-битов режим ** // TX9 = 0; // избрано 8-битово приемане RX9 = 0; // Избран е 8-битов режим на приемане // __ Избран е 8-битов режим __ //
С това завършваме настройката си за инициализация. и е готов за работа.
Предаване на данни чрез UART:
Функцията по-долу може да се използва за предаване на данни чрез модула UART:
// ** Функция за изпращане на един байт дата към UART ** // void UART_send_char (char bt) {while (! TXIF); // задържаме програмата, докато TX буферът е свободен TXREG = bt; // Заредете буфера на предавателя с получената стойност} // _____________ Край на функцията ________________ //
След като модулът бъде инициализиран, каквато и стойност да бъде заредена в регистъра, TXREG ще бъде предадена чрез UART, но предаването може да се припокрива. Следователно винаги трябва да проверяваме за флаг за прекъсване на предаването TXIF. Само ако този бит е нисък, можем да продължим със следващия бит за предаване, иначе трябва да изчакаме този флаг да се понижи.
Горната функция обаче може да се използва само за изпращане на само един байт данни, за изпращане на пълен низ следва да се използва функцията по-долу
// ** Функция за преобразуване на низ в байт ** // void UART_send_string (char * st_pt) {while (* st_pt) // ако има char UART_send_char (* st_pt ++); // обработваме го като байтови данни} // ___________ Край на функцията ______________ //
Тази функция може да е малко сложна за разбиране, тъй като има указатели, но повярвайте ми, указателите са прекрасни и улесняват програмирането и това е един добър пример за същото.
Както можете да забележите, ние отново извикахме UART_send_char (), но сега вътре в цикъла while. Разделихме низа на отделни символи, всеки път, когато тази функция бъде извикана, един символ ще бъде изпратен до TXREG и той ще бъде предаден.
Получаване на данни чрез UART:
Следващата функция може да се използва за получаване на данни от UART модула:
// ** Функция за получаване на един байт дата от UART ** // char UART_get_char () {if (OERR) // проверяваме за грешка {CREN = 0; // Ако грешка -> Нулиране на CREN = 1; // Ако грешка -> Нулиране} докато (! RCIF); // задръжте програмата, докато RX буферът е свободен, върнете RCREG; // получаваме стойността и я изпращаме на основната функция} // _____________ Край на функцията ________________ //
Когато данните са получени от модула UART, той ги взима и съхранява в регистъра RCREG. Можем просто да прехвърлим стойността във всяка променлива и да я използваме. Но може да има грешка при припокриване или потребителят да изпраща данни непрекъснато и все още не сме ги прехвърлили на променлива.
В този случай битът за получаване на флаг RCIF идва на помощ. Този бит ще намалее всеки път, когато данните бъдат получени и все още не са обработени. Следователно ние го използваме в цикъл while, създавайки забавяне, за да задържим програмата, докато се справим с тази стойност.
Превключване на светодиода с помощта на модула UART на микроконтролера PIC:
Сега нека стигнем до последната част на Програмата, функцията void main (void) , където ще превключваме светодиод през компютъра, използвайки UART комуникацията между PIC и компютъра.
Когато изпратим символ „1“ (от компютър), светодиодът ще бъде включен и съобщението за състоянието „ЧЕРВЕН LED -> ВКЛ.“ Ще бъде изпратено обратно (от PIC MCU) към компютъра.
По същия начин изпращаме знак „0“ (от компютър) светодиодът ще бъде изключен и съобщението за състоянието „ЧЕРВЕН LED -> ИЗКЛ.“ Ще бъде изпратено обратно (от PIC MCU) към компютъра.
while (1) // Безкраен цикъл {get_value = UART_get_char (); if (get_value == '1') // Ако потребителят изпрати "1" {RB3 = 1; // Включване на LED UART_send_string ("ЧЕРВЕН LED -> ВКЛ."); // Изпращане на известие до компютъра UART_send_char (10); // ASCII стойност 10 се използва за връщане на каретката (за отпечатване в нов ред)}} if (get_value == '0') // Ако потребителят изпрати "0" {RB3 = 0; // Изключване на LED UART_send_string ("ЧЕРВЕНО -> ИЗКЛЮЧЕНО"); // Изпращане на известие до компютъра UART_send_char (10); // ASCII стойност 10 се използва за връщане на карета (за отпечатване в нов ред)}}
Симулиране на нашата програма:
Както обикновено, нека симулираме нашата програма с помощта на proteus и да разберем дали тя работи както се очаква.
Горното изображение показва виртуален терминал, в който показва поздравително съобщение и състояние на светодиода. Червеният светодиод може да се забележи, че е свързан към щифта RB3. Подробната работа на симулацията може да бъде намерена във видеото в края.
Хардуерна настройка и тестване на изхода:
Връзката за тази схема е наистина проста, ние използваме нашата PIC Perf платка и просто свързваме трите проводника към RS232 към USB конвертор и свързваме модула към нашия компютър чрез USB кабел за данни, както е показано по-долу.
След това инсталираме приложението Hyper Terminal (изтеглете го от тук) и го отворете. Трябва да показва нещо подобно
Сега отворете диспечера на устройствата на вашия компютър и проверете към кой Com порт е свързан модулът ви, моят е свързан към COM порт 17, както е показано по-долу
Забележка: Името на COM порта за вашия модул може да се промени според вашия доставчик, това не е проблем.
Сега се върнете към Hyper Terminal Application и отворете Set Up -> Port Configuration или натиснете Alt + C, за да получите следното изскачащо поле и изберете желания порт (COM17 в моя случай) в изскачащия прозорец и кликнете върху connect.
След като се установи връзката, включете вашата PIC перфоритна дъска и ще видите нещо подобно по-долу
Задръжте курсора в командния прозорец и въведете 1, след което натиснете enter. Светодиодът ще се включи и състоянието ще се покаже, както е показано по-долу.
По същия начин задръжте курсора си в командния прозорец и въведете 0, след което натиснете enter. Светодиодът ще се изключи и състоянието ще се покаже, както е показано по-долу.
По-долу са дадени пълният код и подробно видео, което ще покаже как светодиодът реагира в реално време за „1“ и „0“.
Това е, момчета, свързваме PIC UART с нашия компютър и прехвърляме данните, за да превключваме светодиода с помощта на Hyper терминал. Надявам се, че сте разбрали, ако не, използвайте раздела за коментари, за да зададете вашето запитване. В следващия урок отново ще използваме UART, но ще го направим по-интересен, като използваме Bluetooth модул и излъчваме данните по въздуха.
Също така проверете UART комуникацията между два ATmega8 микроконтролера и UART комуникацията между ATmega8 и Arduino Uno.