Таки економимо резистори?

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

Допис про економію резисторів отримав нове звучання?

Універсальний gcc-avr.mak

У зв’язку з описаною раніше помилкою avr-ld та методом боротьби з нею мене спитали про той «універсальний» файл gcc-avr.mak, яким я користуюся у всіх проектах. «Нічого воєнного», це просто файл, у який зібрано команди, які без змін переходили б з проекту в проект шляхом копіювання (і наступного редагування) Makefile від попереднього проекту 😉

Тепер файл gcc-avr.mak підключається до Makefile проекту командою include. Так само, як і подібний мейк-файл для роботи з програматором avreal — avreal.mak. Файл для проекту тепер короткий, містить лише головні налаштування. Легше знайти потрібне, важче поламати те, що вже перевірене.

Повернімося тепер до цього універсального мейк-файлу для avr-gcc і до згаданої помилки в avr-ld.

Окрім іншого, на початку gcc-avr.mak здійснюється налаштування шляхів до програм, використовуваних при компіляції. Виглядає це так (нумерація рядків відповідає файлу, доданому у прикріплений архів).

40
41
42
43
44
45
46
47
48
49
# Set default toolchain prefix if it does not defind in environment or project makefile
TOOL ?= avr-

# Set tool names
CC  := $(TOOL)gcc
AS  := $(TOOL)gcc -x assembler-with-cpp
BIN := $(TOOL)objcopy
OBJCOPY := $(TOOL)objcopy
OBJDUMP := $(TOOL)objdump
SIZE    := $(TOOL)size

Зроблено це було ще у часи, коли я багато працював паралельно з різними версіями avr-gcc з різних джерел. Частково тому, що все «дихало», нові версії мали кращу оптимізацію, але могли «глюкнути» і потрібно було мати можливість швидко відкотитися на перевірену версію. Частково тому, що я активно розвивав і супроводжував AVR-порти scmRTOS і треба було перевіряти всі зміни у різних версіях компіляторів, вишукувати «інтерференцію» помилок і «особливостей» ;-). Тоді найперевіреніша і найстабільніша версія avr-gcc була встановлена основною за допомогою команди junction (див. допис Різні версії WinAVR поруч). У файлі gcc-avr.mak підключалася ця основна версія — але лише тоді, коли змінна TOOL не була встановлена у Makefile проекту. У проекті ж цей рядок або був відсутнім, або міг мати вигляд:

1
TOOL = c:/avr-gcc/kgp/20080530/bin/avr-

Ще у цьому gcc-avr.mak, у його варіанті для Windows, були рядки, які приводили до єдиного вигляду шляхи у змінній PATH і експортували її для процесів, викликаних make. Це було пов’язане з необхідністю змусити працювати на одному комп’ютері avr-gcc з різних джерел. Якщо коротко, то ті, що спиралися на MSYS, і ті, що були зібрані геть автономно, використовували шляхи вигляду /c/directory і c:\directory відповідно. Це теж окрема пісня, яка тепер для мене цікава лише в історичному плані. Якщо комусь цікаво почути — проспіваю окремо.

Ну так от, оця змінна TOOL виявилася найкращим місцем для додавання заміни значення змінної оточення LANG (дивись вже згаданий допис щодо виправлення помилки переповнення буфера в avr-ld):

40
41
# Set default toolchain prefix if it does not defind in environment or project makefile
TOOL ?= LANG=en avr-

Позаяк змінна є префіксом для всіх інструментів, вона ж превентивно перемикає мову і для інших програм пакету. Файл цей у мене лежить один на всі проекти, тому вони всі відразу виправилися. Добре, на всі проекти з однієї групи, тому все ж таки по внесенні змін мені довелося його розкопіювати у декілька місць. І я так і не зробив собі репозиторію для загально-загальних файлів.

Додаю архів із дуже-демо-проектом, який має використовувану мною структуру каталогів.
Там є спільниі для всіх проектів «бібліотеки» (каталог common, що може містити як підкаталоги незалежних від архітектури мікроконтролера модулів, так і залежні, наприклад, common/avr, що може своєю чергою містити підкаталоги з контролеро-залежними модулями). На цьому ж рівні знаходиться спільний для всіх каталог tools, де живуть спільні (для групи проектів) скрипти і підкаталог tools/makefiles зі згаданими «універсальними» файлами. Всі проекти (представлені одним-однісіньким project1) мають схожу структуру. На верхньому рівні проекту живе його Makefile а також файли середовища програмування (у мене це Code::Blocks) і, при необхідності, деякі додаткові персональні скрипти. У підкаталозі src для простих проектів лежсть всі їхні тексти, у складніших — ще підкаталоги з модулями.

«Модуль» (мають бути перелічені у змінній MODULES у Makefile проекту) у контексті цього підходу є каталог, який може бути підключеним до проекту як одне ціле. Окремі файли ніде не перелічуються, gcc-avr.mak автоматично включає у компіляцію і лінкування всі асемблерні, C-шні і C++-ні файли, які у цих каталогах знаходить. Таким чином, «модуль» у цьому розумінні може містити декілька модулів у термінах програмування, які можуть бути використані у проекті лише разом. Так само «модулем» може бути каталог із лише h-файлами, які пов’язані між собою лише тим, що стосуються однієї сім’ї мікроконтролерів і ніяк більше не пов’язані між собою. Весь каталог буде підключено до проекту, а які конкретно файли будуть використані — залежить від директив #include у файлах проекту.

Описувати це довше, ніж читати самі файли. Беріть як є.
Прикрутити таку систему можна до будь-якого інтегрованого середовища, яке дозволяє зробити проект «із зовнішнім Makefile». При цьому, напевне, будуть втрачені якісь зручні можливості середовища по налаштуванню проекту, але можна нашвидкоруч щось підправити у vim чи gedit, а тоді з консолі набрати make program :-).

p.s. Раніше я писав про те, що можна зробити в gcc (avr-gcc) з використанням секцій (дописи «Використання секцій в GCC» і «Секції .init в avr-gcc»). Робота з Makefile і gcc-avr.mak згадані там лише побіжно, але у прикріплених архівах є реалістичніші проекти з використанням такої техніки роботи з мейк-файлами «модулями».

Attached Files:

Випалювач з ЧПК

Ось дивіться, яку цікавезну штуку я надибав — випалювач з числовим програмним керуванням.

Arduino Nano, трохи іншої електроніки плюс механіка; «великий» комп’ютер або OrangePi Zero. Прошивка ардуінки як ардуінівський скетч і зроблена. А ще Qt-шні програми — для OrangePi і для Linux/Windows десктопів.

Опис у блозі автора (там і посилання на GitHub):

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

Саморобний дозиметр

Той саморобний дозиметр, фото якого було у попередньому дописові спогадів про аварію 1986 року.
Я таки наважився його розібрати і сфотографувати нутрощі. Нічого не розсипалося і є шанси зібрати назад 😉

Дозиметр зібрано в корпусі від слухового апарата. Штатний відсік батарейок випиляно і туди вставлено 9-вольтову.
Саморобний дозиметр 1986 (1)
Подивитися більше фото » » »

Чорнобиль — багатьом є що згадати

Вийшло так, що 26 квітня 1986 року, в суботу вранці, мені конче треба було дістатися до університетського 12-го гуртожитка, щоб вже звідти з дружиною їхати на вокзал.
Так-так, я мав «койкомєсто» у заводському гуртожитку в Броварах, дружина те ж саме у студенстькому гуртожитку в Києві, ні там, ні там кімнату не давали. Мене у студентський не пускали, бо вже не був студентом, а дружині в Броварах… Та там мене, «молодого спеціаліста», кілька місяців не хотіли прописувати, «у тебе дружина в Києві прописана!» (ага, по студентському гуртожитку «до 30 червня»), куди вже окрему кімнату. Але то вже з іншої категорії спогадів.

Ну так от, квитки на поїзд з Києва на Полтаву вже давно були куплені. У мене була жменя відгулів за нічні виклики на завод, дружині у деканаті теж легко дали «вольную» і повернутися до Києва ми мали аж 10 чи 11 травня. Але я ледь вибрався з Броварів до Києва, бо раптом кудись поділися всі автобуси. Їх і так на маршрутах було по два-три, інтервал руху до пів години. Коли якийсь ламався, то ходили ще рідше. Але після довгого очікування люди почали турбуватися і тут хтось відкілясь приніс звістку — «всі автобуси забрали на евакуацію». Куди, чому — незрозуміло, десь аварія, вибух, називалися різні версії. Так нічого конкретного і не знаючи, 26 ввечері ми поїхали і найтяжчі дні були у безпечному місці. А коли повернулися назад, то вже більш-менш було зрозуміло, що берегтися треба сильно. Хусточка-шапочка, в пилюку не лізти, повітря зволожувати, підлогу мити, самим в душ і так далі.

От. А десь у кінці травня я вже паяв саморобного дозиметра. Досі працює.
Саморобний дозиметр

Трубка влетіла в копієчку, а все інше нашкреблося по шухлядках. Після обміру викинув одні штані і курточку. І там, і там по плямці високої активності (і це воно вже пралося!). Швидше за все, чиркнув об щось у недовідмитому автобусі.
Восени з ним ходили на прогулянки — озираючись, щоб ніхто не бачив, бо балакали всяке про отакі «несанкціоновані» заміри, та й дозиметри хто паяв, то знали лише друзі. Тримав за шнур так, щоб трубка висіла на невеликій висоті над поверхнею. Но обмитому дощами асфальті було чисто, але варто протягнути руку вбік, пронести трубку на опалим листям, відразу фон вищий разів у десять і більше. То ніякої «золотої осені» і шурхотіння листям. Ніяких «зрізати дорогу стежкою через сад». Хоча багато людей вже призаспокоїлися і ходили звичними шляхами. Але ми вважали за краще поберегтися. Зрештою, коли десь у 1994 нас, кількох співробітників, обміряли на кріслі «скріннер», то у мене результат різко відрізнявся — майже скрізь були нулі, а де було, то було небагато. Той, хто міряв, сильно здивувався, «нехарактерно для киян». Звісно, головну роль тут відіграла наша відсутність у Києві з 27 квітня по 10 травня. Нам пощастило.

ECC і HW parity

Знову згадую Лиса з Маленького принца, пора вже тег «Світ недосконалий» на його честь заводити.

STM32F0 (і не лише, але я зараз Cortex-M0 дивлюся) — є апаратний контроль парності в оперативній пам’яті.

STM32L0 — є контроль і виправлення помилок (ECC) у флеші та EEPROM.

А от щоб разом, так ні.
І, до речі, STM32F0 має переривання по збою оперативної пам’яті, а STM32L0 не має переривань від свого блоку ECC. Хоча переривання «все виправлено, але збій був» було б дуже корисним для раннього попередження про можливі відмови.

p.s. Ще цікава штука на цю тему є в ATtiny41x/81x, апаратна перевірка флеша по CRC16.

Падіння напруги на кабелі

Стало цікаво, як спадає напруга на кабелі, коли навантаження не зібрано все в одній точці на кінці, а розподілено рівномірно. Скажімо, декілька десятків споживачів із приблизно однаковим споживанням на приблизно рівних відстанях. Спочатку напруга спадатиме швидше, бо підключено більше споживачів, потім, ближче до кінця кабелю, швидкість спадання зменшиться. Але якими будуть загальні втрати напруги?
От якщо на кінці кабелю із загальним опором R висить навантаження зі споживанням струму I, то напруга впаде на величину IR. А що буде при рівномірному підключенні?

Позаяк і пристроїв доволі багато, і цікавить варіант, коли загальні втрати відносно невеликі (нехай з 20 до 18 вольт), та й самі споживачі не чисто резистивні (десь всередині є стабілізатор живлення частини електроніки, та частина разом із стабілізатором себе поводять як джерело постійного струму), в ідеалізованій моделі можна вважати, що навантаження зовсім рівномірне і незалежне від напруги.

Отже, струм I рівномірно розподілено на всю довжину L, з відстанню x від початку струм спадає i = I (1 − x/L). Загальний опір кабеля R, питомий R/L.

Зміна напруги:
dU = −idR = −I (1 − x/L)(R/L)dx = (IR/L2)(x − L)dx

Повна зміна на відстані a то інтеграл по x від 0 до a:
ΔUa = (IR/L2)(a2/2 − La) = (IR/(2L2)) ((L−a)2L2) = (IR/2)((1−a/L)2−1)
На кінці кабеля
ΔU = −IR/2

Якщо віднормувати напругу на падіння при зосередженому на кінці кабелю навантаженні IR, а відстань на довжину кабелю L, отримаємо такі графіки зміни напруги:

Падіння напруги на кабелі

Тобто втрата напруги на кінці при рівномірно розподіленому навантаженні вдвічі нижча, ніж була б при всьому навантаженні на кінці.

Або можна взяти кабель із вдвічі меншою площею перерізу і знизити собівартість.

LPUART? USART1? обидва і в одну прошивку!

Є в мікроконтролерах STM32L0x така приємна штука, як LPUART. Може працювати від LSE — 32768Hz кварца коли мікроконтролер спить і піднімати його по приходу байта. Ну там ще дрібно-дробовий дільник, який дозволяє витягувати доволі високі частоти обміну від такого кварца, але то для мене вже не так важливо було. Просто є за оптроном ще один мікроконтролер, який періодично посилає інформацію про стан того, що він контролює. А на цій стороні бажано побільше спати.

У пристрої і STM32L011K вистачить, програма ледь перевалює за 8 кілобайт флеша. На нього і розраховував. Але на малих кількостях ціноутворення штука малопередбачувана, STM32L051K8 може бути суттєво дешевшим за STM32L011K4. Тому хочеться, щоб можна було поставити чи те, чи те.
Все було б добре, але «світ дуже недосконалий»© Лис з «Маленького принца». LPUART не потрапив на ніжки в 32-виводному корпусі STM32L051K. Мікроконтролери L051 мають можливість незалежної роботи від LSE є і для USART1, USART2. Але ж (ой правий Лис, ой правий!) L011 спрощений, USART2 у нього є, але він так не вміє.

Зрештою, знайшлася ніжка (PB7), де сидить LPUART_RX для L011K і USART1_RX для L051K. Все добре.

Тільки от прошивка має бути єдина, щоб той, хто прошиватиме плати, не вдивлявся у маркування мікроконтролера. Ну та до цього не звикати, все одно під одну прошивку маю реально п’ять різних варіантів виконання пристрою (на 4 різних платах). Плати візуально відрізняються відчутно, але однак простіше віддати одну прошивку. Код плати задано підключенням двох ніжок мікроконтролера на VCC/GND і ще один резистор каже «тут запаяно лише ту малу частину, яка спільна для всіх плат, це спрощений п’ятий варіант».

Вид мікроконтролера L011 («категорія 1») чи L051 («категорія 3») можна прочитати з ідентифікаційного регістра

// cat1 (L011) or cat3 (L051)
bool is_mcu_cat1()
{
    return (DBGMCU->IDCODE & 0xFFF) == 0x457;
}

і далі все просто. Відмінності ініціалізації LPUART і USART1 невеликі. Ініціалізувати і дозвіл переривань лише для одного, та ще ніжку треба увімкнути на потрібний номер альтернативної функції.

Два обробники переривань викликають одну й ту ж процедуру обробки

extern "C" void USART1_IRQHandler(void)
{
    device.octrl.byte_received(USART1->RDR);
}

extern "C" void LPUART1_IRQHandler(void)
{
    device.octrl.byte_received(LPUART1->RDR);
}

До речі, гарна штука LTO (link-time optimization). Ця byte_received() в іншому файлі, але воно чудово проінлайнило функцію в обидва обробники.

Писачок — робимо самі 2

Наближається Великдень, а разом з ним і традиційне виготовлення писанок. Ну а для розписування потрібен відповідний інструмент — писачок, що його, залежно від регіону, називають ще писальце або кистка.

Так починався опублікований мною 7 років тому опис-відеоурок того, як можна самостійно зробити писачок. І зараз такий самий час.

Писачки робив тоді так, як було зручно мені, з урахуванням матеріалів та інструментів, що завжди під рукою і я навіть не задумувався, що їх може не бути 🙂 (хтось із моїх дітей свого часу дуже здивувався, виявивши, що не у всіх вдома є пінцет і кусачки). Але цьогоріч мене в коментарях на youtube спитали, чи можна обійтися без паяльника.

Звичайно можна, переважна більшість писачків, зроблених за всю історію, обійшлися без паяльника. Трохи подумавши і роздивившись інші писачки, наводжу два варіанти.
Кінчик конуса обов’язково підрівняти надфілем чи точильним каменем. Тут в обох варантах я цього не робив, оскільки це лише демонстрація ідеї.
Далі: опис і фото двох варіантів виготовлення писачка без паяльника » » »

Міні-комп’ютер розміром з монету (конкурс)

Конкурс, у якому можна виграти одну з трьох плат VoCore v1.0 з OpenWRT/Linux:

Плата VoCore v1.0

  • Процесор RT5350, 360 MHz + память 32 МБ SDRAM
  • WiFi на борту
  • OpenWRT/LEDE Linux
  • Розміри 25.6 x 25.6 mm – приблизно як ураїнська монета 1 гривня
  • Повністю відкритий код та схема

Треба лише описати — що хочеш на цій платі зробити, розмір і можливості плати такі, що можна зробити багато всього.
З надісланого відберуть 10% найцікавіших заявок, тоді серед них розіграють три плати, по Україні відправлять «Новою Поштою» за власний рахунок.

Детальніше у фейсбуці, в оголошенні від Володимира Шиманського, співзасновника Blynk IoT Platform.

p.s. Сам я участі в конкурсі не беру, бо то треба спочатку навчитися краще керувати своїм часом, вивільнити його трохи, і лише затим придумати, що ж я хочу зробити. За місяць я не вкладуся 😀

[flagcounter image]