Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с PIC16F874A и LCD дисплей - не се инициализира.
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7973
Страница 1 от 2

Автор:  Demoman [ Вто Юли 06, 2010 4:47 pm ]
Заглавие:  Проблем с PIC16F874A и LCD дисплей - не се инициализира.

Имам този дисплей http://home.comet.bg/datasheets/LCD/AC-162B.pdf свързан към PIC16F874A чрез 8 битова шина за данни. Написах следния код за инициализацията на дисплея:
Код:
#define LCD_DB0   PIN_D0
#define LCD_DB1   PIN_D1
#define LCD_DB2   PIN_D2
#define LCD_DB3   PIN_D3
#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#define LCD_E     PIN_E2
#define LCD_RS    PIN_E0
#define LCD_RW    PIN_E1

// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_E);
if(address==1)
   output_high(LCD_RS);
else
   output_low(LCD_RS);   
delay_ms(500);
output_bit(LCD_DB0, !!(n & 1));
output_bit(LCD_DB1, !!(n & 2));
output_bit(LCD_DB2, !!(n & 4));   
output_bit(LCD_DB3, !!(n & 8));
output_bit(LCD_DB4, !!(n & 16));
output_bit(LCD_DB5, !!(n & 32));
output_bit(LCD_DB6, !!(n & 64));   
output_bit(LCD_DB7, !!(n & 128));
delay_ms(500);
output_high(LCD_E);
delay_ms(50);
output_low(LCD_E);
delay_ms(50);
}

//LCD initialization
void lcd_init(void)
{
output_low(LCD_RW);
delay_ms(500);
lcd_send_byte(0,0x3C);
delay_ms(500);
lcd_send_byte(0,0xF);
delay_ms(500);
lcd_send_byte(0,0x1);
delay_ms(500);
lcd_send_byte(0,0x7);
delay_ms(500);
}

Но дисплея не се инициализира като извикам lcd_init. На дисплея първия ред е празен, а втория изцяло запълнен и така стои каквото и да го правя.
Проверих поотделно всички пинове на дисплея дали са коректно вързани към съответните на ПИКа - да, няма грешки. Пробвах да обърна огледално младшите и старшите битове - нищо. Дигах всички delay-ове до 5000 ms - нищо. lcd_send_byte задава коректно шината за данни т.е. няма проблеми с 8-те извиквания на output_bit. Пробвах с flex_lcd.c драйвер с 4 битова шина - нищо. Някой да има идеи за решаването на този проблем?

Автор:  optron [ Вто Юли 06, 2010 8:16 pm ]
Заглавие: 

Омотал си последователността на импулсите.
Когато тактуваш Е, не трябва нищо друго на променяш.
Значи - държиш Е ниско ниво, сетваш си изходите както трябва да са, вдигаш Е, изчакваш малко над 230 наносекунди (аз го правя 256 наносекунди, удобно ми е с таймер1), сваляш Е, изчакваш колкото е за съответната операция (написани са в таблица в даташита) и след това повтаряш тази процедура за всяка следваща команда.
Забелязах, че ползваш милисекундни закъснения (50, 500 ...). Те може да са причина дисплеят да не те слуша - доста са големи ... Дисплеят работи с наносекундни времена. Пробвай с времената, които ти написах.
Проверил ли си с осцилоскоп дали върви правилна комуникация?
Накрая ако не стане, пробвай с друг дисплей - при китайските има голям процент на фабрично дефектни.

Автор:  Demoman [ Сря Юли 07, 2010 10:11 am ]
Заглавие: 

Намалих закъснението на Enable до 1 микросекунда, намалих другите до 5 ms заради някои от командите, които изисват по около 2 ms изчакване. Ефект - никакъв. Проверявал съм пиновете с мултицет (нямам осцилоскоп) - коректно са свързани, коректно се сетват от PIC-a. Днес ще отскоча за да си купя друг дисплей и довечера ще го пробвам.

Нормално ли е в неинициализирано състояние, на дисплея първия ред да е празен, а втория - изцяло запълнен?

Автор:  head_up [ Сря Юли 07, 2010 10:35 am ]
Заглавие: 

Demoman написа:
Нормално ли е в неинициализирано състояние, на дисплея първия ред да е празен, а втория - изцяло запълнен?

По принцип първият ред е нормално да е запълнен, вторият празен, ама твоя може да е малко с модерни разбирания, та да е на обратно...
и optron е прав - омотал си времедиаграмите. разгледай как изглеждат в пдф-то и ги следвай точно: смъкваш/качваш първо RS-a, нагласяш RW, изчакваш, качваш Е, изчакваш, буташ данните на шината (много странно си си написал тая функция при все че е на един порт, за какво така?!), изчакваш, сваляш Е, изчакваш (пък може и да не много). ако се прежаля днес ще ти постна инициализацията на тоя боклук на асемблер, нейде я бях писал (стига да я намеря), та да спестим на бъдещите поколения мъките - гледам, че много ви затруднява специално тоя дисплей.
в крайна сметка може и да се окаже дефектен, тогава поздравяваш майката на произодителя, вносителя и продавача в магазина. и топлофикация, и енергото, и ВИК... ще тръгне, но без мили думи не става :D

Автор:  Demoman [ Сря Юли 07, 2010 10:56 am ]
Заглавие: 

Не схващам кое съм омотал при времедиаграмите - свалям E, сетвам шината, качвам Е, чакам 1 милисек., свалям Е, чакам 1 милисек. Къде тук е грешката? :oops:

Функцията съм я писал така, щото не знаех, че може и по-лесно с PORTD=n :oops:

Автор:  head_up [ Сря Юли 07, 2010 11:25 am ]
Заглавие: 

това са изрезки да не се сърдят издателите, но работи, щото съм го ползвал преди 4-5 години с някакъв пик18Ф(нещо си) - за това има и LAT-ове, вече не помня точно какво беше, сигурно 452 или нещо такова, но минаваше без проблеми. то всъщност беше в оригинал нещо на МК, 2ра книга - за справка на останалите фукции имаше кодове които се теглеха от сайта някога отдавна. Та бях го направил за 162b и всъщност май повече не се докоснах до пик (хвала бог Ом) до преди няколко месеца. И помни вълшебните думички "Аз твойта мама китайска моа ли да... " :D

Прикачени файлове:
162b.txt [1.63 KiB]
234 пъти

Автор:  bateAz [ Сря Юли 07, 2010 11:32 am ]
Заглавие: 

Не познавам конкретно този дисплей, но на повечето дисплеи има един бит, който показва кога контролерът му е зает. Понякога при начална инициализация може да е зает дълго - до секунди. Не виждам да го четеш някъде, така кодът ти е хем по-несигурен, хем по-бавен.
За пробата може да увеличиш закъсненият 10 ( десет ) пъти и да провериш какво ще стане. Не пречи да провериш и константите, които зареждаш, дали са правилните.

Автор:  Demoman [ Сря Юли 07, 2010 11:38 am ]
Заглавие: 

Константите съм ги проверявал с мултицет - правилни са. Ами, бях изпраскал по 5 секунди закъснения навсякъде и ефект нямаше. Пък и във второто мнение от темата ми казаха да намаля драстично закъсненията. :)

Автор:  CarBeta [ Сря Юли 07, 2010 3:57 pm ]
Заглавие: 

Не става въпрос да се сменят времената безразборно и да се налучква. Ако прочетеш внимателно, всеки казва как е решил проблема, но те съветва да се съобразиш с datasheet'a на дисплея. Аз съм работил точно с такъв дисплей и при мен тръгна от раз. Не е лоша идеята на bateAz след като изпратиш команда да четеш бит 7 (Busy Flag) докато стане пак 0. Контролерът на дисплея сам си казва кога е готов за следващата команда. Аз за себе си опитно установих, че 25 ms са ми достатъчни. Това съм писал за инициализация и работи. Трябва само да го промениш за 8 бита ако ще го ползваш.

Цитат:
Init_LCD_4 movlw D'15'
movwf Counter
call Wait
movlw B'00110000'
movwf PORTB
bsf E
bcf E
movlw D'5'
movwf Counter
call Wait
movlw B'00100000'
movwf PORTB
bsf E
bcf E
movlw B'00101000'
call Send_command
movlw DISP_OFF
call Send_command
movlw DISP_ON
call Send_command
return

п.п.
константите не се проверяват с мултицет

Автор:  head_up [ Сря Юли 07, 2010 11:25 pm ]
Заглавие: 

@Demoman, сега ми направи впечатление, че ти казваш на горният ред долен и на долният горен. каква е вероятността да си объркал кой е първи и кой последен пин от рейката, ако си завъртял дисплея с главата на долу (само на контраста му дреме, няма да се усетиш, че си го обърнал на четене, ако не изгърмиш порта)? я пак погледни последната страница от даташита, то чак звучи невероятно, ама ... 8O

Автор:  Demoman [ Чет Юли 08, 2010 10:07 am ]
Заглавие: 

head_up написа:
@Demoman, сега ми направи впечатление, че ти казваш на горният ред долен и на долният горен. каква е вероятността да си объркал кой е първи и кой последен пин от рейката, ако си завъртял дисплея с главата на долу (само на контраста му дреме, няма да се усетиш, че си го обърнал на четене, ако не изгърмиш порта)? я пак погледни последната страница от даташита, то чак звучи невероятно, ама ... 8O

Пиновете не съм ги объркал, просто е закрепен наобратно самия дисплей т.е. дупките за пиновете идват отдолу на екрана заради самата платка. Дисплеят стърчи над платката. А може ли дисплей да изтрещи ако объркам + и - на захранването? :oops:

Автор:  head_up [ Чет Юли 08, 2010 10:10 am ]
Заглавие: 

може, ако китаеца е спестил едно диодче :D

Автор:  relsys [ Чет Юли 08, 2010 11:30 am ]
Заглавие: 

Вземи дръпни едно MikroC, там има работещи драйвери - така ще разбереш дали е дисплея или на тебе ти е рано още да пише драйвери.

Автор:  CarBeta [ Чет Юли 08, 2010 4:37 pm ]
Заглавие: 

Можеш ли да пуснеш една снимка на дисплея да видиме на кое викаш горе и на кое долу.

Автор:  StiV [ Пет Юли 09, 2010 11:02 pm ]
Заглавие: 

Обърна ли внимание как са разположени изводите, че имаше едни странни модели дето първите 2 извода са 15-ти и 16-ти, а после започваха от 1 до 14. Да не е такъв модел, че няма да тръгне колкото и да го мъчиш. Мисля, че такива бяха с буква "В" накрая и изводите им са от долу? Виж да не е там проблема.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/