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

dimich пише:

...

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

SMCR=1; // in setup()

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

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

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

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

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

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

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

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

#5 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 символи.

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

dimich пише:

#pragma GCC unroll 25

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

jokeer пише:

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

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

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

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

#8 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ів, з'являється додаткова затримка, впоратись з якою не вдається

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

dimich пише:

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

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

jokeer пише:

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

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

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

dimich пише:

Raspberry Pi Zero?

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

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

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

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

dimich пише:

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

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

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

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

#15 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;

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

dimich пише:

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

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

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

dimich пише:

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

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

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

dimich пише:

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

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

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

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

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

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

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

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

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

#24 Re: Апаратні питання » Осциллограф HANTEK DSO2С15. Сколько памяти на борту? » 2022-08-19 13:01:28

Mishka пише:

Или что тогда вы называете центральной частью?

Интервал времени любой продолжительности меньший, чем продолжительность сохранённого сигнала и симметричный относительно момента срабатывания триггера синхронизации.

Что-то посты становятся всё длиннее, а ответ на вопрос в заголовке топика так и не найден.
Не надо больше писать много букв. Достаточно одной информативной картинки (образец в посте №6).

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

В HANTEK этот режим тоже называется Zoom и включается точно так же, как и в SIGLENT - нажатием на энкодер скорости развёртки. В более старых моделях режим назывался по-другому и вызывать его надо было с помощью команд меню.
Принципиальное отличие этого режима в том, что он позволяет рассмотреть всю сохранённую осциллограмму с любой степенью детализации. Именно для этого и нужны мегабайты памяти.
Простое растягивание в режиме Стоп позволяет сколь угодно подробно рассмотреть только центральную часть. А значит края осциллограммы не нужно сохранять с высокой детализацией. По моим подсчётам при горизонтальном размере экрана 800 пикселей и 33 возможных скоростей развёртки для этого достаточно 27К памяти, если не экономить. Если задаться целью максимальной экономии, то можно уложиться в  14К (без потери качества!)

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