roboforum.ru

Технический форум по робототехнике.

LCD+AVR

LCD+AVR

Votmax » 06 янв 2008, 00:49

Привет всем! У меня есть экранчик МТ16S2D от МЭЛТа, но я не могу заставить его работать, хотя в протеусе все проходит на ура. На экране - ничего. Все припаяно правилоно, на 100%. проверял. Напряжение = 5В. Дело точно не в контрастности, т.к. припаян подстроичник по схеме с мануала. ПЛЗ, подскажите. Как мне кажется проблема в инициализации.
У кого есть опыт работы с МЭЛТами, скиньте примерчики простые.

Вот отрывок кода:

Инициализация как по мануалу...
Код: Выделить всёРазвернуть
 com(48);    //110000
com(48);    //110000
com(48);    //110000
com(56);    //111000
com(8);      //001000
com(01);    //000001
com(06);   //000110
com(15);   //001111

Вывожу данные...
Код: Выделить всёРазвернуть
 dat('2');
dat('0');
dat('0');
dat('8'); 
dat(' ');



Описание процедур...

Код: Выделить всёРазвернуть
com(unsigned char data) // команды


PORTC.7=0; //a
PORTC.6=0; //r/w
PORTC.0=0; //e
PORTA=data;
PORTC.0=1;
delay_ms(100);
PORTC.0=0;
   }   

dat(unsigned char data) //данные
{

PORTC.7=1; //a
PORTC.6=0; //r/w
PORTC.0=0; //e
PORTA=data;
PORTC.0=1;
delay_ms(100);
PORTC.0=0;


Добавлено спустя 2 минуты 55 секунд:
Да, еще:

- интерфейс 8 бит
- я работаю через CodeVisionAVR, я знаю, что в нем есть библиотеки работы с ЖКИ, но хочется сделать все самому.
- ATMEGA32
Последний раз редактировалось Vooon 06 янв 2008, 01:44, всего редактировалось 1 раз.
Причина: CODE!!! #$@*&!

Re: LCD+AVR

Myp » 06 янв 2008, 02:11

1. а точно дисплей рабочий?
когда на него подаёшь напряжение он должен показывать квадратики

2. инициализация и вывод символов для этого дисплея есть гдето на сайте фирмы производителя МЭЛТ или гдето там на форуме

3. попробуй прочитать что у тебя на дисплее
тоесть чтонить отобрази а потом прочитай из дисплея и сравни совпадает ли

Re: LCD+AVR

avr123.nm.ru » 06 янв 2008, 11:01

Votmax писал(а):я работаю через CodeVisionAVR, я знаю, что в нем есть библиотеки работы с ЖКИ, но хочется сделать все самому.
- ATMEGA32


Сделай как в CVAVR или у меня http://www.avr123.nm.ru/z5.htm
и убедись что пара MK + LCD работает.

А потом сам городи наздоровье.

Re: LCD+AVR

SSG » 06 янв 2008, 11:41

А, что в МЭЛТ-овских дисплеях запись по нарастающему фронту сигнала е производиться? Обычно enable устанавливается в 1, устанавливаются нужные сигналы на линии данных, и сигнал enable для записи устанавливается в 0. У Вас наоборот. :(

LCD+AVR

Votmax » 06 янв 2008, 14:17

SSG писал(а):А, что в МЭЛТ-овских дисплеях запись по нарастающему фронту сигнала е производиться? Обычно enable устанавливается в 1, устанавливаются нужные сигналы на линии данных, и сигнал enable для записи устанавливается в 0. У Вас наоборот. :(


Да, правильно, это я ошибся, когда сюда вставлял, просто я уже много вариантов испробовал, и так единицы и эдак.
Что самое интересное: в мануале МЭЛТА написано, что данные записываются по спаду сигнала е, а в мануале контроллера ЖКИ МЭЛТа, что данные записываются, в течении времени, когда на е выставлена единица.

Myp писал(а):1. а точно дисплей рабочий?
когда на него подаёшь напряжение он должен показывать квадратики

2. инициализация и вывод символов для этого дисплея есть гдето на сайте фирмы производителя МЭЛТ или гдето там на форуме

3. попробуй прочитать что у тебя на дисплее

тоесть чтонить отобрази а потом прочитай из дисплея и сравни совпадает ли



Когда подаю питание 5.5В видны на экране квадратики, я их контрастностью подкручиваю.

Re: LCD+AVR

$ilent » 06 янв 2008, 15:26

Любая операция с любыми внешними или с внутренними устройствами происходит по фронту или по спаду "клока", "защелки".
5.5В. предельно допустимое напряжение - убавь.
Т.к. квадратики появились - переходи к инициализации со всеми задержками и проверками и НЕ проверками флагов:
0x30,// 6 8-ми проводный интерфейс
0x01,// 1 очистка экрана, счетчик на 0
0x0D,// 4 отображение включено
0x06,// 5 увеличение счётчика на 1
, как только её пройдёшь - экран очистится.

Votmax » 15 янв 2008, 18:10

Сделал алгоритм с проверкой флагов. В общем, после инициализации квадратики остаются. Я записываю данные(2008 year). Ставлю курсор в начальное положение и считываю данные с ячейки, выдает FF, что по таблице соответствует заполненному квадратику? Ни кто не знает в чем дело? Я уже переписал процедуры для данных и команд в соответствии с рекомендуемыми под однотипные ЖКИ.


Код: Выделить всёРазвернуть
com(unsigned char data)

PORTC.7=0;
PORTC.6=0;
PORTA=data;
  PORTC.0=1;
delay_ms(1);
  PORTC.0=0;
   }   

dat(unsigned char data)
{
  PORTC.7=1;
PORTC.6=0;
PORTA=data;
  PORTC.0=1;
delay_ms(1);
  PORTC.0=0;
}


Добавлено спустя 2 часа 2 минуты 46 секунд:
Новые данные: Я поставил большие выдержки времени между командами, чтобы посмотреть, что выполняется. Получается, что во время инициализации видно очистку экрана (по коду 01), т.е. экран на один такт очищается от заполненных квадратиков, а с наступлением следующей команды (06-выбор сдвига экрана) все квадратики экрана снова становятся залитыми. В чем дело?

Срабатывание очистки экрана говорит о работоспособности процедур записи команд и данных. В общем фигня какая-то.
Последний раз редактировалось Digit 16 янв 2008, 11:47, всего редактировалось 1 раз.
Причина: Есть же тег CODE!

Re: LCD+AVR

$ilent » 15 янв 2008, 18:42

Во-первых:
Запись данных производится после "Разрешения обращения к модулю (а также строб данных)"
Во-вторых:
Громадная задержка в твоём случае не нужна - ты же работаешь не на 16МГц???
И в третьих:
А порт "А" как настроен в момент чтения?
Код: Выделить всёРазвернуть
com(unsigned char data)
{
PORTC.7=0;
PORTC.6=0;
PORTC.0=1;
PORTA=data;
PORTC.0=0;
}
dat(unsigned char data)
{
PORTC.7=1;
PORTC.6=0;
PORTC.0=1;
PORTA=data;
PORTC.0=0;
}

И вот так по-моему будет лучше:
Код: Выделить всёРазвернуть
void write_44780 (unsigned char *p, int len, char command, char flag)
       {
      while (len--)
             {
           switch (command)
                  {
                case 0:
                     RS0;             // адрес регистра комманд
                    break;
                case 1:
                     RS1;            // адрес регистра данных
                    break;
                }
                   RW0;                  // операция записи
                  E1;               // строб
                  PORTD = *p;
                  E0;
                  PORTD = 0xff;
                  p++;
                if (flag==0)
                   {
                   read_44780 ();
                     while (Flag & (1 << BIT(7)))
                           {
                              read_44780 ();
                          }
                  }
         }
      }

Votmax » 15 янв 2008, 20:41

За пример большое спасибо! Вроде я делаю все также, только по-корявому и ламерски, но это я пока учусь. :-)

Большие задержки я поставил между процедурами записи данных/команд, а не во время их исполнения. Я выяснил, что контроллер ЖКИ верно проходит инициализацию. Т.е. по ее завершению экран очищается. А как только начинается запись данных, так все ячейки опять полностью залиты, это подтверждается чтением из ЖКИ - FF.

Re: LCD+AVR

SSG » 15 янв 2008, 20:55

Вот страшный пример проекта :)
Вложения
LCD_Test.zip
(33.04 КиБ) Скачиваний: 43

Re: LCD+AVR

$ilent » 15 янв 2008, 21:05

Да ни фига не правильно.
Если бы было правильно, то при записи в LCD одного байта (любого, кроме значения соответствующего этому чёрному прямоугольнику из соответствующей таблицы встроенного знакогенератора) на экране появилось бы что-то, причём в ОДНОЙ ЯЧЕЙКЕ, а не по всему полю.
Положи сюда весь код!!!

Re: LCD+AVR

Myp » 15 янв 2008, 22:36

а у тя с питанием всё ОК
мб он тупо ресетится постоянно?

Votmax » 16 янв 2008, 11:41

Вот код, он правда примитивный и без проверки флагов, но это я специально, чтоб была только суть, а еще я просто недавно перешел на СИ.

Код: Выделить всёРазвернуть
#include <mega32.h>
#include <stdio.h>
#include <delay.h>

com(unsigned char data);  //процедура записи команд
date(unsigned char data); //процедура записи данных
 
void main(void)
{

DDRA=0xff;               //настройка портов
PORTA=0x00;
DDRB=0xff;
PORTB=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;               
PORTD=0x00;
       
     delay_ms(10);
           
    com(0b110000);  //инициализация по мануалу.
    com(0b110000);
    com(0b110000);
    com(0b111000);
    com(0b1000);
    com(0b0001);
    com(0b110);
   
     com(0b1100);  //включение экрана
     
         
       
     date('2');
     date('0');
     date('0');
     date('8'); 
     date(' ');
     date('y');
     date('e');
     date('a');
     date('r');
     date('!');
     
     
         
while (1)
      {   
          };
};

com(unsigned char data)

PORTC.7=0;
PORTC.6=0;
PORTA=data;
PORTC.0=1;
delay_ms(1);
PORTC.0=0;
delay_ms(1);
  PORTA=0x00;
}   

date(unsigned char data)
{
PORTC.7=1;
PORTC.6=0;
PORTA=data;
PORTC.0=1;
delay_ms(1);
PORTC.0=0;
delay_ms(1);
  PORTA=0x00;
      }
Последний раз редактировалось Digit 16 янв 2008, 11:48, всего редактировалось 1 раз.
Причина: БЛИН!!! ЕСТЬ ТЕГ "КОД" НА ФОРУМЕ!

Re: LCD+AVR

$ilent » 16 янв 2008, 12:15

Значит так, при инициализации должны быть выдержены задержки.
Зделай так:
Код: Выделить всёРазвернуть
static unsigned char lcd_init_8[1]=
{
0x30,// 8-ми проводный интерфейс
};
static unsigned char lcd_in[3]=
{
0x28,
0x0C,
0x06,
};

void init_44780 ()
{
delay_ms (20);
write_44780 (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);
delay_ms (40);
write_44780 (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);
delay_ms (40);
write_44780 (lcd_init_8, sizeof(lcd_init_8), comm, no_check_flag);
delay_ms (40);
write_44780 (lcd_in, sizeof(lcd_in), comm, check_flag);
}

Далее, в место твоего gate('2') и т.д. попробуй gate(0x32)
И ещё, не многовато точек с запятой?:
Код: Выделить всёРазвернуть
while (1)
      {   
          };
};

Правильней будет так:
Код: Выделить всёРазвернуть
main ()
{
...
...
while (1)
      {   
       ;;
      }
...
...
}

Re: LCD+AVR

Votmax » 17 янв 2008, 12:04

Ура! Получилось! Проблема была не в коде, а в кривых руках, криво припаявших один проводок! Только увидел - сразу исправил - включил - все заработало!!! Ура!

Уже успел написать такие процедуры как очистка экрана, gotoxy, вывод строки целиком. Вот только проблема новая появилась:
-Как вывести число?

МОИ ДЕЙСТВИЯ:

1) Нашел пример в CodeVisionAVR что-то вроде

Код: Выделить всёРазвернуть
 char *ptr_to_ram="This string is placed in SRAM";


или

Код: Выделить всёРазвернуть
 unsigned char string[];
string="Hello";


Но у меня не работает, говорит, что тип flash unsigned char не соответствует типу unsigned char. Я стал использовать тип flash unsigned char и хорошо так написал процедуру вывода строки.


2) Есть стандартные процедуры типа

Код: Выделить всёРазвернуть
 itoa(int n, char *str);[ 


- переводит число в строку типа char, но у меня же flesh а как перевести char в flesh char или flesh unsigned char ?

3) В общем какой-то тупик!

Подскажите, кто как делает?


Rambler\'s Top100 Mail.ru counter