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

 
 
> Инициализация текстового LCD-дисплея
POLL
сообщение Dec 18 2011, 08:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 300
Регистрация: 11-06-11
Пользователь №: 65 640



Изучаю работу с LCD-экранчиками и вот с нуля пишу программку инициализации oled-дисплейчика на кристалле ws0010 в режиме 4bit.
Мучаюсь который день, че-то не получается. С каждой подачей питания на экране то выводятся всякие стрелочки, точечки, то квадратики, бывает вообще ничего нет. Иногда курсор на первой позиции мигающий появляется, бывает так и мигает, а бывает хоп и исчезает. (при инициализации я специально курсор и его блинк вывожу)...

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

В даташите на этот экран в режиме 4bit даются 2 такие схемы.
1 схема
2 схема

Из первой схемы узнаем что перед подачей команд нужно подождать 500ms для стабилизации питания.
Из второй схемы, что после паузы в отличие от привычных контроллеров HD44780 этому нужно подать 5 раз сигнал LOW на DB7-DB4.

Итак, что я делаю в инициализации.

Код
1) выставляю пины МК подключенные к DB7-DB4 в output (DDRB = 0b00001111)
2) пины RS, RW, E выставляю в output (DDRD = 0b11100000)
3) на RS, RW, E подаю LOW (PORTD |= 0b00000000)
4) задержка для стабилизации питания _delay_ms(1500);
5) подаю команды как указано в схемах.
   А) Подаю на линию данных 0000 (PORTB |= 0b00000000)
   команду подаю так:
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0000
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0

   таких последовательностей подаю 5 раз, как в даташите.

6) делаю небольшую задержку _delay_ms(100);

7) Подаю команды Function Set.
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0010
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0

   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0010
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0
   - DB7-DB4 ставлю в 1000
   - E ставлю в 1
   _delay_ms(10);
   - E ставлю в 0
   - функция проверки флага занятости
   - RW ставлю в 0

8) Подаю команды Display on
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0000
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0
   - DB7-DB4 ставлю в 1111
   - E ставлю в 1
   _delay_ms(10);
   - E ставлю в 0
   - функция проверки флага занятости
   - RW ставлю в 0

9) Подаю команды Entry mode set
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0000
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0
   - DB7-DB4 ставлю в 0111
   - E ставлю в 1
   _delay_ms(10);
   - E ставлю в 0
   - функция проверки флага занятости
   - RW ставлю в 0

10) Подаю команды Return home
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0000
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0
   - DB7-DB4 ставлю в 0010
   - E ставлю в 1
   _delay_ms(10);
   - E ставлю в 0
   - функция проверки флага занятости
   - RW ставлю в 0

11) Подаю команды Display clear
   - RS, RW, E ставлю в 0
   - DB7-DB4 ставлю в 0000
   - E ставлю в 1
   - _delay_ms(10);
   - E ставлю в 0
   - DB7-DB4 ставлю в 0001
   - E ставлю в 1
   _delay_ms(10);
   - E ставлю в 0
   - функция проверки флага занятости
   - RW ставлю в 0

конец инициализации



Может я команды неправильно отдаю, флашки не в такой последовательности выставляю?
Насчет функции проверки флага занятости.
Логика такая.
Код
- выставляем порты DB7-DB4 в input
- RS, RW ставлю в 0
- E ставлю в 1
- пауза _nop_(); _delay_ms(5);
- считываю значение порта DB7
int val = ((PIN(PORTB) & _BV(3))==0)?0:1;
#define PIN(x) (*(&x - 2))
- E ставлю в 0
- E ставлю в 1
- _nop_();
- E ставлю в 0
- цикл длится пока while(val!= 0);
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Genadi Zawidowsk...
сообщение Dec 18 2011, 11:02
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Насчет функции проверки флага занятости.

Надо считать два ниббла и проверять в получившемся байте старший бит (можно игнорировать младший, но считать надо).
ps: и зачем я Вам ссылку на проект давал? Хочется по граблям пройтись самому?
Go to the top of the page
 
+Quote Post
POLL
сообщение Dec 18 2011, 14:24
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 300
Регистрация: 11-06-11
Пользователь №: 65 640



Цитата(Genadi Zawidowski @ Dec 18 2011, 15:02) *
Надо считать два ниббла и проверять в получившемся байте старший бит (можно игнорировать младший, но считать надо).
ps: и зачем я Вам ссылку на проект давал? Хочется по граблям пройтись самому?


Для начинающих - ваш пример не годится.
Слишком много файлов и конструкций для изучения.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Dec 18 2011, 18:11
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Я бы из этих конструкций "PORTD |= 0b00000000" и "PORTB |= 0b00000000" палки поубирал... Для начала...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 18 2011, 19:05
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(POLL @ Dec 18 2011, 18:24) *
Для начинающих - ваш пример не годится.
Слишком много файлов и конструкций для изучения.

Вам нужен только один файл HD44780.C
Цитата
Надо считать два ниббла и проверять в получившемся байте старший бит (можно игнорировать младший, но считать надо).
А тут всё Вам понятно? Это указание на ещё одну ошибку у Вас.

Сообщение отредактировал Genadi Zawidowski - Dec 18 2011, 19:07
Go to the top of the page
 
+Quote Post
POLL
сообщение Dec 18 2011, 21:44
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 300
Регистрация: 11-06-11
Пользователь №: 65 640



Цитата(Genadi Zawidowski @ Dec 18 2011, 23:05) *
А тут всё Вам понятно? Это указание на ещё одну ошибку у Вас.


Да, понятно.
Нужно считать данные с портов DB7-DB4 2 раза (RW=1;E=1, пауза, считали, E=0, пауза, E=1,пауза, считали,E=0).

Подсмотрел в одном примере реализацию, не могу понять зачем при этом делают операции с тетрадами
Код
unsigned char data;
  DDRX_DATA &= 0x0f;     //конфигурируем порт на вход
  PORT_DATA |= 0xf0;     //включаем pull-up резисторы
  SetBit(PORT_SIG, RW);     //RW в 1 чтение из lcd
  ClearBit(PORT_SIG, RS);    //RS в 0 команды
  do{
    SetBit(PORT_SIG, EN);    
    _delay_us(2);
    data = PIN_DATA & 0xf0;      //чтение данных с порта
    ClearBit(PORT_SIG, EN);
    data = __swap_nibbles(data);
    SetBit(PORT_SIG, EN);    
    _delay_us(2);
    data |= PIN_DATA & 0xf0;      //чтение данных с порта
    ClearBit(PORT_SIG, EN);
    data = __swap_nibbles(data);
  }while((data & (1<<FLAG_BF))!= 0 );
  ClearBit(PORT_SIG, RW);
  DDRX_DATA |= 0xf0;


Зачем сначала data |= PIN_DATA & 0xf0, затем "переворачивают" (swap), а потом еще раз data |= PIN_DATA & 0xf0 и еще раз переворачивают.
Ужос зачем стока манипуляций с битами, неужели просто нельзя считать и сравнить DB7 1 или 0.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 18 2011, 22:40
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ну на это не обращайте внимания... Типичный пример тяжело портируемой программы (привязка к тому, то биты в старшей тетраде байта находятся). Вот в ARM бывают порты 32-битные, представьте что шина индикатора припаяна к 19,20,21 и 22 битам... Да и на AVR, иногда индикатор можно захотеть на младштие биты развести...
Вы лучше чем искать, прочитайте внимательно что я писал про проблемы инициализации. Никакой gav.ru не поможет - OLED появились совсем недавно, с этими проблемами (из-за значащих битов в команде переключения интерфейса) пока мало людей столкнулись.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016