|
Помогите разобраться с кодом для 74HC595 |
|
|
|
May 8 2012, 13:13
|
Участник

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

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

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

|
В строке Цитата выводим "текущий бит" в линию DS 1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;2) Выводятся числа 0..8, а не 0.9
|
|
|
|
|
May 8 2012, 20:26
|
Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
May 8 2012, 21:13
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 8 2012, 21:26
|

Профессионал
    
Группа: Свой
Сообщений: 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 } Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает . Ну и конечно далее по тексту
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 8 2012, 21:29
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 8 2012, 22:01
|

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

|
Цитата(lol483 @ May 9 2012, 01:29)  Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP. И к тому же частота работы 74HC595 по моему около 100 МГц. Т.е абсолютно наплевать когда возникает этот самый фронт , так? И весь раздел DS Waveforms дан что бы заполнить пустые страницы. Кстати там и указана максимально возможная частота , и она несколько ниже Вашей
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 9 2012, 06:46
|
Участник

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

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

Группа: Участник
Сообщений: 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], форматирование
Эскизы прикрепленных изображений
|
|
|
|
|
May 9 2012, 10:06
|

Гуру
     
Группа: Свой
Сообщений: 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 В СИ не силён, но чтото мне это не нравится.
|
|
|
|
|
May 9 2012, 11:06
|

Гуру
     
Группа: Свой
Сообщений: 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; А что на СИ эти строки дают абсолютно одинаковый результат?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|