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

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

|
Цитата(hd44780 @ May 10 2012, 14:38)  Про 2 порта я не понял  . 4 ноги - код цифры, а остальное куда? И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными. C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр. И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6. И что у тебя "всё остальное"? у газоразрядного индикатора в общем случае 11 ног (общий анод и катоды-цифры от 0 до 9), если всего будет 6 ламп (часы, минуты, секунды) то через что бы управлять всеми шестью через К155ИД1 нужно будет задействовать 4*6 ног. (Кстати я ошибся написав что два порта, на самом деле целых три, только сейчас понял). По любому надо будет разбираться с 74HC595, так как их можно соединить последовательно, очень сэкономив ноги МК. "И как у тебя задаётся в какой разряд индикации какая цифра выводится?" - просто в цепочку последовательно соединенных 74YC595 - проталкивается число времени, например, 234002 - (23:40:02).
|
|
|
|
|
May 11 2012, 07:12
|
Участник

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

|
Цитата(ILYAUL @ May 10 2012, 20:59)  Можно начать экономить отказавшись от секунд. Баловоство это. Тоже правда. А кто нибудь знает различия во внешнем виде между динамической и статической индикацией газоразрядных индикаторов. И есть ли они ? По идее их использовали со статической индикацией.
|
|
|
|
|
May 11 2012, 08:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Не знаю. Когда-то давно, когда я ещё был маленьким, и на эти вещи смотрел исключительно как на красивые игрушки, мне в руки попал некий блок индикации на каких-то лампах. Одна лампа-одна цифра. Там было порядка 20 таких ламп. И куча каких-то микросхем (сколько именно, не помню). Но, как мне теперь кажется, это была статическая индикация (по воспоминаниям, исходя из равного (или примерно равного) кол-ва микросхем и ламп).
Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.
А зачем именно газовые лампы?
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 11 2012, 08:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата(hd44780 @ May 11 2012, 12:41)  Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей. Так это же очень хорошо, что инерционные, Вы уже питаете следующую лампу, а предыдущая все еще светится. Мне кажется, что раньше не применяли динамическую индикацию исключительно из соображений сложности реализации на простой логике. Сейчас же в век дешевых микроконтроллеров нет причин не использовать. Цитата(hd44780 @ May 11 2012, 12:41)  А зачем именно газовые лампы? Это нынче модный тренд. Из разряда "теплый ламповый звук", Steam Punk и т.д.
--------------------
|
|
|
|
|
May 11 2012, 08:57
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(hd44780 @ May 11 2012, 11:41)  Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей. нету времени, посмотрите здесь
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
May 12 2012, 12:01
|
Участник

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

|
Всё, я разобрался! Оказалось что я не правильно работал с регистром последовательного сдвига, а именно он смещал всё на бит в сторону. Вот поправил функцию и всё поехало как надо: Код void HC595_write(unsigned char dig) //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP) { unsigned int i; for(i=0; i<=7; i++) //цикл для последовательного вывода 8 бит данных из массива { PORTD.0=bin_digits[dig] & (1<<i); //выводим "текущий бит" в линию DS PORTD.1=1; //выводим "0" в линию SH_CP PORTD.1=0; //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP) } PORTD.2=1; //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP) PORTD.2=0; //выводим "0" в линию ST_CP } Вот что именно изменил: "for(i=0; i<=7; i++)" , а вот как было "for(i=0; i<7; i++)".
Сообщение отредактировал lol483 - May 12 2012, 13:22
|
|
|
|
|
May 12 2012, 12:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Ничего себе заявочки! Цитата регистр последовательного сдвига неправильно работал , Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код Код for(i=0; i<7; i++) и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт?
--------------------
|
|
|
|
|
May 12 2012, 13:23
|
Участник

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

|
Цитата(GDI @ May 12 2012, 15:49)  Ничего себе заявочки! , Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код Код for(i=0; i<7; i++) и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт? По идее всего 6 раз и как раз последний бит не дописывался. Так ?
|
|
|
|
|
May 12 2012, 15:18
|
Участник

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

|
Цитата(_Артём_ @ May 12 2012, 16:28)  Нет не так. 7 раз. Да, точно 7, всего то их восемь, вот последний то и не дописывался. Но сейчас всё отлично.
|
|
|
|
|
May 12 2012, 15:28
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Ещё сомнительная конструкция: Код PORTD.0=bin_digits[dig] & (1<<i); Лучше как-то так: Код PORTD.0= (bin_digits[dig] & (1<<i)) ? (1) : (0); или прочитать bin_digits[dig] в байт и сдвигать его: Код tmp=bin_digits[dig];
for(..... PORTD.0= (tmp&1) ? (1) : (0); .... tmp>>=1; ....
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|