ae_ 2 23 февраля, 2022 Опубликовано 23 февраля, 2022 · Жалоба TEMPO, Вы неправильно управляете Latch Enable, при сдвигах он должен быть =0, а после всех трёх сдвигов однократно единичный импульс. Не после каждого Write_Bit_8(...), а только после последнего. Output Enable незачем дёргать во время сдвигов, держите его всегда =0. OE можно использовать для гашения всех индикаторов на время, или мигания, или управления яркостью, плавное гашение индикатора(FadeOut), например. OE на сдвиги никак не влияет, а LE влияет: при LE=0 регистры — 'No Change' upd: противоречие в даташите, по диаграмме сдвиг при LE=0, по таблице при LE=1. Раз один способ не работает, надо проверить другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 23 февраля, 2022 Опубликовано 23 февраля, 2022 · Жалоба 27 минут назад, ae_ сказал: TEMPO, Вы неправильно управляете Latch Enable, при сдвигах он должен быть =0, а после всех трёх сдвигов однократно единичный импульс. Не после каждого Write_Bit_8(...), а только после последнего. Полностью поддерживаю. Указал на это в первом посте, но ТС говорит, что не помогло - я подумал, что проблема может быть аппаратной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 23 февраля, 2022 Опубликовано 23 февраля, 2022 (изменено) · Жалоба adnega, ae_, спасибо за помощь. Вот так получается надо: Write_Bit_8(0xFF); // первый Write_Bit_8(0xFF); // второй Write_Bit_8(0xFF); // третий PORTD |= (1 << LE); // LE High _delay_ms(10); PORTD &= ~(1 << LE); // LE Low А ведь нужна небольшая задержка между LE High и LE Low? Изменено 23 февраля, 2022 пользователем TEMPO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ae_ 2 23 февраля, 2022 Опубликовано 23 февраля, 2022 · Жалоба TEMPO, Проверьте схему так: PORTD &= ~(1 << OE); // OE Low PORTD |= (1 << LE); // LE High PORTD |= (1 << DIN); // DIN High while(1) { _delay_ms(250); PORTD |= (1 << CLK); // CLK High _delay_ms(250); PORTD &= ~(1 << CLK); // CLK Low } Должны последовательно загораться сегменты A..DP первого индикатора, затем второго и третьего. В итоге должны гореть все сегменты. В этом тесте не используется защёлкивание, LE=1 выходы отображают реальные состояния сдвиговых регистров. Данные не меняются, DIN всегда =1 Выходы всегда включены, /OE =0 Работает только сдвиг с интервалом 0,5 сек. за 12 с заполнятся все 8*3=24 разряда и останутся гореть. upd: ок, заработало. опоздал с этой проверкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 23 февраля, 2022 Опубликовано 23 февраля, 2022 · Жалоба ae_, спасибо, обязательно попробую, только сегодня железку забыл на работе((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 23 февраля, 2022 Опубликовано 23 февраля, 2022 · Жалоба 45 минут назад, TEMPO сказал: adnega, ae_, спасибо за помощь. Вот так получается надо: Write_Bit_8(0xFF); // первый Write_Bit_8(0xFF); // второй Write_Bit_8(0xFF); // третий PORTD |= (1 << LE); // LE High _delay_ms(10); PORTD &= ~(1 << LE); // LE Low А ведь нужна небольшая задержка между LE High и LE Low? Драйвер может работать на частотах порядка 25 МГц. AtTiny2313 с ее частотой, да с учетом вашего использования портов в режиме чтение-модификация-запись - импульс LE будет с достаточным запасом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться