Радиолоцман Электроника en
расширенный поиск +
  

12-05-2009

HTTP/TCP на Аtmega88 микроконтроллере (AVR веб сервер)

HTTP/TCP на Аtmega88 микроконтроллере (web сервер)

Теория:

Это продолжение статьи Ethernet - устройство на микроконтроллере AVR. Аппаратная часть осталась той же самой (ENC28J60 + Atmega88). Программа изменилась, теперь она реализует еще и web сервер.

Теперь, вместо использования программы из командной строки и посылки UDP пакетов к Ethernet устройству, мы можем просто настроить на него наш web браузер. К программе добавился только web сервер, и вся основанная на UDP функциональность сохранилась. Можно использовать обе возможности.

Программа написана на Си и в памяти микроконтроллера осталось еще много свободного места.

Введение

Командный интерфейс UDP вполне достаточен для большинства приложений, но интегрированный web сервер гораздо более универсален и прост в использовании. Как сделать web сервер на микроконтроллере Atmega88?

Прежде чем взяться за этот Ethernet проект, я разумеется, сделал некоторое моделирование, и уже тогда я заметил, что UDP не создаст проблем с нехваткой места в памяти микроконтроллера Atmega88. Я был вполне уверен, что и TCP + http будет работать. TCP/IP был изобретен более 25 лет назад. Сейчас микроконтроллеры обеспечивают почти туже самую вычислительную мощность, как у компьютеров тех времен. В те годы не использовались не java не xml, все делалось простыми и эффективными путями.

Таким образом мы имеем вполне реальный web сервер на микроконтроллере Atmega88.

TCP полностью автоматический

TCP это протокол, в котором устанавливается соединение. Для этого сначала должен произойти обмен множеством пакетов, и обе стороны соединения должны пройти через несколько состояний [смотрите TCP полностью автоматический в rfc793]. После того, как соединение было установлено, множество пакетов данных может быть послано. Счетчики и автомат TCP гарантируют, что данные прибудут в правильном порядке и без потерь.

Большие web страницы могут потребовать посылки множества пакетов данных, маленькие страницы – меньше. Как много должны посылать мы?

Давайте посмотрим на программу, представленную в первой статье. В этой статье мы всего лишь переключали реле через Ethernet. Это можно было сделать, используя простую web страницу, подобную этой:

Output is: ON

Switch off

Рисунок 1. Пример web страницы для Ethernet устройства удаленного переключения.

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

Как много пакетов данных должно быть послано для такой страницы?

Всего один!

Особенность использования TCP в том, что один из участников соединения может посылать более одного пакета данных, но нам не нужна такая функциональность. Нам нужен TCP, лишь потому, что HTTP базируется на нем, а мы хотим использовать HTTP.

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

С учетом всего этого, вполне возможно осуществить web сервер в Atmega88, при этом не менее 50% памяти контроллера остается свободной.

Удаленное Ethernet устройство со встроенным web сервером: включение и выключение чего ни будь

Программа в пакете eth_rem_dev_tcp-2.X реализует простой переключатель. С его помощью вы можете что ни будь включать или выключать. Простой механизм пароля обеспечивает очень простую защиту, не позволяя не авторизованным пользователям переключать устройство.

Ниже представлен снимок экрана с web страницей, сгенерированной устройством:

Рисунок 2. Встроенный в Atmega88 web сервер, снимок экрана с браузером mozilla firefox.

Web – сервер на микроконтроллере, посылающий единственный пакет данных

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

  1. Прием SYN
  2. Отправка SYN, ACK
  3. Прием ACK (сейчас соединение установлено)
  4. Прием ACK с HTTP командой GET
  5. Отправка ACK
  6. Отправка FIN, ACK с данными HTTP (код 200 ОК)
  7. Прием FIN? ACK
  8. Отправка ACK

Легко заметить, что это довольно таки простая последовательность команд и действий. Все необходимые функции я реализовал в файле ip_arp_udp_tcp.c. В файле main.c реализован цикл приема данных. В этом цикле имеется множество условных переходов, в порядке того, какое действие должно быть выполнено. Здесь вы также можете увидеть, как код разветвляется между UDP и TCP с портом 80 (web сервер). Если вы захотите осуществить вашу собственную функциональность (например, считывать данные с датчиков температуры, давления воздуха, чего угодно…), вам потребуется только изменить код перед вызовом функции print_webpage и код самой функции print_webpage, так, чтобы она генерировала вашу собственную web страницу. Этот код находится в файле main.c. Файл enc28j60.c реализует драйвер для микросхемы Ethernet контроллера enc28j60. Вам не следует беспокоиться по поводу файла enc28j60.c.

Рисунок 3

Вы можете получить web сервер, просто загрузив новую программу в микроконтроллер.

Создание и загрузка программы в микроконтроллер

Распакуйте пакет eth_rem_dev_tcp-2.X (командой tar -zxvf eth_rem_dev_tcp-2.X чтобы распаковать, загрузить программу можно в конце статьи). Подробные инструкции есть в файле README включенном в пакет eth_rem_dev_tcp-2.X.

Затем вам надо задать IP адрес для вашего устройства. Для этого отредактируйте 3 строчки в файле main.c:

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {10,0,0,24};
static char baseurl[]="http://10.0.0.24/";

Для первого устройства вам не понадобиться менять строку с mymac. Но вам вероятно потребуется изменить IP адрес (параметр myip). Это должен быть свободный адрес из диапазона адресов вашей сети.

(Если все же вы решили использовать обращение к устройству по имени, а не по IP адресу, третью строчку следует также изменить, прописав в ней вместо адреса имя устройства:

static char baseurl[]="http://ИМЯ/";

прим. перев).

Здесь представлен диапазон частных IP адресов (не маршрутизируемых в интернете), которые вы можете использовать:

Маска подсети Сетевые адреса

255.0.0.0 10.0.0.0 - 10.255.255.255
255.255.0.0 172.16.0.0 - 172.31.255.255
255.255.255.0 192.168.0.0 - 192.168.255.255

Например: ваш WIFI маршрутизатор может иметь IP адрес 192.168.1.1, ваш компьютер может иметь адрес 192.168.1.12. это означает, что вы можете использовать адрес 192.168.1.10 и оставить некоторый диапазон адресов для других компьютеров в сети. Если вы используете в сети протокол DHCP, проверьте, чтобы этот адрес не дублировался в сети (исключите его из диапазона DHCP).

Теперь скомпилируйте программу командой "make", загрузите файл eth_rem_dev.hex в микроконтроллер. Откройте web браузер и наберите в адресной строке: http://Ваш_IP_адрес/secret.

Леко;-)

Производительность

Встроенные системы обычно маленькие, маленькие не только физически, но также в смысле объема памяти и производительности CPU.

Все, реализованные в таких системах протоколы TCP/IP таким образом имеют гораздо меньшее максимальное количество параллельных пользователей (2-5 параллельных http соединений).

Реализуя TCP/IP, tuxgraphics использовал другой подход. Количество данных, которое мы хотим показать очень маленькое. Возможно, вы захотите отображать показания присоединенных датчиков или переключать что ни будь. Для всего этого вам потребуется всего лишь несколько байт данных. Мы ограничили размер web страницы нескольким сотнями байт. С этим ограничением, нам не потребуется ограничивать количество параллельных соединений.

AVR микроконтроллер имеет удивительный процессор. Большинство операций выполняется за один такт. С TCP/IP, реализованным tuxgraphics, на этом контроллере мы реально можем получить верх производительности, выходящий за пределы этого web сервера. В нем нет жестко запрограммированного ограничения числа пользователей и он может обслужить сотни web страниц в секунду. Некоторые web серверы, реализованные на небольших персональных компьютерах не смогут дать такой производительности.

Загрузки и ссылки

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

На английском языке: HTTP/TCP with an Atmega88 Microcontroller (AVR Web Server)

Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения (только последние 20 сообщений):Полный вариант обсуждения »
  • Поучительно и довольно заманчивое решение. Устройства с Ethernet-модулями, на данный момент становятся востребованными как никогда. Обе статьи заслуживают внимания.
  • Но пока, я понял, функции у сервера не большие? Думаю все впереди
  • Я подобное делал на связке PIC18242 X-PORT. Получается тоже интересное устройство. Я реализовал на этом устройстве ИК управление по локальной сети. Время на разработку ПО в этом случае меньше, возможностей больше. Но в принципе идея неплохая и достойна жить.
  • Здравствуйте, собрал устройство. Не пойму зачем нужны TP1 и TP2. Устройство, судя по зелёному и желтому индикатору разъёма, инициализируется. Но на пинг не отвечает и по ip через браузер не заходит. myip и baseurl поменял, как в диапазоне моей сети. Подскажите пожалуйста что нужно еще сделать.
  • Вы внимательно читали первую часть статьи. Там говорится о нескольких тестовых программ для микроконтроллера, чтобы убедиться в правильности собранной схемы (пошаговая инструкция по сборке и проверке устройства). Самая первая программа - мигание красным светодиодом, вы ее зашивали в микроконтроллер? Работала? Далее - программа-тест для пингования устройства по сети... Т.е. нужно убедиться что микроконтроллер и микросхема Ethernet-драйвера запускаются и работают корректно. Не помешает и внимательно проверить монтаж/пайку.
  • Сейчас передалаю печатку под мегу 88. У меня её не было, использовал мегу 8. Проверил в протеусе и понял свою ошибку.
  • хотел спросить про фьюзы. Заблокировал уже много контроллеров. Возможно из-за программатора usbasp. Пробывал запустить от внутреннего генератора. Считал фьюзы, снял галку с cksel1 и установил cksel2 - результат не видит контроллер.
  • Что микроконтроллер mega8, что mega88 по умолчанию (заводские установки) настроены на работу от внутреннего осциллятора (Mega8 - по умолчанию работает на 1 Мгц, mega88 - на 8 МГц). Если, как вы говорите, изменили CKSEL2 и CKSEL1 (а другие не трогали и принимаем, что "установил галку" означает бит запрограммирован т.е. =0), то микроконтроллер все равно остается подключенным к внутреннему осциллятору и по идее должен определяться программатором. Я не исключаю глюк программатора, но лично я с такими проблемами никогда не сталкивался (я пользуюсь PonyProg или JTAGICE). Подключите к микроконтроллеру который не определяется программатором внешний кварц даже на 1 Мгц и проверьте. Можно выложить скрин ваших установок Fuse-битов, глянем... На заметку Все что нужно знать о Fuse-битах AVR
  • TP1 и TP2 нужно соединять?
  • Нужно ли соединять TP1 и TP2 - посмотрю чуть позже. Насчет установки Fuse-битов... Скрин это хорошо, но для какого микроконтроллера они (mega8 или mega88) вы не указали, я лишь догадываюсь, что т.к. есть расширенный байт, то это mega88. В любом случае, так как я первый раз вижу такое непонятное и не наглядное оформление окна для установки Fuse-битов микроконтроллера - ориентироваться по такому очень тяжело... Теперь другой неясный момент - что означает "установленная галка": бит =0 (т.е. запрограммирован) или бит = 1 (т.е. незапрограммирован)? Меня окончательно запутал скрин: смотрите галочка не стоит в H-Fuse в 5 разряде (это бит SPIEN), и тут же выше видим, что в окошке [SPIEN=0] в 5 разряде он прописан. Т.е. делаем вывод: "галочка НЕ установлена" соответствует что бит=0 (запрограммирован). Скажем так - Не стандартное исполнение, обычно в программаторах УСТ. галочка означает, что бит=0. (Рисунок megaXX_fuse_red.jpg) Исходя из этого, имеем следующую конфигурацию Fuse-битов: значение старшего байта = hDF, младшего байта = h64, расширенный байт = h01 - в этом случае для работы микроконтроллера потребуется внешний низкочастотный кварцевый резонатор. При этом еще включен внутренний делитель тактовой частоты с коэф. 8 и отключен вывод тактовой частоты на порт PORTB0 (кстати, это и есть точка TP2). Для данной схемы микроконтроллер вами настроен не верно, он должен тактироваться от внешнего источника - с микросхемы ENC28J60. Так что будьте внимательней со своим программатором, попробуем вместе разобраться если что. Не исключаю, что я мог запутаться... Честно говоря, я не смотрел исходники программы микроконтроллера, хотя там, я уверен, есть необходимая информация по установке Fuse-битов.
  • убрал фьюз CKDIV8, в схеме старой ревизии устройство работает от внутреннего генератора на 8 МГц. Может у меня в настройках роутера что-то не так. назначил ip=192.168.1.10 Можно подключить устройство напрямую к сетевой карте компьютера и пинговать? Очень непонятное в наладке устройство. Следовал всем шагам.:confused:
  • Т.е. вы хотите сказать что микроконтроллер работает корректно и теперь его в расчет не берем. На последнем скрине (и учитывая, что убрали Fuse-бит CKDIV8) установка Fuse-битов правильная? микроконтроллер работет на 8 МГц Насчет TP1 и TP2 - соединять их не вижу смысла, т.к. по даташиту на микросхему ENC28J60 5 вывод (WOL) не используется... Светодиоды статуса на коннекторе Ethernet в вашем устройстве горят? Т.е. я имею ввиду выполнение пошаговой проверки по статье Зеленый светодиод горит? На роутере загорается светодиод статуса порта, к которому подключаете устройство? Завтра на работе постараюсь посмотреть исходники и все материалы в статьях.
  • Да, зелёный светодиод загорается сразу, оранжевый через время (видимо проходит инициализация). При пошаговой инструкции, когда заливал прошивку test0.hex, красный светодиод мигал с частотой 1Гц. Фьюзы взял из шаблона для atmega88, в статье нигде не нашел про их описание. Устройство собирал с самодельной платой ENC28, готовой платой для Arduino и из другой статьи подобное устройство на Atmega32 - ничего не получилось. Пробовал пинговать через командную строку, заходить через строку браузера. Может помехи по питанию. Питание брал от usb на ldo 3.3v без конденсаторов на 100nf.
  • А может стоит попробовать Arduino-проекты, например Ethernet плата расширения. Точнее, можно попробовать запустить скетч Arduino на вашем микроконтроллере, будет ли пинговаться, а за одно сравните схему включения микросхемы Ethernet-контроллера.
  • Скачал eth_rem_dev_tcp-2.17.tar.gz, make -> ip_arp_udp_tcp.h:28: error: expected ';', ',' or ')' before '*' token cross-avr-gcc Версия: 4.3.3_20100125-35.1 , avr-libc Версия: 1.8.0-7.3 , cross-avr-binutils Версия: 2.23.1-2.2.1 Обновление cross-avr-gcc Версия: 4.8.2-3.2 avr-libc Версия: 1.8.0-7.5 -> ip_arp_udp_tcp.h:28:1: error: unknown type name 'prog_char' HELP!!!
  • И что? Где вопрос?
  • Вопрос как решить проблему? Я понимаю, что код старый, еще под тройку, но как собрать не откатываясь на старый компилятор (тем более что сие геморой тот еще)
  • Так, разобрался... Надо добавить ``-Wno-deprecated-declarations -D__PROG_TYPES_COMPAT__`` в опции компиляции и все собирается пучком...
  • Обрабатывать 8-битным контроллером с крохотной памятью TCP-IP - как-то страшно. Может лучше на ARM?
Полный вариант обсуждения »
Рекомендуемые публикации по теме:
Схемы  »
Бесконтактный тахометр на микроконтроллере AVR. Часть 2. Программное обеспечение для микроконтроллера
Схемы  »
DDS генератор на микроконтроллере ATmega16. Часть 2. Программное обеспечение для микроконтроллера
Книги  »
10 практических устройств на AVR-микроконтроллерах. Книга 1 (+ CD-ROM)
Книги  »
10 практических устройств на AVR-микроконтроллерах. Книга 3 (+ CD-ROM)
Схемы  »
Библиотека AVR GCC для управления ЖК индикатором - использование различных выводов микроконтроллера. Часть 1

При перепечатке материалов с сайта прямая ссылка на РадиоЛоцман обязательна.

Приглашаем авторов статей и переводов к публикации материалов на страницах сайта.

Срезы ↓
Датчики влажности и температуры ДВТ-03
Цена: от 3 168 руб.
Доставка: Россия и страны СНГ
DIY настольный 3D принтер
Цена: 163 $ (9500 руб.)
Промо-акция, последняя скидка
Очки с подсветкой и сменными окулярами
Цена: от 8 $ (477 руб.)
Бесплатная доставка: Весь мир
радиолоцман вконтакте радиолоцман одноклассники радиолоцман facebook радиолоцман twitter радиолоцман google плюс