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

LCD проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4660
Страница 1 от 1

Автор:  steve [ Пон Авг 20, 2007 11:26 am ]
Заглавие:  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 | Прегледано 1365 пъти ]

Автор:  Gogo [ Пон Авг 20, 2007 3:06 pm ]
Заглавие: 

Конфигурация написаал ли си? Не я виждам! Ако няма, пика няма да тръгне.

Автор:  steve [ Пон Авг 20, 2007 3:14 pm ]
Заглавие: 

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

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

Автор:  valioman [ Пон Авг 20, 2007 3:34 pm ]
Заглавие: 

steve написа:
...... Въпреки това ми е странно как пиновете си сменят състоянието без тази конфигурация, която липсва.

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

Автор:  Gogo [ Пон Авг 20, 2007 4:14 pm ]
Заглавие: 

valioman написа:
.... пък и мисля че вградения драйвер на Майкрочипския компилатор е за 4 бита.
Поддържа и двата режима - 4 и 8 битов!

Автор:  steve [ Пон Авг 20, 2007 7:53 pm ]
Заглавие: 

Ползвам 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]
258 пъти

Автор:  steve [ Вто Авг 21, 2007 10:37 am ]
Заглавие: 

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

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

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

Автор:  bkulev [ Съб Сеп 15, 2007 11:37 am ]
Заглавие: 

защото функциите за eXternalLCD са компилирани в библиотеката с *.h файла който
виждаш. Промяната само в *.h файла няма да доведе до исканите от теб промени,
т.е. необходимо е да прекомпилираш функциите и да ги подмениш в lib файла, или
хвани сорса на всички функции и заедно с променения *.h файл си ги компилирай
в твой lib файл и го добави в проекта, обаче укажи на линкера първо да търси функциите в
него и след това в default lib, щото знаеш ...

Успех :)

Автор:  million [ Съб Сеп 15, 2007 12:08 pm ]
Заглавие: 

Ако честотата на симулирания процесор в PROTEUS e различна от тази за която е писана програмата няма да тръгне. На 1 херц може и да ти мигат пиновете, но дисплея си чака неговите времезакъснения, защото симулацията е в реално време.

Автор:  NikB [ Пет Авг 15, 2008 9:39 am ]
Заглавие:  Re: LCD проблем

steve написа:
Здравейте.
Преди да пиша порових из форума както с помощта на търсачката, така и без нея и не намерих нещо, което да ми помогне. Ето защо задавам въпроса си.
Надявам се да не ми се смеете, че питам смешни за повечето от вас неща.
Става въпрос за PIC18F452 и LCD 8х2.....


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

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

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