Отговори на тема  [ 10 мнения ] 
LCD проблем 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение LCD проблем
Здравейте.
Преди да пиша порових из форума както с помощта на търсачката, така и без нея и не намерих нещо, което да ми помогне. Ето защо задавам въпроса си.
Надявам се да не ми се смеете, че питам смешни за повечето от вас неща.
Става въпрос за PIC18F452 и LCD 8х2. За сега не съм правил платка за опити. Мъча се да ползвам симулация с Proteus 6.7. Опитах да ползвам xlcd.h от компилатора MCC18, но без успех. Направих си и собствен код за целта, но резултатът и същия. Целта ми беше като начало просто да изпиша каквото и да е на дисплея (дори само 1 буква). До колкото разбрах дисплей LM016L от Proteus е с Hitachi управление. Затова ползвах него за симулация.
До сега съм писал за малки чипове на асемблер и това ми един от първите опити да направя нещо на С. Мигането на светодиоди работи в симулацията за разлика от дисплея.

Ето кода, който написах:

#include <p18f452.h>
#include <delays.h>

#define Data PORTD
#define DataTris TRISD
#define Ctrl PORTB
#define CtrlTris TRISB
#define E_pin PORTBbits.RB0
#define E_pin_tris DDRBbits.RB0
#define RW_pin PORTBbits.RB1
#define RW_pin_tris DDRBbits.RB1
#define RS_pin PORTBbits.RB2
#define RS_pin_tris DDRBbits.RB2

void init_mcu(void)
{
DataTris = 0b00000000; // all outputs
CtrlTris = 0b00000000; // all outputs
}
void init_LCD(void) // Clock is 4MHz; for other frequency the delays must be changed
{
Data = 0x00;
Ctrl = 0x00;

Delay1KTCYx(100); // Wait more than 30ms for LCD POR procedure
RS_pin = 0;
RW_pin = 0;
Data = 0b00111000; // 2 lines, 5x7 dots
Delay1KTCYx(1); // LCD gets the data
E_pin = 1;
Delay1KTCYx(1);
E_pin = 0;
Delay10TCYx(10); // wait more than 39us
RS_pin = 0;
RW_pin = 0;
Data = 0b00001100; // display on, cursor off
Delay1KTCYx(1); // LCD gets the data
E_pin = 1;
Delay1KTCYx(1);
E_pin = 0;
Delay10TCYx(10); // wait more than 39us
RS_pin = 0;
RW_pin = 0;
Data = 0b00000001; // display clear
Delay1KTCYx(1); // LCD gets the data
E_pin = 1;
Delay1KTCYx(1);
E_pin = 0;
Delay1KTCYx(10); // wait more than 1.53ms
RS_pin = 0;
RW_pin = 0;
Data = 0b00000110; // increment, shift cursor right
Delay1KTCYx(1); // LCD gets the data
E_pin = 1;
Delay1KTCYx(1);
E_pin = 0;
Delay1KTCYx(100); // wait
}
void main( void )
{
init_mcu();
init_LCD();

// write text to LCD
RS_pin = 1;
RW_pin = 0;
Data = 0x35; // "S"
Delay1KTCYx(1); // LCD gets the data
E_pin = 1;
Delay1KTCYx(1);
E_pin = 0;
Delay1KTCYx(10); // wait

Data = 0x00;
Ctrl = 0x00;

while (1)
{
}
}

Ще съм благодарен ако някой ми помогне да разбера къде греша.

П.П.
Виждал съм работещи симулации на Proteus с несвързан извод за контраста на дисплея. Дори да го свържа (към маса, към захранване, с резистор или както и да е) няма промяна в положението.


Прикачени файлове:
LCD.jpg
LCD.jpg [ 86.48 KiB | Прегледано 1352 пъти ]

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
Пон Авг 20, 2007 11:26 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Конфигурация написаал ли си? Не я виждам! Ако няма, пика няма да тръгне.


Пон Авг 20, 2007 3:06 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
Ами освен това :
void init_mcu(void)
{
DataTris = 0b00000000; // all outputs
CtrlTris = 0b00000000; // all outputs
}
друго не съм написал. Чудех се дали е достатъчно. За по-сигурно написах програмка, която да прави всички битове на двата порта ту нули, ту единици. В Proteus се виждаше, че работи. Когато задам ниска честота на работа в Proteus се вижда как пиновете си сменят нивото, но дисплея не реагира.

:oops: май се сетих важната част, която съм пропуснал. Конфигурациите за тип осцилатор, използвани ресети, WDT и т.н. Ще опитам довечера да го подкарам и дано се получи. Въпреки това ми е странно как пиновете си сменят състоянието без тази конфигурация, която липсва.

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн


Пон Авг 20, 2007 3:14 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
steve написа:
...... Въпреки това ми е странно как пиновете си сменят състоянието без тази конфигурация, която липсва.

Еми виртуално не съм чул да забременее некоя к...ва та кво остава да не тръгне един ПИК.
И виж дали не можеш го подкара 4 битово ... закво да хабиш краката нахалос .... пък и мисля че вградения драйвер на Майкрочипския компилатор е за 4 бита.


Пон Авг 20, 2007 3:34 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
valioman написа:
.... пък и мисля че вградения драйвер на Майкрочипския компилатор е за 4 бита.
Поддържа и двата режима - 4 и 8 битов!


Пон Авг 20, 2007 4:14 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
Ползвам 8-битов режим, защото така ми беше по-лесно като си писах кода вместо майкрочипския вариант. Иначе ще бъде 4-битов. Когато се мъчех да ползвам xlcd.h сменях #define DATA_PORT PORTB с PORTD, но то продължаваше да си генерира импулси на същите пинове. Ще видим какво ще стане като направя свястна конфигурация на чипа.

И така малко по-късно сътворих нещо като конфигурация, но резултатът е отново нищо на дисплея.
Ето и какво съм добавил към кода :

#pragma config OSC=HS, PWRT=ON, BOR=OFF, WDT=OFF, CCP2MUX=OFF, LVP=OFF, DEBUG=OFF
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
#pragma config WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
#pragma config EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

void init_mcu(void)
{
RCON = 0b00011111; // no priority interrupt levels
EECON1 = 0b00000100; // access data eeprom memory, memory access, memory write enabled
INTCON = 0b00000000; // all int disabled, perpherial int disabled, TMR0 overflow int disabled
// external int disabled, portb int disabled
INTCON2 = 0b10000000; // portb pull-ups disabled
INTCON3 = 0b00000000; // low priority ext int 1 & 2, ext int 1 & 2 disabled
PIR1 = 0b00000000; // no peripherial ints occured
PIR2 = 0b00000000; // no peripherial ints occured
PIE1 = 0b00000000; // no peripherial ints allowed
PIE2 = 0b00000000; // no peripherial ints allowed
IPR1 = 0b00000000; // low priority peripherial ints
IPR2 = 0b00000000; // low priority peripherial ints
T0CON = 0b00001000; // TMR0 stopped
T1CON = 0b00000000; // TMR1 stopped
T2CON = 0b00000000; // TMR2 stopped
T3CON = 0b00000100; // TMR3 stopped
CCP1CON = 0b00000000; // CCP disabled
SSPSTAT = 0b00000000; // MSSP status clear
SSPCON1 = 0b00000000; // MSSP no collision, no overflow, disabled (pins as I/O)
SSPCON2 = 0b00000000; // everything disabled and iddle
TXSTA = 0b10000010; // master mode, 8-bit, transmit disabled, async, low speed, empty shift reg
RCSTA = 0b00000000; // serial port disabled, 8-bit, receiver disabled, no addr detection, no errors
ADCON0 = 0b00000000; // Fosc/2, ch0 selected, ADC OFF
ADCON1 = 0b10000110; // right justified, Fosc/2, all pins digital
LVDCON = 0b00000000; // LVD OFF

DataTris = 0b00000000; // all outputs
CtrlTris = 0b00000000; // all outputs
}

Съмнявам се да има проблем с времената за изчакване. Първо са доста завишени и второ са сметнати за 4MHz, а в Proteus съм задал 1MHz. Направо се вижда как се сменят нивата. Изглежда конфигурацията е в ред, защото при експерименти с бутони и светодиодчета всичко реагира, както се очаква.
Вече почвам да се чудя дали ако пробвам на реален дисплей ще тръгне и проблема е с Proteus. Рано или късно ще трябва да се прави платка, но в момента нямам време за това.

Ако някой е така добър да пусне едно файлче на С с пример за изписване дори само на един символ, което да работи в Proteus ще съм му много благодарен.


Прикачени файлове:
Коментар на файл: Ето цялата програмка (няма други файлове, както е видно в началото).
LCDTest.c [3.47 KiB]
257 пъти

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
Пон Авг 20, 2007 7:53 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пон Авг 20, 2007 11:13 am
Мнения: 13
Местоположение: Варна, България
Мнение 
Тази сутрин станах рано и реших все пак да сътворя една експериментална платка. Въведох символи, колкото да запълня дисплея (не мери температура, както лъже дисплея, а просто има текст). Пуснах го отново на Proteus и нямаше неочакван обрат. Отново нищо не се показа в симулацията. Записах чипа и пуснах схемата. Резултатът се вижда на снимката.
Сега ми е интересно защо на симулацията не се получава нищо. Също така ако някой има идея защо като променя порта в xlcd.h и интерфейса на 8-битов няма никакъв резултат. Абе изобщо с тоя драйвер нищо не се получава.

П.П.
Благодаря за подсещането да напиша конфигурация. Кой знае колко време щях да се мъча без нея и нищо да не става :oops:


Прикачени файлове:
P8213109.JPG
P8213109.JPG [ 941.37 KiB | Прегледано 1333 пъти ]

_________________
"Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
Вто Авг 21, 2007 10:37 am
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Яну 25, 2006 12:47 pm
Мнения: 305
Местоположение: Varna
Мнение 
защото функциите за eXternalLCD са компилирани в библиотеката с *.h файла който
виждаш. Промяната само в *.h файла няма да доведе до исканите от теб промени,
т.е. необходимо е да прекомпилираш функциите и да ги подмениш в lib файла, или
хвани сорса на всички функции и заедно с променения *.h файл си ги компилирай
в твой lib файл и го добави в проекта, обаче укажи на линкера първо да търси функциите в
него и след това в default lib, щото знаеш ...

Успех :)


Съб Сеп 15, 2007 11:37 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Дек 06, 2006 9:05 pm
Мнения: 92
Местоположение: София
Мнение 
Ако честотата на симулирания процесор в PROTEUS e различна от тази за която е писана програмата няма да тръгне. На 1 херц може и да ти мигат пиновете, но дисплея си чака неговите времезакъснения, защото симулацията е в реално време.


Съб Сеп 15, 2007 12:08 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение Re: LCD проблем
steve написа:
Здравейте.
Преди да пиша порових из форума както с помощта на търсачката, така и без нея и не намерих нещо, което да ми помогне. Ето защо задавам въпроса си.
Надявам се да не ми се смеете, че питам смешни за повечето от вас неща.
Става въпрос за PIC18F452 и LCD 8х2.....


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

Ако желаеш, може да обменим инфо.
(Аз много време не бях писал на PIC и наскоро ми се наложи - без Протеус щях да съм много зле)
Изображение
Изображение
Сега ще постна една тема, че търся инфо за драйвери за 16873 за LCD, за сега пиша на асемблер.
http://www.mcu-bg.com/mcu_site/viewtopic.php?p=71279#71279


Пет Авг 15, 2008 9:39 am
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 13 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни