реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Помогите разобраться с кодом для 74HC595
lol483
сообщение May 8 2012, 13:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



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


Сообщение отредактировал lol483 - May 8 2012, 13:14
Прикрепленные файлы
Прикрепленный файл  __________74HC595.rar ( 26.06 килобайт ) Кол-во скачиваний: 33
 
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 8 2012, 14:01
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В строке
Цитата
выводим "текущий бит" в линию DS

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 20:26
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



Цитата(Genadi Zawidowski @ May 8 2012, 17:01) *
В строке

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9


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

В обоих случаях в итоге на выходах Q0-Q3 74HC595 постоянно логические 1.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 21:06
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 21:13
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



Цитата(ILYAUL @ May 9 2012, 00:06) *
Интересно , а что на OE?

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

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

Сообщение отредактировал lol483 - May 8 2012, 21:13
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 21:26
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



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

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 8 2012, 21:29
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



Цитата(ILYAUL @ May 9 2012, 00:26) *
Код
{
        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 - May 8 2012, 21:34
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 8 2012, 22:01
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(lol483 @ May 9 2012, 01:29) *
Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.
И к тому же частота работы 74HC595 по моему около 100 МГц.

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 06:46
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



Я думаю что по сути всё равно когда возникает импульс на SH_CP, главное что бы синхронно с ним на DS подавались нужные данные (вернее что бы бит там уже был раньше чем возникнет 1 на SH_CP). В даташите указана частота 100МГц. Сейчас попробую переделать так что бы с некой задержкой дергалась SH_CP.
Go to the top of the page
 
+Quote Post
lol483
сообщение May 9 2012, 08:49
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-05-12
Пользователь №: 71 734



Ну значит так: после добавления задержек в код на осциле стали видны колебания, но газоразрядный индикатор подключенный при помощи К155ИД1 ничего не показывает.
Схема и код прилагается.
CODE
#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);
}
}
}


Сообщение отредактировал IgorKossak - May 9 2012, 10:00
Причина редактирования: [codebox], форматирование

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 10:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(lol483 @ May 9 2012, 00:13) *
У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

А они должны быть!!! И Вы их должны видеть!!!
И до тех пор пока Вы их не увидите дальнейшие движения бессмысленны.
Ищите косяк.
Код
delay_ms(5);

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

Цитата(lol483 @ May 9 2012, 00:29) *
И к тому же частота работы 74HC595 по моему около 100 МГц.

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

Цитата(lol483 @ May 9 2012, 11:49) *
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?

Цитата(lol483 @ May 9 2012, 11:49) *
PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS

В СИ не силён, но чтото мне это не нравится.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 9 2012, 10:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(zombi @ May 9 2012, 13:06) *
В СИ не силён, но чтото мне это не нравится.


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

А так?
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 11:06
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(adnega @ May 9 2012, 13:29) *
PORTD.0= (bin_digits[dig] >> i) & 1;

А так?

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

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

А что на СИ эти строки дают абсолютно одинаковый результат?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 9 2012, 12:28
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ May 9 2012, 14:06) *
Код
PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

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

А что - нет?
Go to the top of the page
 
+Quote Post
zombi
сообщение May 9 2012, 13:03
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ May 9 2012, 15:28) *
А что - нет?

А я не знаю, вот и спрашиваю.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 08:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016