Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Управляем 7 сегментным индикатором
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Rom20
Доброго времени суток! Вот тут такая задачка написать управляющую программу на ATmega8 для схемы (см схему). Вот только возникает проблема что бы допустим выставить данные на последнем индикаторе необходимо их прогнать через все сдвиговые регистры следовательно данные которые будут в этих регистрах будут потеряны, думал какой алгоритм лучше всего здесь применить, но так ни чего не придумал путнего, кроме здоровой таблицы в которой будут записаны все возможные комбинации цифр, ну это получиться очень большая таблица, чувствую что есть решение проще ну что то пока до него не дошел. Подскажите пожалуйста алгоритм по которому будет удобно зажигать нужную цифру при это сильно не трогая предыдущие.
_Pasha
595-е обновляют выход после соотвествующего строба записи, Ваши опасения беспочвенны. Так и делается - прогон всех символов, только желательно для контроля правильности введенных данных еще добавить такой же парафазный выход с Q8'
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485 - в ТТЛ их некоторое количество давным-давно есть.
Rom20
Цитата(_Pasha @ Aug 13 2011, 19:54) *
595-е обновляют выход после соотвествующего строба записи, Ваши опасения беспочвенны. Так и делается - прогон всех символов, только желательно для контроля правильности введенных данных еще добавить такой же парафазный выход с Q8'
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485 - в ТТЛ их некоторое количество давным-давно есть.

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

C этим делом разобрался что необходимо выставлять на линию сразу 4 байта, а вот как быть если мне нужно изменить только одно значение маску накладывать? а то схема у меня собрана так что один байт несет информацию сразу для двух индикаторов, пока пробую написать программу в виде наложения маски на данные которые выставляю на линии, или может есть способ проще?
haker_fox
QUOTE (Rom20 @ Aug 14 2011, 22:31) *
может есть способ проще?

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

да мысль переделать схему была вот только тогда печатка получиться двухсторонняя, а так односторонняя, ну буду работать с маской тогда.
haker_fox
QUOTE (Rom20 @ Aug 14 2011, 23:45) *
буду работать с маской тогда.

Это вполне обоснованно! Разработчик вправе выбирать компромисс между уровнем сложности железа и программы. Если нет возможности усложнить железо (в данном случае изготовить двухстороннюю печатную плату), то можно компенсировать недостаток незначительным усложнением программы.
ae_
Цитата(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)
Sirko
Цитата
Кстати, дифф. приемопередатчики не обязательно драйверы RS-485

AM26LS31 <-> AM26LS32 четыре канала по цене одной ADM485, вполне ходовая, т.е. "доставабельная" связка.
Rom20
Спасибо все за советы, вроде со всем разобрался написал ПО все заработало
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.