Страница 1 из 1
Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Ср июл 25, 2012 20:37:00
jakob291
Всем доброго.
Купил (на свою голову) этот 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
Ser60
Дело в том, что надо подавать стробы после каждой команды при инициализации.
Посмотрите примеры программ работы с дисплеем на сайте производителя.
http://www.melt.com.ru/shop/mt-12232b-2ylg.html
Re: Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Чт июл 26, 2012 05:58:46
s_black
Re: Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Чт июл 26, 2012 10:09:45
jakob291
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
jakob291
"хотел бы я в глаза взглянуть тому конструктору..." вместо эпиграфа.
Снова прошу помощи ибо близок к тому чтобы что-нибудь разбить.
пишу в ЖКИ текст, пользуюсь программой из "лаборатории". Но 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
Ser60
jakob291: Я прямо сейчас уезжаю на неделю на озера, Интернет там местами будет, но на ходу мне печатать сложно. Может быть вечерами... Как я посмотрю, у Вас проблемы с С, почему-бы не прочитать сначала учебник по программированию. Иной выход - пишите на АСМе, как Вы и начинали. МЭЛТ-овские функции на АСМ перерабатываются элементарно, я так в свое время и поступил для ПИК-ов. Там в этих функциях все-равно большей частью работа с SFR или битами, так что С или АСМ - без разницы. Проблемы со strlen() - ну напишите ее тоже сами, там делов-то - один цикл, быстрее будет написать чем пост печатать. А со временем разберетесь. Удачи!
Re: Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Чт июл 26, 2012 21:53:18
jakob291
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
Ser60
Да, согласен с Вами, странный дисплей... Обычно системой команд чипа контроллера ЖКИ предусмотрена регулировка контраста, например изменением ЖКИ "bias voltage", или есть вывод регулирови контраста. В этом дисплее ничего такого нет, значит регулировка контраста там не предусмотрена вообще. При изменении напряжения питания ЖКИ в пределах 4-6в по ДШ (то, что Вы делаете с резистором) может немного меняться и контраст. Ну не знаю - лично я такие партизанские методы не приветствую, поскольку следует следить, чтобы была небольшая разница между напряжением питания ЖКИ и МК. Следует просто смириться с природой, забив на контраст, или купить другой ЖКИ. А при изменении угла зрения контраст, конечно, будет меняться тоже.
Re: Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Пт июл 27, 2012 05:19:37
da-nie
с языками у меня проблем нет, я профессионально пишу на C#, попутно знаю еще четыре.
В таком случае, вам стоит освежить знания языков.

Нет, серьёзно.
Просто в CVAVR же не чистый С, а обрезанный и дополненный.
Ну вот зачем вы это говорите? Это ладно, я только поиронизирую, а вот если тролль какой придёт? Застебут же!

Особенно, если читать ниже процитированное про открытие для программистов на Си++. Это одно разом перечёркивает "с языками у меня проблем нет, я профессионально пишу на C#". Не стоит так делать. Лучше сначала книжку по Си найдите, там вы все эти откровения прочтёте.
Для программистов, привыкших к С++ и выше это может стать открытием, т.к. перечень функций (идиотское название, перечень методов) в полномасштабных средах программирования (Visual studio) создается самой средой, и нет нужды их заявлять.
Описанное вами - это, как бы, стандарт Си, вообще-то.

Компилятор не в курсе, какая функция у вас есть, а какой нет, вот и просит указать прототипы. При раздельной компиляции с той же целью используются заголовочные файлы. И, к примеру, VC6, конечно же, задавать "перечень функций" за вас не будет.
У меня же strlen не работает, тип данных не тот.
Нет. У вас не тип данных не тот, а способ чтения данных по указателю не тот. Не умеет strlen читать из FLASH. Чтение из FLASH это не просто доступ к переменной, на это команды у МК есть специальные.
А она, сами понимаете, нужна, без нее приходится ручками считать сколько символов.
Скажите, а зачем вы короткую фразу пытаетесь хранить в программной памяти? Разве у вас не хватило ОЗУ?
Re: Прошу помощи с LCD 12232b-2Y(F)LG
Добавлено: Пт июл 27, 2012 07:30:37
U235
jakob291 писал(а):У меня же strlen не работает, тип данных не тот.
Используйте
strlenf. В справочнике CodeVisionAVR можно найти и другие функции для памяти программ.