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

Помогите разобраться с кодом для 74HC595

Здравствуйте, прошу помощи в следующей проблеме: написал кусочек кода для будущих часов на газоразрядных индикаторах с применением регистра последовательного сдвига 74HC595

и столкнулся с непонятным моментом, на осциллографе на соответствующих ножках МК: DS-постоянно 1, SH_CP-постоянно 1, ST_CP-постоянно 0. В соответствии с прикрепленной прошивкой там должны быть определенные колебания. Расскажите что в коде не так, в чем проблема?

__________74HC595.rar

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

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


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

В строке

выводим "текущий бит" в линию DS

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;

2) Выводятся числа 0..8, а не 0.9

 

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


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

В строке

 

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;

2) Выводятся числа 0..8, а не 0.9

 

1) - не помогло, всё так же.

2) - там идет перебор с нулевого элемента строки по девятый, то есть всего 10 чисел (0-9). Разве не так ?

 

В обоих случаях в итоге на выходах Q0-Q3 74HC595 постоянно логические 1.

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


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

Интересно , а что на OE?

OE постоянно и намертво присоединена к 0.

MR постоянно присоединена к 1 (5 v).

 

У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

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

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


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

{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .

Ну и конечно далее по тексту

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


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

{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .

Ну и конечно далее по тексту

Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.

И к тому же частота работы 74HC595 по моему около 100 МГц.

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

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


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

Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.

И к тому же частота работы 74HC595 по моему около 100 МГц.

Т.е абсолютно наплевать когда возникает этот самый фронт , так? И весь раздел DS Waveforms дан что бы заполнить пустые страницы.

Кстати там и указана максимально возможная частота , и она несколько ниже Вашей

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


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

Я думаю что по сути всё равно когда возникает импульс на SH_CP, главное что бы синхронно с ним на DS подавались нужные данные (вернее что бы бит там уже был раньше чем возникнет 1 на SH_CP). В даташите указана частота 100МГц. Сейчас попробую переделать так что бы с некой задержкой дергалась SH_CP.

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


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

Ну значит так: после добавления задержек в код на осциле стали видны колебания, но газоразрядный индикатор подключенный при помощи К155ИД1 ничего не показывает.

Схема и код прилагается.

#include <mega16.h>
#include <delay.h>

unsigned char dig;
unsigned char bin_digits[10]=
 {
	 0b11111111,	//0
	 0b11111110,	//1
	 0b11111101,	//2
	 0b11111100,	//3
	 0b11111011,	//4
	 0b11111010,	//5
	 0b11111001,	//6
	 0b11111000,	//7
	 0b11110111,	//8
	 0b11110110,	//9
 };

void HC595_write(unsigned char dig)
 //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
unsigned char i;
for(i=0; i<7; i++)	  //цикл для последовательного вывода 8 бит данных из массива
{
	PORTD.0=bin_digits[dig] & 1<<i;	//выводим "текущий бит" в линию DS
	PORTD.1=0;			//выводим "0" в линию SH_CP
	delay_ms(5);
	PORTD.1=1;	
	//выводим "1" в линию SH_CP - считываем бит на входе регистра
	//(считывание происходит по переднему фронту импульса на SH_CP)
	delay_ms(5);
}
PORTD.2=1;		
//выводим "1" в линию ST_CP - "защелкиваем данные"
// ("защелкивание" происходит по переднему фронту импульса на ST_CP)
delay_ms(5);
PORTD.2=0;				//выводим "0" в линию ST_CP
}

void main()
{
DDRD=0xFF;				//конфигурируем порт "D" на вывод
while(1)
{
	for(dig=0; dig<9; dig++)
	//цикл для чередования числел (0-9) записываемых в регистр 74HC595
	{
		HC595_write(dig);		//функция записи данных в регистр 74HC595
		delay_ms(500);
	}
}
}

post-71734-1336553376_thumb.png

Изменено пользователем IgorKossak
[codebox], форматирование

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


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

У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

А они должны быть!!! И Вы их должны видеть!!!

И до тех пор пока Вы их не увидите дальнейшие движения бессмысленны.

Ищите косяк.

delay_ms(5);

После добавления задержки 5000 тактов Вы заметили колебания!? Какие частоты? Длительности? Действительно ли 5ms?

 

И к тому же частота работы 74HC595 по моему около 100 МГц.

Зависит от питания и температуры. При 5В и 25С я бы больше 25MHz не подавал (для серийного изделия).

 

unsigned char bin_digits[10]=

{

0b11111111, //0

0b11111110, //1

0b11111101, //2

0b11111100, //3

0b11111011, //4

0b11111010, //5

0b11111001, //6

0b11111000, //7

0b11110111, //8

0b11110110, //9

};

А почему инверсные значения 0-9?

 

PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS

В СИ не силён, но чтото мне это не нравится.

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


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

В СИ не силён, но чтото мне это не нравится.

 

PORTD.0= (bin_digits[dig] >> i) & 1;

 

А так?

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


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

PORTD.0= (bin_digits[dig] >> i) & 1;

 

А так?

Так нравится.

 

PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

А что на СИ эти строки дают абсолютно одинаковый результат?

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


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

PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

А что на СИ эти строки дают абсолютно одинаковый результат?

А что - нет?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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