Страница 1 из 2

ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вс июл 29, 2012 10:59:12
Johnson
Здравствуйте, уважаемые коты!

Попал в руки новый дисплей WG12232 (О его управлении прочитал >тут<).

Второй день его мучаю, ни как не могу добиться от него хотя бы точки или символа...
Помогите, пожалуйста, понять, что я не так делаю в коде?

С генерацией всё нормально, 2кГц на него подаю (7вывод) (и, следовательно, МК прошивается нормально).
Распаял тоже всё верно, проверил уже раз 10.

МК: Atmega8535, тактирована кварцем 16МГц

Собственно, код (портировал на CVAVR из вышеуказанной статьи):
Спойлер

Код: Выделить всё

#include <mega8535.h>
#include <delay.h>

interrupt [TIM0_OVF] void timer0_ovf_isr(void){PORTD.7= ~PORTD.7;TCNT0= 0xC2;}

//Команды
#define Display_ON          0b10101111
#define Display_OFF         0b10101110
#define Display_START_Line  0b11000000
#define Set_Page            0b10111000
#define Set_Address         0b00000000
#define ADC_Select_right    0b10100000
#define ADC_Select_back     0b10100001
#define Static_Drive_ON     0b10100101
#define Static_Drive_OFF    0b10100100
#define Duty_Select_0       0b10101000
#define Duty_Select_1       0b10101001
#define Read_Modify_Write   0b11100000
#define END                 0b11101110
#define RESET_com           0b11100010
//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTA
#define PIN_DATA  PINA
#define DDR_DATA DDRA
//порт к которому подключены управляющие выводы
#define PORT_SIG PORTC
#define PIN_SIG  PINC
#define DDRX_SIG DDRC

//номера выводов микроконтроллера, к которым подключены управляющие выводы ЖКД
#define A0 2
#define RW 3
#define EN 4
#define CS2 5 //L -> Chip2 Enabled!
#define CS1 6 //L -> Chip1 Enabled!
#define RES 7

//макросы для работы с битами
#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
#define SetBit(reg, bit)          reg |= (1<<(bit))

void WG12232_write (unsigned char data){//общая часть для функций вывода команд и данных
    DDR_DATA = 0xFF;
   PORT_DATA = 0x00;
    ClearBit(PORT_SIG,RW);//режим записи
   SetBit(PORT_SIG,EN);//фронт стробирующего импульса
   PORT_DATA = data;//подаём данные
   delay_us(2);//длительность стробирующего импульса
   ClearBit(PORT_SIG,EN);//спад стробирующего импульса
}

void busy_wait (void){//функция проверки занятости индикатора
    SetBit(PORT_SIG,RW);//режим чтения
   ClearBit(PORT_SIG,A0);//регистра состояния
   PORT_DATA = 0xFF;//с подтягивающими резисторами
   DDR_DATA = 0x00;//порт на вход
   SetBit(PORT_SIG,EN);//фронт стробирующего импульса
   while (!(PIN_DATA & (1<<7)));//ждать выполнения предыдущей команды
   ClearBit(PORT_SIG,EN);//спад стробирующего импульса
   PORT_DATA = 0x00;//обнуляем порт данных
    DDR_DATA = 0xFF;//и переводим его на выход
   SetBit(PORT_SIG,RW);//возвращаем режим записи
}

void WG12232_com_write (unsigned char com){//функция ввода команды в индикатор
    busy_wait();//проверка готовности LCD
    ClearBit(PORT_SIG,A0);//Вывод Ao в 0 (команда)
   WG12232_write(com);//подаём команду
}
void WG12232_data_write (unsigned char data){//функция вывода данных на индикатор
    busy_wait();//проверка готовности LCD
    SetBit(PORT_SIG,A0);//вывод Ao в 1 (данные)
   WG12232_write(data);//подаём данные
}
void WG12232_clear (void){//функция очистки видео ОЗУ, соответсвтенно экрана
    unsigned char V_page,i;//внутренние переменные

    ClearBit(PORT_SIG,CS1);//выбираем оба кристалла
   ClearBit(PORT_SIG,CS2);
   
   for(V_page=0;V_page<4;V_page++)//для всех страниц
   {
       WG12232_com_write(Set_Page | V_page);
      WG12232_com_write(Set_Address);//и адресов
       for (i=0;i<61;i++) WG12232_data_write(0);//пишем нули
   }
}

//функция чтения данных из видео ОЗУ
unsigned char WG12232_data_read (unsigned char page, unsigned char addr){
    unsigned char data;
   
   if((page>3) || (addr>60)){return(0x00);}//проверяем не вышли ли за границы
   WG12232_com_write(Set_Page | page);//установить адрес по вертикали
   WG12232_com_write(Set_Address | addr);//установить адрес по горизонтали
    ClearBit(PORT_SIG,RW);//режим чтения
   SetBit(PORT_SIG,A0);//данных
   PORT_DATA = 0xFF;//с подтягивающими резисторами
   DDR_DATA = 0x00;//порт на вход
   busy_wait();//проверка готовности LCD
   SetBit(PORT_SIG,EN);//фронт стробирующего импульса
   delay_us(10);
   data = PIN_DATA;//считать данные
    ClearBit(PORT_SIG,EN);//спад стробирующего импульса
   PORT_DATA = 0x00;//обнуляем порт данных
   DDR_DATA = 0xFF;//и переводим его на выход
   ClearBit(PORT_SIG,RW);//возвращаем режим записи
   return(data);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void InitLcd(void){
    //настраиваем порты ввода/вывода
    DDR_DATA = 0b00000000;
    PORT_DATA = 0b11111111;
     
    DDRX_SIG = 0b11111100;
    PORT_SIG = 0b10001000;   // (7)RES=1, (6)CS1=0, (5)CS2=0, (4)EN=0, (3)RW=1, (2)A0=0
 
    ClearBit(PORT_SIG,RES);
    delay_us(40);
    SetBit(PORT_SIG,RES);
    while (!(PIN_DATA & (1<<4)));//ждём ответа ЖКИ
 
    WG12232_com_write(END);//END
   WG12232_com_write(Static_Drive_OFF);
   WG12232_com_write(Duty_Select_1);
   WG12232_com_write(Display_ON);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void WG12232_point (unsigned char x, unsigned char y){//функция вывода точки

    unsigned char s;//внутренняя переменная для считанных данных видео ОЗУ
    if((x>32) || (y>122)) return;//проверяем не вышли ли за границы
   if(y>=61){ //если точка на втором кристалле
       SetBit(PORT_SIG,CS1);
       ClearBit(PORT_SIG,CS2);//выбираем второй кристалл
      y = y-61;//определяем для него адрес
   }
   else{ //если на первом кристалле
       ClearBit(PORT_SIG,CS1);//выбираем первый кристалл
       SetBit(PORT_SIG,CS2);
   }
   
   s=(WG12232_data_read((x/8),y));//считываем видео ОЗУ по адресу, где ставим точку (чтобы уже засвеченные точки не потушить)
   WG12232_com_write(Set_Page | (x/8));//выставляем тот же адрес по странице
   WG12232_com_write(Set_Address | y);//и колонке
   WG12232_data_write((1<<(x%8)) | s);//и рисуем точку
}

void main(void){
    TCCR0=0x03;   // прескалер
    TIMSK=0x01;   // разрешаем прерывание по переполнению от таймер0
    ACSR=0x80;
    #asm("sei")

    InitLcd();
   
   WG12232_com_write (RESET_com);//сброс ЖКИ
   
   WG12232_clear();//очистка видео ОЗУ
   
    WG12232_point(10,10);

while (1);}


Инициализацию пробовал проводить по-разному, из разных источников...
Регулятор контраста крутил - без толку.
19 и 20 выводы индикатора не запитываю, судя по ДШ они отвечают за подсветку (кстати, тут не понятно. подсветка есть и без них, это нормально?).

Какова вероятность того, что дисплей мертв?
Или, всё же, не правильно им дергаю?
Подскажите минимальный код, который отобразит на нем хоть что-нибудь (без разницы что)?

PS: Вселяет надежду только то, что после хардрезета (0 на RES) яркость подсветки на миг снижается, далее засвечивается нижний ряд пикселей, потом пиксели пропадают и подсветка возвращается в прежнее состояние.

СпойлерПодключения:
DB0-DB7 дисплея к соответствующим битам PORTA
A0 = PortC.2
EN = PortC.4
RW = PortC.3
CS1 = PortC.6
CS2 = PortC.5
RES = PortC.7
CL = PortD.7

Кому не трудно, перекомпилируйте, пожалуйста, код из статьи под эти порты, буду очень благодарен...

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вс июл 29, 2012 14:48:14
Johnson
Коты, помогайте! :)
Напился валерьянки, и теперь грежу рабочим дисплеем, лапы так и чешутся!
Столько всего сделать надо, а дело застопорилось на этом дисплее. Покупать другой желания особого нету, да и не работает магазин в воскресенье...
Надо и энкодер прикручивать, и ик-приемник, и аудиопроцессор, а индикации нету. А "в слепую" особо не поковыряешься.
Жаль, что паяльника дома нет...

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 06:09:58
Johnson
Вопрос ещё актуален... Ни как не могу его победить...
Неужели ни кто не ковырял их?

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 06:14:16
shurikss123
Johnson писал(а):Вопрос ещё актуален... Ни как не могу его победить...
Неужели ни кто не ковырял их?


дома буду, скину тебе тест свой http://www.youtube.com/watch?v=FdctasN7q6o

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 07:56:48
Johnson
Буду очень счастлив! :)

Заодно задам пару вопросов ещё...
На каком-то форуме читал, что эти дисплеи очень плохо работают с процессорами с тактом выше 8мГц. У меня 16мГц такт. Может ли быть в этом причина? Хотя, использую CVAVR, там задержки выставляются не от тактов, а по МС/НС...

Всю схему питаю от 5в через программатор. При принудительном сбросе дисплея на миг появляются "артефакты" в виде прямоугольников. Видны они только если резистор контраста выкрутить на максимум (5в на ногу).
Нормально ли, что приходится так контраст выкручивать?
Не может ли быть, что питания не хватает?

Очень ли точно необходимо соблюдать такт дисплея? Должен ли работать, если вместо 2000гц подам 2013гц?

Из ДШ не совсем понял... Какое состояния ноги RES рабочее? Лог.1 и сбрасывать Лог.0?

Обязательно ли запитывать 19 и 20 ноги дисплея (судя по ДШ это LED+ и LED-)?

PS: Ещё заметил один момент. Когда на RES висит лог.0 - то нижний ряд пиеселей подсвечен не зависимо от контрастности... А если контрастность прибавить на максимум - то засвечиваются прямоугольники в шахматном порядке... Это нормально?

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 08:40:23
s_black
Johnson писал(а):Заодно задам пару вопросов ещё...
На каком-то форуме читал, что эти дисплеи очень плохо работают с процессорами с тактом выше 8мГц. У меня 16мГц такт. Может ли быть в этом причина?

причина не в этом (если Вы, конечно, задержки правильные установили)
Johnson писал(а):Всю схему питаю от 5в через программатор. При принудительном сбросе дисплея на миг появляются "артефакты" в виде прямоугольников. Видны они только если резистор контраста выкрутить на максимум (5в на ногу).
Нормально ли, что приходится так контраст выкручивать?
Не может ли быть, что питания не хватает?

нормально, зависимость контрастности от угла поворота движка переменника достаточно нелинейна (ещё смотря какой характеристики переменник)
Johnson писал(а):Очень ли точно необходимо соблюдать такт дисплея? Должен ли работать, если вместо 2000гц подам 2013гц?

нет не точно , работает и на 1 кГц, и на 5 кГц
Johnson писал(а):Из ДШ не совсем понял... Какое состояния ноги RES рабочее? Лог.1 и сбрасывать Лог.0?

логически подумайте ... СБРОС... сброс с 1 в 0. Не видел ни одного контроллера со сбросом высоким уровнем.
Johnson писал(а):Обязательно ли запитывать 19 и 20 ноги дисплея (судя по ДШ это LED+ и LED-)?

подсветку лучше запитать, так будет большая вероятность увидеть изображение в случае недостаточной контрастности
Johnson писал(а):PS: Ещё заметил один момент. Когда на RES висит лог.0 - то нижний ряд пиеселей подсвечен не зависимо от контрастности... А если контрастность прибавить на максимум - то засвечиваются прямоугольники в шахматном порядке... Это нормально?

тут как-то непонятно... Вы сами себе противоречите: "...независимо от контрастности..." и сразу - "... если контрастность прибавить на максимум..."

При работе с данным дисплее проблем вообще не возникало. Не хочу повторять избитую фразу, но всё же - внимательно проверьте монтаж и программу по строкам. Я думаю проблема пустяковая. Удачи Вам!

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 09:03:38
s_black
Да, ещё... А какая буковка стоит в конце названия дисплея?

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 09:11:45
Johnson
s_black писал(а):Да, ещё... А какая буковка стоит в конце названия дисплея?

WG12232E-TML-NA

Про лапы подсветки... А нормально, что подсветка есть даже с незапитанными лапами? Подал на них напряжение - не изменилось абсолютно ни чего.

тут как-то непонятно... Вы сами себе противоречите: "...независимо от контрастности..." и сразу - "... если контрастность прибавить на максимум..."

Понимаю, что противоречу. Линия из нижних пикселей при лог0 на резете видна всегда. однако, при максимальной контрастности видны прямоугольники.


Программу уже перелопатил вдоль и поперек. Более того, я не готовую программу беру, я сам пытаюсь написать и проинициализировать его.
Монтаж аналогично.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 09:22:56
s_black
Выводы подсветки могут (обычно так и есть) повторяться в общей гребёнке и быть выведены сбоку, т.е. дублированы.
Судя по реакции на сброс дисплей живой. Ещё раз смотрите правильность подключения выводов. Если всё верно, просто залейте готовый хекс, тот, что в статье, и пронаблюдайте картинку. Если её нет - стопудовая ошибка в подключении или фьюзы не настроены. Когда добьётесь картинки с готового хекса - экспериментируйте со своим исходником. Удачи!

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 10:25:26
Johnson
Готовый хекс настроен на другой МК и другие порты...
Судя по ДШ выводы подсветки не дублированы, но она просто запитана на питание логики.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 10:39:21
s_black
Если подсветка запитана от логики - порты МК сгорят ((( Смотрите ещё раз монтаж.
Если не получится у Вас запустить дисплей, напишите как Вы хотите подключить порты к дисплею и задайте тип МК - я приеду с работы, перепишу исходник и вышлю Вам хекс для проверки монтажа.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 11:14:31
Johnson
s_black писал(а):Если подсветка запитана от логики - порты МК сгорят ((( Смотрите ещё раз монтаж.
Если не получится у Вас запустить дисплей, напишите как Вы хотите подключить порты к дисплею и задайте тип МК - я приеду с работы, перепишу исходник и вышлю Вам хекс для проверки монтажа.

Имел в виду от питания логической части дисплея. По ДШ у него два входа питания - логика и лед.


Про то как подключил порты - предусмотрительно написал в первом посте темы...
Там же и код, как я пытаюсь инициализировать его, и другие замечания.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 11:20:40
s_black
Отключите подсветку от логики. Может быть она у Вас садит напряжение контроллеров дисплея?

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 11:51:04
aleksandr-zh
вот на днях писал, но для мега8 и 12864
ноги не долго переназначить и МК тоже
написано под BASCOM

http://bascomavr.3bb.ru/viewtopic.php?id=736#p7436

если надо - перепишу под Вас. Скажите ноги - что и куда подключено

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 12:17:03
Johnson
aleksandr-zh писал(а):вот на днях писал, но для мега8 и 12864
ноги не долго переназначить и МК тоже
написано под BASCOM

http://bascomavr.3bb.ru/viewtopic.php?id=736#p7436

если надо - перепишу под Вас. Скажите ноги - что и куда подключено


Спасибо, конечно, но у Вас под драйвер ST7920, а в моем дисплее SED1520.
Ну а ноги в первом посте указаны...

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 12:19:07
Johnson
s_black писал(а):Отключите подсветку от логики. Может быть она у Вас садит напряжение контроллеров дисплея?


Вы не поняли :)
Я подаю питание только на 2ю ногу дисплея, и подсветка сразу зажигается. А подключение питания к 19й ноге вообще ни какого эффекта не производит.

Вообще, если взять этот дисплей и подать питание на 1(-) и 2(+) ноги - он зажгет подсветку и отобразит прямоугольники... Видимо, это сделано для быстрой диагностики работоспособности....

В принципе, попробую подключить схему к более сильному источнику питания... Найти бы только в завалах 7805...

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 12:29:20
s_black
Johnson писал(а):Я подаю питание только на 2ю ногу дисплея, и подсветка сразу зажигается.

Здаётся мне, что Вы путаете понятия.
Подсветка - это освещение отдельными специальными светодиодами подложки матрицы жидких кристаллов для их лучшего наблюдения в условиях недостаточной освещённости. ЖКИ не излучает свет, как светодиоды, а только меняет прозрачность сегментов, и, при слабой освещённости изображения почти не видно. А то что Вы называете подсветкой - это включение контроллера ЖКИ.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 13:05:11
Johnson
s_black писал(а):
Johnson писал(а):Я подаю питание только на 2ю ногу дисплея, и подсветка сразу зажигается.

Здаётся мне, что Вы путаете понятия.
Подсветка - это освещение отдельными специальными светодиодами подложки матрицы жидких кристаллов для их лучшего наблюдения в условиях недостаточной освещённости. ЖКИ не излучает свет, как светодиоды, а только меняет прозрачность сегментов, и, при слабой освещённости изображения почти не видно. А то что Вы называете подсветкой - это включение контроллера ЖКИ.

Извините, я не настолько новичок в электронике, чтоб путать поляризацию ЖКИ и диодную подсветку...
При подаче питания логики начинают светиться именно диоды подложки.

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 13:22:22
s_black
Может дисплей негодный? Фото макета можете выложить?

Re: ATmega8535 + LCD WG12232 = светящийся кирпич (?)

Добавлено: Вт июл 31, 2012 13:49:04
Johnson
Вот, RES=0
Нижний ряд пикселей подсвечен. Щас ещё заметил, что если удерживать резет в этом состоянии - по дисплею пробегают горизонтальные полосы в произвольном порядке. Выходы МК при этом не изменяются.
Если установить RES=0 полоса пропадает.
При попытках дальнейшей инициализации ни чего не происходит...