Ви не увійшли.
Так, ARDUINO_AVR_UNO більш підходить під задачу.
Тоді можна використати ![]()
Взагалі щоб задати правильне питання, треба знати половину відповіді. А якщо знаєш половину відповіді - іншу половину, скоріше за все, теж знаєш ![]()
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;Можна так
Або почитати як влаштовано pins_arduino.h
щоб не множити окремі скетчі до різних плат
#idef __AVR_ATmega8__
#else
#endifДля кожної вашої каменюки - свій ifdef. І зробити, щоб під неправильний камінь не зібралось. І буде вам щастя.
Бо не домовились що робити з пустими полями.
Взагалі без розуміння задумки автора - складно.
sizeof(data)/sizeof(data[0]) часто зустрічаю. Теж не люблю. А так.. Неочевидно трохи. Я здогадуюсь що в С масив і вказівник майже синоніми, і так теж можна. Але в такому записі легко допустити помилку, і компілятор її нормально пропустить. І фіг потім знайдете що не так ![]()
sizeof(data)/sizeof(*data)Не люблю. І щось мені здається що там помилка ![]()
#define DATA_SIZE 10
int data[DATA_SIZE];Просто і зрозуміло.
розділення на масив має буте швидше, ниж займатися розділом після отримання...
Число операцій приблизно однакове. Розпихувати операції з розбором окремих полів має смисл, якщо одна велика операція в ваші обмеження не влізе. Ну, зробите це окремою функцією, будете викликати після кожного розділювача. Головне - не робити суперфункцій з суперциклами і глобальними суперзмінними. Робіть функції прості і зрозумілі.
Ви намагаєтесь робити складно. Робіть просто.
1. просто приймайте символи в буфер. Коли приймете n - обробіть весь буфер зразу. Якщо буфер переповниться - ну, придумайте щось. Це помилка в даних.
2. обробка буфера. знаходите розділювачі полів, викусюєте частини з цифрами, перетворюєте в int. int кидаєте в масив.
Весь алгоритм.
Не треба придумувати байто@0bства на рівному місці. Не треба економити рядки коду. Не треба придумувати саморобні парсери. atoi нормально працює.
В тому й річ що ніяк. На то воно й undefined. Стежте за попередженнями компілятора, хоча це 100% гарантії не дасть, на цей код він не дає попереджень. Є статичні аналізатори, хттпс://cppcheck.sourceforge.io/demo/ наприклад. Цей ловить.
Cppcheck 2.10
[test.cpp:10]: (error) Array 'rArr[10]' accessed at index 10, which is out of bounds.
Done!jokeR пише:Ось наприклад я взяв такий код ....
ось тут я не розумію, як цей код пов'язон читанням повідоилень і як він реагує на закінчення повідомлення?
Це відноситься до експлуатації undefined behavior. Вам просто повезло що байти удачно розмістились.
Ну, а delay() у вас там навіщо?
void loop() {
String textcom = ""; // переменная для сбора текста из сом-порта
while (Serial.available() > Пояснюю ще раз.
Як тільки ця умова перестане виконуватись - ви вивалитесь з функції loop(). Це відбудеться, коли ви читаєте з порту швидше ніж туди пишуть. При наступному запуску (це відбувається дуже швидко) String textcom знову очиститься.
Не треба робити ініціалізацію таким чином. Робіть її в setup. І очищайте буфер коли вам потрібно.
А нестабільність тому, що вам треба підібрати точно таку затримку, щоб читати з точно такою швидкістю, з якою туди пишуть. Очевидно, це неможливо.
Ну так ви зробили щось не те що вам пропонували.
Ось наприклад я взяв такий код
#include <stdio.h>
int rArr[10]; // = {0};
int rIndex; // = 0;
int main()
{
rArr[10] = {0};
rArr[1] = 1;
rIndex = 0;
return rIndex+rArr[0];
}і прогнав його через godbolt.org
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
rArr:
.zero 20
rIndex:
.zero 2
main:
push r28
push r29
in r28,__SP_L__
in r29,__SP_H__
.L__stack_usage = 2
sts rArr+20+1,__zero_reg__ ; тут видно, що rArr[10] = {0}; попадає мимо масиву. насправді обнуляється rIndex
sts rArr+20,__zero_reg__
ldi r24,lo8(1)
ldi r25,0
sts rArr+2+1,r25
sts rArr+2,r24
sts rIndex+1,__zero_reg__ ; rIndex = 0; - обнуляється ще раз
sts rIndex,__zero_reg__
lds r18,rArr
lds r19,rArr+1
lds r24,rIndex ж
lds r25,rIndex+1
add r24,r18
adc r25,r19
pop r29
pop r28
retВам просто повезло.
Упсь. Без резистора 3.48В. Походу підтяжка 5.1к на 3.3в.
Упсь №2. Якщо підключити тільки 1 резистор, а другу лінію залишити вільною - запускається.![]()
Не розпарсив hmm
Сорян, радіоринок на Караваєвих дачах
Думаю що постачальники ті ж самі.
А тепер саме цікаве. вношу в лінію CC свою ємність (лізу міряти напругу) - і зарядка запускається. І продовжує працювати далі. Неочікуваний спецефект.
З"явилась необхідність отримати 5В від зарядки з виходом type-c. Судячи з манів, просто так вона їх не віддасть. Треба щоб із сторони пристрою на лініях CC1 і CC2 були pull down резистори 5.1к. В роз"ємі що я купив - pull-up на 56к, тобто це роз"єм для зарядки. Ок, читаю хттпс://electronics.stackexchange.com/questions/688168/usb-c-c2c-xn005-56-as-5v-power-supply, киваю, перепаюю резистори. Все одно не працює. На резисторах падає 1.6В, зарядка напругу не віддає ![]()
Що я пропустив?
Ви ж, сподіваюсь, платформу та фреймворк lgt8fx використовуєте для LGT8F, а не atmelavr та arduino-avr?
Обіжаєте ![]()
[env:LGT8F328P]
platform = lgt8f
board = LGT8F328P
framework = arduinoМожете зарепортити issue у FastLED.
Ну, так.
Походу, для LED стрічок це не найкращий контроллер ![]()
А тепер слайди ![]()
Так виглядає білий колір на atmega328
А так - на lgt8f328
У китайців 3-й байт передається трохи інакше - довжина імпульсу не 1 мкс, а 0.75. Як вони цього добились (і навіщо) - незрозуміло.
У мене "Addressable LEDs (Async)":
Моі глаза..
Я шукав 2812 і не знайшов.. Ну хоч одна загадка розгадана. Навіть дві. У вас немає імпульсів ні 0.75 мкс, ні 1 мкс. А у мене є. У мене FastLED@^3.10.1. А у вас?
Хм, те ж. Але не знайшов як ним читати цей протокол і встановив плугін https://github.com/dustin/logic-ws2812
Просто у вас кольори розшифровуються а в мене ні.
Не вловив причини для сарказму.
Осцилограф просто красивий ![]()
Частота виборок в пробнику наче 24 мгц, повинно вистачити. https://arduino.ua/prod651-logicheskii-analizator-saleae-8-kanalov


Різні байти (B і R) передаються з різними таймінгами - в мене немає пояснень цьому, хіба що дійсно чудеса китайського контроллера.
Згоден, без експеримента з оригінальною ардуїною нічого не скажеш.
О, ви не з такої сім"ї як всі
З багатої
) І така само нога але не болить ![]()
У нас логічний пробник за 5 баксів. І lgt8f238, начебто покращена копія atmega, але це не точно
І індикатор куплений по скаженій знижці
)
Можливо індикатор трохи підгулявший. Бо якщо не намагатись використовувати всі кольори одночасно - працює як очікувано. В принципі, для індикатора рівня цього досить.
https://github.com/GyverLibs/microLED/ - я сюди дивлюсь. няп fastled йому потрібен тільки для сумісності з кольорами в стилі fastled. асемблерний код свій.

Таймінги досить дивні.
TH+TL=1.25us - зберігається
Але TH=1us , коли потрібно 0.8+-0.15..
Це fastled. У Гувера свій імпортозаміщонний лісапет, і там з таймінгами зовсім дивно.

Хм, дійсно якась фігня. Передається FFFFFF FFFFFF FFFFFF FFFFFF 000 000 000 000
Спробую іншу лібу. Гувер обіцяв, що його ліба підтримує китайску ардуїну ![]()
Моі глаза.. ![]()
Дякую ![]()