|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 2:40 am
|
Страница 1 от 1
|
[ 10 мнения ] |
|
| Автор |
Съобщение |
|
steve
Ранг: Минаващ
Регистриран на: Пон Авг 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 с несвързан извод за контраста на дисплея. Дори да го свържа (към маса, към захранване, с резистор или както и да е) няма промяна в положението.
_________________ "Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
|
| Пон Авг 20, 2007 11:26 am |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Конфигурация написаал ли си? Не я виждам! Ако няма, пика няма да тръгне.
|
| Пон Авг 20, 2007 3:06 pm |
|
 |
|
steve
Ранг: Минаващ
Регистриран на: Пон Авг 20, 2007 11:13 am Мнения: 13 Местоположение: Варна, България
|
Ами освен това :
void init_mcu(void)
{
DataTris = 0b00000000; // all outputs
CtrlTris = 0b00000000; // all outputs
}
друго не съм написал. Чудех се дали е достатъчно. За по-сигурно написах програмка, която да прави всички битове на двата порта ту нули, ту единици. В Proteus се виждаше, че работи. Когато задам ниска честота на работа в Proteus се вижда как пиновете си сменят нивото, но дисплея не реагира.
 май се сетих важната част, която съм пропуснал. Конфигурациите за тип осцилатор, използвани ресети, WDT и т.н. Ще опитам довечера да го подкарам и дано се получи. Въпреки това ми е странно как пиновете си сменят състоянието без тази конфигурация, която липсва.
_________________ "Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
|
| Пон Авг 20, 2007 3:14 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Еми виртуално не съм чул да забременее некоя к...ва та кво остава да не тръгне един ПИК.
И виж дали не можеш го подкара 4 битово ... закво да хабиш краката нахалос .... пък и мисля че вградения драйвер на Майкрочипския компилатор е за 4 бита.
|
| Пон Авг 20, 2007 3:34 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Поддържа и двата режима - 4 и 8 битов!
|
| Пон Авг 20, 2007 4:14 pm |
|
 |
|
steve
Ранг: Минаващ
Регистриран на: Пон Авг 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 ще съм му много благодарен.
_________________ "Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
|
| Пон Авг 20, 2007 7:53 pm |
|
 |
|
steve
Ранг: Минаващ
Регистриран на: Пон Авг 20, 2007 11:13 am Мнения: 13 Местоположение: Варна, България
|
Тази сутрин станах рано и реших все пак да сътворя една експериментална платка. Въведох символи, колкото да запълня дисплея (не мери температура, както лъже дисплея, а просто има текст). Пуснах го отново на Proteus и нямаше неочакван обрат. Отново нищо не се показа в симулацията. Записах чипа и пуснах схемата. Резултатът се вижда на снимката.
Сега ми е интересно защо на симулацията не се получава нищо. Също така ако някой има идея защо като променя порта в xlcd.h и интерфейса на 8-битов няма никакъв резултат. Абе изобщо с тоя драйвер нищо не се получава.
П.П.
Благодаря за подсещането да напиша конфигурация. Кой знае колко време щях да се мъча без нея и нищо да не става 
_________________ "Има само две безкрайни неща, Вселената и човешката глупост. За първото не съм съвсем сигурен."
Алберт Айнщайн
|
| Вто Авг 21, 2007 10:37 am |
|
 |
|
bkulev
Ранг: Популярен
Регистриран на: Сря Яну 25, 2006 12:47 pm Мнения: 305 Местоположение: Varna
|
защото функциите за eXternalLCD са компилирани в библиотеката с *.h файла който
виждаш. Промяната само в *.h файла няма да доведе до исканите от теб промени,
т.е. необходимо е да прекомпилираш функциите и да ги подмениш в lib файла, или
хвани сорса на всички функции и заедно с променения *.h файл си ги компилирай
в твой lib файл и го добави в проекта, обаче укажи на линкера първо да търси функциите в
него и след това в default lib, щото знаеш ...
Успех 
|
| Съб Сеп 15, 2007 11:37 am |
|
 |
|
million
Ранг: Минаващ
Регистриран на: Сря Дек 06, 2006 9:05 pm Мнения: 92 Местоположение: София
|
Ако честотата на симулирания процесор в PROTEUS e различна от тази за която е писана програмата няма да тръгне. На 1 херц може и да ти мигат пиновете, но дисплея си чака неговите времезакъснения, защото симулацията е в реално време.
|
| Съб Сеп 15, 2007 12:08 pm |
|
 |
|
NikB
Ранг: Почетен член
Регистриран на: Съб Сеп 25, 2004 10:32 pm Мнения: 710
|
 Re: LCD проблем
Навярно си решил проблемите със симулацията. Аз имам по-скоро проблеми с изучаването на Протеус, постнах една тема в тоя форум, но никой не писа, явно Протеус не е много популярен.
Ако желаеш, може да обменим инфо.
(Аз много време не бях писал на PIC и наскоро ми се наложи - без Протеус щях да съм много зле)
Сега ще постна една тема, че търся инфо за драйвери за 16873 за LCD, за сега пиша на асемблер.
http://www.mcu-bg.com/mcu_site/viewtopic.php?p=71279#71279
|
| Пет Авг 15, 2008 9:39 am |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|