Перейти к содержанию
    

TEMPO, Вы неправильно управляете Latch Enable, при сдвигах он должен быть =0, а после всех трёх сдвигов однократно единичный импульс. Не после каждого Write_Bit_8(...), а только после последнего.

Output Enable незачем дёргать во время сдвигов, держите его всегда =0. OE можно использовать для гашения всех индикаторов на время, или мигания, или управления яркостью, плавное гашение индикатора(FadeOut), например.

OE на сдвиги никак не влияет, а LE влияет: при LE=0 регистры — 'No Change'

MBI5168_LE.png.78487c6f849c17a8a56ac2d6eea2efd7.png MBI5168_TT.png.aff4c17cbcb05d98ab2813f4bf47b4ca.png

upd: противоречие в даташите, по диаграмме сдвиг при LE=0, по таблице при LE=1. Раз один способ не работает, надо проверить другой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, ae_ сказал:

TEMPO, Вы неправильно управляете Latch Enable, при сдвигах он должен быть =0, а после всех трёх сдвигов однократно единичный импульс. Не после каждого Write_Bit_8(...), а только после последнего.

Полностью поддерживаю. Указал на это в первом посте, но ТС говорит, что не помогло - я подумал, что проблема может быть аппаратной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Изменено пользователем TEMPO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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: ок, заработало. опоздал с этой проверкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 будет с достаточным запасом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...