lol483 0 8 мая, 2012 Опубликовано 8 мая, 2012 (изменено) · Жалоба Здравствуйте, прошу помощи в следующей проблеме: написал кусочек кода для будущих часов на газоразрядных индикаторах с применением регистра последовательного сдвига 74HC595 и столкнулся с непонятным моментом, на осциллографе на соответствующих ножках МК: DS-постоянно 1, SH_CP-постоянно 1, ST_CP-постоянно 0. В соответствии с прикрепленной прошивкой там должны быть определенные колебания. Расскажите что в коде не так, в чем проблема? __________74HC595.rar Изменено 8 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба В строке выводим "текущий бит" в линию DS 1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0; 2) Выводятся числа 0..8, а не 0.9 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба В строке 1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0; 2) Выводятся числа 0..8, а не 0.9 1) - не помогло, всё так же. 2) - там идет перебор с нулевого элемента строки по девятый, то есть всего 10 чисел (0-9). Разве не так ? В обоих случаях в итоге на выходах Q0-Q3 74HC595 постоянно логические 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба Интересно , а что на OE? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 8 мая, 2012 Опубликовано 8 мая, 2012 (изменено) · Жалоба Интересно , а что на OE? OE постоянно и намертво присоединена к 0. MR постоянно присоединена к 1 (5 v). У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-( Изменено 8 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба { PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS PORTD.1=0; //выводим "0" в линию SH_CP PORTD.1=1; //выводим "1" в линию SH_CP } Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает . Ну и конечно далее по тексту Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 8 мая, 2012 Опубликовано 8 мая, 2012 (изменено) · Жалоба { PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS PORTD.1=0; //выводим "0" в линию SH_CP PORTD.1=1; //выводим "1" в линию SH_CP } Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает . Ну и конечно далее по тексту Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP. И к тому же частота работы 74HC595 по моему около 100 МГц. Изменено 8 мая, 2012 пользователем lol483 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 8 мая, 2012 Опубликовано 8 мая, 2012 · Жалоба Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP. И к тому же частота работы 74HC595 по моему около 100 МГц. Т.е абсолютно наплевать когда возникает этот самый фронт , так? И весь раздел DS Waveforms дан что бы заполнить пустые страницы. Кстати там и указана максимально возможная частота , и она несколько ниже Вашей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба Я думаю что по сути всё равно когда возникает импульс на SH_CP, главное что бы синхронно с ним на DS подавались нужные данные (вернее что бы бит там уже был раньше чем возникнет 1 на SH_CP). В даташите указана частота 100МГц. Сейчас попробую переделать так что бы с некой задержкой дергалась SH_CP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lol483 0 9 мая, 2012 Опубликовано 9 мая, 2012 (изменено) · Жалоба Ну значит так: после добавления задержек в код на осциле стали видны колебания, но газоразрядный индикатор подключенный при помощи К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); } } } Изменено 9 мая, 2012 пользователем IgorKossak [codebox], форматирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба У меня осциллограф до 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 В СИ не силён, но чтото мне это не нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба В СИ не силён, но чтото мне это не нравится. PORTD.0= (bin_digits[dig] >> i) & 1; А так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба PORTD.0= (bin_digits[dig] >> i) & 1; А так? Так нравится. PORTD.0=bin_digits[dig] & 1<<i; PORTD.0=(bin_digits[dig] >> i) & 1; А что на СИ эти строки дают абсолютно одинаковый результат? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба PORTD.0=bin_digits[dig] & 1<<i; PORTD.0=(bin_digits[dig] >> i) & 1; А что на СИ эти строки дают абсолютно одинаковый результат? А что - нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 9 мая, 2012 Опубликовано 9 мая, 2012 · Жалоба А что - нет? А я не знаю, вот и спрашиваю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться