электроника сәнгате
645 subscribers
643 photos
71 videos
56 files
320 links
сәлам дуслар! здесь схемотехника, pcb дизайн, микроконтроллеры, линукс встроенный и десктопный
Download Telegram
Forwarded from letters to robot (Artsiom K)
KiCanvas

KiCanvas is an interactive , browser-based viewer for KiCAD schematics and boards.


Просмотрщик для гит репозиториев с кикадовскими проектами.

Открыт, написан на Typescript, но пока что в альфа стадии и поддерживает только GitHub.

https://kicanvas.org
🔥4👍2
Эстетически прекрасное руководство по LaTeX для полных новичков.

Легко читается и хорошая подборка ссылок и литературы, куда идти за конкретными темами. Самое главное, оно написано из 2020х, с учетом современных реалий.
[pdf] [github]
🔥9
Приехала собранная плата веб камеры. Очень волнующий момент, когда держишь в руках собранную плату, а недавно это был проект в Altium :)
Сейчас надо будет сделать первый запуск нового железа, вот шаги которых я придерживаюсь:
1. Визуальный осмотр. С лупой и хорошим светом ищу микроскопические "сопли" припоя, проверяю правильность установки транзисторов, диодов, микросхем и.т.д. Плата должна быть идеально чистой.
2.Прозвонка на КЗ. Самый важный шаг перед подачей питания. Мультиметр в режиме измерения сопротивления между VCC и GND на всех источниках питания. Если сопротивление высокое - можно двигаться дальше.
3.Безопасное первое включение. Никогда не включаю сразу в розетку или USB. Только лабораторный блок питания с минимальным лимитом тока 50-100 мА. Это лучшая защита от "волшебного дыма". Измеряю напряжение на всех источниках.
4. Подключаю программатор и пробую определить чип. Если он отозвался это 90% успеха! Значит, питание в норме и кварц завелся. Можно переходить к тестированию с софтом.
🔥151
любимая книга Андрея @hardware_design в удобном веб-формате. есть ощущение, что зумерскому мозгу намного легче воспринимать текстовую информацию с html-страничек.

https://the-epic-file.com/text/bookz/aoe_3/aoe3_contents.htm
11😁4
Подборка паяльников до 3 тыс. руб. Цены меняются, во время распродаж могут составлять 2300 — 2700 руб.

🟡 Pine64 Pinecil V1 — линк
Без лишних слов, современная классика.

🟡Miniware TS21 — линк
Относительно новый продукт от создателей TS101, опережает большого брата по многим параметрам, включая и цену.

🟡Станция WEP 982V — линк
Самый интересный для меня вариант с тремя типами жал и версией для работы от АКБ.

🟡Sequre S99 — линк
Текущий выбор админа, 150Вт в форм-факторе ручки для письма, мощность и удобство.

🟡Sequre SI012 — линк
Паяльник того же производителя, но с поддержкой всем хорошо знакомых типов жал T12 и TS. Подойдет скорее тем, кто уже имеет подобные жала среди своих инструментов и хочет продолжить ими пользоваться.

🟡Sequre SI012 Pro — линк
Попытка понять его отличия от версии не Pro провалилась. Та же модель в непрозрачном корпусном исполнении. К сожалению, пост не является рекламой бренда Sequre, но так вышло, что из новых малоизвестных производителей мой выбор пал именно на него.

💬Встраиваемый Алик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Forwarded from Канал схемотехника-программиста (Дмитрий Кузьмичев)
Особенности микроконтроллеров от Espressif💎

Речь пойдёт именно о серии ESP32.
- ESP32 - только у него есть классический Bluetooth, годится для многих классических применений, в частности, для Bluetooth-аудиосистем
- ESP32S2 - может удерживать подключение к WiFi даже находясь в некоторых спящих режимах, но одноядерный во всех вариациях; первый контроллер с поддержкой Flash до 128 МБ, интерфейсом под дисплей и USB
- ESP32S3 - 2 ядра и варианты с бОльшим количеством Flash и PSRAM (PSRAM до 16 МБ); даа варианта ULP-сопроцессора: FSM (который на ассемблере), и RISC-V
- ESP32C3 - первый контроллер на RISC-V-ядре; как правило, имеют встроенную Flash на 4 МБ
- ESP32C6 - первый контроллер с поддержкой WiFi 6 (но только в 2.4 ГГц)
- ESP32H2 - контроллер с беспроводным интерфейсом, но без WiFi, только BLE/ZigBee/Thread
- ESP32P4 - первый контроллер со вторым USB 2.0, есть MIPI-интерфейсы под дисплей и камеру, Ethernet, но нет своего беспроводного интерфейса (если нужен, подключается внешний контроллер с беспроводным интерфейсом и используется esp-hosted)
- ESP32C5 - первый контроллер с 5 ГГц
🔥6👍1
#bootloader #bluepill
Поправил амурский бутлоадер для того чтоб он подходил для BluePill-MIK32 🔥

В файле bootloader.c добавил дефайн, для ELBEAR'a - BOOT_UART_0, для BluePill - BOOT_UART_1 👈

В Makefile в OPENOCD_CFG необходимо выбрать m-link для ELBEAR’a или blue_prog для BluePill 🙃

Заморочки были с флеш памятью, разобрался наконец-то, для BluePill выставил режим QSPI, для ELBEAR'а подходит QPI 🤷‍♂

Ну и основной нюанс, это то что на "таблетке" нет ноги DTR на TTL-конвертере, это значит что в начале загрузки нужно жать кнопку ресет, главное вовремя попасть. Я быстро приловчился и у вас получится 😉
🔥3
Сегодня попался, наверное, самый подробный гайд по основам проектирования для 3D-печати (FDM/FFF) из всех какие я видел.

Монументальный, отлично структурированный и красиво оформленный пост в блоге (с чеклистом!), который построен по принципу: золотое правило + его иллюстрированное объяснение. Таких правил там больше 40 штук.

Это не мейнстрим советы для новичков о том как избавиться от узинга и варпинга в подаренном на день рождения принтере, а набор коротких заметок о том как чертить, чтобы хорошо печаталось, выглядело, работало и не разваливалось. Особенно радует, что в гайде сделан акцент на функциональные детали, а не на low-poly фигурки покемонов и цветочные горшки.

Если честно, некоторые кусочки я бы предложил почитать даже тем инженерам по механике, которые проектируют под субтрактивные способы производства и даже литьё. А то бывает такое начертят, что потом стыдно китайцам показывать. 😀

Уверен: каждый найдёт там для себя что-то новое и полезное. Страница отлично сохраняется в pdf, если вы такое любите.

https://blog.rahix.de/design-for-3d-printing/
3👍104
Forwarded from Embedded Doka (Dmitry Murzinov)
Чувак заморочился и полностью разреверсил Raspberry Pi Compute Module 5 gen

🐱https://github.com/schlae/cm5-reveng

Fun facts:

▫️Для выполнения работы использовались: сканер 9600 DPI, LCR-метр и VNA
▫️Схематик и PCВ выполнены в KiCad 9.
▫️PCВ 10-ти слойная (использованы buried via и microvia)
▫️Резисторы задания размера RAM & FLASH не 0-омные: каждая потенциальная позиция должна иметь специфический номинал и образует делитель, напряжение с которого считывается встроенным в RP1 АЦП
▫️Между BCM2712 и RP1 используется загадочный интерфейс на диффпарах (автор проекта предполагает что это PCIe)
▫️Использован очень навороченный PMIC (хотя кажется это тенденция последних лет 10), автор намерен похекать его I2C карту регистров
▫️Не использовать для воспроизводства: для высокоскоростных цепей не везде учтён Signal Integrity, некоторые футпринты "приблизительные"

@embedoka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81
Вот нам с вами повезло работать на рынке, на котором государство разбрасывает деньги с вертолёта, чтобы потом пересажать, всех, кто эти деньги неосторожно забирал.

На рынке, где госбанки раздают десятки и сотни миллиардов кредитов дутым компаниям, чтобы потом обанкротить и забрать себе.

На рынке, где в коммерческом сегменте ты конкурируешь с дешеёвыми и быстрыми китайцами, а в госсекторе — с теми, кто взял денег у государства и госбанков.

С другой стороны, никто не обещал, что будет легко. Вот в какой-нибудь Киргизии или Нигерии вообще никакой электроники нет, всё везут из Китая.
💯106💩22
Принято считать, что язык Си очень простой. Оригинальная книжечка Кернигана и Ритчи — это всего 200 страниц. Однако, учитывая специфику применения Си (низкоуровневые приложения), здесь можно найти немало тонкостей, о которых мало где слышно.

Я решил написать несколько заметок о неочевидных приколах языка Си.
🔥72👍2
⚡️Битовые поля.
Часто одна байтовая переменная содержит несколько значащих бит, обозначающих что-то сепаратное, и эти биты обычно приходится выделять масками. Не приходится, если использовать битовые поля.
Пример.
typedef union
{
uint8_t all;
struct
{
uint8_t idle_state : 1;
uint8_t erase_reset : 1;
uint8_t illegal_command : 1;
uint8_t crc_error : 1;
uint8_t erase_sequence_error : 1;
uint8_t address_error : 1;
uint8_t parameter_error : 1;
uint8_t __res : 1;
};
} MIK32SD_R1_Response_TypeDef;

Ответ SD-карты типа R1 легко разобрать побитово, если байтовый ответ присвоить члену all, а затем в отдельных if'ах проверить каждый бит.
🔥7
⚡️alignment

В большинстве современных систем минимальный адресуемый объём информации — один байт. Как удобно было работать с восьмиразрядками, у которых машинное слово — тоже один байт! Можно было безболезненно и просто обращаться к любой ячейке памяти.

С ростом разрядности процессора появляется проблема. Процессор обязан уметь читать и записывать объём информации, равный машинному слову, за одну инструкцию, иначе профит от увеличения разрядности во многом теряется. Но при этом нужно уметь читать и записывать байтную информацию, это удобно для многих приложений, скажем, для работы с ascii-строками. Если процессор 32-разрядный, то хорошо бы ещё уметь адресовать 16-битные полуслова, так как некоторые переменные целесообразно делать именно 16-битными. Итого имеем множество способов обращения в память, и сделать устройство управления, которое допускало бы все сценарии обращений, очень тяжело.

Выход: сделать систему чтения памяти, которая всегда читала бы 32-разрядное слово, чей адрес описывается битами A31-A2. При команде lw (чтение 32 бит) слово сразу бы передавалось в регистр. При команде lb (чтение 8 бит) конкретный байт выбирался бы битами A1 и A0 и передавался бы в младший значащий байт регистра. При команде lh (чтение 16 бит) нужное полуслово выбиралось бы битом A1 и следовало бы в младшее значащее полуслово регистра.

Собственно, так и сделано в RISC-V.

Из минусов: команда lw применима только к двоичным адресам, которые оканчиваются на 2 нуля. То есть, обратиться в ячейку 0x1234 можно, а 0x1235 — нет, процессор выкинет исключение "load address misaligned", "адрес загрузки не выровнен". Аналогичная ситуация с командой lh, она неприменима к нечетным адресам.

Компилятор, зная данную особенность процессора, размещает переменные в памяти как надо, чтобы не вызывать конфликтов выравнивания при обращении и использовать статическую память оптимально.

Однако есть 2 вещи, где порядок переменных пользователь определяет сам: структуры и аргументы функций. Аргументы функций сейчас трогать не будем, а вот структуры рассмотрим подробнее.

Я создал тип данных-структуру:
typedef struct
{
uint32_t dummy1; //4
uint8_t dummy2; //1
uint32_t dummy3; //4
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

И вроде бы она должна занимать в памяти 4+1+4+1+1=11 байт, но если посмотреть размер через sizeof, получим:
Size of struct: 16
Object address: 02003FE0

На поле dummy1 компилятор выделяет 4 байта. Адрес начала объекта-структуры делится на 4 нацело. Если бы на dummy2 был выделен 1 байт, то абсолютный адрес dummy3 уже не был бы кратен 4, и процессор не смог бы быстро читать поле dummy3. Поэтому на dummy2 выделяется аж 4 байта, где 3 байта никак не используются, это пустышки. Чтобы адреса переменных за структурой были так же выровнены, после полей dummy4 и dummy5 идут еще 2 байта-пустышки. Итого получаем 16.

5 байт драгоценной ОЗУ улетели в трубу. Ужас!
Иногда экономия памяти важнее производительности, и на этот случай в компиляторах GCC существует атрибут packed:
typedef struct __attribute__((packed))
{
uint32_t dummy1; //4
uint8_t dummy2; //1
uint32_t dummy3; //4
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

В этом случае структура будет плотно "сжата", и пустышек не будет:
Size of struct: 11
Object address: 02003FE4

Но в то же время обращение к полю dummy3 очень сильно усложнится. Для простого чтения поля процессору придется дважды читать 32-разрядные ячейки, дважды применять инструкцию сдвига и еще применить инструкцию логического ИЛИ. Атрибут packed — это очень радикальная вещь, и лучше его не использовать. Вместо этого предлагается оптимальнее расставлять переменные в структуре.
typedef struct
{
uint32_t dummy1; //4
uint32_t dummy3; //4
uint8_t dummy2; //1
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

Здесь компилятору приходится вводить лишь одну пустышку, и память удается сэкономить.
Size of struct: 12
Object address: 02003FE4
🔥5
⚡️alignment-2

Собственно, слово "alignment" означает "выравнивание". В 16-разрядных машинах адреса переменных выравниваются по 2 байта, в 32-разрядных — по 4 байта. Но иногда нам нужно выровнять переменные так, чтобы их адреса были кратны какой-то большей степени двойки. Для этого в GCC существует атрибут aligned.

Рассмотрим на примере.
typedef struct __attribute__((aligned(8)))
{
uint32_t dummy1; //4
uint32_t dummy3; //4
uint8_t dummy2; //1
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

Size of struct: 16
Object address: 02003FE0

Структура начала занимать 16 байт, хотя поля расположены в правильном порядке. Обращаем внимание на адрес: он кратен 8. Для наглядности попробуем выровнять по большему значению.
typedef struct __attribute__((aligned(128)))
{
uint32_t dummy1; //4
uint32_t dummy3; //4
uint8_t dummy2; //1
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

Size of struct: 128
Object address: 02003F00

Адрес действительно выравнивается, теперь он стал кратен 128.
Кстати, интересно, что абсолютное значение адреса уменьшилось. Это потому что я создаю объект в теле функции main, не помечая его ключевыми словами volatile или static, и этот объект лоцируется в область стека, которая растет сверху вниз. То, что адрес стал меньше, значит, что под объект было выделено больше памяти в стеке.

P.S. Кстати, атрибут aligned сильнее, чем атрибут packed. Если написать так:
typedef struct __attribute__((aligned(128), packed))
{
uint32_t dummy1; //4
uint32_t dummy3; //4
uint8_t dummy2; //1
uint8_t dummy4; //1
uint8_t dummy5; //1
} my_struct_t;

Результат будет тот же, что и раньше.
Size of struct: 128
Object address: 02003F00
🔥6