Microchip ATtiny

Так, ці нові tinyAVR (ATtiny416/417/814/816/817) вже Microchip, а не Atmel.

Після купівлі Мікрочіпом фірми Атмел були певні побоювання щодо майбутнього мікроконтролерів AVR. І от з’явилися нові tiny з цікавими можливостями. Дещо, як програмована логіка та перемикання швидкості/споживання компаратора, не новина для мікроконтролерів Microchip. Дещо було в AVR, але лише в лінійці xmega. Не думаю, що за час від купівлі все перераховане нижче встигли зробити у нового власника. Швидше за все, роботи велися і до продажу фірми. Головне, що все це не закинуто, тобто поява цих нових tiny свідчить, принаймні, про продовження лінії мікроконтролерів з ядром AVR.

Отже, що маємо: » » »

DIDR0 та PRR

Трохи інший проект, трохи інший мікроконтролер (ATmega168PA, а не ATmega48PA), але знову мікроампери, як і у випадку зі світлодіодом. Тільки тепер головними героями є не світлодіод, який вирішив побути фотодіодом, а два регістри, які посперечатися, хто з них головніший.

Результат той же — завищене споживання. Навіть основна причина та ж сама — проміжна напруга на цифровому вході. На відміну від того світло-фото-діода вона там і повинна бути такою, бо це ще й вхід АЦП. Оскільки входи АЦП штатно повинні приймати «нецифрові» напруги, у мікроконтролері є регістр DIDR0 (Digital Input Disable Register), бітами у якому можна від’єднати від потрібної ніжки цифровий вхід і закоротити його на лінію GND. Звісно, я це знаю і, звісно, маску потрібних ніжок я у регістр записав.

«Але є одне але»
АЦП у цьому проекті потрібен періодично і ненадовго, тому він майже постійно вимкнений бітиком регістра PRR (Power Reduction Register), щоб додатково зекономити дещицю струму. При старті програми АЦП вимкнено. Відповідний фрагмент ініціалізації мікроконтролера виглядав наступним чином:

1
2
3
4
5
6
7
8
     // TIM1 та TIM2 потрібні завжди, інше буде дозволено при потребі
    xouti   ACSR, 1 << ACD
    xouti   PRR, ~((1<<PRTIM2) | (1<<PRTIM1))
     // Порти
    xouti   DIDR0, DIDR0_MASK
    xouti   PORTB, PORTB_PORT_MASK
    xouti   DDRB,  PORTB_DDR_MASK
    xouti   PORTC, PORTC_PORT_MASK

І от що з’ясувалося.
Якщо порядок запису у регістри PRR та DIDR0 такий, як показано вище, то цифрові входи не відключаються від ніжок. В результаті на вході заміру напруги живлення плати при збільшенні напруги струм плати спочатку росте з десь 250 мікроампер до 400, потім спадає до 300, бо напруга на вході АЦП минає середину живлення і наближається до безпечного рівня.
Якщо ж рядок 5 поставити перед рядком 3, то цифрові входи відключаються і залишаються відключеними і після вимикання живлення АЦП. Тобто при встановленні біта PRADC у регістрі PRR сам регістр DIDR0 продовжує працювати і керувати портами, але схеми запису в нього вирубаються начисто.

Мені і в голову не прийшло, що таке може бути — незважаючи на те, що опис регістра DIDR0 розміщено в кінці розділу опису АЦП. Все ж таки керує цей регістр ланцюгами цифрових входів портів, а не аналоговими входами.
Тепер знатиму…

Мікроампери

Працюю зараз з платкою, яка повинна мати якнайменше споживання.
Сьогодні щось дописав, щось виправив і вирішив знову перевірити струм. І виявив, що плата їсть на 20-50 мікроампер більше, ніж очікувалося. Та ще й струм залежить від положення плати!

Винним виявився… світлодіод.
Зрозуміло, зрештою винний я сам і причина зайвого струму вічна і банальна — не ініціалізована ніжка мікроконтролера. Вона десь пізніше таки ініціалізується, але аж тоді, коли світлодіод треба увімкнути. А до того — високоомний вхід.
Світлодіод працює як фотодіод, від положення плати залежить освітленість цього «фотодіода» і, відповідно, напруга на цифровому вході. От звідти і змінна зайвина у споживанні.

ATmega48PB

А також вся компанія ATmega88PB та ATmega168PB. Зацікавило, оскільки саме мега48 — один з небагатьох представників AVR, який я досі використовую. Іноді ATmega168 — на тих же платах під час налагодження, для свободи використання printf. Ще іноді ATtiny13A для малоногого та ATtiny26-ATtiny261 за їхню 64-мегагерцову PLL для таймера.

У порівнянні з ATmega48P/ATmega48PA зміни достатньо значні, навіть сигнатура помінялася :-) , чого не було при переході від ATmega48P до ATmega48PA.

  • Нарешті викинули оту дурницю з двома парами VCC/GND (на додаток до VCCA/GNDA) і додали звільнені ніжки у PORTE. У той же порт додали ніжки ADC6 та ADC7, які тепер можуть бути і виходами.
  • Вихід аналогового компаратора тепер доступний на одному з цих доданих IO-виводів. Тепер можна зробити чесний апаратний гістерезис та ще й подати цей вихід на вхід RXD, а не ліпити програмний UART у випадках, коли сигнал приймається саме на компаратор (ну от такий він, сигнал).
  • Детектор стартового біта USART тепер працює в усіх sleep-режимах, тобто навіть у power down! Внутрішній RC вмикається по спаду на RXD, але тактування подається лише на USART, процесор піднімається вже після приймання. Особливо цікаво у поєднанні з попереднім пунктом.
  • 9-байтовий унікальний ідентифікатор кристалу. Але чомусь недоступний для програматора — розміщений у горішній частині регістрів і читається лише з програми. Принаймні у цій версії документації інших методів отримати не описано.
    Дрібна дурниця — в документації молодший регістр унікального ідентифікатора названо DIDR0 (Device IDentifier Register 0), тобто так само, як регістр заборони цифрових входів на аналогових ногах (Digital Input Disable Register 0).

Чого досі не вистачає:

  • Можливості перемкнути бітиком компаратор у low power режим — хай він спрацьовує не за 0.5-0.7 мкс, а за 3-5, але при цьому перестає жерти аж 60 мкА (при 3,3 В). Було б особливо приємно при використанні аналогового компаратора з UART у режимі power down.
  • Перемикання тактування на ходу, а не лише через fuse CKSEL. У деяких нових ATtiny це вже зробили, то могли б і тут.
  • Хоча у багатьох випадках мені б вистачило мультиплексора перед таймером 2, який вже має асинхронний режим. От туди б запускати не лише зовнішній «годинниковий» кварц, а ще й «128-кілогерцовий» генератор. Залишається додати до цього таймера input capture та прокидання по цій події — і можна з основного 8-мегагерцового RC йти в сон, звідки прокидатися, маючи час від попередньої події.

AVReAl update — 1.29r0

Вийшла нова версія програматора avreal — v1.29r0 (Wed 2013-12-11).

  • Ключ -% розширеної діагностики замінено на ключ -i керування рівнем інформаційних повідомлень;
  • При перенаправленні stdout у файл критичні повідомлення дублюються на stderr (якщо той не перенаправлено);
  • Остаточна відмова від групування ключів (тепер не можна -wv, можна лише -w -v);
  • Додано синоніми mega325PA, mega3250PA.

AVReAl update — 1.28r14

Вийшла нова версія програматора avreal — v1.28r14 (Mon 2013-08-05).

  • Виправлено помилку в сигнатурах ATmega128rfr2, ATmega256rfr2;
  • Додано ATmega32HVE, ATmega64HVE.

AVReAl update — 1.28r13

Вийшла нова версія програматора avreal — v1.28r13 (Sun 2013-06-02).

Помилка в синхронізації (MPSSE)

Виявлено помилку, через яку не проходить процедура пересинхронізації додатковим імпульсом SCK у наступних умовах:

  • програма у мікроконтролері виставляє на ніжці ніжку SCK високий рівень;
  • використовується MPSSE-адаптер (FT2232, FT4232H, FT232H).

При роботі через LPT-адаптер синхронізація проходить нормально, після стирання через нього знову можна запрограмувати через USB-адаптер.

Схоже, помилка давня, але в більшості випадків до неї не доходило, бо синхронізація встановлювалася після обов’язкового початкового циклу RESET-синхронізації.
Наче хтось колись на щось подібне жалівся, але я не міг відтворити у себе і не знаходив нічого підозрілого в коді avreal. На цей раз мені знадобилося «підняти» одну стару плату з AT90S8515 і я таки отримав оте «Can’t resync» на USB-адаптері. Спробував за допомогою маленької тестової програми відтворити ситуацію на ATmega168 — все нормально працює і через MPSSE, синхронізується першою RESET-спробою, до SCK-імпульсів справа не доходить. А от AT90S8515 не програмується.

Все необхідне я зробив через ByteBlaster, помилку ловитиму за хвіст найближчим часом.


Помилку виправлено у версії 1.28r13.

AVReAl update — 1.28r12

Вийшла нова версія програматора avreal — v1.28r12 (Fri 2013-01-04).

  • Додано ATtiny828, ATmega64RFR2, ATmega128RFR2, ATmega256RFR2
  • «Купу крапочок» замінено на щось більш схоже на індикатор процесу (progress bar)

Також зроблено дрібні зміни у внутрішній структурі, більш важливі для мене самого як ознака того, що я ще не закинув проект і збираюся робити трохи більше, ніж ліниво додавати в таблиці нові кристали :-)

«A»-AVR: POR

В огляді змін в мікроконтролерах AVR при переході на нову технологію (стаття “A” and “not-A” AVRs) часто зустрічаються слова «Помінялися рівні POR».

Зміну рівнів Power-On Reset зумовлено переходом на «advanced POR circuit», що на рівні конструктора систем на мікроконтролерах означає:

  • Специфіковано не лише типове значення напруг POR, а й мінімальне та максимальне.
  • Специфіковано мінімальну швидкість наростання напруги живлення.
  • Типове значення рівня POR трохи збільшилося.

Раніше (для «не-А» мікроконтролерів) перші два пункти не було вказано взагалі і залишалося лише здогадуватися, до якої межі можна без ризику наближатися.

Останній пункт розглянемо докладніше.

Наприклад, при переході від ATtiny13 до ATtiny13A (AVR520, Table 2-4. Power-On Reset) типове значення рівня POR при наростанні напруги збільшилося від 1,2 В до 1,4 В. Обидва значення менші за специфіковану для версії ATtiny13V мінімальну напругу живлення 1,8 В, тому в проектах, зроблених без порушення специфікацій виробника, перехід на нові типи не викличе проблем. Можливо, вони навіть краще працюватимуть, бо зменшиться різниця між напругою, при якій POR «відпускає» схеми мікроконтролера та фіксує значення FUSES, та мінімальною напругою гарантованої роботи.

Але в проектах «для себе» в часто виправданому в таких випадках стилі «ці конкретні екземпляри запрацювали — і добре» можуть виникнути проблеми.

[flagcounter image]