Сенсорный модуль на avr

Еще раз о емкостных сенсорах.

Несмотря на то, что, как мне кажется, тема емкостных сенсоров прикосновения досточно подробно рассмотрена во множестве публикаций, в комментариях к одной из моих статей прозвучала просьба рассказать про это еще раз. Ну что же, раз есть интерес, значит, еще одна статья по этой теме не будет лишней.

Вообще говоря, существует много емкостных методик определения касания. Самый древний подход — определение касания по наводкам от силовой сети, которые всегда присутствуют на теле человека (если он, конечно, не находится в чистом поле). Во вторую группу можно выделить QTouch’еобразные (основанные на перекачивании в накопительный конденсатор заряда с сенсора и последующем измерении его величины) подходы, отличающиеся алгоритмами обработки, формой датчиков, подходом к фильтрации помех, etc. Посмотреть на реализацию такой системы на коленке, а также почитать подробное описание идеи работы такой системы на русском можно тут. В этой же статье нас будет интересовать третий подход, менее продвинутый, но гораздо более простой относительно второго и надежный относительно первого — непосредственное измерение емкости пластины сенсора. В принципе, и об этом уже писал Elm-Chan. Но попробуем повторить то же самое по-русски и не глядя в чужие исходники.

Для опыта я буду использовать свою макетку с установленной ATmega48, так что пример будет под AVR.

Итак, идея состоит в том, что любой объект имеет емкость, а современные микроконтроллеры работают на такой скорости, которая позволяет измерить емкость даже отдельного кусочка фольги размером 1х1 см. — примерно такого размера обычно выбирается сенсор в этом методе, очевидно, по размеру пальца, ибо подобный подход пригоден прежде всего для реализации отдельных сенсорных кнопок. Когда к такой кнопке прикасается человек, ее емкость существенно возрастает, что и регистрирует контроллер, принимая решение о нажатии. Итак, включим все следующим образом:

Ножка микроконтроллера подтягивается к питанию резистором достаточно большого номинала (1 мегаом), и к ней же подключается площадка сенсора. Оценка емкости производится путем измерения времени заряда площадки до напряжения логической единицы — это возможно, поскольку выводы микроконтроллера обладают пороговыми свойствами, т.е., в регистре PIN будет читаться единица начиная с какого-то определенного уровня (около 1В, немного различается для разных кристаллов). Алгоритм опроса такого сенсора выглядит следующим образом:

1. Настроить ножку на выход;
2. Подать на нее логический ноль, чтобы гарантированно разрядить сенсор перед замером;
3. Настроить ножку на вход;
4. Посчитать, за сколько тактов напряжение на ней достигнет единицы.

Все вышесказанное я воплотил в такой код:

SNS_DDR, SNS_PORT и подобные — имена, заданные дефайнами. В функцию передается битовая маска вывода, который нужно опросить, что делает ее универсальной для опроса нескольких кнопок.

Но после опроса нам надо решить, нажата кнопка или нет. Очевидный подход — найти количество тактов цикла, соответствующее порогу нажатия, и сравнивать полученное значение с ним. Но такое решение получится нестабильным, потому что порог будет зависеть от силы нажатия на сенсор (рука эластична, с изменением силы нажатия меняется площадь соприкосновения, а, следовательно, и емкость). Потому лучше ввести гитерезис: выбрать значение, ниже которого сенсор гарантированно свободен, и значение, зарегистрировав число выше которого можно точно сказать, что к площадке прикасаются, после чего делать вывод, сравнивая результат опроса с этими двумя значениями. Возможно, звучит громоздко, но, надеюсь, код внесет ясность:

1. Опрашиваем сенсор;
2. Если значение выше порога касания — регистрируем касание и запоминаем это.
3. Если значение ниже порога свободного сенсора — регистрируем пустой сенсор и запоминаем это.
4. Выдаем запомненное значение.

В этом случае между крайними положениями будет считаться, что сенсор находится в предыдущем гарантированном состоянии. Такой подход повышает четкость срабатывания датчика.

Вышеприведенные участки кода — фрагменты проекта, который я по-быстрому набросал в AVR Studio + WinAVR и который приложен в аттаче.

Подключение сенсорного экрана к микроконтроллеру AVR

Сенсорные экраны (Touch Screen) находят все большее применение — это устройство ввода информации представляет собой экран, реагирующий на прикосновения к нему.

Существует несколько разных типов сенсорных экранов, которые работают на разных физических принципах: резистивные сенсорные экраны, матричные сенсорные экраны, емкостные сенсорные экраны, проекционно-емкостные сенсорные экраны, оптические сенсорные экраны.

Мы рассмотрим подключение четырехпроводного сенсорного экрана к микроконтроллеру AVR, на котором реализуем сенсорный USB интерфейс для подключения к компьютеру для реализации сенсорной мышки. Данный тип сенсорного экрана используется, например, в игровой приставке PlayStation Portable (PSP) или Nintendo DS.

Для нашего проекта потребуется:

  • микроконтроллер ATmega168 (или ATmega328);
  • кварцевый резонатор 16 МГц;
  • монтажная плата для 28-выводных микроконтроллеров AVR (использовалась макетная плата OlimexAVR-P28);
  • программатор микроконтроллеров AVR;
  • плата с установленным разъемом miniB USB;
  • сенсорный экран от игровой приставки PSP;
  • коннектор для подключения сенсорного экрана;
  • два резистора номиналом 68 Ом, один резистор номиналом 1.5 кОм;
  • соединительные провода.

Резистивный сенсорный экран состоит из стеклянной панели и гибкой пластиковой мембраны. И на панель, и на мембрану нанесено резистивное покрытие.

Пространство между стеклом и мембраной заполнено микроизоляторами, которые равномерно распределены по активной области экрана и надежно изолируют проводящие поверхности. Когда на экран нажимают, панель и мембрана замыкаются, и контроллер с помощью аналогово-цифрового преобразователя регистрирует изменение сопротивления и преобразует его в координаты прикосновения (X и Y). В общих чертах алгоритм считывания таков:

  1. На верхний электрод подается напряжение +5 В, нижний заземляется. Левый с правым соединяются накоротко и проверяется напряжение на них. Это напряжение соответствует Y-координате экрана.
  2. Аналогично на левый и правый электрод подается +5 В и «земля», с верхнего и нижнего считывается X-координата.

Алгоритм работы показан на иллюстрации ниже.

Как видно, работа данного алгоритма означает, что электроды должны непрерывно переключаться, чтобы быстро определить координаты. Подключение сенсорного экрана была выбрано следующее:

Выводы сенсорного
экрана ВОВ-09224)

Соответствие выводов
для чтения координаты X

Соответствие выводов
для чтения координаты Y

Подключение очень простое – прямое подключение сенсорного экрана к линиям ввода/вывода микроконтроллера, но заметьте (как видно из таблицы), два из них обязательно должны быть подключены к входным каналам АЦП. Питание сенсорного экрана подается через вывод микроконтроллера, подтянутый к 5 В и другой вывода микроконтроллера, подтянутый к GND.

Для реализации интерфейса USB HID требуется несколько резисторов подключенных к двум выводам внешних прерываний микроконтроллера ATMega168, а также следует учесть, что вывод USB порта D+ подключен к выводу INT0 микроконтроллера.

Реализация USB HID интерфейса на микроконтроллерах AVR возможна с помощью библиотеки V-USB. Более подробная информация: Objective Development. На страничке загрузок Вы можете найти данные библиотеки, исходные файлы, примеры использования и полезную документацию, а также все необходимые рекомендации для применения библиотеки в своих устройствах.

Первоначальная задача при разработке кода для микроконтроллера – убедиться, что мы можем получить надежные координаты от сенсорного экрана, прежде чем организовывать передачу данных по интерфейсу USB. Вы можете скачать исходный код программы микроконтроллера для чтения данных АЦП от сенсорного экрана.

Читайте также  Программирование мк avr в ос ubuntu

В основном, требуется два обращения к АЦП, одно для координаты X, второе – для координаты Y. Однако, мы не можем просто установить надолго один вывод сенсорного экрана на один канал АЦП, выводы должны будут постоянно меняться.

Была написана функция для каждой координаты, которая меняет соответствие выводов и производит чтение данных АЦП.

void read_x(void)
<
DDRC = 0b00010010; // Output on PC4(5V) and PC1(GND), Input on PC4(ADC)
sbi(PORTC, 4); //pull PC4 to 5V
cbi(PORTC, 1); //pull PC1 to GND

_delay_ms(1); //wait for screen to initialize

В этом случае, нам потребуется лишь глобальная переменная h для значений АЦП.

Задержка после переназначения соответствия выводов порта важна. Было обнаружено, что без включения задержки, значения АЦП были не последовательны и имели место отклонения. Связано это с тем, что мы подаем питание на одну из линий сенсорного экрана, а затем быстро переключаемся на входной канал АЦП. Задержка в 1 мс решила данную проблему.

Теперь, когда мы знаем что аппаратная и программная часть обслуживающая сенсорный экран работает, мы можем приступить к использованию полученных данных в вычислении движения для нашей сенсорной «мыши». Для проекта был использован пример кода для реализации USB мышки. Он реализован для такой же архитектуры, которую используем мы: целевой микроконтроллер, тактовая частота, Fuse-биты, поэтому никаких изменений в make-файле делать не требовалось.

Как же применить данные, полученные от АЦП, для реализации движения мышки.

В основной программе (main.c) используется член dx структуры reportbuffer как значение скорости по оси X (также для оси Y). В основном, нам необходимо загрузить 8-битное значение со знаком в reportbuffer.dx и это переместит курсор мыши на некоторой скорости.

Код для микроконтроллера реализует следующее:

  • включает таймер для отсчета интервалов чтения АЦП;
  • заполняет небольшой буфер значениями данных АЦП;
  • вычисляет разность последовательных данных для определения направления движения;
  • запускает алгоритмы сравнения и выражения проверки условий;
  • вычисляет скорость;
  • загружает данные в буфер reportbuffer.dx.

Однако, была некоторая проблема: данные от АЦП – это 10-битные значения без знака, которые загружаются в переменные h и hl. Когда мы делаем вычисления, сравнения и другие операции для определения направления движения, то должны использовать знаковые или беззнаковые 8-битные, 16-битные или long-значения. Это создает относительно большие проблемы в ходе любых операций между бинарными значениями с различной размерностью. В целом, было необходимо преобразовать беззнаковый 10-битный результат АЦП в 8-битный беззнаковый. Выражение ниже реализует эту операцию:

Другая проблема выявлена в ходе отладки – прерывания, вызываемые процедурой printf, конфликтовали с прерываниями USB, поэтому невозможно было отображать целые значения, необходимые для отладки. Решение – написание кода для последовательной отладки с библиотеками USB.

Исходный код программы микроконтроллера — USB Touchscreen Mouse

Исходный код и hex.-файл для отладки — SerialDebug USB Touchscreen Mouse (чтение данных АЦП)

Перевод: Vadim по заказу РадиоЛоцман

cool-hacker › Блог › Емкостный сенсор на микроконтроллерах AVR и задержка итерациями. Примеры на Attiny13

Приветствую, любитель микроконтроллеров!

Вступление
Я продолжаю воплощать в жизнь свой первый, когда-то заброшенный, проект на микроконтроллере — лампу настроения. И, как и обещал в прошлый раз, по ходу разработки пишу небольшие заметки для начинающих. В этот раз рассмотрим как реализуется емкостный сенсор и задержки тех или иных операций итерациями основного цикла. Что касается самого проекта, могу сказать, что на данный момент написана полностью рабочая прошивка. Остается дело за схемой, печаткой и тестированием в нормальном железе. Затем выложу все на ваш суд.

Сенсорная кнопка
Принцип сенсорной кнопки прост. Берем небольшую площадку не важно какой формы, я взял кусок фольгированного текстолита (далее — кнопка). Подпаиваем к ней резистор большого номинала, порядка 1 МОм. И подключаем кнопку через этот резистор к питанию. Подпаиваем к кнопке провод, который соединит кнопку с ножкой микроконтроллера (далее — МК). Площадку изолируем тонким изолятором, хотя и без него будет работать. Площадка кнопки имеет определенную емкость, которая увеличивается, когда на ней находится палец человека.

Алгоритм работы следующий:
1. Переводим ногу МК в режим выхода.
2. Подаем низкий уровень, чтобы разрядить емкость кнопки.
3. Переводим ногу МК в режим входа и ждем когда емкость кнопки зарядится через резистор 1 МОм и на входе появится верхний уровень. Ожидание производится в цикле, в котором инкрементируется счетчик.
4. Сенсор зарядился — по значению счетчика можно судить о состоянии сенсора.

Обратите внимание, что подсчет итераций идет в атомарном блоке. Это значит, что в это время не будут срабатывать прерывания и не собьют нам время заряда сенсора.

Теперь для использования нашего алгоритма нам необходимо определить порог срабатывания кнопки. Для этого при инициализации мы выполняем калибровку. И берем в качестве порогового — значение на четверть большее, чем возвращается при свободном сенсоре.

Я проверял, на пустом сенсоре функция у меня возвращает стабильно 15. А когда кладешь на сенсор палец — около 30. Значит порог у нас будет где-то 15 + 15/4 = 18.

Ну а далее, в основном цикле программы нам остается проверять состояние сенсора и сравнивать его с пороговым значением. Если превысило — кнопка нажата, нужно отреагировать.

При необходимости, нужно в блок обработки нажатия добавить задержку, чтобы обработка не срабатывала несколько раз подряд.

Я, в течении нескольких дней, пользовался кнопкой, пока отлаживал прошивку для лампы — сенсор срабатывает четко!

Задержка итерациями основного цикла
Иногда в основном цикле требуется периодически производить какие-то действия с большой задержкой. Скажем 2 секунды. Однако, просто «спать» при этом нельзя, потому что можно проворонить, скажем, нажатие на сенсорную кнопку или другое событие. В этом случае есть простой выход. Берем счетчик, выставляем его в некоторое значение и каждую итерацию основного цикла декрементируем. Как только счетчик стал равен нулю — наша задержка истекла и пришло время для нашего действия. В основном цикле можно добавить минимальную задержку, которая не сделает появление ожидаемого события критическим.

Таким образом, с помощью счетчиков легко организовать различные задержки в основном цикле программы, не проворонив при этом критических событий и не расходуя драгоценные байты на дорогостоящие функции delay.

Результат
Дабы разбавить сухой текст, я хочу показать результат сегодняшнего урока наглядно. Т.к. я делаю лампу настроения, то я использовал RGB-светодиод. В основном цикле будем менять 7 цветов радуги + розовый по кругу. А при нажатии на сенсорную кнопку будем просто моргать белым цветом. Микроконтроллер будет работать на частоте 9.6 МГц, для этого достаточно от фьюзов по умолчанию убрать делитель на 8 (сделать CKDIV8 = 1). Фьюз байты удобно рассчитывать вот этим калькулятором.

Задержка между сменами цветов реализована циклами. Регулировка яркости светодиода реализована с помощью бинарной модуляции, о которой и подробно писал в прошлый раз.

Читайте также  Плавный пуск ламп накаливания

Схема для модуляции в протеусе получилась немного отличающейся от реальной картины: пришлось реализовать емкостный сенсор на двух конденсаторах и переключателе. Питание 5В для МК на схеме отсутствует, но оно необходимо!

Смотрим результат на видео

Исходный код, схему, модель в протеусе можете скачать в архиве.

В преддверии Нового года, желаю вам довести все ваши проекты до конца!

AVR Lab устройства на микроконтроллерах AVR

Форум по AVR

  • не работает программа из примера про пролистывания меню
  • sinaprog не работает
  • Пароль к архивам на сайте
  • Пароль
  • HDD и прерывания — доработка программы из статьи /node/220

AVR Touchscreen сенсорный экран на ATmega8

  • atmega8
  • avr
  • touchscreen
  • ts12864
  • WG12864A
  • сенсорный экран

В этой заметке рассмотрим принцип работы с тачскрином (англ. Touchscreen) и подключим его к AVR микроконтроллеру, а точнее к ATmega8. Идея использования тачскрина пришла ко мне, когда я хотел отказаться от использования клавиш в своем проекте метеостанции. Метеостанция выводила данные на графический ЖКИ WG12864A. Поискав в Интернете графические ЖКИ с предустановленной сенсорной панелью я уже расстроился, что таких у нас (г. Киев) не продают, либо их стоимость зашкаливает.

Далее я натолкнулся на сенсорные панели, которые можно прикрепить уже на свой ЖКИ с помощью двухстороннего скотча. Такая штука нашлась, и называется TS12864ARNB, предназначена для индикатора WG12864A. Также нашлись в наличии панельки для WG12864C (немного другие размеры и распиновка чем у WG12864A), называются TS12864CRNA. Купив такую панельку для своего ЖКИ я начал экспериментировать. Вообще TS12864ARNB – резистивная сенсорная панель с 4-х проводным интерфейсом. Рассмотрим принцип ее работы:

Основу тачскрина представляет тонкое стекло, на которое нанесено две тонких резистивных пленки, разделенных между собой шариками изоляторами и с внешней стороны покрытых защитным слоем. Резистивные пленки способны проводить ток и имеют крест-накрест расположенные электроды (X-,X+,Y-,Y+). При прикосновении, проводящие пленочки замыкаются и образуют между собой контакт, при этом точка прикосновения образует простой резистивный делитель:

Благодаря этому координаты прикосновения можно легко вычислить. Для этого нужно с помощью АЦП произвести 2 измерения (но на практике задействуется 4 канала АЦП микроконтроллера). Сперва на заднюю пленку подаем постоянное напряжение, например наши +5В (на вывод X+ подаем , а на вывод Х подключаем к земле). При этом, на каждом горизонтальном участке заднего слоя, ток создает падение напряжение, пропорционально длине участка, которое и нужно нам считать. Щупом послужит передний резистивный слой, электроды которого замыкаются и подаются на вход АЦП. Это будет Х-вая координата нажатия. Аналогично считывается и У координата. Определить нажатие можно подав так: подаем на У- +5В, а все остальные выводы ставим в Hi-Z состояние, появления на них нулевого потенциала будет сигналом того, что произошло прикосновение. Продемонстрируем сказанное, соорудим макет:

Источник тактирования – внутренний RC генератор на 1МГц, резистор R1 – 10 кОм, конденсатор С7 – 0,1мкФ. Светодиод D1 сигнализирует, что на схему подается питание, R2 – 1кОм. Резистор R3 ограничительный, для подсветки ЖКИ, 17 Ом, VR1 – переменный резистор на 10кОм, для регулировки контраста. Заодно подключим к микроконтроллеру графический ЖКИ WG12864A, на котором будем выводить точки с координатами прикосновения, считанными с тачскрина. Получиться некий мини-планшет, на котором можно будет рисовать. Код программы выглядит вот так:

Я специально не налаживал тачпанель на ЖКИ, потому как видеокамера давала очень плохую картинку и не можно было иметь представления что твориться на экране.

Так просто рисовать каряки и смайлики быстро надоело, захотелось чего-то еще. Сделал сенсорную клавиатуру, на 12 клавиш. Цифры с 0 по 9 + сброс и backspace. И дописал код, который после определения координат нажатия, смотрит, на какую клавишу нажали, и если таковая была, то мигает кнопкой на экране и добавляет введенный символ:
Клавиатурный буфер организован подобно буферу в статье про символьный ЖКИ и матричную клавиатуру. Константа MAX_NUMBER определяет размер буфера, переменная number_count – количество цифр в буфере, а массив data[MAX_NUMBER] – собственно данные. Функция key_pressed (x,y); по заданным координатам, определяет какая клавиша была нажата (или была ли вообще нажата хоть одна) и заносит данные в буфер, а функция write_data (); — выводит содержимое буфера на ЖКИ. В остальном программа идентична предведущей.

Когда-то давно я писал уже статью про тачскрины, ее оригинал можно прочитать вот здесь:

Введение

Во многих современных устройствах в качестве органов управления используются сенсорные кнопки. Например, у меня на кухне с помощью сенсорных кнопок включается и выключается варочная поверхность.
Сенсорные кнопки хороши тем, что для них не нужны отверстия в корпусе, и у них отсутствует механический износ, присущий традиционным кнопками. Кроме того конструкция сенсорной кнопки, если не считать электронную начинку, намного проще механической, ведь это обычная проводящая поверхность изолированная слоем диэлектрика, и ей можно придать практически любую конфигурацию.
В этой статье я расскажу о простой реализации сенсорной кнопки на микроконтроллере.

Принцип работы сенсорной кнопки

По сути, сенсорная кнопка — это сенсор, то есть какая-то проводящая поверхность, и контроллер, измеряющий его емкость (способность накапливать электрический заряд). При неизменных условиях внешней среды емкость сенсора не меняется. Но когда к нему подносится палец, его емкость увеличивается. По этому изменению контроллер «делает вывод», что пользователь нажал на кнопку.
Емкость измеряется путем подсчета времени, которое требуется для ее заряда до определенного уровня напряжения. Это время зависит как от значения емкости, так и от величины зарядного тока, которая задается какой-то внешней цепью. В простейшем случае эту роль может выполнять резистор, подключенный одним концом к источнику питания, а другим к сенсору.

где Cs — емкость сенсора, Cf — емкости вносимые прикосновением пальца.

Поскольку емкость сенсора и ее изменения очень маленькие (единицы, десятки пикофарад), то время заряда тоже будет небольшим. Чтобы упростить измерение времени заряда, нужно увеличить его значение, а для этого необходимо заряжать емкость сенсора очень маленьким током (микроамперами).

Конфигурация сенсорной кнопки

От конфигурации (от его формы и размера) сенсора зависит его емкость. У меня в проекте использовался сенсор в виде вытравленной круглой контактной площадки диаметром 1 см. Также я пробовал использовать прямоугольные кусочки фольгированного текстолита разного размера. Чем больше площадь сенсора, тем больше его емкость и тем более чувствительную сенсорную кнопку можно сделать.
Чувствительную в том плане, что она будет в состоянии срабатывать через толстый слой диэлектрика. Вообще на эту тему лучше почитать атмеловские материалы, поскольку сейчас я об этом мало что могу сказать.

Схема

Схема, которую использовал я, представлена на рисунке выше.
Сенсор через резистор подключен к выводу микроконтроллера, который подтянут высокоомным резистором к плюсу питания. Первый резистор служит простейшей защитой от электростатики (ESD), а второй ограничивает зарядный ток.
В начальный момент вывод микроконтроллера работает в режиме выхода и на нем установлен уровень логического нуля. Емкость сенсора, если она имеет какой-то заряд, быстро разряжается на внутренние цепи микроконтроллера. Когда она разрядится вывод микроконтроллера переключится в режим входа с отключенным подтягивающим резистором и емкость сенсора начинает заряжаться через внешний высокоомный резистор. В это время программа опрашивает состояние вывода микроконтроллера и подсчитывает количество циклов опроса. Когда емкость зарядится до напряжения логической единицы, микроконтроллер зафиксирует это и сравнит состояние счетчика с каким-то пороговым значением. По результату этого сравнения микроконтроллер определяет поднесен ли к сенсору палец или нет.

Читайте также  Дигитайзер на arduino uno

Сам принцип думаю понятен, теперь можно посмотреть как это может выглядеть в Си коде. Для реализации одиночных сенсорных кнопок, я написал небольшой программный модуль — драйвер.

Чтобы добавить его в свой проект, нужно переписать заголовочный и сишный файл драйвера (sensor.c и sensor.h) в папку проекта, добавить сишный файл sensor.c к проекту внутри среды разработки и включить заголовочный файл драйвера sensor.h (с помощью директивы include) в свой файл, где будут использоваться функции драйвера.

Разберем как им пользоваться. Для хранения настроек сенсора используется структура данных sensor_t. В настройки сенсорной кнопки входит адрес порта, номер вывода в порте, пороговое значение и текущее состояние. Чтобы добавить к проекту сенсорную кнопку, нужно для начала создать переменную типа sensor_t.

Для инициализации используется функция SENS_Init(. ) которой нужно передать адрес переменной, хранящей настройки, номер вывода микроконтроллера, адрес используемого порта и пороговое значение срабатывания. Пороговое значение зависит от емкости сенсора (от его геометрии) и от зарядного тока. Сейчас значение можно определить только экспериментально, потом я хочу добавить функцию калибровки.

Опрос одной сенсорной кнопки выполняет функция SENS_Poll(. ), которой нужно передать адрес переменной типа sensor_t. Эта функция возвращает состояние сенсорной кнопки. Для всех возможных состояний сенсорной кнопки объявлен специальный тип данных sensor_state_t. Но функция опроса возвращает только два состояния SENS_PRESSED и SENS_NOT_PRESSED. Остальные состояния сделаны на будущее.

Функция SENS_Poll(. ) выполняет один цикл разряда- заряда сенсора.

Для достоверного определения состояния сенсора, эту функцию лучше вызывать несколько раз. Так же как делается при опросе механических кнопок. Работу функции нежелательно прерывать прерываниями, иначе подсчет времени заряда будет некорректным. Частоту вызова функции опроса можно сделать такой же, как при работе с механическими кнопками. Функция не оптимальная, из-за того, что доступ к порту осуществляется через указатель. Но это позволяет упростить процедуру настройки сенсора, используя только адрес регистра PORTX, а адреса регистров DDRX и PINX вычисляются из него.
И последняя функция драйвера — это SENS_GetState(. ). Она просто возвращает текущее значение сенсорной кнопки.

Код самого тестового проекта очень простой. Инициализация выхода для светодиода, инициализация сенсорной кнопки и бесконечный опрос кнопки в цикле while(1). Никаких прерываний не используется. Частота работы микроконтроллера 9.6 МГц.