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

прости
Програмирането с щракване с мишката е толкова вкоренено в съзнанието на съвременните компютърни потребители, че много начинаещи програмисти на микроконтролери намират WinAVR за много сложен и неудобен, докато CVAVR, напротив, е много прост и удобен. Мнението ми за CVAVR е негативно, но не и за това сега. Ще се опитам да покажа, че решаването на много типични проблеми в WinAVR не може да бъде по-трудно от използването на плодовете на Code Wizard от CVAVR.

Става дума за конзолен 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 трябва да съдържа нулева стойност).

Искам веднага да ви предупредя за някои точки, които могат да изненадат начинаещите програмисти:

  1. За да поддържатprintf иscanf, автоматично се включват библиотеки, които увеличават получения код с около 1,5 килобайта (увеличението може да е различно за различните типове микроконтролери).
  2. По подразбиранеsprintf иscanf не поддържат работа с числаfloat иdouble – ако трябва да ги използвате за вход/изход, трябва да принудите библиотеката за поддръжка на плаваща запетая (вижте документацията за WinAVR). Поддръжката на float ще добави още един или два килобайта към вашия проект.
  3. Според стандарта C функциитеprintf иscanf са блокиращи функции, те няматняма "вградено" буфериране. Това означава буквално следното: ако зададете скоростта на обмен на 300 бода и решите да изведете низ от 100 знака, тогава този процес ще отнеме повече от 3 секунди. При въвеждане функциятаscanf няма да се върне, докато не бъдат въведени всички необходими данни.
  4. По подразбиране се прави така, че знакът'\r' автоматично да се добавя към всеки знак'\n'. Ако не ви трябва, трябва да намерите и промените функциятаuart_putchar във файлаcom_io.c.
  5. Моят код не отчита възможността за наличие на повече от един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 е труден!