1 КБ программного пространства, 64 байта оперативной памяти. Возможна ли 1-проводная связь?

(Если ваш ленивый, смотрите дно для TL; DR)

Здравствуйте, я планирую создать новый (прототип) проект, связанный с физическими вычислениями. В основном у меня есть провода. На всех этих проводах необходимо одновременно измерять напряжение. Разница между показаниями каждого провода, превышающая несколько сотен микросекунд, полностью его испортит. Arduino занимает около 114 микросекунд. Таким образом, самое большее, что я мог прочитать, - это 2 или 3 провода до того, как задержка исказит точность показаний.

Так что мой план состоит в том, чтобы Arduino был "хозяином" массива ATTinys. Arduino довольно тесный для пространства, но это огромная игровая площадка по сравнению с tinys. ATTiny13A имеет 1 КБ флэш-памяти (пространство программы), 64 байта ОЗУ и 64 байта (недолговечного и медленного) EEPROM. (Я выбираю это как по цене, так и по размеру)

ATTinys в моей системе не будет делать много. По сути, все, что они будут делать, это дождаться сигнала от Мастера, а затем прочитать напряжение 1 или 2 проводов и сохранить его в ОЗУ (или, возможно, в ЭСППЗУ, если оно стеснено). А затем отправьте его Мастеру, используя только 1 провод для данных (больше места нет!).

Пока все, что мне нужно сделать, это реализовать тривиальный код чтения напряжения (используя встроенный АЦП). Но это общение немного меня беспокоит. Как вы думаете, протокол связи (используя только 1 провод!) Может быть даже реализован в таких ограничениях?

TL; DR: Как вы думаете, возможно ли реализовать протокол 1-проводной связи в менее чем 1 КБ программного пространства и 64 байтах ОЗУ (и 64 байтах EEPROM)? Нужно ли мне переходить на сборку, чтобы она подходила?

Я знаю, что в настоящее время мои программы Arduino, связанные с библиотекой Wiring, имеют размер более 8 Кб, поэтому я немного обеспокоен.

8 ответов

Решение

1 Кбайт места в программе должно быть достаточно, учитывая, что ваш протокол должен быть достаточно сложным, чтобы отправлять одно целое число при срабатывании. Посмотрите на Манчестерское Кодирование.

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

Однажды я создал программное обеспечение для промышленной панели управления, которое содержало ЖК-дисплей с сегментами 8x14, некоторые светодиоды, некоторые кнопки, последовательную (I2C) EEPROM и последовательный интерфейс для хоста. Был использован 4-битный процессор. Устройство не имело последовательного интерфейса, поэтому интерфейс RS232C и шина I2C должны были быть реализованы программно. Вдобавок ко всему, был протокол Modbus (который, помимо прочего, требует вычислений CRC с определенным временем) и прикладная программа.

Устройство имело около 128 х 4 бит оперативной памяти и 1 кВт, 2 кВт, 3 кВт или 4 кВт ПЗУ (10 бит на слово). Размер итоговой программы составлял около 1100 слов, поэтому она не совсем подходила для самого маленького устройства. Я использовал Ассемблер, конечно.

Однако вместо использования нескольких микроконтроллеров вы можете рассмотреть возможность использования аппаратного решения.

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

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

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

Я сделал встроенное программирование в подобных ограничениях. Я использовал Borland Turbo C (это было давным-давно) в крошечной модели и получил код, который едва ли был больше, чем я мог бы сделать в ассемблере, с долей усилий. Я говорю следующее: вполне возможно и целесообразно использовать C в качестве ассемблера высокого уровня.

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

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

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

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

Вы можете рассмотреть возможность обновления до ATTiny25. Это более функциональный 8-контактный AVR с универсальным последовательным интерфейсом Atmel. Он способен выполнять однопроводную последовательную связь в аппаратном обеспечении, имея всего несколько байтов программного обеспечения.

Недавно я разработал систему "ведущий-ведомый", используя ведущий AT90USB646 и ведомые ATtiny85. Очевидно, у меня было гораздо больше памяти для работы с рабами, но я хотел бы поделиться с вами следующим:

Что касается вашего протокола связи, имейте в виду, что некалиброванный внутренний генератор на ATtiny13 имеет точность +/- 10%. Это означает, что вы не сможете использовать, например, связь RS-232.

Я использовал вариант протокола Dallas 1-Wire в моей системе. Включая полную поддержку подчиненного перечисления и т. Д., Исходный код C компилируется в 1626 байтов.

Редактировать: Упс, не понял, вопрос так стар. Надеюсь, это все еще может помочь.

Другие вопросы по тегам