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

Програмиране на дисплей AMPIRE 164A-D
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7896
Страница 1 от 2

Автор:  NRG [ Съб Юни 12, 2010 8:08 pm ]
Заглавие:  Програмиране на дисплей AMPIRE 164A-D

Здравейте,

Прибрах се в БГ и първата работа ми бе да отскоча до магазина да пазарувам. Човека, не му се приказваше много кое е добре и кое не, та финансовия фактор повлия и си взех посочения дисплей (Ampire 164A-D, четири-редов, 16 знака матричен). Докато бях в чужбинция, програмирахме в даскалото дисплей NEW HEAVEN, с вграден контролер SPC780D, цялото ръководено от Rabbit 5600W.

Свалих си дата-шийта от нета (http://www.ampire.com.tw/Spec-AC/AC-164A.pdf) и излиза, че е контролера на Ampire 164A-D е идентичен (същия) с SPC780D, следователно промених библиотеката, която бях написал, с очакването нещата да тръгнат. Свързах дата-бъса с паралелен порт D на PIC18F45K20, свързах захранването на логиката през пика (3.3В), свързах осветлението на 4.8В, свързах пина за контраст директно на дъното на пика (на нула) и командния бъс (Rs R/W и E) на порт C.

Проблемите ми са:
1. Контраста е зле - почти не се личат редовете, когато го стартирам. В предни теми се бе споменало, че много контролери трябва външно да се снабдят с -5-6В, но не съм сигурен дали при този е така...??
2. Дисплея въобще не захапва. Не мога и да го инициализирам.
3. Дисплея започва да грее, след броени секунди поради захранването на осветлението му. Захранвам го посредством ПИК-кита (3.3В) и серийно съм свързал една батерия АА от 1.5В и така напрежението за дисплея стига до ~4.8В, което според дата-шийта е ОК.

Прикачвам кода по-долу.

Прикачени файлове:
KS0066U.h [12.82 KiB]
193 пъти

Автор:  Cekins [ Съб Юни 12, 2010 8:56 pm ]
Заглавие: 

Въх мър майка ...

1. За контраста се слага един потенциометър между VDD и GND към 3-ти пин и пота се врътка докато ти хареса.
2. С PicKit не се мъчи да го храниш - ще го прецакаш - подсветката харчи, на тоя, по спомен към 300 mA.
3. Пак по спомен ама май 5 волтово LCD не може да тръгне на 3.3. А и не съм сигурен дори да го пуснеш на 5 дали ще реагира на 3.3 на входа. Май искаше мин. 3.6 волта за 1-ца.

Заради точка 3 ти трябва, както пише в даташита, "по специална заявка" на 3.3V. Ако си го купувал от Комет - техните са само на 5V.

Ииии, какво искаш точно да му програмираш. Ако имаш предвид да му вкарваш char set - може само 8 символа - другите са твърди.

Автор:  didofen [ Пон Юни 14, 2010 1:49 pm ]
Заглавие: 

определено няма да тръгне дисплея на 3.3в. най-лесно за контраст 1к резистор към маса и трети крак на дисплея

Автор:  NRG [ Пон Юни 14, 2010 11:07 pm ]
Заглавие: 

Мерси за съветите колеги. Оправиха се нещата след като приспособих зарядно от мобифон на 4.82В да достави сока за дисплея. Контраста е ок също, така както го бях свързал.

Поздрави!

Автор:  Gogo [ Пон Юни 21, 2010 10:36 am ]
Заглавие: 

Cekins, По т.3: 5 волтово LCD не тръгва на 3.3. Ако го пуснеш на 5, реагира на 3.3 на входа.
Имам едно устройство (контролер), направено точно по този начин и дисплея си се "клати" директно от 3,3-волтов проц. Има обаче един проблем, който не съм сигурен от какво точно се получава: когато "защрака" автоматиката, дисплея яко се ошашкваше и започваше да изписва на случайни позиций случайни символи, а проца си кара автоматиката без грешка - т.е. не е от него. Когато имам цялостно опресняване на дисплея, всичко си идва по местата, докато не включи някой контактор. Успях софтуерно да се преборя почти напълно с тези смущения, но все още, понякога, много рядко, някой символ изчезва от позицията си - остава празно :D Та не мога да си обясня, дали това е ефект от ниските управляващи нива или самият дисплей е калпав. То не, че аз не съм де, ама...

Автор:  NRG [ Пон Юни 21, 2010 1:54 pm ]
Заглавие: 

Здравейте,
Не се разбираме с дисплея. Инициализирането му [KS0066U_Init(&DL1N1F0, &D1C1B1);] минава ОК и имам контрол над дата трансфера, броя на редове, големината на символите, мигането, показването на курсора и вкл. и изкл. на дисплея. С изписването върху дисплея обаче все още не се справям. Имате ли представа или предположения защо?

Код:

/** C O N F I G U R A T I O N   B I T S ******************************/
#pragma config FOSC = INTIO67

/** I N C L U D E S **************************************************/
#include "p18f45k20.h"

#pragma code
char *iter, *addr, *ems, *donoff, *cdshift, *fset;
char L1, L2, L3, L4, I1S1,I1S0, I0S1, I0S0;
char DL1N1F0, DL1N1F1, DL1N0F0, DL1N0F1, DL0N0F0, DL0N1F0, DL0N1F1, DL0N0F1;
char D1C1B1, D1C1B0, D1C0B1, D1C0B0, D0C0B1,   D0C0B0,   D0C1B1,   D0C1B0;
char SC1RL1, SC1RL0, SC0RL1, SC0RL0;
void KS0066U_PortSetup();
void KS0066U_Enable();
void KS0066U_Disable();
void KS0066U_Write();
void KS0066U_Read();
void KS0066U_Clear();
void KS0066U_Return();
void KS0066U_EntryModeSet();
void KS0066U_FunctionSet();
void KS0066U_DispOnOffCtrl();
void KS0066U_CursDispShift();
void KS0066U_SetAddr();
void KS0066U_ReadBusyFlag();
void KS0066U_Default();
void KS0066U_PrintString();
void KS0066U_Init();

void main()
{
   KS0066U_Init(&DL1N1F0, &D1C1B1);
   KS0066U_PrintString("Test String",&L2,&I0S0);
}
/*Subroutines*********************************************************/
//Connections between PIC18F45K20 and the KS0066U controller onto the AMPIRE LCD
//KS0066U    |Rs R/W E DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
//PIC        |C4 C5 C6 D7  D6  D5  D4  D3  D2  D1  D0

void KS0066U_Enable()                           
{
   LATCbits.LATC6 = 1;
   LATCbits.LATC6 = 0;
}
void KS0066U_Write()                                 
{
   LATCbits.LATC5 = 0;
   LATCbits.LATC4 = 1;
}
void KS0066U_Read()                           
{   
   LATCbits.LATC4 = 0;
      LATCbits.LATC5 = 1;
}
void KS0066U_ReadBusyFlag()
{
   KS0066U_Read();
   TRISD = 0xff;         // Set PortD to input
   while(LATDbits.LATD7); //wait for bit D7 to become 0
   LATCbits.LATC5 = 0;
   TRISD = 0x00;         // Set PortD to output
}
void KS0066U_PortSetup()
{
         TRISD = 0x00; //Set PortD to OUTPUT
       TRISCbits.TRISC6 = 0; //Set PortC bit6 to OUTPUT
      TRISCbits.TRISC5 = 0; //Set PortC bit5 to OUTPUT
      TRISCbits.TRISC4 = 0; //Set PortC bit4 to OUTPUT
      LATD = 0x00;        //Set PortD to LOW
      LATC = 0x00;        //Set PortC to LOW
}

void KS0066U_Clear()                                 
{   
   LATC = 0x00;
   LATD = 0x01;
      KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_EntryModeSet(char *ems)                                 
{
   I1S1 = 0x07;
   I1S0 = 0x06;
   I0S1 = 0x05;
   I0S0 = 0x04;

   LATD = *ems;
    KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_FunctionSet(char *fset)                             
{
   DL1N1F0 = 0x38;
   DL1N1F1 = 0x3c;
   DL1N0F0 = 0x30;
   DL1N0F1 = 0x34;
   DL0N0F0 = 0x20;
   DL0N1F0 = 0x28;
   DL0N1F1 = 0x2C;
   DL0N0F1 = 0x24;

   LATD =  *fset;
     KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_DispOnOffCtrl(char *donoff)                          // DispOnOffCtrl
{
   D1C1B1 = 0x0f;
   D1C1B0 = 0x0e;
   D1C0B1 = 0x0d;
   D1C0B0 = 0x0c;
   D0C0B1 = 0x09;
   D0C0B0 = 0x08;
   D0C1B1 = 0x0b;
   D0C1B0 = 0x0a;

   LATD = *donoff;
   KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_CursDispShift(char *cdshift)
{
SC1RL1 = 0x1c;
SC1RL0 = 0x18;
SC0RL1 = 0x14;
SC0RL0 = 0x10;

   LATD = *cdshift;
   KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_SetAddr(char *addr)                              // SetDispDataRamAddr
{
   L1 = 0x00;
   L2 = 0x40;
   L3 = 0x10;
   L4 = 0x50;
   LATCbits.LATC4 = 0;
   LATCbits.LATC5 = 0;
   LATD = *addr;
   KS0066U_Enable();
   KS0066U_ReadBusyFlag();
}

void KS0066U_Init(char *fset, char *donoff)
{
   KS0066U_PortSetup();
   KS0066U_FunctionSet(fset);
   KS0066U_DispOnOffCtrl(donoff);
   KS0066U_Clear();
   KS0066U_Clear();//For some reason it is necessary to repeat the clear command
}

void KS0066U_PrintString(char *iterator,char *addr,char *ems)
{
    KS0066U_EntryModeSet(&ems);
   KS0066U_SetAddr(&addr);
    while (*iterator){
       KS0066U_Write();
      LATD = *iterator;
      KS0066U_Enable();
      KS0066U_ReadBusyFlag();
       iterator++;
   }
}

Автор:  didofen [ Пон Юни 21, 2010 3:20 pm ]
Заглавие: 

не видях къде си вдигаш ерес-а при данни

Автор:  NRG [ Пон Юни 21, 2010 5:31 pm ]
Заглавие: 

didofen написа:
не видях къде си вдигаш ерес-а при данни

@didofen
Ако говориш за "Rs", то в командата "KS0066U_Write()" вдигам бит4(Rs) от порт "С", при пращане на данни към дисплея.

Автор:  didofen [ Вто Юни 22, 2010 10:05 am ]
Заглавие: 

да не би да имаш проблеми с контраста

Автор:  Cekins [ Вто Юни 22, 2010 12:39 pm ]
Заглавие: 

Gogo - единицата ти я хваща по някаква щастлива случайност

в случая 5*0,7 е 3,5
4,82*0,7=3,374 - пак не достига малко.

Четете малко да му се невиди.

На тия входове най-вероятно има шмигери - Вие се опитвате да ги цъкате в границите им - ми ще има проблеми.

Прикачени файлове:
ac-164.jpg
ac-164.jpg [ 159.89 KiB | Прегледано 2210 пъти ]

Автор:  michev [ Вто Юни 22, 2010 2:13 pm ]
Заглавие: 

Cekins, може и аз да греша в разчитането на дейташийта, ама май не си много прав.
Прав си само за 0.7 * VDD до VDD, обаче VDD е от 2.7 до 5.5 волта. Т.е ако той си храни логиката на дисплея с 3.3 волта не виждам какъв ще му е проблема.

Автор:  NRG [ Вто Юни 22, 2010 9:42 pm ]
Заглавие: 

didofen написа:
да не би да имаш проблеми с контраста


Не, нямам проблем с контраста, доколкото мога да съдя. Когато ползвам адресите указани в дата-шийта [ 0x00, 0x40, 0x10, 0x50 ] за първи, втори, трети и четвърти ред, мога да местя курсора само на първо положение на първи и на втори ред, а на останалите хоризонтални положения нямам достъп, или поради някаква причина изчезва курсора, може би от неправилно настроено напрежение на контраст-пина, както ти казваш. Не мисля, че контраст пина е виновен, най-вече понеже в процеса на експериментиране с различни командни последователности и тайминги, ми излизат ясни произволни символи на произволни позиции по дисплея.

Поради това си мисля, че проблема ми е на софтуерно ниво, но не виждам къде бъркам. Както писах по-горе, същия код работи с SPCL780D контролер на идентичен дисплей както този, но през Dynamic C и RABBIT.

Поздрави!

Автор:  Cekins [ Сря Юни 23, 2010 9:33 am ]
Заглавие: 

И как точно ще му захраниш логиката с 2,7 да попитам аз. Щото не съм виждал Ampire дисплей с два извода за VDD на логиката и на LCD-то ?

Автор:  didofen [ Сря Юни 23, 2010 9:55 am ]
Заглавие: 

ми нещо не можах да се оправя с с-то ти, та да изкажа следното. подават се данните на данновите пинове, настройват се ереса и ч/з пиновете и тогава се вдига енеибъл и се сваля. освен това е мн важно времето му на задържане в единица, както и времето между импулсите, т.е. времето между командите. има си критични минимуми

Автор:  michev [ Сря Юни 23, 2010 5:22 pm ]
Заглавие: 

Cekins, страница 8 от дейташийта.

Прикачени файлове:
ampire.png
ampire.png [ 21.97 KiB | Прегледано 2212 пъти ]

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