Application Note PCA85134. Continuation.

Технологическая программная часть.
Как я уже указывал, PCA85134 управляется по интерфейсу I2C. Этот интерфейс достаточно хорошо описан в интернете и литературе. Я тоже в своё время отметился в этом деле, поэтому, если кто хочет освежить знания — вперёд. Команды, которыми управляется PCA85134 приведены в Table.10 на стр. 21  ДШ. Помещать таблицу в статью — только место занимать. Их (команд) всего пять: — установка режима; — загрузка указателя адреса видео ОЗУ; — выбор одной из восьми микросхем PCA85134; — выбор банка памяти видео ОЗУ; — выбор режима мигания. В указанной таблице есть ссылки на таблицы расшифровки управляющих разрядов. Даже плохо зная английский на интуитивном уровне можно понять их назначение. Кроме команд в обмене участвует ещё управляющий байт «Control byte» (Fig.18 стр.27.) В нём значащие только два старших разряда (Table 17. стр.27.) 7-й разряд (CO) определяет последний ли в текущем сеансе обмена этот управляющий байт (CO=0), или не последний (CO=1). 6-й разряд (RS) определяет к командному регистру (RS=0), или к регистру данных (RS=1) будет следующее за управляющим байтом обращение.
Видео ОЗУ PCA85134 представляет собой массив бит 60 на 4 (Fig.11  стр.16.). 60 колонок — это 60 сегментов S0-S59, а 4 строки — это 4 общих вывода (Duty) для мультиплексных режимов отображения (в PCA85134 обозначены как BP0-BP3). В статическом режиме адресуется или 0-я, или 2-я строка (по умолчанию 0-я, как в нашем примере).
Чтобы свести в кучу всю вышеуказанную информацию рассмотрим что делает исходный код технологической программы.
Функция инициализации:

//Инициализация PCA85134
void set_PCA85134 (void)
{
    do
        {
            ack=0;
            i2start();//старт
            i2write(0b01110000); ack |= i2ack();//адрес PCA85134 для записи 0х70 (без 1 в 0-м разряде)     
            i2write(0b00000000); ack |= i2ack();//управляющий байт, опишу позже (кому не терпиться - стр.27 DS)
            i2write(0b11001001); ack |= i2ack();//команда "mode-set", опишу позже (кому не терпиться - стр.21-22 DS)
            i2stop();//стоп
		}
    while(ack);
}

Функции работы с I2C не рассматриваю — подразумевается, что вы их знаете.
i2write(0b01110000); — записываем адрес устройства с которым ведём обмен (в нашем случае, конечно, PCA85134). 0-й бит=0. Это признак записи в устройство.
i2write(0b00000000); — записываем управляющий байт, а в нём:
7-й бит (СО) = 0. Это признак последнего в этом сеансе обмена управляющего байта.
6-й бит (RS)=0. Это признак следующей за этим управляющим байтом команды (а не данных).
Остальные биты 5-0 не играют никакой роли.
i2write(0b11001001); — записываем команду «Mode-set», а в ней:
7-4-й биты = 1100. Это Operation code команды.
3-й бит (Е)=1. Включение (разрешение) отображения.
2-й бит (В)=0. Включение bias=1/3, а в статическом режиме этот бит не играет роли.
1-0-й биты=01. Включение статического режима с одним общим проводом BP0.

Остальные четыре команды мы не использовали, и в них по включению питания установились значения по умолчанию:
«Load-data-pointer» — загрузка указателя адреса видео ОЗУ, а в ней:
7-й бит=0. Это Operation code команды.
6-0-й биты(P[6:0]) =0000000. Это адрес видео ОЗУ.
«Device-select» — выбор одной из восьми микросхем PCA85134, а в ней:
7-3-й биты=11100. Это Operation code команды.
2-0-й биты(A[2:0])=000. Это аппаратный субадрес одной из восьми PCA85134. Этот субадрес определяется комбинацией подключения трёх ног микросхемы А2,А1,А0 (потому и восемь) или к питанию, или к земле (потому и аппаратный).
«Bank-select» — выбор банка памяти видео ОЗУ, а в ней:
7-2-й биты=111110. Это Operation code команды.
1-й бит(I)=0. Определяет, что в статическом режиме банком для хранения входящих данных выбирается 0-я строка видео ОЗУ.
0-й бит(O)=0. Определяет, что в статическом режиме банком для хранения исходящих данных выбирается 0-я строка видео ОЗУ.
«Blink-select» — выбор режима мигания, а в ней:
7-3-й биты=11110. Это Operation code команды.
2-й бит(АВ)=0. Это признак нормального режима мигания (есть ещё альтернативный).
1-0-й биты (BF[1:0])=00. Мигание выключено.
Итог инициализации: разрешили отображение информации в статическом режиме с одним общим выводом (BP0) с установленным в ноль адресом видео ОЗУ, выбрали 0-ю из восьми микросхем (у нас А2,А1,А0 — сидят на «земле»), выбрали 0-ю строку видео ОЗУ как для записи так и для чтения и мигание выключили. Вот!
Функция записи данных по адресу:

//Функция записи PCA85134
void write_PCA85134 (unsigned char adr, unsigned char data)
{
    if(adr > 59) adr = 59;//для всех 60-ти сегментов
    do
        {
            ack=0;
            i2start();//старт 
            i2write(0b01110000); ack |= i2ack();//адрес PCA85134 для записи 0х70 (без 1 в 0-м разряде)     
            i2write(0b10000000); ack |= i2ack();//управляющий байт, опишу позже (кому не терпиться - стр.27 DS)
            i2write(adr);        ack |= i2ack();//адресуем видео ОЗУ
			i2write(0b01000000); ack |= i2ack();//управляющий байт
			i2write(data);       ack |= i2ack();//записываемый байт
            i2stop();//стоп
		}
    while(ack);
}

i2write(0b01110000); — адрес записи PCA85134
i2write(0b10000000); — управляющий байт:
7-й бит (СО) = 1. Признак не последнего в этом сеансе обмена управляющего байта.
6-й бит (RS)=0. Признак следующей за этим управляющим байтом команды (а не данных).
i2write(adr); — загрузка указателя адреса видео ОЗУ. Правильней было бы написать i2write(0b01111111 & adr);, чтобы OpCode был в любом случае равен 0, но я учёл это строкой if(adr > 59) adr = 59;
i2write(0b01000000); — управляющий байт:
7-й бит (СО) = 0. Последний в этом сеансе обмена.
6-й бит (RS)=1. За ним данные, а не команда.
i2write(data); — записываем данные в видео ОЗУ.

Главная функция:
В ней после технологической задержки, установки портов, инициализации PCA85134, в главном цикле идёт постоянный опрос кнопок. Если было определено нажатие кнопки 1 то функция записи данных по адресу запишет по адресу 0 (при первом нажатии кнопки 1) или по увеличенному на 1 адресу (при последующих нажатиях) значение 0b10000000.
Для лучшего понимания взгляните на таблицу ниже:
Write_to_videoRAMРанее мы установили, что в нашем статическом режиме данные в видео ОЗУ записываются в 0-ю строку. Строка содержит 60 бит, каждый из которых отвечает за отображение своего сегмента. Записываются эти 60 бит побайтно в 8 таковых. Адрес 0 — это 7-й бит 0-го байта видео ОЗУ. Адрес 1 — 6-й бит 0-го байта и т.д.
В таблице после строк «байт №0-7 видео ОЗУ», «номеров разрядов этих байтов 7-0», «сегментов S0-S59» представлены строки показывающие состояние битов в строке 0 видео ОЗУ после различного количества нажатий кнопки 1. Жёлтым цветом выделены биты, в состоянии после включения питания. Синим цветом выделен записываемый байт. Зелёным — уже записанные функцией записи данных по адресу. 1-я строка после строки сегментов S0-S59 показывает состояние после первого нажатия кнопки 1. 2-я строка — после 2-го нажатия. 4-я строка — после 25-го нажатия. 6-я строка — после 60-го нажатия. Как видите записываемый синий байт сдвигается вправо по рисунку «зазеленяя» «жёлтые» биты видео ОЗУ. После нажатия кнопки 2 во все адреса запишутся нули и таблица станет «жёлтой».
Видео ниже покажет как это работает «вживую»:

Попробуйте в исходнике поизменять значения записываемый байта, и по отображению сегментов вы убедитесь в правильности вышеуказанного.
Так байты будут записываться, если мы перед каждой записью данных будем использовать команду «Load-data-pointer», т.е. адресовать ОЗУ. Если же адрес установлен, допустим 0, то записывая подряд 8 байтов данных мы заполним всё видео ОЗУ, т.к. после записи каждого байта адрес автоматом увеличивается на 8. Но такое заполнение видео ОЗУ и автоинкремент адреса соответствует приводимому в примере статическому режиму, а в мультиплексных будет немного не так (Fig 12. стр. 17).
Вот такая вот фигня, малята. Ждём окончания.

Запись опубликована в рубрике Разное с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован.