Ви не увійшли.
...
Дякую за розгорнуту відповідь. Даташит я читав (в моєму про це написано в розділі 14).
Мій працюючий варіант:
SMCR=1; // in setup()
__asm__("sleep/n/t") ; // in loop()
І ніяких бібліотек. Цікаво, що ще пару днів тому я так вже робив. Не запрацювало з-за того, що забув /n/t. Переглянувши бібліотеку зрозумів, у чому був косяк.
Дякую за оперативність. З ваших відповідей я зрозумів, чого не вистачає. Треба зупиняти процессор!
Нове питання: як це зробити з Arduino IDE?
Закинув я подалі ідею підлаштовувати час виконання фрагментів програми і вирішив використати переривання від таймера. Працює, але не без несподіваного сюрприза. Раніше нормально виводилися 23 символи в рядку, з використанням переривання тільки 17. При спробі вивести 18й символ (а місце для нього є і на екрані, і на осциллограмі) таймер збивається. Таке враження, що, якщо обробка переривання не завершується за 4 мкс до наступного переривання, то це має негативний вплив. Хто-небудь може щось прояснити?
Все ще цікавіше. Змінна 32-розрядна. Вхідна інформація надходить у вигляді 32-розрядних послідовних кодів трьох різних форматів. Ці слова мені треба прийняти, декодувати і вивести їх вміст у придатному для сприйняття людиною вигляді у відповідних позиціях екрану.
Звичайно, можна попередньо розібрати слово по байтах, але на це витрачається неприпустимо багато часу.
Намагаюся створити фрагмент програми, час виконання якого не буде залежати від оброблюваних значень. Зіштовхнувся з цікавим ефектом.
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 символи.
#pragma GCC unroll 25
Нічого не змінюється, включно з розміром скомпільованого файлу.
Тут прямо проситься stm32, в якій більше мегагерців. Чи Ch32v003.
Да багато чого напрошується, але я обрав UNO
Окрема зиінна на кожну колонку для того, щоб зменшити об'єм обчислень під час формування відеосигналу. Кодова таблиця класична: суміжні N байтів описують поверхи одного символа. При формуванні порожнього екранного рядка визначаються 25 символів, які будуть відображатися в наступних N рядках і в змінні і0 ... і24 записуються стартові адреси описів відповідних символів в кодовій таблиці. Після відображення чергового поверха чергового символа до відповідного іХ додається 1, щоб в наступному рядку відображався наступний поверх. Коли всі поверхи відображені, в наступному порожньому екранному рядку виконуються обчислення початкових адрес для наступних 25 символів.
Якщо і0 ... і24 замінити елементами масиву, то на їх інкремент знадобиться суттєво більше часу. Хоча з "unroll" варто спробувати
Хвіст, що може тягнутися за символом враховано. Останній біт завжди нульовий
Звичайно переплутав. Вони такі маленькі, що можна і переплутати
У мене вийшло так:
SPDR = codePage[i0++]; __asm__("nopnt""nopnt""nopnt""nopnt""nopnt""nopnt");// бекслеші чомусь з'їдаються
...
...
...
SPDR = codePage[i24++]; __asm__("nopnt""nopnt""nopnt""nopnt""nopnt""nopnt");// бекслеші чомусь з'їдаються
Один рядок - один "поверх" одного символа.
Якщо використовувати цикл (звичайно, без NOPів, з'являється додаткова затримка, впоратись з якою не вдається
Щоб отримати безперервний потік, потрібно виводити через USART в режимі SPI.
В SPI мені вдалося звести інтервал між суміжними байтами до 0,125 наносекунди.
А USART в режимі SPI хіба не буде додавати стартові і стопові біти?
... до апаратних штук типа max7456.
Чи може max7456 працювати на повний екран?
Raspberry Pi Zero?
Як на мене, то це занадто.
Я спробував виводити послідовний код через SPI. Виводить 8 біт за мікросекунду, а потім ще мікросекунду чекає. Чи можна вплинути на цю зайву затримку?
А можна приклад козявки з HDMI?
Трохи розвію туман. Пристрій повинен приймати послідовні 32-розрядні слова і відображати на моніторі їх декодований вміст у вигляді 24 текестових рядків (виключно цифри) довжиною по 25...30 символів. Ідей є кілька. Вирішив почати з Arduino. Прийом інформації вже реалізовано - для цього вистачило періоду і тривалості рядкових синхроімпульсів. Наразі триває боротьба за формування відеосигналу в форматі 640*480*60 Гц
Ще може бути, що ваш компілятор виявився розумніший, і згенерував щось типу
Схоже, що це найкраще пояснення того, що відбувається. Дякую за думку
shifter і є тією змінною, розміщення якої радикально впливає на швидкість
Розібрався з фото. Там виводиться байт 0b01010101 молодшим бітом вперед
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;
Тобто 1 біт за 1 такт на atmega328p?
Саме так. Я не розумію, як таке може бути, але засоби об'єктивного контролю підтверджують
A, якщо вдається 8 біт за 0.5 мкс, то там явно не атмега. Або розігнана до 32 МГц
Звичайнісінький 16 МГц UNO. Я ж казав "Сам у шоці"
Навіщо це вам потрібно?
Формую відеосигнал зсувом байтової змінної. Якщо змінна в регістрі, то через однобітовий порт виводжу послідовно 8 бітів за 0,5 мікросекунди (сам у шоці). Якщо змінна не в регістрі - 1 біт за той же час. Різниця катастрофічна
Вимкнути оптимізацію - цікава ідея. Куди треба лізти для цього,
But what the hell is a guarantee?
Змінна байтова
Коли компілятор зберігає змінну в регістрі, фрагмент програми працює в рази швидше. Але він може використовувати або не використовувати регістр за власним розсудом. Чи відомі комусь ВЛАСНОРУЧ ПЕРЕВІРЕНІ засоби змусити компілятор використовувати для змінної регістр. Ключове слово "register" не працює, принаймні у мене.
Производитель не всегда заинтересован говорить правду. Для продавца это очень сложный вопрос. Считаю, что человек, пользующийся устройством - самый надёжный источник информации.
А вообще-то ситуация вызывает некоторое недоумение: у темы более 300 просмотров и ни одного ответа по сути вопроса.
Или что тогда вы называете центральной частью?
Интервал времени любой продолжительности меньший, чем продолжительность сохранённого сигнала и симметричный относительно момента срабатывания триггера синхронизации.
Что-то посты становятся всё длиннее, а ответ на вопрос в заголовке топика так и не найден.
Не надо больше писать много букв. Достаточно одной информативной картинки (образец в посте №6).
В HANTEK этот режим тоже называется Zoom и включается точно так же, как и в SIGLENT - нажатием на энкодер скорости развёртки. В более старых моделях режим назывался по-другому и вызывать его надо было с помощью команд меню.
Принципиальное отличие этого режима в том, что он позволяет рассмотреть всю сохранённую осциллограмму с любой степенью детализации. Именно для этого и нужны мегабайты памяти.
Простое растягивание в режиме Стоп позволяет сколь угодно подробно рассмотреть только центральную часть. А значит края осциллограммы не нужно сохранять с высокой детализацией. По моим подсчётам при горизонтальном размере экрана 800 пикселей и 33 возможных скоростей развёртки для этого достаточно 27К памяти, если не экономить. Если задаться целью максимальной экономии, то можно уложиться в 14К (без потери качества!)