#1 Re: Програмування Arduino » Регістрова змінна » 2025-09-06 15:06:33

Класний варіант. Звичайно, обробки, швидше ніж таблична, не існує.
Однак, не варто було одразу викладати код. JOKEERу весь кайф обламали.

#2 Re: Програмування Arduino » Регістрова змінна » 2025-09-05 21:57:38

Більше тижня нічого не писав, бо дуже ретельно працював над проектом. Схоже, те, що було потрібно, отримав. Вийшло виводити на екран 24 текстових рядків по 16 символів плюс 6 інтервалів. Є ідея, як подвоїти кількість символів в рядку за допомогою зовнішньої мікросхеми. Але реалізацію відклав з огляду на поточну неактуальність.
А от ще одну ідею реалізував і екран у мене тепер кольоровий. Що цікаво, навантаження на процессор практично не зросло.
Дякую усім, хто допомагав.
Найскладнішим виявився такий фрагмент:
У 32-розрядному слові в бітах з 12 по 27 міститься двійковий код 16-розрядного числа з фіксованою крапкою. Старші 9 бітів містять цілу частину, молодші 7 бітів - дробову. Потрібно перетворити його в 6-байтовий код для відображення на екран (по одній двійково-десятковій цифрі в байті).
Задача здається нескладною, але це все треба зробити швидше, ніж за 25 мікросекунд (на 16 МГц 8-бітному Arduino).
Це не прохання про допомогу (у мене вже все працює). Це ідея "задачі вихідного дня" для реально творчіх особистостей. Якщо хтось зацікавиться, спробуйте.
Цікаво, яким буде найменший час.

#3 Re: Програмування Arduino » Регістрова змінна » 2025-08-28 11:28:53

dimich пише:

...

Дякую за розгорнуту відповідь. Даташит я читав (в моєму про це написано в розділі 14).
Мій працюючий варіант:

SMCR=1; // in setup()

__asm__("sleep/n/t") ; // in loop()

І ніяких бібліотек. Цікаво, що ще пару днів тому я так вже робив. Не запрацювало з-за того, що забув /n/t. Переглянувши бібліотеку зрозумів, у чому був косяк.

#4 Re: Програмування Arduino » Регістрова змінна » 2025-08-27 23:58:34

Дякую за оперативність. З ваших відповідей я зрозумів, чого не вистачає. Треба зупиняти процессор!
Нове питання: як це зробити з Arduino IDE?

#5 Re: Програмування Arduino » Регістрова змінна » 2025-08-27 22:25:52

Закинув я подалі ідею підлаштовувати час виконання фрагментів програми і вирішив використати переривання від таймера. Працює, але не без несподіваного сюрприза. Раніше нормально виводилися 23 символи в рядку, з використанням переривання тільки 17. При спробі вивести 18й символ (а місце для нього є і на екрані, і на осциллограмі) таймер збивається. Таке враження, що, якщо обробка переривання не завершується за 4 мкс до наступного переривання, то це має негативний вплив. Хто-небудь може щось прояснити?

#6 Re: Програмування Arduino » Регістрова змінна » 2025-08-26 22:24:12

Все ще цікавіше. Змінна 32-розрядна. Вхідна інформація надходить у вигляді 32-розрядних послідовних кодів трьох різних форматів. Ці слова мені треба прийняти, декодувати і вивести їх вміст у придатному для сприйняття людиною вигляді у відповідних позиціях екрану.
Звичайно, можна попередньо розібрати слово по байтах, але на це витрачається неприпустимо багато часу.

#7 Re: Програмування Arduino » Регістрова змінна » 2025-08-26 17:16:59

Намагаюся створити фрагмент програми, час виконання якого не буде залежати від оброблюваних значень. Зіштовхнувся з цікавим ефектом.

  if((serialBuf & 0x200) == 0) {i15 = 0;} else {i15 = 1; __asm__("nopnt");}

  if((serialBuf & 0x400) == 0) {i14 = 0; __asm__("nopnt""nopnt""nopnt");} else {i14 = 1;} 

Час виконання кожного з рядків стабільний, незалежно від значення serialBuf. Але для досягнення такої стабільності треба додавати різну кількість NOPів і, що ще цікавіше, в різні гілки.
Сиджу. Чухаю потилицю.
Доречі, на монітор таки вдалося вивести 30 рядків по 23 символи.

#8 Re: Програмування Arduino » Регістрова змінна » 2025-08-24 19:37:06

dimich пише:

#pragma GCC unroll 25

Нічого не змінюється, включно з розміром скомпільованого файлу.

jokeer пише:

Тут прямо проситься stm32, в якій більше мегагерців. Чи Ch32v003.

Да багато чого напрошується, але я обрав UNO

#9 Re: Програмування Arduino » Регістрова змінна » 2025-08-24 18:53:32

Окрема зиінна на кожну колонку для того, щоб зменшити об'єм обчислень під час формування відеосигналу. Кодова таблиця класична: суміжні N байтів описують поверхи одного символа. При формуванні порожнього екранного рядка визначаються 25 символів, які будуть відображатися в наступних N рядках і в змінні і0 ... і24 записуються стартові адреси описів відповідних символів в кодовій таблиці. Після відображення чергового поверха чергового символа до відповідного іХ додається 1, щоб в наступному рядку відображався наступний поверх. Коли всі поверхи відображені, в наступному порожньому екранному рядку виконуються обчислення початкових адрес для наступних 25 символів.
Якщо і0 ... і24 замінити елементами масиву, то на їх інкремент знадобиться суттєво більше часу. Хоча з "unroll" варто спробувати
Хвіст, що може тягнутися за символом враховано. Останній біт завжди нульовий

#10 Re: Програмування Arduino » Регістрова змінна » 2025-08-24 17:17:11

Звичайно переплутав. Вони такі маленькі, що можна і переплутати smile

У мене вийшло так:

 SPDR = codePage[i0++]; __asm__("nopnt""nopnt""nopnt""nopnt""nopnt""nopnt");// бекслеші чомусь з'їдаються
    ...
    ...
    ...
 SPDR = codePage[i24++]; __asm__("nopnt""nopnt""nopnt""nopnt""nopnt""nopnt");// бекслеші чомусь з'їдаються

Один рядок - один "поверх" одного символа.
Якщо використовувати цикл (звичайно, без NOPів, з'являється додаткова затримка, впоратись з якою не вдається

#11 Re: Програмування Arduino » Регістрова змінна » 2025-08-24 11:14:14

dimich пише:

Щоб отримати безперервний потік, потрібно виводити через USART в режимі SPI.

В SPI мені вдалося звести інтервал між суміжними байтами до 0,125 наносекунди.
А USART в режимі SPI хіба не буде додавати стартові і стопові біти?

jokeer пише:

... до апаратних штук типа max7456.

Чи може max7456 працювати на повний екран?

#12 Re: Програмування Arduino » Регістрова змінна » 2025-08-22 14:01:36

dimich пише:

Raspberry Pi Zero?

Як на мене, то це занадто.
Я спробував виводити послідовний код через SPI. Виводить 8 біт за мікросекунду, а потім ще мікросекунду чекає. Чи можна вплинути на цю зайву затримку?

#14 Re: Програмування Arduino » Регістрова змінна » 2025-08-21 22:10:35

Трохи розвію туман. Пристрій повинен приймати послідовні 32-розрядні слова і відображати на моніторі їх декодований вміст у вигляді 24 текестових рядків (виключно цифри) довжиною по 25...30 символів. Ідей є кілька. Вирішив почати з Arduino. Прийом інформації вже реалізовано - для цього вистачило періоду і тривалості рядкових синхроімпульсів. Наразі триває боротьба за формування відеосигналу в форматі 640*480*60 Гц

#15 Re: Програмування Arduino » Регістрова змінна » 2025-08-21 07:30:32

dimich пише:

Ще може бути, що ваш компілятор виявився розумніший, і згенерував щось типу

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

#16 Re: Програмування Arduino » Регістрова змінна » 2025-08-21 00:39:22

shifter і є тією змінною, розміщення якої радикально впливає на швидкість
Розібрався з фото. Там виводиться байт 0b01010101 молодшим бітом вперед

#17 Re: Програмування Arduino » Регістрова змінна » 2025-08-21 00:36:06

  shifter = figures[codePagePtr];
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;
  shifter = shifter >> 1;
  PORTB = shifter;

#18 Re: Програмування Arduino » Регістрова змінна » 2025-08-21 00:19:14

dimich пише:

Тобто 1 біт за 1 такт на atmega328p?

Саме так. Я не розумію, як таке може бути, але засоби об'єктивного контролю підтверджують signal.jpg

#19 Re: Програмування Arduino » Регістрова змінна » 2025-08-20 23:25:59

dimich пише:

A, якщо вдається 8 біт за 0.5 мкс, то там явно не атмега. Або розігнана до 32 МГц smile

Звичайнісінький 16 МГц UNO. Я ж казав "Сам у шоці"

#20 Re: Програмування Arduino » Регістрова змінна » 2025-08-20 22:09:35

dimich пише:

Навіщо це вам потрібно?

Формую відеосигнал зсувом байтової змінної. Якщо змінна в регістрі, то через однобітовий порт виводжу послідовно 8 бітів за 0,5 мікросекунди (сам у шоці). Якщо змінна не в регістрі - 1 біт за той же час. Різниця катастрофічна

#21 Re: Програмування Arduino » Регістрова змінна » 2025-08-20 18:11:44

Вимкнути оптимізацію - цікава ідея. Куди треба лізти для цього,

#24 Програмування Arduino » Регістрова змінна » 2025-08-20 17:00:37

MikeM
відповідей: 84

Коли компілятор зберігає змінну в регістрі, фрагмент програми працює в рази швидше. Але він може використовувати або не використовувати регістр за власним розсудом. Чи відомі комусь ВЛАСНОРУЧ ПЕРЕВІРЕНІ засоби змусити компілятор використовувати для змінної регістр. Ключове слово "register" не працює, принаймні у мене.

#25 Re: Апаратні питання » Осциллограф HANTEK DSO2С15. Сколько памяти на борту? » 2022-08-20 12:50:15

Производитель не всегда заинтересован говорить правду. Для продавца это очень сложный вопрос. Считаю, что человек, пользующийся устройством - самый надёжный источник информации.
А вообще-то ситуация вызывает некоторое недоумение: у темы более 300 просмотров и ни одного ответа по сути вопроса.

Підвал форуму