Datasheet atmega8-16pi — atmel даташит микроконтроллеры (mcu) avr 8k flash 512b ee 1k sram adc
Содержание
- 1 Питание микроконтроллера
- 2 Подключение платы Arduino Pro Mini
- 3 Getting started with MightyCore
- 4 PROGMEM with flash sizes greater than 64kB
- 5 Схема подключения микроконтроллера AVR
- 6 Supported clock frequencies
- 7 Что есть в даташитах
- 8 Зачем писать в регистры напрямую, когда есть HAL и LL?
- 9 Подключение двух светодиодов на один вывод
Питание микроконтроллера
Микроконтроллеры в зависимости от модели и серии питаются от напряжения величиной от 1.8 до 5 Вольт. Все микроконтроллеры AVR работают от напряжения в 5 Вольт. Поэтому можно считать что практически у всех микроконтроллеров напряжение питания 5 В, плюсовой вывод на микроконтроллере обозначается как Vcc. Нулевой вывод или еще его называют земля корпус, минусовой вывод обозначается как GND. Если взять блок питания от компьютера то черный провод это GND, а красный это +5 В это и есть Vcc. Если питаем от батареек то минус батарее это GND а плюс это Vcc. Главное чтобы напряжение питания с батареек было в диапазоне напряжения микроконтроллера, это интервал можно посмотреть в документации на МК.
На пример:
• Operating Voltages
- –1.8 — 5.5V (ATtiny2313V)
- –2.7 — 5.5V (ATtiny2313)
• Speed Grades
- –ATtiny2313V: 0 — 4 MHz @ 1.8 — 5.5V, 0 — 10 MHz @ 2.7 — 5.5V
- –ATtiny2313: 0 — 10 MHz @ 2.7 — 5.5V, 0 — 20 MHz @ 4.5 — 5.5V
Operating Voltage это как раз и есть тот диапазон напряжения в котором возможно нормальная работа МК. Существуют низковольтные серии (ATtiny2313V) у которой минимальное напряжение заметно ниже.
Speed Grades это максимально возможные частоты работы МК в зависимости от напряжения которое к нему подвели. Здесь видно, чем ниже напряжение тем меньше максимальная работа МК.
Для того чтобы нам МК начал работать то на него достаточно подать напряжение в 5 В. Как и говорилось ранее один провод кидаем на Vcc а другой на землю — к выводу GND. Некоторые микроконтроллеры имеют несколько выводов Vcc и также несколько GND. Это сделано не для того чтобы вам было делать печатные платы и удобства монтажа а для того чтобы подвести напряжение к камню равномерно, т.е. равномерно запитать весь кристалл. Это делается для того чтобы внутренний линии кристалла не перегружались. К примеру вы взяли МК с квадратным корпусов TQFP у него выводы Vcc и GNВ находятся со всех сторон. С одной стороны вы подвели питание, т.е. задействовали всего лишь 2 вывода питания а с другой стороны вы подключили на порты кучу светодиодов и взяли и зажгли их разом. Получается что внутренние линии МК перегружены, в результате камень офигеф от такой нагрузки выходит из строя. Поэтому если у контроллера есть несколько выводов питания то запитать нужно все выводы Vcc и GND.
Помимо выводов предназначенных для питания МК есть еще выводы AGND и AVCC — это выводы питания АЦП (аналого-цифрового преобразователя). АЦП это довольно точный измеритель напряжения, по этой причине его можно запитать через фильтры. Для того чтобы помехи которые довольно часто бывают в цепях питания не влияли на результаты измерения. По этой причине в некоторых схемах производят разделение земли, а на вывод AVCC подается напряжение через фильтрующий дроссель. А если вы не планируете пользоваться АЦП и вам не нужны точные измерения, то на AVCC можно подать те же +5 В что и на Vcc, а вывод AGND подключить к земле. Подключать выводы AVCC и GND нужно обязательно!
Ahtung!
В микроконтроллере Atmega8 есть одна ошибка на уровне топологии чипа — выводы VCC и AVCC связаны друг с другом на уровне кристалла и между ними сопротивление 5 Ом. К примеру, в чипах Atmega16 и Atmega168 выводы VCC и AVCC связаны между собой и их сопротивление составляет порядка десяток МОм. В документации по этому поводу ничего не сказано. Поддержка Atmel на это ответила что в чипе есть недочет и выводы VCC и AVCC соединенны между собой внутри камня. По этой причине ставить фильтрующий дроссель на AVCC для ATmega8 нет смысла, но запитывать вывод AVCC нужно в любом случае.
Подключение платы Arduino Pro Mini
Для соединения с компьютером используется специальный кабель FTDI FT232RL (или CH340G), содержащий преобразователь интерфейса USB–USART. Микроконтроллер содержит интерфейс USART, его сигналы RX и ТХ выведены на торцевую часть платы. Специальный кабель подключается к этим входам Arduino Pro Mini, а также к контактам VCC и GND. При этом питание 5 В поступает в модуль от персонально компьютера. Существуют соединители, имеющие также очень важный контакт DTR. Сигнал на этом контакте автоматически формирует сигнал сброса перед обновлением программы в МК. Без сброса в нужный момент в начале записи программы невозможно записать новую программу. Следует учитывать порядок подключения контактов. Правильно соединение USART выполняется по схеме:
/*
DTR <——————> DTR
TXD <——————> RXD
RXD <——————> TXD
VCC <——————> VCC
GND НЕ ПОДКЛЮЧЁН CTS
GND <——————> GND
*/
1 |
/* DTR <——————> DTR TXD <——————> RXD RXD <——————> TXD VCC <——————> VCC GND НЕ ПОДКЛЮЧЁН CTS GND <——————> GND */ |
Getting started with MightyCore
Ok, so you’ve downloaded and installed MightyCore, but how do you get the wheels spinning? Here’s a quick start guide:
- Hook up your microcontroller as shown in the .
- Open the Tools > Board menu item, and select a MighyCore compatible microcontroller.
- If the BOD option is presented, you can select at what voltage the microcontroller will shut down at. Read more about BOD .
- Select your prefered pinout. Personally I prefer the standard pinout because it’s «cleaner», but the Bobuino pinout is better at Arduino UNO pin compatibility. Read more about the different pinouts .
- Select your prefered clock frequency. 16 MHz is standard on most Arduino boards.
- Select what kind of programmer you’re using under the Programmers menu.
- If the Variants option is presented, you’ll have to specify what version of the microcontroller you’re using. E.g the ATmega1284 and the ATmega1284P have different device signatures, so selecting the wrong one will result in an error.
- Hit Burn Bootloader. If an LED is connected to pin PB0, it should flash twice every second.
- Now that the correct fuse settings is set and the bootloader burnt, you can upload your code in two ways:
- Disconnect your programmer tool, and connect a USB to serial adapter to the microcontroller, like shown in the . Then select the correct serial port under the Tools menu, and click the Upload button. If you’re getting some kind of timeout error, it means your RX and TX pins are swapped, or your auto reset circuity isn’t working properly (the 100 nF capacitor on the reset line).
- Keep your programmer connected, and hold down the button while clicking Upload. This will erase the bootloader and upload your code using the programmer tool.
Your code should now be running on your microcontroller! If you experience any issues related to bootloader burning or serial uploading, please use or create an issue on Github.
PROGMEM with flash sizes greater than 64kB
The usual attribute stores constant data such as string arrays to flash and is great if you want to preserve the precious RAM. However, PROGMEM will only store content in the lower section, from 0 and up to 64kB. If you want to store data in the upper section, you can use (64 — 128kB) if your target is an ATmega1284/P. Accessing this data is not as straight forward as with , but it’s still doable:
const char far_away[] PROGMEM1 = "Hello from far away!\n"; // (64 - 128kB) void print_progmem() { char c; // Print out far_away for(uint8_t i = ; i < sizeof(far_away); i++) { c = pgm_read_byte_far(pgm_get_far_address(far_away) + i); Serial.write(c); } }
Схема подключения микроконтроллера AVR
Эта упрощенная схема подключения микроконтроллера так сказать необходимы минимум для запуска контроллера, по хорошему лучше добавить несколько внешних элементов. Провод показанный пунктиром от источника питания к БП необязателен. Если ты питаешь МК от внешнего источника то это провод лишний. Но лучше питать всю схему от одного источника — так больше вероятность того что все прошьется успешно. Для учебных целей схема подключения питания самый раз, светодиодиком там помигать или еще чего.
Вывод AREF это вход опорного напряжения АЦП, туда подается напряжение относительно которого будет считать АЦП. Можно использовать внутренний источник опорного напряжения величиной в 2.56 В либо использовать напряжение AVCC. На вывод AREF рекомендуется подключать конденсатор, это улучшает качество опорного напряжения АЦП и как в следствии правильность измерения АЦП. На входе в AVCC установлен дроссель и конденсатор между AVcc и GND. Также между выводами GND и VCC ставят керамический конденсатор номиналов в 100 нФ как можно ближе к выводам питания микросхемы — он сглаживает краткие импульсы помехи, которые получаются в результате работы самих микросхем. Также между выводами VCC и GND устанавливают конденсатор емкость в 47 мкФ для сглаживания более сильных бросков напряжения.
Вывод сброса
В МК AVR есть внутренняя схема сброса и вывод reset внутри уже подтянут сопротивлением в 100 кОм к выводу Vcc. Но этой подтяжки не хватает, получается что микроконтроллер «выход» в сброс от незначительного потенциала на выводе. К примеру от прикосновения пальцем вывода RST, а иногда от случайного касания самой платы. Поэтому имеет смысл дополнительно подтянуть этот вывод резистором в 10 кОм. Меньшее значение резистора лучше не брать, потому что если вы используйте внутрисхемный программатор то он не сможет пересилить подтяжку и прошить микроконтроллер. Поэтому значение в 10 кОм в самый раз.
Supported clock frequencies
MightyCore supports a variety of different clock frequencies. Select the microcontroller in the boards menu, then select the clock frequency. You’ll have to hit «Burn bootloader» in order to set the correct fuses and upload the correct bootloader.
Make sure you connect an ISP programmer, and select the correct one in the «Programmers» menu. For time critical operations an external crystal/oscillator is recommended.
You might experience upload issues when using the internal oscillator. It’s factory calibrated but may be a little «off» depending on the calibration, ambient temperature and operating voltage. If uploading failes while using the 8 MHz internal oscillator you have these options:
- Edit the baudrate line in the file, and choose either 115200, 57600, 38400 or 19200 baud.
- Upload the code using a programmer (USBasp, USBtinyISP etc.) or skip the bootloader by holding down the shift key while clicking the «Upload» button
- Use the 4, 2 or 1 MHz option instead
Frequency | Oscillator type | Speed | Comment |
---|---|---|---|
16 MHz | External crystal/oscillator | 115200 | Default clock on most AVR based Arduino boards |
20 MHz | External crystal/oscillator | 115200 | |
18.4320 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
14.7456 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
12 MHz | External crystal/oscillator | 57600 | Useful when working with USB 1.1 (12 Mbit/s) |
11.0592 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
8 MHz | External crystal/oscillator | 57600 | Common clock when working with 3.3V |
7.3728 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
4 MHz | External crystal/oscillator | 9600 | |
3.6864 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
2 MHz | External crystal/oscillator | 9600 | |
1.8432 MHz | External crystal/oscillator | 115200 | Great clock for UART communication with no error |
1 MHz | External crystal/oscillator | 9600 | |
8 MHz | Internal oscillator | 38400 | Might cause UART upload issues. See comment above |
4 MHz | Internal oscillator | 9600 | Derived from the 8 MHz internal oscillator |
2 MHz | Internal oscillator | 9600 | Derived from the 8 MHz internal oscillator |
1 MHz | Internal oscillator | 9600 | Derived from the 8 MHz internal oscillator |
Что есть в даташитах
Непосредственно в Datasheet нам могут потребоваться такие разделы:
Device Summary – первая страница даташита вкратце рассказывает об устройстве. Очень полезна в ситуациях, когда вы где-то нашли чип (увидели в магазине, выпаяли, встретили упоминание) и хотите понять, что это.
General Description – более подробное описание возможностей чипов из линейки.
Pinouts – схемы распиновки для всех возможных корпусов чипа (на какой ноге какой пин).
Pin Description – описание назначения и возможностей каждого пина.
Memory Map – карта адресов в памяти нам вряд ли потребуется, но иногда в нее включается также таблица адресов блоков регистров.
Register Map – таблица адресов блоков регистров, как правило, находится именно в даташите, а в Ref Manual – только сдвиги (address offsets).
Electrical Characteristics – в этом разделе нас в первую очередь интересуют absolute maximum ratings, перечисляющие максимальные нагрузки на чип. В отличие от неубиваемой Atmega328p, большинство МК не позволяет подключать к пинам серьезные нагрузки, что становится неприятным сюрпризом для ардуинщиков.
Package Information – чертежи доступных корпусов, полезные при проектировании своих плат.
Reference Manual структурно состоит из разделов, посвященных конкретной периферии, указанной в их заголовке. Каждую главу можно условно поделить на три части:
Overview, Introduction, Features – обзор возможностей периферии;
Functional Description, Usage Guide или просто основной блок раздела – подробное текстовое описание принципов устройства периферии и способов ее использования;
Registers – описание управляющих регистров. В простых случаях типа GPIO или SPI этого может быть вполне достаточно, чтобы начать использовать периферию, но часто приходится все-таки читать и предыдущие части.
Зачем писать в регистры напрямую, когда есть HAL и LL?
СловарикHAL, Hardware Abstraction Layer – библиотека для управления микроконтроллером с высоким уровнем абстракции. Если надо использовать интерфейс SPI1, просто настраиваем и включаем SPI1, не задумываясь, какие регистры за что отвечают.LL, Low Level API – библиотека, содержащая макросы или структуры с адресами регистров, позволяющая обращаться к ним по имени. DDRx, PORTx, PINx на Атмеге – это LL.
Более-менее разобравшись с Атмегой и начитавшись статей про прекрасности STM32, я накупил полдюжины разных плат – и Discovery, и «Синие Таблетки», и даже просто чипы под свои самоделки. Все они два года пылились в коробке. Иногда я говорил себе: «все, с этих выходных осваиваю STM», запускал CubeMX, генерил сетап для SPI, смотрел на получившуюся стену текста, обильно сдобренную копирайтами STM, и решал, что это как-то уж слишком.
Разобраться, что тут понаписал CubeMX, конечно, можно. Но одновременно понятно, что запомнить все формулировки, чтобы потом писать их руками, нереально. А уж дебажить это, если я случайно забуду в Кубе поставить какую-нибудь галочку, – совсем привет.
Прошло два года, я по-прежнему облизывался в ST MCU Finder на всякие вкусные, но недоступные моему пониманию чипы, и случайно наткнулся на замечательную статью, пусть и про STM8. И внезапно понял, что все это время стучался в открытую дверь: регистры у STM устроены так же, как у любого другого МК, и для работы с ними Куб необязателен. А что, так можно было?..
HAL и конкретно STM32CubeMX – инструмент для профессиональных инженеров, плотно работающих с чипами STM32. Главная фишка – высокий уровень абстракции, возможность быстро мигрировать с одного МК на другой и даже с одного ядра на другое, оставаясь в рамках линейки STM32. Любители с такими задачами сталкиваются редко – наш выбор МК, как правило, ограничен ассортиментом AliExpress, и мы чаще мигрируем между кардинально разными чипами – переезжаем с Атмеги на STM, с STM на ESP, ну или что там нам новенького подкинут китайские друзья. HAL здесь не поможет, а времени его изучение съест немало.
Остается LL – но от него до регистров полшага. Лично я нахожу написание своих макросов с адресами регистров полезным: я внимательнее изучаю даташит, думаю, что мне потребуется в будущем, а что точно нет, лучше структурирую свои программы, ну и вообще преодоление способствует запоминанию.
Кроме того, есть нюанс с популярным STM32F103 – для него существуют две несовместимые версии LL, одна официальная от STM, вторая – от Leaf Labs, используемая в проекте STM32duino. Если писать open-source библиотеку (а у меня была именно такая задача), надо либо делать две версии, либо обращаться к регистрам напрямую.
Наконец, отказ от LL, на мой взгляд, упрощает миграцию, особенно если закладываться на нее с самого начала работы над проектом. Утрированный пример: напишем ардуиновский blink в Atmel Studio без LL:
Чтобы этот код замигал светодиодом на китайской платке с STM8 (из ST Visual Desktop), в нем достаточно поменять два адреса:
Да, я использую особенность подключения светодиода на конкретной плате, мигать будет очень медленно, но будет же!
Подключение двух светодиодов на один вывод
В данной схеме два светодиода подкючены на одну ножку порта, такая схема позволяет упростить печатную плату, не придется тажить еще одну шину к каждому светодиоду. Для того чтобы зажечь верхний сетодиод нужно на вывод Pxy подать логический 0, а для того чтобы зажечь нижний то подать высокий уровень. Если мы хотим зажечь сразу оба светодиода та нам нужно перевести вывод МК в режим Hi-Z как будто его нет, в этом случае появится сквозной ток через оба светодиода и они оба загорят. Или можно бысто зажигать то один то другой, визуально они будут оба гореть. Минус схемы в том что погасить сразу два диода нельзя.