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

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

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

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

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

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

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

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

Ответы [ 8 ]

9 голосов
/ 18 апреля 2010

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

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

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

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

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

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

2 голосов
/ 18 апреля 2010

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

2 голосов
/ 18 апреля 2010

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

1 голос
/ 10 сентября 2010

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

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

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

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

1 голос
/ 28 мая 2010

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

1 голос
/ 28 мая 2010

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

1 голос
/ 18 апреля 2010

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

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

1 голос
/ 18 апреля 2010

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

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

...