20 років avreal

Отак багато часу пройшло. Весь 2018 рік — рік 20-річчя програми avreal, назва якої утворена дуже просто, як комбінація AVR і ReAl. І деякий час пошук по слову avreal видавав лише обговорення на інтернет-форумах або мій сайт, і лише потім почав вважати це помилкою набору і видавати «якусь співачку» 🙂

Писати я його почав влітку 1998 року, під час роботи над реальним проектом з AT90S8515.
До того лише трохи «грався для себе» і для того мені вистачало PIP04, був для Windows такий попередник PonyProg-а. Але для реальної щоденної роботи возити мишкою мені було незручно, хотілося інструмента, якого можна запхати у makefile і викликати з редактора. Тобто потрібна була утилітка командного рядка. Здається, тоді вже існував лінуксовий uisp, але на лінукс я перейшов кількома роками пізніше. Для MS DOS знайшлася лише (підказали в RU.EMBEDDED) програма fbprg. Та з’ясувалося, що вона хоч і «command line», але страшенно незручна.

От тоді й всівся за своє. Паралельно із робочим проектом, продовжуючи в ньому використовувати fbprg. Саме тому перший адаптер, який підтримував avreal, був той fbprg, а LPT за умовачанням використовувався другий, бо на першому був принтер.

Зрештою, воно більш-менш впевнено запрацювало, хтось із знайомих (Євген Краштан?) перевірив на 90s1200 і 90s2313, знайшов декілька помилок, надав парочку 90s1200 із запоротим DevID для експериментів. Таке ж саме запитання — «де знайти програматор AVR, який добре вбудовується в ланцюжок make і компіляторів командного рядка» — виникало в RU.EMBBEDED і SU.HARDW.SCHEMES, на початку вересня 1998 року я запропонував свою програму.

Так і пішло. Фактично, навіть сайт я завів, ще на LuckyNet, для розміщення нових версій та опису, у щось блогоподібне воно перетворилося набагато пізніше, десь ближче до 10-річчя програми.

З часом додавалися інші адаптери (спочатку Altera ByteBlaster, бо працював тоді з альтерівськими PLD і цей адаптер був і вдома, і на кожному столі на роботі, затим за компанію Xilinx Download Cable, а тоді просто можливість задати довільну конфігурацію).
З Win98 на роботі перейшли на WinNT — з’явилася win-версія (через DLPortIO, який на роботі ж використовувався для іншого). Сам я перейшов на Linux — от вам лінуксова версія. Попросили FreeBSD — зробив, але реально його окрім прохача майже ніхто не використовував, та й для нього з часом стало неактуально. Тому ця версія трохи «недорізаною» тяглася, туди нові можливості додавалися лише ті, які «само собою» починали працювати. Пізніше я зовсім відмовився від підтримки.

З’явилися мікросхеми FTDI з MPSSE, тобто апаратним JTAG/SPI, відповідно, в avreal з’явилася можливість працювати через USB. Для USB були ще геть недорогі адаптери з soft-USB, зокрема, з емуляцією COM-порта і AVR910. Але вони були повільні, відчутно повільніші за PCI-LPT карту, не набагато швидші за звичайний LPT. Згодом і звичайні, і PCI-LPT почали уповільнюватися, але то інша історія.

І от так потихеньку і пройшло 20 років.

Ще наприкінці минулого року я згадав про дату, чесно 🙂 тоді хотів щось дописати в avreal. Але трапилася одна справа, у яку я вклав весь свій вільний час. У травні цього року звільнився з роботи. Не заради дописування avreal, звісно, але початково були плани протягом літа завершити свою частину тієї справи, роззирнутися, відіспатися, почитати чогось корисного, а восени шукати нову роботу. Та не так сталося, як гадалося — в кінці липня вже була нова робота з купою нової інформації, яку слід перетравити і засвоїти.
Навіть згадана справа пригальмувалася, все інше відклалося.

Тому, на жаль, на рік 20-річчя сам avreal не отримав ніяких подарунків у вигляді якихось нових можливостей, але в результаті змін у житті я познайомився з кількома чудовими людьми, які «в молодості» використовували avreal 🙂 І відновив контакт з кількома такими ж, яких знав раніше.

p.s. Мене заспокоюють, що «справжня зрілість» це 21 рік. І що до наступної осені я ще можу щось встигнути.

“B” and “not-B” AVRs

I am sorry, this text in English does not exist (yet).
I apologized there. Try google translate.


Від публікації огляду відмінностей між «A» і «не-A»-версіями мікроконтролерів AVR пройшло чимало часу і вже давно можна порівнювати «B»-версії. Таких мікроконтролерів ще небагато, але є на що подивитися. Errata на кристали я ще не вивчав, як там буде що важливе — доповню пізніше.

Раніше я вже коротко писав про ATmega48PB…168PB. ATmega328PB і ATmega324PB просунулися набагато далі, це вже практично нові мікроконтролери, сумісні по виводах з «not-B». Для всіх цих мікроконтролерів є спільний, з першого погляду непомітний, але важливий момент — DIP-корпусів більше нема. Тому тим, хто розраховує лише на них, далі можна не читати 😉

З точки зору програматора змінилися лише сигнатури (ідентифікатри) мікроконтролерів та додався один fuse в ATmega328PB і ATmega324PB. Він забороняє нову функцію (CFD, див. нижче) і з заводу запрограмований. Якщо його не треба міняти і якщо можна змусити програматор проігнорувати сигнатуру, то всі ці кристали можна прошивати як відповідні PA. Втім, в avreal ці мікроконтролери вже додано, а для всіх іншіх програматори це, думаю, зроблено давно 🙂

Можливо, цей список і не збільшуватиметься вже, бо анонсовано геть нові ATmega3208/3209/4808/4809 із суттєво збільшеним обсягом оперативної пам’яті (натомість зменшеною EEPROM) та розширеною периферією.

Отже, відмінності… » » »

AVReAl update — 1.29r1

avreal v1.29r1 (Sun 2018-02-11) has been released.

  • Added support for:
    • Attiny441, ATtiny841
    • ATmega48PB, ATmega88PB, ATmega168PB, ATmega328PB
    • ATmega324PB
  • The file with device serial number can now contain a 0x-prefixed hexadecimal number.
  • Fixed a bug where the character arrays for -h became too long and cuts off by vsnprintf(). But avreal was not crashes like avr-ld does.

    Raspberry Pi як комп’ютер для роботи

    Не від хорошого життя довелося провести тест Raspberry Pi як робочого комп’ютера.

    Не знаю, після якого оновлення Ubuntu MATE, але на моєму основному комп’ютері перестав працювати avr-ld, валиться з помилкою «*** buffer overflow detected ***» (це на 64-бітній системі, пізніше я перевірив, що на 32-бітній такій же МАТЕ і з тими ж оновленнями все працює — це не так, залежить не від розрядності, докладніше тут).
    А мені терміново знадобилося внести маленьку зміну в прошивку ATtiny13A. Мій «червоненький» ноутбук зараз інтенсивно використовує дружина, то щоб їй не заважати, я згадав про Raspberry, на яку оце ж нещодавно ставив (таку ж!) убунту.

    Поставив там avr-gcc, все зібрав, перекинув на основний комп, прошив.

    Стало цікаво порівняти швидкість. Цей маленький (близько 400 байт прошивки) асемблерний проект на роль такого тесту геть не годиться, тому я вирішив позбирати більший. Поставив, відповідно, arm-none-eabi-gcc, щоб збирати поточний проект для STM32F105. Там десятки файлів, за 40 кілобайт результат, — час вже можна міряти. Збирав на Raspberry, на основному своєму комп’ютері (AMD A8), на «червоненькому» Dell Vostro V130 (Core i3) і на роботі на Pentium D (дохлий, як на нинішні часи, комп’ютер, але його там цілком вистачає). На всіх системах стоїть Ubuntu MATE 16.04 з усіма оновленнями. Лише на AMD A8 64-бітна, всі інші 32-бітні (і на всіх 32-бітних avr-ld свою роботу чесно робить).

    Ось що вийшло (time make -j число_ядер, час у секундах).
    Воно від збирання до збирання трохи стрибало, але не принципово.

    система
    (ядер*ГГц)
    real user system
    Raspberry Pi 3
    (4*1.2)
    12.2 32.6 3.3
    Pentium D E2160
    (2*1,8)
    9.5 13.3 1.8
    Core i3 M380
    (4*1,33)
    8.2 20.6 2.7
    AMD A8-7600
    (4*3.1)
    3.1 7.7 1.2

    Тут у табличці нема ширини і швидкості шини пам’яті, своє слово сказало і те, що Raspberry працює з SD-карти, Pentium-D і AMD A8 з SATA-дисків, а Core-i3 з SSD. Але тут я хочу порівняти все ж таки не кількість зкомпільованих рядків коду на гігагерц-ядро чи DDR-истість пам’яті, а абсолютний час — питання, що турбує: «чи йти заварювати чай, чи воно раніше збере» 🙂

    Виявилося, що Pi 3, на відміну від перших Raspberry, цілком придатний для роботи з прошивками такого обсягу.
    І що ця плата реально набагато швидша, ніж комп’ютер, на якому років 15 тому я запускав альтерівський Quartus-II 9.1 для збирання прошивок альтер (не можу пригадати, що у мене тоді було… якийсь Athlon-550 чи що). Та й «мікроконтролерні» компіляції там більше часу займали.

    Розчистка завалів-2

    Sic transit gloria mundi

    Із запропонованих раніше мікросхем практично нічого нікому не знадобилося.
    То цей раз просто викинув, і не лише ці AVR-ки, півтора десятки ATmega8515 і пів десятка ATmega32, а ще й купу різної дрібноти

    ATmega8515 і ATmega32

    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) has been released.

    • Switch -% replaced by message level switch -i;
    • If stdout is redirected to file critical messages are duplicated to stderr;
    • The final rejection of the switches grouping (-wv prohibited now, only -w -v allowed);
    • mega325PA, mega3250PA aliases added.
    [flagcounter image]