Прости устройства - WinAVR Console I-O

Става дума за конзолен I/O. Имам предвид организацията на обмена на информация между микроконтролера и терминалната програма. Последният е наличен във всяка версия на Windows и се наричаHyper Terminal или нещо подобно, за повечето задачи от реалния свят това е повече от достатъчно. Връзката традиционно се осъществява чрез COM порт и няма значение как се изпълнява: дали ще бъде хардуерен RS-232 порт на дънната платка, USB-RS232 адаптерен кабел или FTDI чип във връзка с микроконтролер.
Основният проблем се вижда в програмата за микроконтролера. Почитателите на CVAVR, като щракнат няколко пъти с мишката, с помощта на съветника, получават празна програма, в която функциитеsprintf иscanf вече работят чрезUSART. Ще докажа, че при използване наWinAVR подобен резултат няма да бъде постигнат по-трудно.
И така, изтеглете архива, в който подготвих три файла. Ще трябва да копирате тези файлове в папката на вашия проект, въпреки че бих препоръчал да поставите файлаavr_helper.h в папката със заглавки "system" (в папкатаavr\include\ в папката, където е инсталиранWinAVR ), тъй като той съдържа редица универсални макроси, които ще ви бъдат полезни по-често, отколкото имате нужда от конзолен I/O.
Файлътcom_io.c трябва да бъде включен в проекта за компилация: ако работите сmakefile, добавете го към реда с други източници, а ако използватеAVR Studio, добавете го към проекта по традиционния начин. Потребителите на Eclipse няма да трябва да полагат никакви усилия - всички източници от папката на проекта се добавят автоматично (по подразбиране) към компилирания списък.
Другият файлcom_io.h трябва да бъде леко редактиран и след това да бъде включен с директивата#include във всеки файл в проекта, който трябва да работи с конзолен I/O. Редактирането на този файл изпълнява задачата на CVAVR Wizard за конфигуриране на необходимите I/O параметри:
Всъщност това е всичко, което трябва да направите (. ), така че във вашия проект всички функции на семействотоprintf да извеждат чрез USART към терминала и всички функции на семействотоscanf да въвеждат данни от конзолата (разбира се, за да работи входът, константатаONLY_OUT трябва да съдържа нулева стойност).
Искам веднага да ви предупредя за някои точки, които могат да изненадат начинаещите програмисти:
- За да поддържатprintf иscanf, автоматично се включват библиотеки, които увеличават получения код с около 1,5 килобайта (увеличението може да е различно за различните типове микроконтролери).
- По подразбиранеsprintf иscanf не поддържат работа с числаfloat иdouble – ако трябва да ги използвате за вход/изход, трябва да принудите библиотеката за поддръжка на плаваща запетая (вижте документацията за WinAVR). Поддръжката на float ще добави още един или два килобайта към вашия проект.
- Според стандарта C функциитеprintf иscanf са блокиращи функции, те няматняма "вградено" буфериране. Това означава буквално следното: ако зададете скоростта на обмен на 300 бода и решите да изведете низ от 100 знака, тогава този процес ще отнеме повече от 3 секунди. При въвеждане функциятаscanf няма да се върне, докато не бъдат въведени всички необходими данни.
- По подразбиране се прави така, че знакът'\r' автоматично да се добавя към всеки знак'\n'. Ако не ви трябва, трябва да намерите и промените функциятаuart_putchar във файлаcom_io.c.
- Моят код не отчита възможността за наличие на повече от единUART /USART модул в микроконтролера. Ако вашият MC има два или повече от тези модули, ще трябва да коригирате макросаINIT(7) във файлаcom_io.c, като промените имената на регистрите с тези, от които се нуждаете, например заменетеUCSRA сUCSR0A илиUCSR1A в зависимост от броя на използванитеUSART.
Надявам се, че сега всички наистина са убедени, че нуждата от всякакви автоматични генератори на изходен код не е толкова голяма. За разлика от "библиотеките" на CVAVR, изходният код на въпросния модул е напълно отворен и може да се редактира, така че е лесно да го модифицирате, за да отговаря на вашите нужди, например да внедрите изход към един модулUSART и вход към друг.
Отделна бележка за тези, които обичат да тестват всичко „в Proteus“. От версия на версия proteus извлича една и съща грешка в своя AVR симулатор: когато извършва твърдо нулиране, той не настройва регистритеUART /USART в състоянието, предписано от листа с данни. Следователно във файлаcom_io.c в макросаINIT(7) можете да видите, така да се каже, „допълнителни“ оператори, които задават първоначалните стойности на регистрите - без това симулацията в proteus няма да работи, въпреки че „вхардуер "всичко е наред без тези оператори. Ако няколко допълнителни байта във вашия код не са решаващи, препоръчвам да не променяте нищо в кода за „съвместимост с proteus“.
В заключение на статията предлагам малък пример, известната helloword:
printf("\nХаресвам WinAVR!\n");
А сега се опитайте да кажете, че конзолният I/O в WinAVR е труден!