Какую флеш память имеет микроконтроллер atmega168 на arduino

Arduino.ru

В микроконтроллере ATmega168 , используемом на платформах Arduino, существует три вида памяти:

  • Флеш-память: используется для хранения скетчей.
  • ОЗУ (Статическая оперативная память с произвольным доступом): используется для хранения и работы переменных.
  • EEPROM (энергонезависимая память): используется для хранения постоянной информации.

Флеш-память и EEPROM являются энергонезависимыми видами памяти (данные сохраняются при отключении питания). ОЗУ является энергозависимой памятью.

Микроконтроллер ATmega168 имеет:

  • 16 Кб флеш-памяти (2 Кб используется для хранения загрузчика)
  • 1024 байта ОЗУ
  • 512 байт EEPROM

Необходимо обратить внимание на малый объем ОЗУ, т.к. большое число строк в скетче может полностью ее израсходовать. Например, следующая объявление:

char message[] = "I support the Cape Wind project.";

занимает 32 байта из общего объема ОЗУ (каждый знак занимает один байт). При наличии большого объема текста или таблиц для вывода на дисплей возможно полностью использовать допустимые 1024 байта ОЗУ.

При отсутствии свободного места в ОЗУ могут произойти сбои программы, например, она может записаться, но не работать. Для определения данного состояния требуется превратить в комментарии или укоротить строки скетча (без изменения кода). Если после этого программа работает корректно, то на ее выполнение был затрачен весь объем ОЗУ. Существует несколько путей решения данной проблемы:

ATmega — использование памяти

Иногда, бывает полезно узнать, сколько памяти использует Ваш скетч.

Иногда, это очень важно, например, когда Вы достигаете предела. Потому что, могут происходить странные и совершенно непредсказуемые вещи, при достижении программой границ памяти (out of memory).

Выхода кода за границы памяти легко избежать, так Arduino IDE скажет вам точно, сколько используется памяти после каждой компиляции/загрузки:

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

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

В оперативной памяти (RAM), есть три области:
* статических данных, в ней хранятся глобальные переменные и массивы… и строки!
* «куча»(heap), используется, если вы вызываете malloc() и free()
* «cтек»(stack), используется, когда одна функция вызывает другую

Куча растёт вверх, и используется довольно непредсказуемым образом. Если вы освобождаете области памяти, то они становятся неиспользованными пробелами в куче, которые могут повторно использоваться новым вызовом malloc(), если запрошенный блок вписывается в эти пробелы.

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

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

Весь фокус в том, чтобы использовать минимальное количесво оперативной памяти(RAM), потому что это дефицитный ресурс: ATmega имеет всего 2048 байт RAM.

Вот небольшая функция функция, которая определяет, сколько оперативной памяти в настоящее время не используется:

И вот скетч, который вызывает данную функцию:

Итак, у нас есть около 1.8 Kb доступного ОЗУ в этом крошечном скетче, который почти ничего не делает. Более точно: скетч использует 2048 — 1846 = 202 байта для внутренних нужд и прочего (кстати, 128 байт, используются для входного буфера последовательного порта).

Когда это значение упадёт до 0, ваш скетч рухнет. Это может выглядеть, как бесконечный цикл, странные расчеты или выход, или постоянная перезагрузка. Не ожидайте, понятных сообщений об ошибке!

Давайте внесём в скетч незначительные изменения:

Первое — это объясняется тем, что все C-строки также хранятся в оперативной памяти! Это объясняет, почему добавление одного символа в строчке приводит к уменьшению объема доступной памяти.

Второе — флэш-память организована в слова. Поэтому, иногда, когда вы ожидаете однобайтовый эффект, то можете получить округление из-за того, что объект хранится во флэш-памяти(flash).

И третье — все C-строки также хранятся во флэш-памяти. Дело в том, что содержимое оперативной памяти не определено при включении питания, поэтому одна из задач, выполняемых при запуске С-кода, состоит в том чтобы скопировать все строки из флэш-памяти в оперативную память.

Мораль: будьте очень осторожны, когда что-нибудь делаете со строками на ATmega, потому что вы можете обнаружить, что очень быстро достигли границы памяти. Добавление большого количества подробных отладочных сообщений может вызвать больше проблем, чем вы думаете!

На сайте avr-libc отыскалась замечательная картинка, иллюстрирующая AVR RAM:

Какую флеш память имеет микроконтроллер atmega168 на arduino

Общие сведения

Arduino Pro — это устройство на базе микроконтроллера ATmega168 (datasheet) или ATmega328 (datasheet). Для заказа доступны две версии устройства — 3.3В / 8 МГц или 5В / 16 МГц. В состав Arduino Pro входит: 14 цифровых входов/выходов (из них 6 могут использоваться в качестве ШИМ-выходов), 6 аналоговых входов, разъем для подключения аккумулятора, переключатель питания, кнопка сброса, а также контактные площадки для впаивания разъема питания, ICSP-разъема для внутрисхемного программирования и внешних выводов платы. Шестиконтактный разъем может служить для питания и взаимодействия с платой через USB посредством FTDI-кабеля либо макетной платы Sparkfun.

Arduino Pro предназначен для полустационарного монтажа в различное оборудование или установки. Плата специально поставляется без впаянных разъемов, что позволяет пользователю припаивать провода или использовать необходимые типы разъемов по своему усмотрению. По расположению выводов Arduino Pro совместим со всеми платами расширения Ардуино. Версия устройства с рабочим напряжением 3.3В может работать от аккумулятора.

Arduino Pro разработан и изготовлен компанией SparkFun Electronics.

Схема и исходный проект

Характеристики

Микроконтроллер ATmega168 или ATmega328
Рабочее напряжение 3.3В или 5В
Напряжение питания 3.35 — 12В (для моделей 3.3В) или 5 — 12В (для моделей 5В)
Цифровые входы/выходы 14 (из них 6 могут использоваться в качестве ШИМ-выходов)
Аналоговые входы 6
Максимальный ток одного вывода 40 мА
Flash-память 16 КБ (ATmeag168) или 32 КБ (ATmega328) из которых 2 КБ используются загрузчиком
SRAM 1 КБ (ATmega168) или 2 КБ (ATmega328)
EEPROM 512 байт (ATmega168) или 1 КБ (ATmega328)
Тактовая частота 8 МГц (для моделей 3.3В) или 16 МГц (для моделей 5В)

Питание

Arduino Pro может быть запитан через USB-разъем, от аккумулятора либо от внешнего источника питания. Для подключения аккумулятора служит разъем JST. Для подключения внешнего источника питания на плату необходимо припаять соответствующий разъем питания.

Ниже перечислены выводы питания, расположенные на плате:

  • VIN. Напряжение, поступающее на Ардуино от аккумулятора или внешнего источника питания (в соответствии с позицией переключателя). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, если устройство запитано от аккумулятора или внешнего источника питания.
  • VСС. Стабилизированное напряжение питания на плате. Его источником может быть либо аккумулятор, либо стабилизатор напряжения внешнего источника питания, либо USB-Serial преобразователь.
  • GND. Выводы земли.

Память

Объем флеш-памяти программ микроконтроллера ATmega168 составляет 16 КБ (из которых 2 КБ используются загрузчиком). Микроконтроллер также имеет 1 КБ памяти SRAM и 512 байт EEPROM (из которой можно считывать или записывать информацию с помощью библиотеки EEPROM). Микроконтроллер ATmega328 имеет 32 КБ флеш-памяти, 2 КБ SRAM и 1 КБ EEPROM.

Входы и выходы

С использованием функций pinMode(), digitalWrite() и digitalRead() каждый из 14 цифровых выводов Pro может работать в качестве входа или выхода. Уровень напряжения на выводах ограничен 3.3В. Максимальный ток, который может отдавать или потреблять один вывод, составляет 40 мА. Все выводы сопряжены с внутренними подтягивающими резисторами (по умолчанию отключенными) номиналом 20-50 кОм. Помимо этого, некоторые выводы Ардуино могут выполнять дополнительные функции:

  • Последовательный интерфейс: выводы 0 (RX) и 1 (TX). Используются для получения (RX) и передачи (TX) данных по последовательному интерфейсу. Эти выводы соединены с линиями TX-0 и RX-1 шестиконтактного разъема.
  • Внешние прерывания: выводы 2 и 3. Данные выводы могут служить источниками прерываний, возникающих при различных условиях: при низком уровне сигнала, по фронту, по спаду или при изменении сигнала на этих выводах. Для получения дополнительной информации см. функцию attachInterrupt().
  • ШИМ: выводы 3, 5, 6, 9, 10 и 11. С помощью функции analogWrite() могут выводить 8-битные аналоговые значения в виде ШИМ-сигнала.
  • Интерфейс SPI: выводы 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Данные выводы позволяют осуществлять связь по интерфейсу SPI. В устройстве реализована аппаратная поддержка SPI, однако на данный момент язык Ардуино пока ее не поддерживает.
  • Светодиод: 13. Встроенный светодиод, подсоединенный к цифровому выводу 13. При отправке значения HIGH светодиод включается, при отправке LOW — выключается.

В Arduino Pro есть 6 аналоговых входов, каждый из которых может представить аналоговое напряжение в виде 10-битного числа (1024 различных значения). По умолчанию, измерение напряжения осуществляется относительно диапазона от 0 до VCC. Тем не менее, верхнюю границу этого диапазона можно изменить, используя вывод AREF и применив несколько низкоуровневых процедур. Помимо этого, некоторые из аналоговых входов имеют дополнительные функции:

  • I2C: вывод 4 (SDA) и вывод 5 (SCL). С использованием библиотеки Wire позволяют осуществлять связь по интерфейсу I2С.

Помимо перечисленных, на плате есть еще один вывод:

  • AREF. Опорное напряжение для аналоговых входов. Может задействоваться функцией analogReference().
  • Reset. Формирование низкого уровня (LOW) на этом выводе приведет к перезагрузке микроконтроллера. Обычно этот вывод служит для функционирования кнопки сброса на платах расширения

Связь

Arduino Pro предоставляет ряд возможностей для осуществления связи с компьютером, еще одним Ардуино или другими микроконтроллерами. В ATmega168 и ATmega328 имеется приемопередатчик UART, позволяющий осуществлять последовательную связь посредством цифровых выводов 0 (RX) и 1 (TX). В пакет программного обеспечения Ардуино входит специальная программа, позволяющая считывать и отправлять на Ардуино простые текстовые данные через USB-соединение.

Библиотека SoftwareSerial позволяет реализовать последовательную связь на любых цифровых выводах Arduino Pro.

В микроконтроллерах ATmega168 и ATmega328 также реализована поддержка последовательных интерфейсов I2C (TWI) и SPI. В программное обеспечение Ардуино входит библиотека Wire, позволяющая упростить работу с шиной I2C; для получения более подробной информации см. документацию. Для работы с интерфейсом SPI см. даташит микроконтроллера ATmega168 или ATmega328.

Программирование

Arduino Pro программируется с помощью программного обеспечения Ардуино (скачать). Для получения более подробной информации см. справку и примеры.

ATmega168 или ATmega328 в Arduino Pro выпускается с прошитым загрузчиком, позволяющим загружать в микроконтроллер новые программы без необходимости использования внешнего программатора. Взаимодействие с ним осуществляется по оригинальному протоколу STK500 (описание, заголовочные файлы C).

Тем не менее, микроконтроллер можно прошить и через разъем для внутрисхемного программирования ICSP (In-Circuit Serial Programming), не обращая внимания на загрузчик; более подробно об этом см. соответствующие инструкции.

Автоматический (программный) сброс

Чтобы каждый раз перед загрузкой программы не требовалось нажимать кнопку сброса, Arduino Pro спроектирован таким образом, который позволяет осуществлять его сброс программно с подключенного компьютера. Один из выводов шестиконтактного разъема соединен с выводом RESET микроконтроллера ATmega168 или ATmega328 через конденсатор номиналом 100 нФ. Во время подключения к компьютеру этот вывод также связан с одной из линий, участвующих в аппаратном управлении потоком данных, идущих через преобразователь USB-Serial: при использовании кабеля FTDI — с линией RTS, при использовании макетной платы Sparkfun — с линией DTR. Когда на этой линии появляется ноль, вывод RESET, соответственно, также переходит в низкий уровень на время, достаточное для перезагрузки микроконтроллера. Данная особенность используется для того, чтобы можно было прошивать микроконтроллер всего одним нажатием кнопки в среде программирования Ардуино. Такая архитектура позволяет уменьшить таймаут загрузчика, поскольку процесс прошивки всегда синхронизирован со спадом сигнала на линии RESET.

Однако эта система может приводить и к другим последствиям. При подключении Pro к компьютерам, работающим на Mac OS X или Linux, его микроконтроллер будет сбрасываться при каждом соединении программного обеспечения с платой. После сброса на Pro активизируется загрузчик на время около полсекунды. Несмотря на то, что загрузчик запрограммирован игнорировать посторонние данные (т.е. все данные, не касающиеся процесса прошивки новой программы), он может перехватить несколько первых байт данных из посылки, отправляемой плате сразу после установки соединения. Соответственно, если в программе, работающей на Ардуино, предусмотрено получение от компьютера каких-либо настроек или других данных при первом запуске, убедитесь, что программное обеспечение, с которым взаимодействует Ардуино, осуществляет отправку спустя секунду после установки соединения.

Физические характеристики

С учетом шестиконтактного разъема и переключателя питания, выступающими за пределы платы, максимальная длина и ширина печатной платы Arduino Pro составляет 5.2 на 5.4 см соответственно. Четыре крепежных отверстия позволяют устанавливать плату в корпус или любую другую поверхность. Обратите внимание, что расстояние между цифровыми выводами 7 и 8 не кратно традиционным 2.54 мм и составляет 4 мм.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *