Ви не увійшли.
я не впевнений що запиляти десяток команд ініціалізації на компі сильно простіше ніж зразу на контроллері.
Як мінімум, не потрібно кожен раз перезаливати прошивку.
Якщо нема напрацювань для роботи з GPIO з компа, то можна на тій же ардуіні отримувати команди контролера дисплея по Serial та відправляти їх на SPI з відповідним DATA/COMM бітом. А самі команди писати з компа в tty хоч вручну, хоч шелл-скриптом.
Ну, моя справа - запропонувати, а там як хочете.
але навіть якщо вдасться зробити щось прийнятне на FTDI - як це переносити в мікроконтроллер? з другою системою команд, другими частотами..
Не треба нічого переносити. Треба мати reference implementation. Якщо з компа працює, а з ардуіни ні, то завжди можна порівняти, що там відбувається по-різному. І потім дивитись, чому ардуіна видає щось не так як треба.
Те ж саме можна і в зворотньому порядку. Буває, коли імплементую керування LCD на новому контролері з компа, і чомусь не працює, а на ардуіні працює, то дивлюсь, що роблю не так в порівнянні з ардуіною.
Система команд контролера якраз одна й та ж. Частоти значення не мають.
Подвійна робота ж.
Щоб виплюнути десяток команд ініціалізації та пару байтів зображення багато роботи не потрібно.
виконувати оцей генгбенг через LPT адаптер (де його взяти в 2025 році?)
LPT я згадав як запасний олдскульний варіант, якщо ніякого USB-адаптера нема.
Доречі, на деяких материнках LPT досі є у вигляді BH-10 BH-26 розʼєму. А якщо нема, то можна поставити.
те ще збочення
Ну, а тикатись навмання, не розуміючи, це у скетчі шось не то, чи баг в бібліотеці, чи на ардуіні пін вигорів, і по сто раз перезаливати прошивку - не збочення?
безпосередньо до компа - наприклад?
Наприклад, через USB адаптер на CH341A в режимі SPI або на FTDI бітбенгом. Можна й по-олдскульному через LPT-порт.
В першу чергу приберіть резистор між землями. Якщо дисплею 3.3 В забагато - заживіть через діод, а краще через LDO на 2.85 В чи adjustable.
Може знов SPI Mode не той?
Для експериментів з LCD з заздалегідь невідомим протоколом набагато зручніше підключити його безпосередньо до компа. Коли запрацює при керуванні з компа, тоді вже підключати до ардуіно чи ще до чогось.
В мене єдине питання - емоджі в логах - це трохи дивно.
Це так зараз модно. Леннарт і Ко люблять емоджі. Пхають їх навіть у мани.
А той факт, що щоб їх бачити в емуляторах термінала замість квадратиків, потрібно ставити додаткові шрифти - то їх не колише. Про віртуальну консоль взагалі мовчу. У них в убунтах все ставиться за замовчуванням, то вони вважають, що у всіх так.
Я чув легенди про ардуїно сумісні шілди, які просто втикаються одне в одне..
Щоб воно нормально працювало, потрібно, щоб а) було стандартизоване; б) виробники дотримувались стандарту. Бо буде як з хетами для Raspberry Pi, коли розробники RPi вирішили, що на шині 3.3V не може бути напруги, коли PMIC уже вимкнено. А розробники хетів вирішили, що на шину 3.3 вольта можна давати напругу зі свого LDO при наявних 5 вольтах. І довелось розробникам RPi підставляти костиль, при якому poweroff за замовчуванням не вимикає PMIC, і девайс продовжує споживати струм і давати 3.3 В у "вимкненому" стані.
я так понимаю, что плата контроллера это одно, но нужна еще плата разработчика?
Плата розробника (development board) зазвичай містить в собі контроллер або гніздо для нього, необхідну обвʼязку, зручні розʼєми для периферії, індикатори, розʼєм програматора і т.п. Призначена для ознайомлення, демонстрації, прототипування, відлагодження ПЗ для контролерів, які планується застосовувати у виробах зі своїми платами.
Якщо це плата розробника для SoM (System On Module), то вона або уже містить сам контроллер і повторює схемотехніку SoM з додатковими прибамбасами (як, наприклад, "плата розробника ESP32"), або має гніздо для підключення готового SoM.
Ардуіно і подібні плати самі по собі технічно є "платами розробника". Але так не називаються, бо нема окремого "контролера ардуіно", який би для роботи потребував зовнішньої обвʼязки. Є контролери - atmega328p, atmega2560 і т.п., для яких є свої плати розробника, з ардуіно ніяк не повʼязані.
а по завершении разработки, плату контроллера во что втыкать?
В плату виробу. Її теж потрібно розробляти. А плату в корпус.
> ви хочете все з готових модулів зібрати і щоб зовсім без пайки? wink
ну, да. хотелось бы
Тоді беріть Uno або Mega2560. Там периферія до плати підключається, а не плата до периферії
Або ESP32 з платою Core Board. Бо самі модулі ESP32 широкі, на макєтці не завжди зручно до них підключатись.
Для нового - esp32c3 коштує майже так само, але можливостей значно більше.
Воно-то так, за інших рівних. Але чи потрібні ті більші можливості?
З іншого боку,
по ардуіні більше база знань
on-chip флешка здається надійніше, ніж хто зна шо там поставив виробник модуля
є 5-вольтовий варіант
при потенційному переводі в серію:
простіше замінити модуль голою атмегою
простіше позбутись бутлоадера та інших прибамбасів фреймворка
є можливість залочити прошивку
Це суто субʼєктивні аргументи, нікого переконувати на меті не маю.
то есть, какой контроллер выбрать?
Вам же не для серійного виробництва, не для комерційного проекту, а для себе погратись? Беріть найрозповсюдженіший Arduino Nano. Взагалі, як уже сказали, підійте будь-який з достатньою кількістю GPIO пінів. Навіть з недостатньою кількістю підійде, якщо застосувати розширювач GPIO. Але тоді бажано щоб на MCU був апаратний контролер шини, через яку розширювач портів підключається. Але навіть якщо апаратного контролера нема, то можна реалізувати програмно. Все залежить від того, наскільки ви готові упоротись.
и что нужно ему добавить, чтоб управлять нагрузками и читать концевики?
Те ж саме, що і для Raspberry Pi.
Щодо вашого початкового питання, в деяких випадках має сенс замість switch використати щось інше. Якщо діапазони можуть змінюватись під час роботи програми, можна було би використати таблицю пошуку з гарантовано константним часом доступу. Якщо змінна була би не int, а, наприклад, double, то можна було би реалізувати бінарний пошук по таблиці діапазонів. Для вибору найбільш оптимального рішення потрібно брати до уваги як характер тих діапазонів, так і відмінності в гілках, що відповідають кожному з них.
Просто і зрозуміло - це std::array та std::vector. А в ардуіно - що маємо, те маємо.
І чому ця форма запису ніде не задокументована?!
Як це не задокументована, якщо вам посилання на документацію дали?
А мало де згадується в підручниках та туторіалах, бо це нестандартне розширення GCC. З іншими компіляторами воно не працюватиме, стандарт C++ таку форму запису не визначає (принаймні поки що). До того ж, це розширення мови C, але більшість розширень GNU C можна використовувати в C++:
and you can also use most of the C language extensions in your C++ programs
Іноді з часом деякі розширення включаються в стандарт.
У GNU C є й інші цікаві розширення, але не всі вони працюють в C++.
Дивіться тільки, щоб такого не вийшло
Не впевнений, чи вміє SPI на Atmega328P працювати без CS
Вміє. Коли SS в output (а Adafruit_SPITFT конфігурує DC пін в output), то конфлікту не має бути.
чи правильно Adafruit_SPITFT його ініціалізує в такій конфігурації.
А схоже, він ніяк його не ініціалізує. Для використання апаратного контролера, мабуть, потрібно викликати SPI.begin().
Не впевнений, чи вміє SPI на Atmega328P працювати без CS (треба буде глянути даташит). А якщо вміє, то чи правильно Adafruit_SPITFT його ініціалізує в такій конфігурації (треба дивитись в ісходніки бібліотеки).
Спробуйте для експерименту software SPI:
#define TFT_CS -1 // Chip Select не викор. #define TFT_DC 10 // Data/Command → D10 #define TFT_RST 9 // Reset → D9 #define TFT_SDA 11 // MOSI → D11 #define TFT_SCK 13 // SCK → D13 ... Adafruit_ST7789 tft(TFT_CS, TFT_DC, TFT_SDA, TFT_SCK, TFT_RST);
Якщо запрацювало, то скоріш за все SS апаратного контроллера SPI на піні D10 конфліктує з TFT_DC.
цей код транслюється в таке...
Код з послідовними case:
case 1:
case 2:
...
case 31:
rIndex = 100;
break;
транслюватиметься в таке саме. Case ranges - це просто синтаксичний цукор, для зручності.
#idef __AVR_ATmega8__
Ці макроси визначаються компілятором відповідно до опції -mmcu. До самих плат ардуіно вони не мають відношення, для різних плат з однаковим процесором ці макроси однаково визначені.
щоб не множити окремі скетчі до різних плат, а один раз закласти перевирку номерів....
Фреймворк визначає макрос відповідно до плати, для якої збирається скетч. Ви можете перевіряти ці макроси препроцесором, наприклад:
#if defined(ARDUINO_AVR_UNO)
...
#elif defined(ARDUINO_AVR_NANO)
...
#elif defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2560)
...
#else
#error Board not supported
#endif
Імʼя макроса складається з префікса ARDUINO_ та значення .build.board= відповідної цільової плати з boards.txt.
Треба подивитися. Там всередині всі кросплатформені штуки на define/ifdef. Можливо, воно називається інакше.
Воно ніяк не називається, номери пінів у фреймворка - це просто числа. Вони використовуються як індекси в таблицях. Є макроси для пінів з функцією аналогового входа.
Для загального випадка такого "інструмента" нема. Для вирішення якоїсь конкретної проблеми можуть бути варіанти.
#ifdef D23 // do something #endif
Десь так
А ви перевіряли, чи ардуіно фреймворк визначає такі макроси?
Чи існують оператори коду, за допомогою яких, при наявности номера, можно б було виконати перевірку - чи є у плати, на яку записан цей скетч, реальний вивод за перевіряємим номером?
Можете описати конкретніше, яку саме проблему хочете цим вирішити? Перевірити під час компіляції чи під час виконання? Вас цікавлять виводи портів GPIO чи їх альтернативні функції?
sizeof(data)/sizeof(data[0]) часто зустрічаю.
data[0] - це те ж саме, що *(data + 0), тобто *(data), тобто *data
А от що цікаво: код дає різну кількість отриманих груп для повідомлення 4/5 і для 4/5/
Так, тому що між розділювачем / та кінцем рядка пусто. atoi() для пустого рядка повертає 0.