В този урок ще установим последователна комуникация между два ATMEGA8 микроконтролера. Установената тук комуникация е тип UART (Universal Asynchronous Receiver Transmitter). Чрез тази серийна комуникация данните могат да се споделят между два микроконтролера, което се изисква в различни вградени системи.
Необходими компоненти
Хардуер: ATMEGA8 (2 броя), захранване (5v), AVR-ISP PROGRAMMER, 100uF кондензатор (свързан през захранването), 1KΩ резистор (два броя), LED, бутон.
Софтуер: Atmel studio 6.1, progisp или flash magic.
Електрическа схема и обяснение
Нека разберем серийната комуникация в AVR микроконтролери. Тук ATMEGA изпраща данни към другия ATMEGA последователно. Той има друг режим на комуникация, но за лесна комуникация избираме RS232. ПИН RS232 на първия ATMEGA8 е свързан с RXD пин на втория ATMEGA8.
Установената комуникация на данни е програмирана да има:
- Осем бита за данни
- Два стоп бита
- Няма бит за проверка на паритета
- Скорост на предаване от 2400 BPS (бита в секунда)
- Асинхронна комуникация (без споделяне на часовника между два ATMEGA8)
Така че имаме два зададени регистъра за два ATMEGA8 по различен начин, където единият действа като ПРЕДАВАТЕЛ, а другият действа като ПРИЕМНИК.
Сега за RS232 взаимодействието между два микроконтролера ATmega, следните функции трябва да бъдат изпълнени за ПРЕДАВАТЕЛЯ и ПРИЕМНИКА:
1. TXD щифтът (функция за получаване на данни) на първия контролер трябва да бъде активиран за TRANSMITTER, а RXD щифтът на втория контролер трябва да бъде активиран за RECEIVER.
2. Тъй като комуникацията е серийна, трябва да знаем всеки път, когато се получи байтът с данни, за да можем да спрем програмата, докато не бъде получен целият байт. Това се прави, като се даде възможност на данните да получават пълно прекъсване.
3. ДАННИТЕ се предават и получават на контролера в 8-битов режим. Така че два знака ще бъдат изпратени на контролера наведнъж.
4. Няма битове за паритет, един стоп бит в данните, изпратени от модула.
Горните функции са зададени в регистрите на контролера; ще ги обсъдим накратко,
ТЪМО СИВО (UDRE): (TRASMITTER SIDE) Този бит не е зададен по време на стартиране, но се използва по време на работа, за да се провери дали предавателят е готов за предаване или не. Вижте програмата на TRASMITTER SIDE за повече подробности.
LIGHT GREY (RXC): (RECEIVING SIDE) Този бит не е зададен по време на стартиране, но се използва по време на работа, за да се провери дали приемникът е готов да получи данни или не. Вижте програмата на ПОЛУЧАВАНЕ НА СТРАНА за повече подробности.
VOILET (TXEN): (TRASMITTER SIDE) Този бит е настроен за активиране на щифта на предавателя от TRASMITTER SIDE.
ЧЕРВЕНО (RXEN): (ПОЛУЧАВАЩА СТРАНА) Този бит представлява функция за получаване на данни, този бит трябва да бъде зададен, за да могат данните от модула да се получават от контролера, а също така позволява RXD щифт на контролера.
BROWN (RXCIE): Този бит трябва да бъде настроен за получаване на прекъсване след успешно приемане на данни. Чрез активирането на този бит ние опознаваме веднага след получаване на 8-битови данни. Няма да използваме този бит тук, така че той е оставен сам.
PINK (URSEL): Този бит трябва да бъде зададен преди да се активират други битове в UCSRC, след като се зададат други необходими битове в UCSRC; URSEL трябва да бъде деактивиран или нулев. Няма да използваме този бит тук, така че той е оставен сам.
ЖЪЛТ (UCSZ0, UCSZ1, UCSZ2): (ПОЛУЧАВАНЕ НА СТРАНА И ТРАНСМИТЪР СТРАНА) Тези три бита се използват за избор на броя битове за данни, които получаваме или изпращаме с едно движение.
Комуникацията между два ATMEGA се установява като осембитова комуникация. Чрез съвпадение на комуникацията с таблица, която имаме, UCSZ0, UCSZ1 на едно и UCSZ2 на нула.
Трябва да ги настроим както на приемащата, така и на предаващата страна.
ORANGE (UMSEL): (RECEIVING SIDE & TRASMITTER SIDE) Този бит се задава въз основа на това дали системата комуникира асинхронно (и двете използват различен часовник) или синхронно (и двете използват един и същ часовник).
И двата контролера не споделят никакъв часовник. Тъй като и двамата използват собствен вътрешен часовник. Така че трябва да зададем UMSEL на 0 в двата контролера.
ЗЕЛЕНО (UPM1, UPM0): (ПОЛУЧАВАНЕ НА СТРАНА И ТРАНСМИТЕР СТРАНА) Тези два бита се регулират въз основа на битовия паритет, който използваме в комуникацията.
ATMEGA е програмиран да изпраща данни без паритет, тъй като дължината на предаване на данни е малка, можем ясно да очакваме загуба или грешка в данните. Така че ние не поставяме никакъв паритет тук. Така че настройваме и двете UPM1, UPM0 на нула или те са останали, защото всички битове са 0 по подразбиране..
СИН (USB): (ПОЛУЧАВАНЕ НА СТРАНА И ТРАНСМИТЪР СТРАНА) Този бит се използва за избор на броя стоп битове, които използваме по време на комуникацията.
Установената тук комуникация е от асинхронен тип, така че за да получите по-точно предаване и приемане на данни, трябва да използваме два стоп бита, следователно ние задаваме USBS на '1' и в двата контролера.
Скоростта на предаване се задава в контролера чрез избор на подходящия UBRRH.
Стойността на UBRRH се избира чрез скорост на кръстосана препратка и честота на кристала на процесора.
Така че чрез кръстосана препратка стойността на UBRR се разглежда като '25' и така се задава скоростта на предаване.
Както е показано в схемата, бутон е свързан от страната на предавателя. Когато този бутон е натиснат, осем битови данни се изпращат от ПРЕДАВАТЕЛ и тези данни се получават от ПРИЕМНИК. При успешно получаване на тези данни той включва и изключва светодиода, свързан към него, което показва успешен трансфер на данни между два контролера.