Завалялись у меня тинки13 и пару ЖК панелей от кассовых аппаратов
ОРИОН.
Еще был ЛБП самодельный, который показывал только напряжение на выходе.
Регулировалось только напряжение от 1,2 до 36 и защита на 3 ампер.
Решил сделать ампер-вольтметр для него, вот и пришлось разбираться с HT1621
Приступим
Буду объяснять все деревенским языком, понятно, коротко и ясно надеюсь
понять HT1621 не так просто оказалось, я рассчитывал все собрать за час, но...
Нашел пару примеров чужого кода на С++, но очень скудные коментами и/или были на китайском.
Короче я всегда предпочитал писать код с нуля чем разбираться в чужом коде, так быстрее и к тому же луче понимаешь суть работы микросхемы.
Перечитав даташит раз 5, я переписал нужные мне команды и протокол работы микросхемы на понятном для меня деревенском
.
Поехали!
Так что же из себя представляет контроллер "
HT1621 RAM Mapping 32x4 LCD"
Эта микросхема на борту имеет 128бит ОЗУ, ячейки которого привязаны на выходы
SEG0..SEG31 и
COM0..COM3.
То есть если мы запишем в ОЗУ какие то данные то они сразу же передаются на ножки микросхемы и тем самым высвечиваются на экране.
(как работает ЖК можете посмотреть здесь http://radiokot.ru/articles/26/))Что же мы имеем:
CS - Chip Selection – вибор чипа, коротко скажу - чтоб начать работать с микросхемой подаем на CS лог. 0, когда закончим передавать данные то подаем лог. 1.
RD - тактирующий сигнал для чтения данных
WR - тактирующий сигнал для записи данных
Data – сами данные, которые передаются последовательно
OSCI/OSCO – для подключения внешнего кристалла 32.768khz, если настроен на внутренний осцилятор то эти ножки могут висеть в воздухе
VLCD - питание LCD
VDD – питание микросхемы
IRQ – преривания
BZ и
BZ – выходы для подключения пищалки, можно получить 2khz или 4khz на этих ножках.
COM0..COM3 – общий для сегментов LCD
SEG0..SEG31 – сами сегменты LCD
Скажу по секрету что если у вас такая же плата как у меня от
ОРИОН, то все что вам нужно для управления это 3 провода, а именно вот эти:
CS,
WR и
DATA.
Протокол работы:
Протокол работы очень простой, все что нам нужно для начала работы с микросхемой это:
1. устанавливаем
CS - 1
2. настраиваем
BIAS и
COM3. посылаем команду
System Enable4. включаем LCD
5. дальше подаем на
CS – 0, посылаем данные с тактирующим сигналом и после окончания посылаем на
CS – 1, как на диаграмме.
BIAS смешение генератора для LCD. Имеет два режима: ½ и 1/3.
Я не совсем понял что это, потом пройдусь осциллографом и напишу обязательно.
На этом дисплее если ставить BIAS 1/3 то сегменты светятся как бы в пол накала Что касается
COM микросхему можно настройть на работу с двумя, тремя или четырьмя общими выходами.
Нам нужны все четыре, ибо на дисплее 12 семисегментных знаков и еще дополнительные.
Формат команд:
Ща будем разбиратся из чего состоят команды.
Первые 3 бита (
bit0..
bit2) указывают на режим команды или режим передачи/приема данных.
Режимов у нас 3 –
100,
101 и
110.
Первый режим – это режим передачи команды – 100 XXXXXXXX X
Зеленными помечены биты самой команды, например: 100 00000011 X – это команда
LCD ON. Последний бит X может быть любым, он пропускается.
второй – режим записи данных - 101 XXXXXX XXXX X
третий – режим чтения (не рассматриваем) – 110 XXXXXX XXXX X
в режимах чтения и передачи данных, биты разделены следующим образом:
bit3..bit8 – это адреса в памяти
bit9..bit12 – это сами данные
bit13 – неважно что, я всегда ставлю 0.
Передача команд:
Есть два способа.
Первый это “обычный” способ, когда посылаем данные и адреса каждый раз, и второе это, когда первой команде указываем начальный адрес, а микросхема сама перейдет на следующий адрес, пока мы посылаем данные.
практика:
посылаем биты – скажем: “100”
CS=0;
// chip selectWR=1; DATA=1; WR=0;
WR=1; DATA =0;WR=0;
WR=1; DATA =0;WR=0;
CS=1;
//WR это тактовый сигнал, DATA это данные, думаю все очень легко Сразу приведу пример инициализаций на псевдо языке программирования
===============
// инициализацийsend 100 00101000 0;
//BIAS & COM – BIAS ½ и COM все 4send 100 00000001 0;
//SYSTEM ENABLE запускаем генераторsend 100 00000011 0;
//TURN ON LCD включаем lcd//посылаем данныеsend
101 0100 1100 0;
// говорим микрухе что мы будем записывать данные и записываем по адресу 0100 данные 1100, ну и последний бит не важно ===============
Можно вот так записывать данные и каждый раз увеличивать адрес на единицу, но помните что микросхема умеет сама увеличивать адрес.
Так вот
Если мы запишем вот так:
send
101 0001 1100 0 1000 0 1001 0 1100 0 1010 0;
то HT1621 сама запишет увеличивая адрес на единицус каждым приёмом пакета данных состоящих из 4х бит.
То есть последняя пачка данных
1010 запишется по адресу
0101, ибо начальный адрес мы указали
0001 а прибавив к нему еще 4 то получится
0101.
Теперь сам дисплей.
Методом тыка битами по ОЗУ, я определил какие сегменты к какому адресу привязаны.
Как видно один знак занимает два адреса в ОЗУ. Всего 12 знаков, значит 24 адреса используются (прям как Иода сказал
)
Если мы по адресу 000001 запишем значение 0001 то у нас высветится самый нижний горизонтальный сегмент первого знака (слева).
Если по адресу 000010 запишем значение 0001 то уже засветится точка первого знака.
Надеюсь доходчиво объясняю
если все еще не понятно то вот пример с картинкой ОЗУ.
Здесь пишем двойку на первом знаке (слева).
Вроде все.
Команды HT1621 я перечислять не буду, все найдете в даташите.
Прилагается пример вольтметр+амперметр, все с коментами, но мне проще на английском коментить (так короче коменты получаются) и там не все на русском,но думаю все легко можно понять.
Если будут вопросы я готов ответить и помочь как смогу
Надеюсь хоть кому то эта статья будет полезна.
P.S. код не оптимизирован, наверно можно еще уменьшить что-то, но цель статьи не программирование на С++, а понять HT1621.
Как вы реализуете программную часть для мк это другая тема.
В архиве есть исходник на CVAVR и HEX для attiny13
http://radiokot.ru/forum/download/file.php?id=149454 - исходник на CVAVR и HEX
- Вложения
-
- 1.GIF
- (5.97 KiB) Скачиваний: 27631
-
- 2.GIF
- (14.21 KiB) Скачиваний: 26463
-
- 5.gif
- (11.96 KiB) Скачиваний: 26506
-
- 3.gif
- (13.96 KiB) Скачиваний: 26442
-
- 4.gif
- (10.34 KiB) Скачиваний: 27157
Последний раз редактировалось
DLL32 Пн апр 29, 2013 17:50:06, всего редактировалось 2 раз(а).