Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Прошу помощи с LCD 12232b-2Y(F)LG

Ср июл 25, 2012 20:37:00

Всем доброго.
Купил (на свою голову) этот LCD и пытаюсь его оживить по нарастающей. Столкнулся с проблемой в простейшей же программе. После подачи питания дисплей весь заполнен точками, я подал ему команду нарисовать прямую с дыркой... а он все равно весь черный.
С лупой проверил все пиксели - светятся все.
Кто знает в чем беда, поможите. Код прикладываю. Проблема в том, что у него контроллер - SED1520DOA, информации маловато. Программа простейшая, на методы (процедуры) не разбивал специально. Пишу в CVAVR. микроконтроллер ATMEGA8515. За шину данных отвечает регистр С, A0=PA0 микро, E1=PA1, E2=PA2, RES=PA7
Проблема программная или аппаратная? Микроконтроллер прошивается, на небольшие изменения программы реагирует (светодиод ставил)
Код:
#include <mega8515.h>
#include <delay.h>
void main (void)
{
DDRC= 0b11111111;      // порты на вывод
DDRA= 0b11111111;      // порты на вывод
PORTC=0b00000000;      //очистка портов
PORTA=0b00000000;
delay_ms(100);         //начало инициализации. ждем.
PORTA.7=1;              //сбрасываем reset
delay_ms(10);
PORTA.0=0;        // бит команда/данные в режим "команда"
PORTA.3=0;        //бит чтения/записи в режим "запись"
PORTC=0b11100010;  //команда reset (не бит RST)
PORTC=0b11101110;   //снять флаг RMW
PORTC=0b10100100;  // режим работы обычный
PORTC=0b10101001;  // мультиплекс установить
PORTC=0b11000000;   // начальная строка - 0
PORTC=0b10100000;   // установить нормальный порядок отображения бит
PORTC=0b10101111;   // дисплей включить
PORTC=0b10111000;  //установка страницы
delay_ms(1);
PORTA.1=1;          //строб Е1
PORTA.2=1;          //строб Е2
delay_ms(1);
PORTA.1=0;           //снять стробы
PORTA.2=0;
delay_ms(1);
PORTC=0b00000011; //установка адреса колонки
delay_ms(1);
PORTA.1=1;
PORTA.2=1;
delay_ms(1);
PORTA.1=0;
PORTA.2=0;
delay_ms(1);
PORTA.3=0;
PORTA.0=1;
PORTC=0b00011001; // пишем байт, жду что черными будут только 4,5,8 пиксель, а остальные потухнут
delay_ms(1);
PORTA.1=1;
delay_ms(1);
PORTA.1=0;
delay_ms(1);
}


Заранее всем спасибо

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 00:02:51

Дело в том, что надо подавать стробы после каждой команды при инициализации.
Посмотрите примеры программ работы с дисплеем на сайте производителя.
http://www.melt.com.ru/shop/mt-12232b-2ylg.html

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 05:58:46

Всё уже придумано до нас

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 10:09:45

Ser60, спасибо. Мой преподаватель программирования всегда говорил: "какой бы код ты не писал, он должен как-то компилироваться" Это я к примерам от melt.ru

Вроде заработало, но столкнулся с новой напастью.
С напастью я справился, но на всякий случай напишу лекарство.
Итак, если CVAVR при попытке вызвать функцию из функции ругается на вызов "undefined symbol *имя_функции*", то нужно вынести ее в начало кода декларативно. То есть, допустим, есть функция:
Код:
void LCDStrobe( void ) {
delay_ms(1);
PORTA.1=1;
PORTA.2=1;
delay_ms(1);
PORTA.1=0;
PORTA.2=0;
delay_ms(1);
}


Мы пытаемся вызвать ее так:
Код:
#include <mega8515.h>
#include <delay.h>
void main (void)
{
LCDStrobe();
...
}


Получаем ошибку "Error: ...\avr\LCD1st.c(8): undefined symbol 'LCDStrobe'"

Это значит, что начать программу нужно так:
Код:
#include <mega8515.h>
#include <delay.h>
void LCDStrobe(void);
void main (void)
{
LCDStrobe();
...
}


Для программистов, привыкших к С++ и выше это может стать открытием, т.к. перечень функций (идиотское название, перечень методов) в полномасштабных средах программирования (Visual studio) создается самой средой, и нет нужды их заявлять.

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 19:20:42

"хотел бы я в глаза взглянуть тому конструктору..." вместо эпиграфа.

Снова прошу помощи ибо близок к тому чтобы что-нибудь разбить.
пишу в ЖКИ текст, пользуюсь программой из "лаборатории". Но CVAVR ни в дугу не хочет понимать нормально типы.
Итак, вот кусок программы
Код:
void puts (flash char str[], unsigned char n, unsigned char inv)
{
 unsigned char a;
 for(a=0;(a<n);a++)
 {
 if (globAddr<=55)
 {
  putc(str[a],inv,1);
 }
 
 else
 {
 putc(str[a],inv,2);
 }
 }
}

flash char locstr[] = "radiokot";
void main (void)
{
InitLCD();
ClearLCDRAM();

puts(locstr, 11, 0);
}


Проблема, что в исходниках вместо flash char[] использовался просто char[]. и с ним срабатывала функция strlen.
У меня же strlen не работает, тип данных не тот. А она, сами понимаете, нужна, без нее приходится ручками считать сколько символов. А написать параметром char мне нельзя, ибо "взятая в кавычки строка автоматически считается строковым литералом и отправляется во flash" (цитата Лебедева)
Прошу любого решения.

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 19:40:58

jakob291: Я прямо сейчас уезжаю на неделю на озера, Интернет там местами будет, но на ходу мне печатать сложно. Может быть вечерами... Как я посмотрю, у Вас проблемы с С, почему-бы не прочитать сначала учебник по программированию. Иной выход - пишите на АСМе, как Вы и начинали. МЭЛТ-овские функции на АСМ перерабатываются элементарно, я так в свое время и поступил для ПИК-ов. Там в этих функциях все-равно большей частью работа с SFR или битами, так что С или АСМ - без разницы. Проблемы со strlen() - ну напишите ее тоже сами, там делов-то - один цикл, быстрее будет написать чем пост печатать. А со временем разберетесь. Удачи!

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Чт июл 26, 2012 21:53:18

Ser60, за идею спасибо, не всегда быстро до меня доходит, что можно обойти даже штатную операцию.
с языками у меня проблем нет, я профессионально пишу на C#, попутно знаю еще четыре. Просто в CVAVR же не чистый С, а обрезанный и дополненный.
Ассемблер я, кстати, тоже немного знаю, но реализовать на нем что-то сложное невероятно сложно.

Ладно, эту процедуру я обойду своей, а пока еще вопрос:
Как правильно подключить контрастность? Я поставил на цепь VCС-GND (пины 1 и 2) настроечный резистор... потом стационарный. В общем попробовав сопротивления от 100 Ом до 40 КОм я добился изменения контраста в определенных пределах, но все равно при взгляде "в лоб" я вижу неактивные точки, зато под "тупым углом" их уже не видно.
Это я чего-то не понимаю или нужно еще больший номинал сопротивления? (кстати, я питаю его 5,8 В вместо 5, нет у меня источника на 5, но по даташиту он выдерживает 6)

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Пт июл 27, 2012 04:52:03

Да, согласен с Вами, странный дисплей... Обычно системой команд чипа контроллера ЖКИ предусмотрена регулировка контраста, например изменением ЖКИ "bias voltage", или есть вывод регулирови контраста. В этом дисплее ничего такого нет, значит регулировка контраста там не предусмотрена вообще. При изменении напряжения питания ЖКИ в пределах 4-6в по ДШ (то, что Вы делаете с резистором) может немного меняться и контраст. Ну не знаю - лично я такие партизанские методы не приветствую, поскольку следует следить, чтобы была небольшая разница между напряжением питания ЖКИ и МК. Следует просто смириться с природой, забив на контраст, или купить другой ЖКИ. А при изменении угла зрения контраст, конечно, будет меняться тоже.

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Пт июл 27, 2012 05:19:37

с языками у меня проблем нет, я профессионально пишу на C#, попутно знаю еще четыре.


В таком случае, вам стоит освежить знания языков. :) Нет, серьёзно.

Просто в CVAVR же не чистый С, а обрезанный и дополненный.


Ну вот зачем вы это говорите? Это ладно, я только поиронизирую, а вот если тролль какой придёт? Застебут же! 8) Особенно, если читать ниже процитированное про открытие для программистов на Си++. Это одно разом перечёркивает "с языками у меня проблем нет, я профессионально пишу на C#". Не стоит так делать. Лучше сначала книжку по Си найдите, там вы все эти откровения прочтёте. 8)

Для программистов, привыкших к С++ и выше это может стать открытием, т.к. перечень функций (идиотское название, перечень методов) в полномасштабных средах программирования (Visual studio) создается самой средой, и нет нужды их заявлять.


Описанное вами - это, как бы, стандарт Си, вообще-то. :wink: Компилятор не в курсе, какая функция у вас есть, а какой нет, вот и просит указать прототипы. При раздельной компиляции с той же целью используются заголовочные файлы. И, к примеру, VC6, конечно же, задавать "перечень функций" за вас не будет.

У меня же strlen не работает, тип данных не тот.


Нет. У вас не тип данных не тот, а способ чтения данных по указателю не тот. Не умеет strlen читать из FLASH. Чтение из FLASH это не просто доступ к переменной, на это команды у МК есть специальные.

А она, сами понимаете, нужна, без нее приходится ручками считать сколько символов.


Скажите, а зачем вы короткую фразу пытаетесь хранить в программной памяти? Разве у вас не хватило ОЗУ?

Re: Прошу помощи с LCD 12232b-2Y(F)LG

Пт июл 27, 2012 07:30:37

jakob291 писал(а):У меня же strlen не работает, тип данных не тот.

Используйте strlenf. В справочнике CodeVisionAVR можно найти и другие функции для памяти программ.
Тема закрыта