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

 
 
> Сорри но опять инициализация LCD, Не получается запустить LCD основаный на HD44780
John23
сообщение Jan 23 2008, 13:43
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 17-01-08
Пользователь №: 34 156



Здравствуйте!
Понимаю что до дыр затёртая тема, но всё же прочитав подобные темы не смог применить к своей инициализации. У меня Atmega 128, с ней портом С подсоединён двустрочный LCD основаный на HD44780. Провожу всеми описываемую инициализацию, но результата нет.
Если не сильно надоело отвечать на подобные вопросы подскажите пожалуйста как быть.
Имеется вот такой вот примитивчик инициализации...

Код
void delay_ms(unsigned short ms)
   {
        unsigned short outer1, outer2;
        outer1 = 200;
        while (outer1) {
                outer2 = 1000;
                while (outer2) {
                        while ( ms ) ms--;
                        outer2--;
                }
                outer1--;
        }
   }
//-------------------------------------------------------------------------------------
//инициализация дисплея
//-------------------------------------------------------------------------------------
//VLED - PC0
//RS   - PC1
//R/W  - PC2
//E    - PC3
//DB4..DB7 - PC4..PC7
//N  - line number (2)
//F  - font type (5x8)
//DL - data length (4 bit)
//D  - display
//C  - cursor
//B  - blink

void Write_8Bit(int value, int pause)
{
  PORTC=value;
  sbi(PORTC,3);
  cbi(PORTC,3);
  PORTC=0xF1;/установить DB4-DB7 в HI
  delay_ms(pause);  
}

void Write_4Bit(int hi, int low, int pause)
{
  PORTC=hi;//старший полубайт
  sbi(PORTC,3);
  cbi(PORTC,3);
  PORTC=low;//младший полубайт
  sbi(PORTC,3);
  cbi(PORTC,3);  
  PORTC=0xF1;//установить DB4-DB7 в HI
  delay_ms(pause);  
  }

void disp_init(void)
{
   DDRC=0xFF;// порт С на выход
  PORTC=0x01;// включить питание
  delay_ms(40);  //пауза после включения питания

for(int c=0; c<3; c++) //3 раза устанавливается 8 битный режим
{
  Write_8Bit(0x31, 40);
}

  Write_4Bit(0x21,0x01,40); // переход в 4 битный режим
  Write_4Bit(0x21,0x81,40); //переход в 4 битный режим, повтор
  Write_4Bit(0x01,0x81,40); //выключить дисплей
  Write_4Bit(0x01,0x61,40); //установить направление сдвига курсора
  Write_4Bit(0x01,0xF1,40); //включить индикатор и разрешить курсор, установить его тип
  Write_4Bit(0x01,0x11,40); //очистить индикатор и курсор домой
}

На дисплее ничего не происходит , кроме того что он светится при подаче на него питания. При посылке битов всегда добавляю 1 для того чтобы питание не пропало, потому как оно физически подсоеденено к PC0. Подскажите что у меня не так.
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kirill Frolov
сообщение Jan 23 2008, 20:05
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(John23 @ Jan 23 2008, 16:43) *
применить к своей инициализации. У меня Atmega 128, с ней портом С подсоединён двустрочный LCD основаный на HD44780. Провожу всеми описываемую инициализацию, но результата нет.


Половина подобных проблем решается осциллографом.

Цитата
Имеется вот такой вот примитивчик инициализации...
Код
void delay_ms(unsigned short ms)
   {
        unsigned short outer1, outer2;
        outer1 = 200;
        while (outer1) {
                outer2 = 1000;
                while (outer2) {
                        while ( ms ) ms--;
                        outer2--;
                }
                outer1--;
        }
   }


Такой код НЕ РАБОТАЕТ в реальной жизни. Советую использовать один аппаратный таймер для счёта времени. Тем более если речь про миллисекунды, а не микро или наносекунды. Попутно этот таймер может ШИМ выдавать или чего-нибудь в этом роде.

Но это ещё не всё. Код в котором нужен delay(), опять же, не на микросекунды или наносекунды, а миллисекунды -- В РЕАЛЬНОЙ ЖИЗНИ НЕ РАБОТАЕТ. Просто потому, что из-за вот этой delay() колом встают все другие процессы, которые у вас есть, вроде же очевидно. Нет, я конечно немного лукавлю, и в простых совсем случаях именно такой код и работает, когда у вас кроме дисплея ничего нет, например.

Цитата
//VLED - PC0
//RS - PC1
//R/W - PC2
//E - PC3
//DB4..DB7 - PC4..PC7


Я обычно таким (см. выше) вещам даю символические имена. Иначе код неочевидный получается. Да хоть через #define.

Цитата
Код
void Write_8Bit(int value, int pause)
{
  PORTC=value;
  sbi(PORTC,3);
  cbi(PORTC,3);
  PORTC=0xF1;/установить DB4-DB7 в HI
  delay_ms(pause);  
}


Во-первых здесь не delay_ms() нужен, а delay(~15uS), насколько я помню, хотя могу и ошибаться. Во-вторых, к сожалению (опять же могу ошибаться), у вас только 4-битный интерфейс, а при использовании 8-битного имеется возможность читать бит готовности в 7-м бите и таким образом исключить задержки. Хотя, практически, с ними даже проще -- реализуется автомат который просыпается не чаще чем в 15мкс (или за сколько там команды выполняются, наизусть не помню) и посылает обновления по байтику.

Цитата
Подскажите что у меня не так.


Нечёткий код, весьма вероятно содержащий ошибку. Промоделируйте ситуацию на компьютере -- замените все "PORTC=" записью в файл выводимых битиков с отметкой времени (виртуального, понятно, или реализуйте честные задержки с помощью средств ОС) -- и смотрите в чём не сходится с даташитом.


--------------------
[ZX]
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- John23   Сорри но опять инициализация LCD   Jan 23 2008, 13:43
- - Сергей Борщ   Цитата(John23 @ Jan 23 2008, 15:43) Подск...   Jan 23 2008, 14:19
- - Freeze Anti   Сейчас не помню уже, но функцию Write_8Bit(0x31, 4...   Jan 23 2008, 17:36
|- - Qwertty   Цитата(Freeze Anti @ Jan 23 2008, 20:36) ...   Jan 23 2008, 17:56
- - Freeze Anti   Что-то я тут не понял... функция void disp_init(vo...   Jan 23 2008, 18:12
- - Qwertty   И еще что заметил - первый переход в 4 битный режи...   Jan 23 2008, 21:33
- - John23   Здравствуйте попытаюсь оправдаться. Пользовался ре...   Jan 24 2008, 08:07
|- - aesok   Цитата(John23 @ Jan 24 2008, 11:07) Я так...   Jan 24 2008, 08:16
|- - Kirill Frolov   Цитата(John23 @ Jan 24 2008, 11:07) Здрав...   Jan 24 2008, 18:20
- - smk   ЦитатаЯ так понимаю нужно для начала найти цивилиз...   Jan 24 2008, 08:25
- - John23   Цитата(aesok @ Jan 24 2008, 12:16) Скачай...   Jan 24 2008, 09:14
|- - Qwertty   Цитата(John23 @ Jan 24 2008, 12:14) Я вид...   Jan 24 2008, 10:59
- - John23   Не стал заморачиваться с неработающим у меня WinAv...   Jan 24 2008, 14:02
- - Freeze Anti   Да не... на инициализацию дисплея можно и delay по...   Jan 24 2008, 19:11
- - John23   Спасибо, поэксперементирую ещё. Надо же его всё та...   Jan 25 2008, 06:47
- - hd44780   Возьми LCD модуль из avrLib, попробуй. У меня 3 ра...   Jan 25 2008, 07:55
- - smk   ЦитатаНе стал заморачиваться с неработающим у меня...   Jan 25 2008, 21:06
- - John23   Доброго времени суток! ЦитатаПопробуйте эти би...   Jan 29 2008, 08:30
- - John23   Уважаемые знатоки, благодарю за помощь, проблема р...   Jan 29 2008, 14:20
- - Pyku_He_oTTyda   Даже когда индикатор не инициализирован, его полов...   Jan 29 2008, 15:12
- - John23   Здравствуйте. ЦитатаДаже когда индикатор не иници...   Jan 31 2008, 09:13
- - Pyku_He_oTTyda   я не дока в индикаторах, но когда первый раз подкл...   Jan 31 2008, 09:43
- - John23   Да уж, я даже не догадывался что для маленького ди...   Jan 31 2008, 10:03
- - j_serg   Уважаемый John23. За AVR и С я взялся буквально ме...   Jan 31 2008, 10:14
- - John23   Спасибо за совет , всегда рад здравым мыслям. Ко...   Jan 31 2008, 11:41
- - j_serg   Цитата(John23 @ Jan 31 2008, 14:41) Спаси...   Feb 1 2008, 11:02


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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 00:29
Рейтинг@Mail.ru


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