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

 
 
> Управляем 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
Ответов
_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
Сергей Борщ
сообщение Aug 14 2011, 07:32
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
ae_
сообщение Aug 17 2011, 09:50
Сообщение #6


Участник
***

Группа: Свой
Сообщений: 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



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

 


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


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