Digispark+TM1637

Да, спасибо, я почитал, понял свой косяк. Завтра поправленное выкладу, сёдня сил нет.

во всём виноват Чубайс виновата Мария! )))

код выглядит нелогично местами. Начать хотя бы с условия в цикле 0 != ii вместо просто проверки ii
А зачем две отдельные строчки 17 и 24?
И для чего режим INPUT_PULLUP? Модуль при передаче ACK тоже включает подтяжку - будем проверять, чья подтяжка сильнее?

да уж!

Если убрать 17 строку - будет КЗ.
Если убрать if (x) в 17 строке - то при включении режима входа, когда линия данных была в нуле, тмка получит сигнал стоп.
INPUT_PULLUP на случай если дисплей совсем не подключен, без этого отсутствие ACK определятся не корректно.
Условие в цикла ну так привычка.

вдобавок устраняет гонки на шине, правильно?
И таки да при любых условиях там сквознячек может быть, если только АСК перед тем как выставиться по заднему фронту CLK даёт мастеру переключится в режим прослушивания, видимо в даташите это должно быть, у тебя хороший осциллограф, фронты тянул? каковы?

Нее, гонки устраняюся логикой, строки 17, 20, 24. А PULLUP реально чтоб обнаружить отсутствие дисплея.
Фронты не замерял, они получаются типичные для пуш-пул.

Залез посмотрел как Гайвер в своей новейшей библиотеке реализовал:

   void _write(uint8_t data) {
        // send
        for (uint8_t i = 0; i < 8; i++) {
            pinMode(_clk, OUTPUT);
            pinMode(_dio, (data & 1) ? INPUT : OUTPUT);
            delayMicroseconds(DISP1637_CLK_DELAY);
            data >>= 1;
            pinMode(_clk, INPUT);
            delayMicroseconds(DISP1637_CLK_DELAY);
        }

        // ack
        pinMode(_clk, OUTPUT);
        pinMode(_dio, INPUT);
        uint8_t i = 50;
        while (i--) {
            delayMicroseconds(1);
            if (!digitalRead(_dio)) break;
        }
        pinMode(_clk, INPUT);
        delayMicroseconds(DISP1637_CLK_DELAY);
        pinMode(_clk, OUTPUT);
    }

Выше (#35) ua6em выкладывал код рекомендованный arduino.cc, там сделано по уму, переключением вход - 1 / выход - 0, но фронт переключения с нуля на единицу сильно завален, а поэтому нужна задержка, медленно будет работать.
У Гайвера такой режим только на клоке, данные пуш-пул и сначала идет задний фронт клока потом переключение данных на вход - будет КЗ где то на 1 такт и цикл ожидания ACK совсем не нужен.

я попытался исправить Гайверовскую функцию по твоей, не одолел студент )))

ua6em тут у многих выключен, его сообщений не видно.

Я этого не понимаю. Ноубоди перфект, как говорил Джобс, но ничего враждебного у него не видел. А тараканы у всех разные.

понять эту строку выше моих сил, если перевести пин в INPUT то понятно, подтягивающий резистор утянет шину в HIGH, а вот что утянет её в ноль при переводе в режим OUTPUT? или так в core написано? пин же не может быть (прямо по Шекспиру) в неопределённом состоянии…ну и экзерсисы…

Утянет, если перед этим будет digitalWrite(_dio, LOW);

в коде этого нету, в том то и дело и выше прокомментировали, что оперируя режимами пинов фронты будут тянуться, зачем он так сделал, в прежней библиотеке было просто:

    uint8_t i, count1;
    for (i = 0; i < 8; i++) //sent 8bit data
    {
        digitalWrite(Clkpin, LOW);
        if (wr_data & 0x01)digitalWrite(Datapin, HIGH); //LSB first
        else digitalWrite(Datapin, LOW);
        wr_data >>= 1;
        digitalWrite(Clkpin, HIGH);

ты электрик? или тебе просто нравится слово “КЗ“? или ты циркач? ты знаешь, что такое КЗ? угомонись, там тайминги некорректные при выводе всего лишь, отставить панику.

каким таким бат файлом, чистейший COM был

как будто не видно, каждому электрику пришедшему со школьной скамьи сейчас выдают по осциллографу Agilen иначе как оправдать повышение тарифов на электроэнергию (по прибору умеющему дистанционно определять чередование фаз я уж молчу, карманный)

тараканы говоришь… :grinning_face_with_smiling_eyes:
это утренние пошли видимо :sweat_smile:

коли тут не удаляется откровенное хамство и глум, других слов нет и админ за это не забанил, думал и мне можно,
”даже пива не пил, ой дурак” (с) не моё