|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:18 am
Проблем с PIC16F874A и LCD дисплей - не се инициализира.
| Автор |
Съобщение |
|
Demoman
Ранг: Минаващ
Регистриран на: Вто Юли 06, 2010 4:42 pm Мнения: 20
|
 Проблем с 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 битова шина - нищо. Някой да има идеи за решаването на този проблем?
|
| Вто Юли 06, 2010 4:47 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Омотал си последователността на импулсите.
Когато тактуваш Е, не трябва нищо друго на променяш.
Значи - държиш Е ниско ниво, сетваш си изходите както трябва да са, вдигаш Е, изчакваш малко над 230 наносекунди (аз го правя 256 наносекунди, удобно ми е с таймер1), сваляш Е, изчакваш колкото е за съответната операция (написани са в таблица в даташита) и след това повтаряш тази процедура за всяка следваща команда.
Забелязах, че ползваш милисекундни закъснения (50, 500 ...). Те може да са причина дисплеят да не те слуша - доста са големи ... Дисплеят работи с наносекундни времена. Пробвай с времената, които ти написах.
Проверил ли си с осцилоскоп дали върви правилна комуникация?
Накрая ако не стане, пробвай с друг дисплей - при китайските има голям процент на фабрично дефектни.
_________________ Digitally yours: Optron
|
| Вто Юли 06, 2010 8:16 pm |
|
 |
|
Demoman
Ранг: Минаващ
Регистриран на: Вто Юли 06, 2010 4:42 pm Мнения: 20
|
Намалих закъснението на Enable до 1 микросекунда, намалих другите до 5 ms заради някои от командите, които изисват по около 2 ms изчакване. Ефект - никакъв. Проверявал съм пиновете с мултицет (нямам осцилоскоп) - коректно са свързани, коректно се сетват от PIC-a. Днес ще отскоча за да си купя друг дисплей и довечера ще го пробвам.
Нормално ли е в неинициализирано състояние, на дисплея първия ред да е празен, а втория - изцяло запълнен?
|
| Сря Юли 07, 2010 10:11 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
По принцип първият ред е нормално да е запълнен, вторият празен, ама твоя може да е малко с модерни разбирания, та да е на обратно...
и optron е прав - омотал си времедиаграмите. разгледай как изглеждат в пдф-то и ги следвай точно: смъкваш/качваш първо RS-a, нагласяш RW, изчакваш, качваш Е, изчакваш, буташ данните на шината (много странно си си написал тая функция при все че е на един порт, за какво така?!), изчакваш, сваляш Е, изчакваш (пък може и да не много). ако се прежаля днес ще ти постна инициализацията на тоя боклук на асемблер, нейде я бях писал (стига да я намеря), та да спестим на бъдещите поколения мъките - гледам, че много ви затруднява специално тоя дисплей.
в крайна сметка може и да се окаже дефектен, тогава поздравяваш майката на произодителя, вносителя и продавача в магазина. и топлофикация, и енергото, и ВИК... ще тръгне, но без мили думи не става 
|
| Сря Юли 07, 2010 10:35 am |
|
 |
|
Demoman
Ранг: Минаващ
Регистриран на: Вто Юли 06, 2010 4:42 pm Мнения: 20
|
Не схващам кое съм омотал при времедиаграмите - свалям E, сетвам шината, качвам Е, чакам 1 милисек., свалям Е, чакам 1 милисек. Къде тук е грешката?
Функцията съм я писал така, щото не знаех, че може и по-лесно с PORTD=n 
|
| Сря Юли 07, 2010 10:56 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
това са изрезки да не се сърдят издателите, но работи, щото съм го ползвал преди 4-5 години с някакъв пик18Ф(нещо си) - за това има и LAT-ове, вече не помня точно какво беше, сигурно 452 или нещо такова, но минаваше без проблеми. то всъщност беше в оригинал нещо на МК, 2ра книга - за справка на останалите фукции имаше кодове които се теглеха от сайта някога отдавна. Та бях го направил за 162b и всъщност май повече не се докоснах до пик (хвала бог Ом) до преди няколко месеца. И помни вълшебните думички "Аз твойта мама китайска моа ли да... " 
|
| Сря Юли 07, 2010 11:25 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Не познавам конкретно този дисплей, но на повечето дисплеи има един бит, който показва кога контролерът му е зает. Понякога при начална инициализация може да е зает дълго - до секунди. Не виждам да го четеш някъде, така кодът ти е хем по-несигурен, хем по-бавен.
За пробата може да увеличиш закъсненият 10 ( десет ) пъти и да провериш какво ще стане. Не пречи да провериш и константите, които зареждаш, дали са правилните.
|
| Сря Юли 07, 2010 11:32 am |
|
 |
|
Demoman
Ранг: Минаващ
Регистриран на: Вто Юли 06, 2010 4:42 pm Мнения: 20
|
Константите съм ги проверявал с мултицет - правилни са. Ами, бях изпраскал по 5 секунди закъснения навсякъде и ефект нямаше. Пък и във второто мнение от темата ми казаха да намаля драстично закъсненията. 
|
| Сря Юли 07, 2010 11:38 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
Не става въпрос да се сменят времената безразборно и да се налучква. Ако прочетеш внимателно, всеки казва как е решил проблема, но те съветва да се съобразиш с datasheet'a на дисплея. Аз съм работил точно с такъв дисплей и при мен тръгна от раз. Не е лоша идеята на bateAz след като изпратиш команда да четеш бит 7 (Busy Flag) докато стане пак 0. Контролерът на дисплея сам си казва кога е готов за следващата команда. Аз за себе си опитно установих, че 25 ms са ми достатъчни. Това съм писал за инициализация и работи. Трябва само да го промениш за 8 бита ако ще го ползваш.
п.п.
константите не се проверяват с мултицет
|
| Сря Юли 07, 2010 3:57 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
@Demoman, сега ми направи впечатление, че ти казваш на горният ред долен и на долният горен. каква е вероятността да си объркал кой е първи и кой последен пин от рейката, ако си завъртял дисплея с главата на долу (само на контраста му дреме, няма да се усетиш, че си го обърнал на четене, ако не изгърмиш порта)? я пак погледни последната страница от даташита, то чак звучи невероятно, ама ... 
|
| Сря Юли 07, 2010 11:25 pm |
|
 |
|
Demoman
Ранг: Минаващ
Регистриран на: Вто Юли 06, 2010 4:42 pm Мнения: 20
|
Пиновете не съм ги объркал, просто е закрепен наобратно самия дисплей т.е. дупките за пиновете идват отдолу на екрана заради самата платка. Дисплеят стърчи над платката. А може ли дисплей да изтрещи ако объркам + и - на захранването? 
|
| Чет Юли 08, 2010 10:07 am |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
може, ако китаеца е спестил едно диодче 
|
| Чет Юли 08, 2010 10:10 am |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Вземи дръпни едно MikroC, там има работещи драйвери - така ще разбереш дали е дисплея или на тебе ти е рано още да пише драйвери.
|
| Чет Юли 08, 2010 11:30 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
Можеш ли да пуснеш една снимка на дисплея да видиме на кое викаш горе и на кое долу.
|
| Чет Юли 08, 2010 4:37 pm |
|
 |
|
StiV
Ранг: Ориентиран
Регистриран на: Съб Фев 05, 2005 10:58 pm Мнения: 284 Местоположение: Varna
|
Обърна ли внимание как са разположени изводите, че имаше едни странни модели дето първите 2 извода са 15-ти и 16-ти, а после започваха от 1 до 14. Да не е такъв модел, че няма да тръгне колкото и да го мъчиш. Мисля, че такива бяха с буква "В" накрая и изводите им са от долу? Виж да не е там проблема.
_________________ Господ прощава, тока не. А глада е по силен от тока !
|
| Пет Юли 09, 2010 11:02 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|