SD карта и Serial порт

Тема в разделе "Arduino & Shields", создана пользователем msd, 29 авг 2011.

  1. msd

    msd Нерд

    Подключил к Orduino-Nano v1.1 SD карту, так, как написано в примерах для SD-card к Arduino-IDE. Выяснилось, что одновременно Serial и SD не работают, т.е. в этих примерах приходится закомментировать все обращения к Serial, только тогда запись-чтение SD карты выполняется, так, как должно быть. В чем тут дело?
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    А с помощью чего вы подключали SD-карту? Какой модуль? Если наш, то что-то тут не то: он использует SPI-коммуникацию, которая не затрагивает serial-пины 0 и 1.
     
  3. msd

    msd Нерд

    Подключал с помощью нескольких резисторов для выравнивания уровней (такие схемы в интернете присутствуют по теме SD Card и Arduino).
    Но проблема решилась, оказывается было просто переполнение RAM.
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Хе, как всегда: проблема откуда не ждали :)
     
  5. msd

    msd Нерд

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

    Валерий Нерд

    Да проблема неприятная.
    1. Как вариант можно хранить большие строки в памяти программ.
    2. Можно попробовать оптимизировать код (последний раз таким образом я выиграл около 300 байт).
    3. Можно "подправить" стандартные библиотеки и таким образом выиграть немного SRAM, например вот.
    4. На этапе отладки отслеживаю свободную SRAM так:
    int freeRam () {
    extern int __heap_start, *__brkval;
    int v;
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
    }
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Когда я делал из Arduino крошечный web-server, я упаковывал исходники web-страниц в gzip. Существенно помогло.
     
  8. Валерий

    Валерий Нерд

    Только сегодня думал о простом сервере для домашних датчиков. Было бы хорошо посмотреть пример :) .
     
  9. nailxx

    nailxx Официальный Нерд Администратор

    Пример прямо сейчас не дам — он давно уничтожен, но наводок набросаю. Во-первых, вам нужно в принципе научить Arduino + Ethernet Shield отвечать на 80-м порту незамысловатой HTML-страницей вроде Hello world. Пример такой штуковины есть на официальной вики.

    Далее, когда всё получится, вам нужно снизить затраты по памяти на хранение исходников web-страниц. Тут нет никакой магии Arduino, тут магия HTTP-протокола. Браузеры умеют понимать контент, если он приходит в gzip. Главное, намекнуть ему на это, указав в HTTP Header'ах ответа с Arduino

    Код (Text):
    Content-Encoding: gzip
    Затем, в теле ответа, вместо сырой строки “<html><body>Hello world</body></html>” отдаёте

    Код (Text):
    #define MY_PAGE "\x1F\x8B\x08\x00\x9B\x8F\x5E\x4E\x00\x03\xF3\x48\xCD\xC9\xC9\x57\x28\xCF\x2F\xCA\x49\xE1\x02\x00\xD5\xE0\x39\xB7\x0C\x00\x00\x00"
    где эта кракозябра — это то, что вы получите от gzip'ания своей страницы заранее, до компиляции. В линуксе для этого можно воспользоваться:

    Код (Text):
    cat my-page.html | gzip -af |  hexdump -v -e '"\x" 1/1 "%02X"' ; echo
    Уверен и в других ОСях есть +/- удобные способы