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

 
 
> Управляем 7 сегментным индикатором, AVR + сдвиговый регистр + 7-индикатор
Rom20
сообщение Aug 13 2011, 15:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Доброго времени суток! Вот тут такая задачка написать управляющую программу на ATmega8 для схемы (см схему). Вот только возникает проблема что бы допустим выставить данные на последнем индикаторе необходимо их прогнать через все сдвиговые регистры следовательно данные которые будут в этих регистрах будут потеряны, думал какой алгоритм лучше всего здесь применить, но так ни чего не придумал путнего, кроме здоровой таблицы в которой будут записаны все возможные комбинации цифр, ну это получиться очень большая таблица, чувствую что есть решение проще ну что то пока до него не дошел. Подскажите пожалуйста алгоритм по которому будет удобно зажигать нужную цифру при это сильно не трогая предыдущие.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
_Pasha
сообщение Aug 13 2011, 15:54
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



595-е обновляют выход после соотвествующего строба записи, Ваши опасения беспочвенны. Так и делается - прогон всех символов, только желательно для контроля правильности введенных данных еще добавить такой же парафазный выход с Q8'
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485 - в ТТЛ их некоторое количество давным-давно есть.
Go to the top of the page
 
+Quote Post
Rom20
сообщение Aug 14 2011, 03:51
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(_Pasha @ Aug 13 2011, 19:54) *
595-е обновляют выход после соотвествующего строба записи, Ваши опасения беспочвенны. Так и делается - прогон всех символов, только желательно для контроля правильности введенных данных еще добавить такой же парафазный выход с Q8'
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485 - в ТТЛ их некоторое количество давным-давно есть.

как работает 595-ы регистр я разобрался, и если посмотреть на схему то видно что строб данных приходит на все регистры одновременно следовательно когда я выставлю нужные мне данные на последнем регистре в цепи и обновлю их то данные обосноваться и на других регистрах и там вылезет всякая ахинея, вот и я задаю вопрос как сделать программно что бы этого не было? просто единственное что пришло на ум это просчитать комбинации всех цифр которые необходимы ну это получится очень большая таблица.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Aug 14 2011, 07:18
Сообщение #4


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

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Вот только возникает проблема что бы допустим выставить данные на последнем индикаторе необходимо их прогнать через все сдвиговые регистры следовательно данные которые будут в этих регистрах будут потеряны
ну и ? обновляйте все регистры одновременно (из массива в ОЗУ), ничего теряться не будет
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 14 2011, 07:32
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Rom20 @ Aug 14 2011, 06:51) *
вот и я задаю вопрос как сделать программно что бы этого не было?
Каждый ваш регистр хранит ровно байт. Вот и храните в ОЗУ 4 байта и выталкивайте их каждый раз при обновлении. Никаких таблиц тут не нужно, разве что таблица знакогенератора для одного знакоместа, которая используется для заполнения каждого из этих четырех байтов. А в качестве регистров посмотрите на TPIC6D595 - это та же пара 595+выходные транзисторы, но греется меньше чем 2804 и один корпус занимает меньше места чем два.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rom20
сообщение Aug 14 2011, 13:31
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(Сергей Борщ @ Aug 14 2011, 11:32) *
Каждый ваш регистр хранит ровно байт. Вот и храните в ОЗУ 4 байта и выталкивайте их каждый раз при обновлении. Никаких таблиц тут не нужно, разве что таблица знакогенератора для одного знакоместа, которая используется для заполнения каждого из этих четырех байтов. А в качестве регистров посмотрите на TPIC6D595 - это та же пара 595+выходные транзисторы, но греется меньше чем 2804 и один корпус занимает меньше места чем два.

C этим делом разобрался что необходимо выставлять на линию сразу 4 байта, а вот как быть если мне нужно изменить только одно значение маску накладывать? а то схема у меня собрана так что один байт несет информацию сразу для двух индикаторов, пока пробую написать программу в виде наложения маски на данные которые выставляю на линии, или может есть способ проще?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 14 2011, 13:47
Сообщение #7


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Rom20 @ Aug 14 2011, 22:31) *
может есть способ проще?

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Rom20
сообщение Aug 14 2011, 14:45
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(haker_fox @ Aug 14 2011, 17:47) *
Если это возможно, я бы предложил Вам переделать схему так, чтобы каждый регистр обслуживал только единственный - индикатор. В противном случае Ваше предложение по поводу маски - совершенно верное!

да мысль переделать схему была вот только тогда печатка получиться двухсторонняя, а так односторонняя, ну буду работать с маской тогда.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Aug 14 2011, 15:10
Сообщение #9


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Rom20 @ Aug 14 2011, 23:45) *
буду работать с маской тогда.

Это вполне обоснованно! Разработчик вправе выбирать компромисс между уровнем сложности железа и программы. Если нет возможности усложнить железо (в данном случае изготовить двухстороннюю печатную плату), то можно компенсировать недостаток незначительным усложнением программы.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 17 2011, 09:50
Сообщение #10


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(Rom20 @ Aug 14 2011, 22:31) *
...разобрался что необходимо выставлять на линию сразу 4 байта
...схема у меня собрана так что один байт несет информацию сразу для двух индикаторов

В подобной ситуации делал так:
- числа в программе хранятся не как символы 7-сегментного индикатора, а в обычном виде 2 3 5 9
- для преобразования числа в 7-сегментное представление есть таблица перекодировки, например для нуля - 0b11111100 (abcdefgh)
- для хранения символьного представления есть дополнительно 4 переменных или массив знак0...знак3 (видеобуфер)
- и, если, для удобства монтажа биты в этих знакоместах переставлены местами, то должна быть маленькая процедура, которая переставляет биты в нужном порядке, например:
исходный вид - a0b0c0d0e0f0g0h0 a1b1c1d1e1f1g1h1 a2b2c2d2e2f2g2h2 a3b3c3d3e3f3g3h3
требуемый вид b2a1a2f4g5h0g3b1 ...

как это работает:
1) получаем цифру, которую нужно отобразить, пусть будет 3, во втором знакоместе, при этом не изменяя ничего, что уже отображается на индикаторе.
2) из таблицы перекодировки получаем 7-сег. вид для цифры "3" - 0x11110010
3) записываем его в "знак1" (переменная/элемент массива для второго слева знакоместа).
4) теперь выполняем процедуру перестановки битов из "знак0...знак3", но не в самих "знак0...знак3", а во временный 4-х байтный буфер, который тут же и выводим на дисплей в сдвиговые регистры 74HC595.

- помигать разделительной точкой между 2-м и 3-м разрядами тоже ничего не трогая на дисплее:
инвертируем младший бит (сегмент h) в переменной "знак1" и выполняем шаг 4)

- погасить крайнее левое знакоместо, но не трогать остальные:
обнуляем "знак0" и выполняем шаг 4)
Go to the top of the page
 
+Quote Post
Sirko
сообщение Aug 18 2011, 21:20
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485

AM26LS31 <-> AM26LS32 четыре канала по цене одной ADM485, вполне ходовая, т.е. "доставабельная" связка.
Go to the top of the page
 
+Quote Post
Rom20
сообщение Aug 19 2011, 11:30
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Спасибо все за советы, вроде со всем разобрался написал ПО все заработало
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:48
Рейтинг@Mail.ru


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