Использование индикаторов Ampire TIC c контроллером PCF8531

Индикаторы серии TIC представляют собой графическую (обычно 128 × 32) ЖКИ матрицу с драйвером PCF8531 (I2C) установленным на стекле (технология COG).

Схема подключения индикатора к микроконтроллеру:

Диод D1 предназначен для понижения напряжения питания встроенного умножителя. В случае, если напряжение питания драйвера VLCD меньше 4.5 В, возможно прямое соединение выводов 3 и 4 индикатора. Конденсатор C2 является блокирующим по питанию.Конденсатор C1 предназначен для сглаживания напряжения VLCD выходного напряжения внутреннего умножителя), подаваемого на матрицу. Емкость конденсатора C1 не должна быть ниже 0.047 uF. Рекомендуемая емкость – 0.1 uF.

Использование внутреннего умножителя позволяет, отказавшись от внешнего генератора VLCD, сократить количество элементов на плате, и, соответственно стоимость и
надежность устройства. Кроме того, драйвер PCF8531 имеет аппаратную температурную компенсацию выходного напряжения VLCD. Это позволяет использовать индикатор во всем указанном рабочем диапазоне температур.

Отрицательной стороной использования внутреннего умножителя для питания матрицы TIC является относительно высокий ток потребления – около 450 мкА при всех включенных пикселях

Схема подключения с внешним источником питания матрицы

Для нормальной работы во всем диапазоне рабочих температур необходимо, чтобы внешний источник VLCD обеспечивал напряжение 5.2 – 6.0 В. Однако использовать внешнее напряжение VLCD рекомендуется только в том случае, если его можно получить простым способом в устройстве (например, делителем). При этом следует учесть, что температурная компенсация VLCD осуществляться не будет.

Для управления драйвером (установки режима работы и загрузки информации, отображаемой на ЖКИ) используется последовательный интерфейс I2C. Временные параметры, входные напряжения и токи по линиям управления указаны в спецификации на драйвер PCF8531. Далее для описания режимов работы будут использоваться обозначения, соответствующие спецификации на PCF8531 (стр.16).

После сброса (подачи высокого уровня на вывод 2) драйвер
работает в следующем режиме:

Режим пониженного энергопотребления – вкл. PD = 1
Адресация RAM – горизонтальная V= 0
Режим отображения – чистое поле D = 0, E = 0, IM = 0
Указатель на RAM – X[6:0] = 0, Y[2:0] = 0
Коэффициент деления напряжения (bias) – 1 / 4 BS[2:0] = 0
Коэффициент мультиплексирования – 1 / 17 M[1:0] = 0
Температурная компенсация – выкл TS[2:0] = 0
Внутренний умножитель напряжения VLCD – выкл HVE = 0, PRS = 0, S[1:0] = 0
Напряжение на выходе внутреннего умножителя VOP[6:0] = 0
Состояние RAM – неопределено
Страница команд – 0 H[1:0] = 0

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

Ядро микроконтроллера: ATMEL ATmega16-16AI TQFP
Частота работы ядра: 8 МГц
Напряжение питания: 5В
Модель индикатора: TIC32 c модулем подсветки синего свечения
Компилятор: CodeVision AVR ver. 1.24

Прежде чем начать работу с контроллером, следует инициализировать шину TWI у микроконтроллера.

Делается это так:

void twi_init(void)
{
TWSR= 0;                         /* без предделителя */
TWBR= ((FCPU/SCL_CLOCK)-16)/2;  /* должно быть более 10 для нормальной работы */
}

TWSR регистр – отвечает за делитель частоты интерфейса, а TWBR – за точное значение частоты работы.
Работа с индикатором допустима на всех скоростях включая 400кГц. При скорости 333кГц (максимально достижимая скорость при работе с кварцем 8Мгц) обновление 4096 пикселов экрана и очистка занимает 8.5 мс. FCPU – переменная хранящая частоту ядра в герцах, и SCL_CLOCK – желаемую частоту I2C.

Для удобства работы с программой также имеет смысл объявить декларации

#define TWINT 0x80
#define TWEA 0x40
#define TWSTA 0x20
#define TWSTO 0x10
#define TWWC 0x08
#define TWEN 0x04
#define TWIE 0x01

#define TW_STATUS TWSR
#define TW_START 0x08
#define TW_MT_SLA_ACK 0x18
#define TW_REP_START 0x10
#define TW_MR_SLA_ACK 0x40
#define TW_MT_DATA_ACK 0x28

#define LCD_RESET PORTC.2
#define LCD_ADDR (0x78)
#define CON1 (0b10000000)
#define CON2 (0b01000000)

Принцип работы шины I2C имеет несколько состояний, и специальный пакет передачи.

Любая передача начинается с состояния START, которое выражается установкой 0 на линии SDA при неизменном значении SCL. Затем отсылается пакет из 8 бит, содержащих адрес запрашиваемого устройства, бит чтения\записи. После этого процессор должен отправить еще один такт, для получения «подтверждения приема».

На языке С эта процедура выглядит так:

/*************************************************************************  
Фунция процедуры СТАРТ
Возвращает 0 = устройство ответило, 1= нет ответа
*************************************************************************/
unsigned int twi_start(unsigned char address) {
    unsigned int   twst;            // отправляем ситуацию START
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// ждем бит прерывания готовности шины I2C            
while(!(TWCR & (1<<TWINT)));
  // Проверяем состояние статусного регистра.
       twst = TW_STATUS & 0xF8;
     if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
        // шлем адрес
            TWDR = address;
            TWCR = (1<<TWINT)| (1<<TWEN);
// Ожидаем завершения операции и отработки состояния АСК
while(!(TWCR & (1<<TWINT)));
            // Проверяем значение статусного регистра
            twst = TW_STATUS &0xF8;
            if ( (twst !=TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
return 0;
}/* twi_start */

После успешного обнаружения устройства по указанному адресу можно слать данные.

/*************************************************************************
Шлет один байт данных по шине I2C
  Входная переменная data – что шлем.
  Возвращает 0 при успешной записи, или 1 при ошибке.
*************************************************************************/
unsigned char twi_write( unsigned char data ) {           
    unsigned int   twst;
// шлет данные в устройство по адресу указанному в ранней процедуре START
TWDR = data;
            TWCR = (1<<TWINT)| (1<<TWEN);
            // Ожидание готовности
            while(!(TWCR & (1<<TWINT)));
// Чтение статусного регистра
twst = TW_STATUS &0xF8;
           if( twst != TW_MT_DATA_ACK) return 1;
           return 0;
}/* twi_write */

После успешной записи шлем состояние STOP

/*************************************************************************
 Terminates the data transfer and releases the I2C bus
*************************************************************************/
void twi_stop(void)
{
   /* send stop condition */
            TWCR = (1<<TWINT)| (1<<TWEN) | (1<<TWSTO);
            // wait until stop condition is executed and bus released
            while(TWCR &(1<<TWSTO));
}/* twi_stop */

Теперь когда рассмотрели основные функции работы шины I2C можно подключать индикатор и работать с ним. Была применена следующая схема

Для питания модуля подсветки был собран простой линейный стабилизатор на базе микросхемы LM1117-3.3. Резистор R3 ограничивает максимальный ток подсветки, конденсаторы C3 и C4 предназначены для сглаживания и повышения стабильности работы преобразователя. Линия RESET индикатора подключена к PORTC.2. Инициализируется индикатор примерно так:

Функция инициализации экрана TIC32  
void tic_init(void)
{
PORTC.2=1; 
//выводим индикатор из сброса
twi_start(LCD_ADDR);
twi_write(CON1);
twi_write(0x01); // выбор конфигурации , стр01
twi_write(CON1);
twi_write(0b00100000); // Enable chip, горизонтальная адресация
twi_write(CON1);
twi_write(0b00001001); // выбор страницы
twi_write(CON1);
twi_write(0b00001100); // Display Mode: NORMAL
twi_write(CON1);
twi_write(0b00000101); // MUX-rate: 1/34
twi_write(CON1);
twi_write(0b00010100); // Bias system: 3
twi_write(CON1);
twi_write(0x01); // Выбор конфиг . Стр 01
twi_write(CON1);
twi_write(0b00001010); // выбор cтраницы
twi_write (CON1);
twi_write (0b00001000);// Фактор умножителя напряжения: 2*V
twi_write(CON1);
twi_write(0b00100000); //коэффициент температуры : 0
twi_write(CON1);
twi_write(0b00000101); // Vlcd - LOW; Voltage multiplier ON
twi_write (CON1);
twi_write (190); // Установка напряжения Vlcd
//оптимально в нашем случае было значение между 182 и 195.
twi_stop();
}

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

Очистка индикатора делается с помощью заполнения нулями его памяти:
Функция очистки экрана (заполнения памяти нулями)

void clear(void)
{
twi_start(LCD_ADDR);
twi_write(CON2);
for(cnt = 0; cnt < 640; cnt++)

twi_write(0x00);
twi_stop(); 
}

Приложения:

Так как графические индикаторы лишь выводят пиксельные данные, то для вывода текстовых данных нужно иметь знакогенератор (записанный растр изображения символа)

Знакогенератор для шрифта 8х5 и графический логотип

Примеры применения ЖКИ:




Сравнение TIC32 и Ampire BC1602A

Также при покдлючении индикаторов к микроконтроллеру с питанием +3.3В или ниже требуется использовать схему сопряжения, поскольку контроллер индикатора работает с уровнями напряжения +5В. NXP рекомендует использовать такую схему на базе двух полевых транзисторов N-типа.

Author: Ilya Tsemenko
Created: May 14, 2009, 5:26 p.m.
Modified: July 4, 2015, 5:26 p.m.

References