Подключение микроконтроллера к локальной сети: HTTP и CGI (заключение)

В прошлой части мы научились отдавать по HTTP достаточно жирную статику. Но всё, о чём я хотел написать в прошлую часть не влезло, так что эта часть будет маленьким дополнением. Добавим какие-нибудь элементы управления (проще говоря, гуй) для получения и отправки данных с сервера и на сервер.

Краткое содержание:

  • Идея
  • Сторона сервера
  • Сторона клиента
  • Заключение

Кроме того, в этой небольшой части мы коснёмся такой странной штуки, как javascript)

Идея


Допустим, мы хотим, чтобы на страничке была всякая полезная инфа, а также формы и прочий гуй.

Когда мы только начали играться с HTTP, то отдавали данные вместе со страничкой, генерируя страничку на лету, вместе с данными. Если мы отдаём страничку из файла, всё сложнее. Можно, конечно, вставить на страничку теги, которые следует заменить на те или иные полезные данные. Но это медленно и сложно)

Есть другой способ — можно реализовать на сервере простейшие «CGI-модули», которые будут отдавать/принимать ту или иную информацию, и дёргать их непосредственно с HTML-странички аяксом.

Реализуем для примера 2 CGI-модуля. Один будет управлять светодиодиком, другой считывать данные с DS1820.

Сторона сервера


На стороне сервера, при получении запроса, разбираем запрашиваемый URL. Если URL начинается на "/cgi-bin", передаём запрос обработчику CGI-запросов. Иначе рассматриваем URL как имя файла.

Обработка запроса

Таким образом, URL принимает такой вид:

/просто/путь/к/файлу


Или такой:

/cgi-bin/(имя модуля)/(команда)/?параметр1=значение1&...


Обработчик запросов. Разбираем полученный URL и заполняем структуру httpd_state_t, из которой сервер (про который я писал в предудщей части ;) ) будет брать данные для ответа клиенту.

void httpd_request(uint8_t id, httpd_state_t *st, char *url)
{
    uint16_t len;
    
    // запрошен индексный файл?
    if(!strcmp_P(url, PSTR("/")))
        url = "/index.htm";

    // значения по умолчанию
    st->statuscode = 4; // ошибка 404
    st->cursor = 0;
    st->numbytes = 0;

    if(!memcmp_P(url, PSTR("/cgi-bin"), 8))
    {
        // вызываем обработчик CGI-запроса
        if((len = cgi_exec(id, url+8, st->data.ram)))
        {
            st->statuscode = 2;                // статус: 200 OK
            st->type = http_text_plain;        // тип: text/plain
            st->data_mode = HTTPD_DATA_RAM;    // источник: буфер в памяти
            st->numbytes = len;                // длина блока
        }
    }

    else
    {
        // пробуем открывать файл
        if(!f_open(&(st->data.fs), url, FA_READ))
        {
            st->statuscode = 2;                        // статус: 200 OK
            st->type = httpd_get_mime_type(url);    // тип данных
            st->data_mode = HTTPD_DATA_FILE;        // источник: файл
            st->numbytes = st->data.fs.fsize;        // длина файла
        }
    }
    
    // документ не найден - возвращаем страничку с ошибкой 404
    if(st->statuscode == 4)
    {
        st->type = http_text_html;                    // тип: text/html
        st->data_mode = HTTPD_DATA_PROGMEM;            // источник: флешка
        st->data.prog = http_not_found;                // страничка 404
        st->numbytes = sizeof(http_not_found)-1;    // длина странички
    }
}


При получении CGI-запроса, вызывается обработчик cgi_exec.

uint16_t cgi_exec(uint8_t id, char *url, char *buf, cgi_callback_t *callback)
{
    char *param;
    
    // отрезаем строку параметров
    if((param = strchr(url, '?')))
        *(param++) = 0;

    // вызываем модуль cgi_led
    if(memcmp_P(url, PSTR("/led"), 4) == 0)
        return cgi_led_exec(url+4, buf);
    
    // вызываем модуль cgi_ds1820
    if(memcmp_P(url, PSTR("/ds1820"), 7) == 0)
        return cgi_ds1820_exec(url+7, buf);
    
    return CGI_NOT_FOUND;
}


Этот обработчик вытаскивает из URL имя модуля и передаёт запрос ему. Пока у нас есть модуль cgi_led (для управления светодиодом) и модуль cgi_ds1820 для получения данных с ds1820.

/*
 * модуль cgi_led
 */

// макросы для светодиодика
#define TEST_LED_PORT        PORTB
#define TEST_LED_DDR        DDRB
#define TEST_LED_BIT        (1<<PB1)

#define test_led_state()    ((TEST_LED_PORT & TEST_LED_BIT) ? 0 : 1)
#define test_led_on()        TEST_LED_PORT &= ~TEST_LED_BIT
#define test_led_off()        TEST_LED_PORT |= TEST_LED_BIT
#define test_led_init()        TEST_LED_DDR |= TEST_LED_BIT; test_led_off()

// обработчик запроса
uint16_t cgi_led_exec(char *action, char *buf)
{
    if(strcmp_P(action, PSTR("/on/")) == 0)
        test_led_on();
    else if(strcmp_P(action, PSTR("/off/")) == 0)
        test_led_off();
    else if(strcmp_P(action, PSTR("/state/")) != 0)
        return CGI_NOT_FOUND;

    *buf = test_led_state() + '0';
    return 1;
}

// инициализация модуля
#define cgi_led_init() test_led_init()

/*
 * модуль cgi_ds1820
 */

// переменные 
int ds1820_temp = 0x7fff;    // текущее значение
uint32_t ds1820_start_time;    // время сделующего опроса датчика
uint8_t ds1820_converted;    // опрос датчика запущен

// обрабочик запроса
uint16_t cgi_ds1820_exec(char *url, char *buf)
{
    uint8_t temp, len;
    
    if(!strcmp_P(url, PSTR("/value/")))
    {
        // нет данных - возвращаем "N/A"
        if(ds1820_temp == 0x7fff)
        {
            memcpy_P(buf, PSTR("N/A"), 3);
            return 3;
        }
        
        // форматируем строку со значением температуры (например, "-12.3")
        itoa(ds1820_temp>>4, buf, 10);
        len = strlen(buf);

        temp = ((abs(ds1820_temp) & 0x0f) * 10 + 7) >> 4;
        if(temp) {
            buf[len++] = '.';
            buf[len++] = '0'+temp;
        }
        
        return len;
    }
    
    return CGI_NOT_FOUND;
}

// вызывается периодически для опроса датчика
void cgi_ds1820_poll()
{
    if(rtime() >= ds1820_start_time)
    {
        if(ds1820_converted)
            ds1820_temp = ds1820_read();
        else
            ds1820_temp = 0x7fff;
        
        ds1820_converted = ds1820_start();
        ds1820_start_time = rtime() + 3;
    }
}


Пока можно проверить работоспособность наших модулей, просто введя соответствующий URL в браузере.

Результат запроса

Сторона клиента


Добавим на HTML-страничку блоки, которые послужат нам каркасом для получения и отправки данных на сервер.

<!-- LED -->
<div id="led-control">
    <p>Управление светодиодиком:</p>
    <img id="led-on" src="i/led-on.gif">
    <img id="led-off" style="display: none;" src="i/led-off.gif">
</div>

<!-- DS1820 -->
<div id="ds1820-example">
    <p>Температура:</p>
    <div id="ds1820-value">N/A</div>
</div>


Принимать и отправлять данные на сервер будем с помощью аякса. Чтобы не выносить себе мозг этими XMLHttpRequest, воспользуемся эпичной библиотечкой jQuery. С использованием этой либы наш код упрощается до идиотизма)

Для чего идет подгрузка скриптов (либа Jquery и наш скрипт), которые лежат на флешкарте, вместе со всеми файлами. Если открыть index.htm то вначале будет


<head>
<title>Embedded Web Server</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/custom.js"></script>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>

Собственно это оно и есть. js/jquery.js — библиотека, а в js/custom.js мы прописываем уже наше управление светодиодиком:

// Вызывается при изменении состояния светодиодика
function led_state(state) 
{
    switch(state) {
        case '0':
            // выключен - показываем кнопочку on
            $("#led-on").show();
            $("#led-off").hide();
            break;
        case '1':
            // включен - показываем кнопочку off
            $("#led-off").show();
            $("#led-on").hide();
            break;
    }
}

// обновляем состояние светодиодика
function led_update() {
    // запрашиваем состояния с сервера
    $.get("/cgi-bin/led/state/", null, led_state);
    
    // каждые 5 секунд)
    window.setTimeout(led_update, 5000);
}

// в начале,
function led_init()
{
    // привязываем действие к кнопке on
    $("#led-on").click(function() {
        // зажечь диодик
        $.get("/cgi-bin/led/on/", null, led_state);
    });
    
    // привязываем действие к кнопке off
    $("#led-off").click(function() {
        // погасить диодик
        $.get("/cgi-bin/led/off/", null, led_state);
    });
    
    // обновляем состояние диодика каждые 5 секунд
    led_update();
}


Получение данных с DS1820:

function ds1820_update()
{
    // получаем с сервера значение
    $.get("/cgi-bin/ds1820/value/", null, function(val) {
        // и вставляем его в блок на страничке
        $("#ds1820-value").html(val + "°");
    });
    
    // каждые 5 секунд
    window.setTimeout(ds1820_update, 3500);
}


Раз уж мы взялись за яваскрипт, можно немного позлорадствовать)

if(navigator.appName == "Microsoft Internet Explorer")
    window.location = "http://lleo.aha.ru/na/";


Инициализация всего хозяйства:

$(document).ready(function() {
    led_init();
    ds1820_update();
});


Осталось добавить CSS'ку и получаем вот такие штучки:

div&#39;ы

Заключение


В этой части мы рассмотрели ещё один вариант работы с HTTP. Он может быть полезен, например, если ты захочешь сделать какой-то мегадевайс с навороченной админкой. Либо, скажем, поднять свою домашнюю страничку на микроконтроллере)

Следующая часть будет посвящена описанию TCP/IP стека, который мы тут соорудили по ходу дела)

Скачать проект: chatek.zip.



Все статьи цикла

Комментарии (84)

RSS свернуть / развернуть
Чятик на аврке жжот неимоверно :)))))
0
выдайте человеку первый приз.
0
… результат немного предсказуем :)
0
Таки да, я был прав :)
0
блин афтар мегареспект
0
Спасибо LifeLover за отличный цикл статей!

К своему заказу в ЧИП-НН добавил ENC28J60 и разъем с интегрированными трансформаторами. Буду экспериментировать! :)
0
Какой разьем взял и почем? А то я тут тоже намутил себе каких то :)
0
LU1T516-43-LF за 100р (дороговато :/)
Вот тут даташит лежит.
0
Черт, а я свои по 190 брал. Так что 100р это халява.
0
У меня J00-0086NL он по паду встает один в один, но распиновка другая. Вот облом :(
0
Пожалуй достойно первого приза :-)
На днях буду начинать раскуривать enc28j60. Аффтар, благослови )))
0
просто нет слов. прям «и узрел охламон круть несусветную» :)
0
Кайфово вышло. Такую тему осветил. Благодарность безграничная. Теперь бы ее самому освоить…
0
Демка конечно весьма забавная и эффектная, но честно говоря — не разделяю общего восторга. Это все не столь сложно (точнее — вообще не сложно, разве что RFC-шки объемные вкуривать надо) в проектировании и реализации. Правда, я программист. Чтобы меня впечатлить в области программирования — надо быть Александреску :)
0
  • avatar
  • Vga
  • 30 апреля 2011, 20:01
Тут дело даже не в восторге от программирования, а от самой идеи. Если раньше те, кто осваивали микроконтроллеры самостоятельно, видели только статьи и уроки о том как сделать автономное устройство: моргалку, кодовый замок, звонок, робота и т.п… И как-то далеко это все было от веб-технологий. То тут МК освещен немного под другим ракурсом. Да, может быть, технически и программно это отнюдь не сложно, тем более для знающих людей, но для основной массы любителей, да и для некоторых опытных в электронике челобаков в этом цикле статей есть что почепнуть.
0
Согласен с Vga, что можно было и самому тему поднять, раскуривая мануалы. Но в том то и дело, что надо было бы самому совершать много проб и ошибок, а тут тебе все разжевано.
0
В принципе, идея тоже легко в голову приходит — достаточно пообщаться с вебмордой роутера) Вот AVR+Ethernet — это чуть сложнее в голову приходит. Хотя я по прежнему сомневаюсь в применимости такой связки — разумней взять проц помощнее и с встроенным PHY — оно будет и дешевле, и веб-морда не будет откусывать 95% ресурсов.
Но в том то и дело, что надо было бы самому совершать много проб и ошибок, а тут тебе все разжевано.
Ну не настолько уж разжевано в последних статьях, да и тут больше курить документацию на протоколы. Познакомился с этим делом, когда писал свой BT-трекер)
0
а PHY — это?
0
В одной из первых статей же пояснялось. Реализация физического уровня Ethernet. Я имел в виду МК, куда встроен полный Ethernet — так, что снаружи остается только повесить MAG и гнездо. Такие девайсы, AFAIK, есть в серии STM32F107, а стоит она пожалуй поменьше, чем старшая мега и ENC28J60.
0
Там PHY нету. Так что еще одну микросхему надо вешать. Полностью, на всем готовом, делает только Luminary, но там цена за камень рублей 300 емнип, и еще хрен где купишь.
0
Возможно, я этот вопрос не исследовал. Просто помнится, что где-то я видел упоминание довольно недорогих АРМов с ФИ. Впрочем, реалтековские PHY, говорят, стоят дешево.
0
Я пробивал этот вопрос. Микруха PHY стоит около 80-120 рублей. По крайней мере та, что идет во всех аппликухах к STM32F1xx и LPC1700
0
Опять же, я этот вопрос не прорабатывал, но тут пробегала ссылка на софт-МАС на авр-ке, а там написано такое:
Потом взгляд переместился на микросхемы PHY, и, при внимательном изучении, оказалось, что довольно просто обеспечить работу с PHY при тактовой проца 20МГц. Да и со стоимостью нет вопросов — Realtek'овский RTL8201BL стоит всего около 1$ (как заметил zltigo, Realtek вообще славится экстремально дешевыми решениями в области Ethernet).
Правда, в промэлектронике его нету, а где брал автор — хз.
0
Хм и в самом деле. ПО баксу в элитане. Надо будет покурить эту микрушку.
0
Так и есть, всё тривиально. Чисто побаловаться)
Сложность правда была — заставить мегу отдавать данные по TCP достаточно быстро и надёжно. Тут всплывали всякие грабли и пришлось несколько раз всё переписывать с нуля.
0
дофига вас таких
это не сложно это фигня
ты на деле реализуй и проделай такой
же обьем работы по описанию
потом посмотрим
0
Свой сервер я писал, хотя и на ПК (не требовалось реализовывать TCP/IP, зато требовалось реализовать протокол поверх HTTP и сам HTTP). Это и в самом деле довольно просто. Правда, после 2-10К строк кода энтузиазм притухает.
0
В том и дело, сам не осилил и других не уважаешь.
0
Всё-всё, хватит)))
0
Ну-ну.
0
Эх, еще бы для полнейшей крутизны график вывести, температуры например ;)
0
картинкой.
0
Ну DD-WRT графики например в SVG рисует.
0
В идеале картинкой, но походу это очень не просто сформировать графический файл в контроллере. Хотя руки дойдут я попытаюсь. Если очень муторно можно и другими средствами, лишь бы каждый браузер (даже мобильный) поддерживал.
0
Не думаю, что формировать картинку — разумно. Тем более что сформировать удастся разве что BMP.
А чем SVG для графиков не устраивает?
0
Да вобщем-то все средства хороши. У меня только подозрение что вещи как SVG в некоторых браузерах могут отбражаться криво. А картинка это уж наверняка и просто для любого браузера. Со стороны контроллера конечно много недостатков — и ОЗУ много надо, и тактов сожрет прилично.
0
Я думаю, «много» — мягко сказано. Потребление памяти можно вроде и поуменьшить, но требуемое процессорное время резко возрастет.
0
svg ослик открывать не умеет, а мобильные браузеры и подавно не будут.
ещё неплохо бы проверить что бы опера-мини открывала.
0
PNG является инет-форматом. У него есть «близкий к BMP» вариант без упаковки. Когда просто массив пикселей загоняется. Тогда картинку не надо хранить в памяти, а генерировать нужные блоки на лету.
0
Ну да. Это хотя бы немного памяти требует. Зато размер… Да и достаточно много процессорного времени уйдет я думаю. Ну и никакой разницы с вариантом BMP.
0
Разница есть.
1) BMP не является интернет форматом
2) BMP это формат мелкомягких
Браузеры не обязаны поддерживать BMP, а старые и мобильные версии так и не поддерживают.
0
а что с чатиком сталосьь ((((
0
  • avatar
  • oss
  • 02 мая 2011, 22:31
Батарейки сели :)
0
Приветствую всех! Спасибо большое за цикл статей! Помогите со схемой получившегося девайса...(я программист в железе слабоват, но так хочется его покодить)…
0
советую купить готовое железо
не советую вникать в схемотехнику и электронику если хочитса просто покодить
затянет еще и бросишь свои компутеры и станеш как я задротом электронным))))
шутко
а если серьозно то берешь дихалтовскую пинборд(или както так)
докупаеш на ебее езернет шилд на 28j60 (копейки стоит)
и можно кодить
0
Спасибо за ответ, но тут продают готовый девайс, причем один из них на STM или печатка, мне же нужна принципиальная схема. Все схемы, что я видел в google – в схеме ATMega тактируется от ENC, для согласования ставят делитель на резисторах, но хочется надежности работы от устройства — поэтому хочу тактировать от кварца и для согласования использовать буферы…
Если судить по исходникам проекта в статьях то на разработку достаточно будет ATmega16/32, тактирование идет от кварца 16МГц, все бы хорошо, но я не понимаю как enc28j60 и CD/MMC подключить к одному SPI ATMega.
Карта памяти и ENC питаются от 3в а кристал от 5в, каким образом развести соединение SPI через согласующие буферы, например такие как 74lvx08 и 74ac125.
0
Мона и напрямую подключать к 5-вольтовой межке. У енки ножки 5в-толерантные.
Вот статейка о согласовании есть.

Впрочем, новые межки с буквой А работают от 3,3В (да и без буквы нормально работают). Так что я всё тупо от 3,3В питал :)
0
Вот для надежности его от енки и тактируют. Да и вообще, судя по тому, что я слышал — енка и надежность вещи несовместимые.

но я не понимаю как enc28j60 и CD/MMC подключить к одному SPI ATMega.
Стандартно. Все линии параллельно заводим на все микросхемы, только линию CS (она же SS) выдаем каждой микре отдельную. При работе довим CS только нужной микры и общаемся с ней так, как будто на шине больше никого нет.
0
подтверждаю)))
а вот насчет карты
если ты собрался юзать FAT
и отдавать сайт не упакованный прямо с файловой системы
то нужен контроллер с кучей памяти
стек+фат(я юзаю микрочиповские стек+фат) у меня отжирают 60К памяти
думаю тут чуток поменьше но точно не меньше 24К выйдет(впрочим могу ошибаться)
0
Приветствую всех. Купил железо, спаял на монтажной плате- все предыдущие проеты работают на ура, ни багов, ни глюков (не проверял только DHСP, т.к. он мне не нужен я его коментил в прошивке) попробовал добавить SD карту на 128Мб, многократно проверял все соединения- но при совместном использовании в схеме с ENC (подключал согласно define на ноги в прошивке) и прошивкой из этого поста, аппарат даже не ping'уется… решил потестить прошивку в Proteus'е, в нем такая же история, хотелось бы узнать в чем проблема может быть и может кто-нибудь сталкивался с этим…
0
Готов поспорить на счет стек + фат. Такие вещи легко помещаются на 8К. В свое время писал на асме под пик16ф628 и получалось вмазаться с жки + фат + шрифт в этот кристал. На меге все еще проще=)
0
ну проекты все написаны на си, и как то чувствуя все удобства языка — не хочется погружаться с головой в асм и пики…
0
Я ж говорю, на С легко влетит на 8к. Могу доказать…
0
лучше поясни по этому посту, на сколько я понял подключение должно быть следующим iscr.ru/1328912064/, по размеру прошивка влазит… но почему то устройство молчит и собранное в железе и в протеусе…
0
Да и не про пики речь. Можно на авр или арме. Хочешь на кортексе!
0
Никогда не думал, что такое можно реализовать на 8-битном микроконтроллере, автору большой respect!.. У меня есть вопрос: с html и джава все понятно — передаются клиенту и там уже выполняются, но как работает php? ведь для него нужен интерпретатор на стороне сервера.
0
Нету там никакого PHP. Все «CGI-обработчики» захардкодены в прошивке.
0
салют, эт снова я!
после продолжительного перерыва опять возник зуд в одном месте, итак:
теперь я имею микросхему atmega16a в DIP корпусе с 40 выводами.
имею плату z28j60 с десятью выводами. (http://mdfly.com/Download/Module/EM2803_SCH.pdf)
источник питания на 5 вольт (USB зарядка)
датчик ds1820
потерялся в схемах, к каким пинам подключается светодиодик (у меня на него тоже планы!) и к каким — датчик. И еще, наверное, нужно согласовывать 3,3В у enc и 5В у atmega?
самое главное! за время перерыва успел систему переставить и все тулчейны пошли прахом, а готовой скомпилированой прошивки нетути! кто подсобит под мегу16?
0
похоже, судя по даташитам на enc и atmega16a, их можно просто запитать от 3,3 В
датчик глянул — вроде тоже можно питать от 3,0 В.
жаль, что саму ENC нельзя запитывать от 5В.
получится от нокиевской зарядки? прошивка still needed, please!
0
похоже, судя по даташитам на enc и atmega16a, их можно просто запитать от 3,3 В
датчик глянул — вроде тоже можно питать от 3,0 В.
жаль, что саму ENC нельзя запитывать от 5В.
0
… поспешил, повторюсь…
0
Елки-палки… Почему нельзя удалять посты??… А по делу хотел сказать, что запускал ENC от 5В через два диода, соединенных последовательно. Хотел быстренько поиграться, а под руками ничего кроме 5В не было.
0
ну тут проще — есть 3,3В вроде как.
а вот прошивки нету. sindrom, не пытался, случайно, скомпилировать этот чатик под atmega16?
0
Не, компилировал под мегу128, но только первые примеры из серии статей. Подробностей не помню, но вроде только ноги в дефайнах поменял и больше ничего не трогал.
0
ковыряю сейчас avr-gcc, пытаюсь сделать makefile под этот проект.
а потом, если получится скомпилировать и все это влезет в 16к, придется выяснять что к какой ноге цеплять… ыыы… )))

сейчас имею серию ошибок

main.o: In function `main':
main.c:(.text+0x20): undefined reference to `mmc_mount'
main.c:(.text+0x26): undefined reference to `lan_init'
main.c:(.text+0x28): undefined reference to `counter_init'
main.c:(.text+0x2a): undefined reference to `cgi_init_all'
main.c:(.text+0x2e): undefined reference to `lan_poll'
main.c:(.text+0x30): undefined reference to `cgi_poll_all'
main.c:(.text+0x32): undefined reference to `lan_up'
не могу понять, это надо в makefile указывать, или где-то в исходниках править?
0
По всей видимости, не все.с файлы компилируются в объектники, или они не передаются линкеру для полной сборки.
0
это где-то в makefile указывается? и если да, то где? пытаюсь найти толковое руководство по makefile с примером конкретно для avr-gcc. пока что нашел два разных синтаксиса, которые якобы для avr-gcc
0
Да, в makefile конечно. Обычно там переменная SRC есть, в неё надо добавить имена всех используемых в проекте.с-файлов. Имена объектных файлов обычно автоматом генерятся. Ну это уже конкретный makefile надо смотреть.
0
вот! В моем makefile, получаемом в результате выполнения команды avr-project, нет такой переменной. мне сейчас помогло OBJECTS = main.o mmc.o ds1820.o enc28j60.o lan.o httpd.o cgi.o counter.o
теперь вылезла другая ошибка:

httpd.o: In function `httpd_request':
httpd.c:(.text+0xfe): undefined reference to `f_open'
httpd.o: In function `tcp_read':
httpd.c:(.text+0x396): undefined reference to `f_lseek'
httpd.c:(.text+0x4c2): undefined reference to `f_read'
httpd.o: In function `tcp_closed':
httpd.c:(.text+0x64e): undefined reference to `f_close'
mmc.o: In function `mmc_mount':
mmc.c:(.text+0x604): undefined reference to `f_mount'
мне бы вообще без mmc обойтись каким-то образом. буду сейчас смотреть код и убирать лишнее…
0
тэкс, отключил mmc.c, закомментировал все эти f_open, f_read, f_lseek, f_close, скомпилировалось нечто. файл размером 35028 байт. интересно, влезет в atmega16?

avr-size main.hex
text data bss dec hex filename
0 12444 0 12444 309c main.hex
это оно?
и еще, все же, где посмотреть к каким ногам и каким образом цепляется датчик и светодиодик? сжальтесь, не заставляйте в код весь вечер смотреть! :-)
попробую сейчас лапшу развешивать на макетную плату…
0
сомневаюсь что этот проект влезет в 16, в 32 в притирочку скорее всего…
0
даже с отключенным mmc? как правильно пользоваться avr-size?
0
скомпиленный проект webif c динамической генерацией html занимает 6300 байт флеша (при условии что в проекте отключены dhcp, udp)
0
и? ds1820 умещался в 2 кб и еще место оставалось. к тому же уважаемый lifelover сам говорил, что с поддержкой mmc в atmega16 проект может не влезть.
имхо проверить можно только прошивкой…
потерял шнурок от программатора :-(
0
на сколько я понял подключение должно быть следующим iscr.ru/1328912064/ (не стал рисовать делители напряжения и прочее, т.к. это протеус), по размеру прошивка влазит… но почему то устройство молчит и собранное в железе и в протеусе…
0
Может, фьюзы не так стоят? даже на 32 молчит?
0
фузи биты ничем не отличаются от предыдущих проектов на сколько я понял- поставил такт внешний, на 16мГц и все остальные- заводские…
0
Очень полезный цикл статей!
Возник небольшой вопрос: а как сделать обратную операцию — сохранение файла на флешку?
Например, посылаем HTTP запрос GET / HTTP/1.1 img.yandex.net/i/www/logo.png и выставляем флаг загрузки файла. После чего яндекс начнет нам пакетами высылать этот файл. В функции httpd_request() мы копируем содержимое пришедших пакетов на флешку. Таким образом мы сохраним файл img.yandex.net/i/www/logo.png у себя на флешке?
0
для начала нужно соеденится с сервером используя функцию tcp_open(), указав адрес, порт и локальный порт (в данном случае 80й, HTTPD_PORT). Если неудалось то пробуем снова, а если получилось — формируем пакет и отправляем с помощью tcp_send. Ловим приходящие пакеты, записываем на флешку, по завершению приема — закрываем соединение. Логика такая, или где-то закралась ошибка? :)
0
а какие есть ограничения по передачи данных из браузера, вместо состояния светика 200 байт реально отправить?
0
Вдоль и поперёк все прочитал, но так и не понял,
как организовать отправку команды в 80 порт Web-сервера(WIN8/Denwer) на php скрипт.
В команду вложить значение температурного датчика, например DATCH=22.
Занимаюсь Умным Домом, на Arduino это у меня работает, применял там EtherCard библиотеку.
Но хочу перейти на STM32F103xx и вот вроде нащупал что то, но ухватиться не могу.
0
GET/POST.
0
we.easyelectronics.ru/GYUR22/stm32-discovery-sdwebenc28j60.html
я портировал этот стэк на STM32, но ввиду каких то косяков (хз каких) теряются пакеты — перешел на W5500 оно поприятнее и попроще будет.
0
Поднять TCP-соединение на сервер (смотри раздел «TCP клиент»), отправить через него HTTP запрос. В простейшем случае он выглядит примерно так:
GET /path/mypage.php?datch=22 HTTP/1.1
Host: myhost.ru


Пустая строка в конце обязательна, переводы строки — обязательно CRLF. К тому же, GET-запросы могут кэшироваться проксями и прочим, так что может потребоваться добавить команды управления кешированием. А лучше — применить более подходящий метод вроде POST или PUT.
В ответ прилетит сообщение о статусе выполнения запроса, желательно его тоже парсить. Хотя и необязательно, если твой датчик не умеет принимать какие-либо меры, если запрос не прошел.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.