Как стать автором
Обновить

Разгадываем ребус вторичных часов «Воронеж»

Время на прочтение 12 мин
Количество просмотров 13K
Всего голосов 109: ↑106 и ↓3 +103
Комментарии 20

Комментарии 20

Как хорошо, что по итогу весь пазл сложился. Успехов в поиске новых лам)

Да, я сам очень рад. Спасибо большое за пожелание!
НЛО прилетело и опубликовало эту надпись здесь

"меандр курильщика" (Явление Гиббса) ещё возникает в результате цифровой обработки сигнала в осциллографе, особенно на медленных развёртках, вы в целом писали об этом в своей статье, просто хочу акцентировать что это проявляется ещё и таким образом, амплитуда реального сигнала меньше чем нам показывает осциллограф

А не пробовали в качестве драйвера линии( вместо всяких L9110S и IR4427 ) "MAX232":?
1) рожден для этого
2) питание только 5В
3) встроенная защита выходов
...

Виноват, там же еще 0 В есть.

Я начал с этой идеи, но увы, ноль.

А нет схемы входных цепей часов( там самоподтяжки к "0" нет случаем)?
А то может задействовать 2 выхода RS232 через диодный смеситель( один тянет к +, другой к -, а 0 сам получается)

Зачем, если есть готовые микросхемы, специально для этих целей и достаточно дешёвые

Все таки биполярный и дифференциальный это немного разные физические интерфейсы, в первом случае у нас земля общая.
В результате дифференциальный выход на биполярный вход выглядит не очень: когда "земли" 2х приборов мечутся друг относительно друга в такт данным.

Как вы понимаете, число 20 очень плохо делится на числа кратные тройке

Зато 24 очень даже делится и на 3, и на 6, а вся приведённая математика пересчитывается в целые числа, без всяких периодов :)

Все чудесно, но длительность посылки 20 мс, как согласно документации, так и снятым осциллограмм. 24 мс — это не кратная частота.
Решил всё же предать ГОСТовские схемы, и освоил-таки программу fritizing .....

Уже думал плюсануть, и тут...<Хнык>


Посмотрел на жменю горелых платок L9110S .....

Также — спасибо "доброму азиату", замкнувшему выход моста на C4. Который следует располагать у нагрузки (искрящего моторчика и т.п. индуктивности) и отделять от моста индуктивностью проводов (а иной раз — и дополнительным дросселем).
Или — уменьшить его раз в 50..100.

Уверяю, у меня есть схема, но она сильно хуже читаема.

Думаю — это всё равно лучше Фритцинга.

Цель какая? Моя цель, чтобы те кому было нужно могли повторить. Если цель, понты, то можно привести схему с кучей соединений, и она станет не читаема.
НЛО прилетело и опубликовало эту надпись здесь

А если важны именно принципы, то — наоборот.

Там для принципиальных, в соседней вкладке fritizing генерирует принципиальную схему. Я подумал, что я достаточно адекватен, чтобы думать о читателях, и привёл схему монтажную.

У вас, кажется, в обработчике TIMER1_COMPA_vect в случае frame_counter=20 ничего не происходит. Но я, собственно, не за этим.

Для реализации подобных конечных автоматов можно из любопытства попытаться применить идею из https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html . С помощью нее можно писать код в императивном стиле, вместо явной обработки состояний:

#define BEGIN_COROUTINE static int32_t state = -1; switch(state) { case -1:
#define YIELD do { state = __LINE__; return; case __LINE__: ; } while(0);
#define END_COROUTINE }

ISR(TIMER1_COMPA_vect) {
    static uint8_t cur_pos_num;
    static int8_t i;

    BEGIN_COROUTINE
        for (;;) {
            for (cur_pos_num = 0; cur_pos_num < 6; ++cur_pos_num) {
                for (i = 9; i >= 0; --i) {
                    set_posi_sig();
                    YIELD;

                    if (i == numbers[cur_pos_num]) {
                        set_nego_sig();
                    } else {
                        set_zero_sig();
                    }
                    YIELD;
                }

                for (i = 0; i < 20; ++i) {
                    set_zero_sig();
                    YIELD;
                }
            }
        }
    END_COROUTINE
}

Если под номер состояния выделять большой int расточительно, то можно каждый раз явно передавать в YIELD какое-то уникальное число:

#define YIELD(s) do { state = s; return; case s: ; } while(0);

Практическая целесообразность под большим вопросом, но по-моему довольно интересный трюк.

Честно признаюсь, силился понять что делает код, но понял что что-то совсем не то, что от него ожидают. Как минимум наличие:

for (;;) {
...
}

В прерывании является бредом.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.