OLED display WEH001602ABPP5N00000 s kontrolérom WS0010

Si začinajúci elektronik? Tak táto rubrika je určená práve tebe.

Moderátori: mirosne, Moderátori

Používateľov profilový obrázok
burizon
Pokročilý člen
Pokročilý člen
Príspevky: 571
Dátum registrácie: 07 Nov 2007, 00:00
Bydlisko: Vranov nad Topľou

OLED display WEH001602ABPP5N00000 s kontrolérom WS0010

Príspevok od používateľa burizon » 15 Okt 2014, 12:08

Ahojte,
kúpil som na otestovanie tento display WEH001602ABPP5N00000 s kontrolérom WS0010 (podobný HD44780). Inicializoval som ho na 4bit mód podľa DS. Pracoval, ale vždy sa tam objavil "nejaký šum" alebo ako to nazvať, proste vždy najprv "vybehnú" nejaké znaky,často sa zasekne a až po resete (aj viacnásobnom) robí to čo od neho chcem. Na ruských fórach súdruhovia doporučovali po zapnutí 500mS na "zorientovanie" sa displaya, potom 5x poslať 0x00 s preložením 100uS a pokračovať inicializáciou podľa DS. No v mojom prípade to nemalo žiadny vplyv na jeho "neserióznu" robotu. Aké máte skúsenosti s týmto displayom?


! Upravený názov témy pre lepšie vyhľadávanie.Snažte sa písať do názvu témy typ zariadenia.upravil: 15.10.2014 mirosne !
Prílohy
Doc1.doc
(56.5 KiB) 38 stiahnutí
0
Naposledy upravil/-a burizon v 15 Okt 2014, 12:55, upravené celkom 1 krát.

MiroH
Stály člen
Stály člen
Príspevky: 176
Dátum registrácie: 13 Dec 2009, 00:00
Bydlisko: Nitra
Vek: 60

Re: OLED display

Príspevok od používateľa MiroH » 15 Okt 2014, 12:43

mam 8x2 s tym istym radicom a chova sa to presne ako pises, vratane ruskych doporuceni.
Zvazujem prepnutie na SPI a usetrim este par portov.
Inak skusal som na arduino kniznicu od adafruit a to bezi, ked som si postup prepisal do CodeVision, tak zasa nic.
0

Používateľov profilový obrázok
kubo150
Ultimate člen
Ultimate člen
Príspevky: 3253
Dátum registrácie: 20 Júl 2007, 00:00
Bydlisko: Pri Bytči
Vek: 32
Kontaktovať používateľa:

Re: OLED display

Príspevok od používateľa kubo150 » 15 Okt 2014, 13:01

Používaš Write komunikáciu alebo R/W komunikáciu? tzn čítaš ready príznak alebo ho SW emuluješ? Čo som pozeral knižnice na nete a zvyky, tak častejšie je používať len W komunikáciu(R/W pin natvrdo k zemi) a ready príznak displeja emulovať softvérovími pauzami, ale pre tento radič môžu byť časy iné. Neviem ako tvoja knižnica rieši pauzu, ak je to pomocou cyklenia asm nop, skúsil by som pokusne znížiť frekvenciu MCU aby sa predlžili čakacie časy, a ak ti komunikácia bude chodiť správne, znamená to, že na displej málo čakáš.
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita

MiroH
Stály člen
Stály člen
Príspevky: 176
Dátum registrácie: 13 Dec 2009, 00:00
Bydlisko: Nitra
Vek: 60

Re: OLED display

Príspevok od používateľa MiroH » 15 Okt 2014, 13:48

Casy som skusal az 5 ms medzi instrukciami, tym to nie je. Ten radic ma bug na 4 bitovej komunikacii.

Nieco bolo preberane v
http://svetelektro.com/modules.php?name ... 55#p552955

Idealne 8 bit, ktory je kompatibilny alebo spi ako som pisal vyssie. Ten vyuziva vlastne 8 bit komunikaciu, ktora chodi korektne.
0

Používateľov profilový obrázok
burizon
Pokročilý člen
Pokročilý člen
Príspevky: 571
Dátum registrácie: 07 Nov 2007, 00:00
Bydlisko: Vranov nad Topľou

Re: OLED display

Príspevok od používateľa burizon » 15 Okt 2014, 13:55

Miro: asi na SPI to môže šlapať ok, na jednom nemeckom fore bol príklad aj s kódom, ale nepátral som ďalej.
Kubo: nečítam busy príznak, R/W je na "zemi" a robím iba pauzy. Hej môže to tak byť, že časy oproti HD44780 môžu byť iné, aj som to tuším menil, ale ešte som nemal čas si k tomu poriadne sadnúť. Chcem vyskúšať aj busy príznak neskôr.

-- Spojený príspevok 15 Okt 2014, 14:16 --

Zdes tovarišč píše, že je potrebné čítať busy príznak.

Как и обещал выкладываю простой пример.
Ранее писал о нестабильности работы, оказалось что при чтении регистра статуса в 4-ех битном режиме работы необходимо обязательно его полностью, я читал только старшие 4 бита для проверки флага занятости (бит 7).

Описание индикатора брал тут, исполнение отличается от моего, но логика работы аналогична.

Так как питание индикатора 5 вольт проверял его работу с платой STM8S-Discovery на основе шаблона описанного ранее.

Подключение линий ввода-вывода:


#define OLED_2X16_E E, 7, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_RW E, 3, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_RS D, 0, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_DB7 B, 7, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_DB6 B, 5, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_DB5 B, 3, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define OLED_2X16_DB4 B, 1, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ

#define OLED_2X16_DB7_IN B, 7, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT
#define OLED_2X16_DB6_IN B, 5, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT
#define OLED_2X16_DB5_IN B, 3, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT
#define OLED_2X16_DB4_IN B, 1, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT


Инициализируем, устанавливаем курсор (можно было и не делать этого) и отображаем символ А.

int main(void)
{
oled_2x16_init();
oled_2x16_set_cursor_position(0, 0);
oled_2x16_print_symbol('A');

while(1)
{
}

return 0;
}
Копи-паст кода:
/*
* File: oled_2x16.c
* Date: 28.08.2011
* Denis Zheleznjakov @ ZiBlog.ru
*/

#include "main.h"

//------------------------------------------------------------------------------
static void write_4bit(uint8_t data)
{
PIN_OFF(OLED_2X16_DB7);
PIN_OFF(OLED_2X16_DB6);
PIN_OFF(OLED_2X16_DB5);
PIN_OFF(OLED_2X16_DB4);

PIN_ON(OLED_2X16_E);

if (data & 0x80)
PIN_ON(OLED_2X16_DB7);
if (data & 0x40)
PIN_ON(OLED_2X16_DB6);
if (data & 0x20)
PIN_ON(OLED_2X16_DB5);
if (data & 0x10)
PIN_ON(OLED_2X16_DB4);

PIN_OFF(OLED_2X16_E);
}

//------------------------------------------------------------------------------
static uint8_t read_4bit(void)
{
uint8_t result = 0;

PIN_ON(OLED_2X16_E);

if(PIN_SIGNAL(OLED_2X16_DB7_IN))
result = 0x80;
if(PIN_SIGNAL(OLED_2X16_DB6_IN))
result |= 0x40;
if(PIN_SIGNAL(OLED_2X16_DB5_IN))
result |= 0x20;
if(PIN_SIGNAL(OLED_2X16_DB4_IN))
result |= 0x10;

PIN_OFF(OLED_2X16_E);

return result;
}

//-----------------------------------------------------------------------------
static void wait_ready(void)
{
PIN_OFF(OLED_2X16_RS);

PIN_CONFIGURATION(OLED_2X16_DB7_IN);
PIN_CONFIGURATION(OLED_2X16_DB6_IN);
PIN_CONFIGURATION(OLED_2X16_DB5_IN);
PIN_CONFIGURATION(OLED_2X16_DB4_IN);

PIN_ON(OLED_2X16_RW);

while((read_4bit() & 0x80) != 0x00)
{
read_4bit();
}

read_4bit();

PIN_OFF(OLED_2X16_RW);

PIN_CONFIGURATION(OLED_2X16_DB7);
PIN_CONFIGURATION(OLED_2X16_DB6);
PIN_CONFIGURATION(OLED_2X16_DB5);
PIN_CONFIGURATION(OLED_2X16_DB4);
}

//------------------------------------------------------------------------------
static void write_instruction(uint8_t instruction)
{
PIN_OFF(OLED_2X16_RS);

write_4bit(instruction);
write_4bit((uint8_t) (instruction << 4));
}

//------------------------------------------------------------------------------
static void write_data(uint8_t data)
{
PIN_ON(OLED_2X16_RS);

write_4bit(data);
write_4bit((uint8_t) (data << 4));
}

//-----------------------------------------------------------------------------
void oled_2x16_set_cursor_position(uint8_t row, uint8_t colum)
{
write_instruction((uint8_t) (0x80 | (row > 0 ? 0x40 : 0) | colum));
}

//-----------------------------------------------------------------------------
void oled_2x16_print_symbol(uint8_t symbol)
{
write_data(symbol);
}

//-----------------------------------------------------------------------------
void oled_2x16_print_string(uint8_t * string)
{
while (*string != 0x00)
{
write_data(*string++);
}
}

//------------------------------------------------------------------------------
void oled_2x16_init(void)
{
PIN_CONFIGURATION(OLED_2X16_E);
PIN_CONFIGURATION(OLED_2X16_RW);
PIN_CONFIGURATION(OLED_2X16_RS);

PIN_OFF(OLED_2X16_E);
PIN_OFF(OLED_2X16_RW);
PIN_OFF(OLED_2X16_RS);

PIN_CONFIGURATION(OLED_2X16_DB7);
PIN_CONFIGURATION(OLED_2X16_DB6);
PIN_CONFIGURATION(OLED_2X16_DB5);
PIN_CONFIGURATION(OLED_2X16_DB4);

write_4bit(0x20);
write_4bit(0x20);
write_4bit(0xA0);
wait_ready();

write_4bit(0x00);
write_4bit(0xC0);
wait_ready();

write_4bit(0x00);
write_4bit(0x10);
wait_ready();

write_4bit(0x00);
write_4bit(0x60);
wait_ready();
0

Používateľov profilový obrázok
burizon
Pokročilý člen
Pokročilý člen
Príspevky: 571
Dátum registrácie: 07 Nov 2007, 00:00
Bydlisko: Vranov nad Topľou

Re: OLED display WEH001602ABPP5N00000 s kontrolérom WS0010

Príspevok od používateľa burizon » 21 Okt 2014, 21:55

S uvedenou inicializáciou to ako-tak šlape. Po zapnuti napájania to nabehne a funguje, beda, ak sa resetuje mikrokontrolér, zblbne to. Ale po prerušení a zapnutí napájania to funguje.

// 4-Bit initialization sequence from Technobly
write4bits(0x03); // Put back into 8-bit mode
delayMicroseconds(5000);
write4bits(0x02); // Put into 4-bit mode
delayMicroseconds(5000);
write4bits(0x02);
delayMicroseconds(5000);

command(0x08); // Turn Off
delayMicroseconds(5000);
command(0x01); // Clear Display
delayMicroseconds(5000);
command(0x06); // Set Entry Mode
delayMicroseconds(5000);
command(0x02); // Home Cursor
delayMicroseconds(5000);
command(0x0C); // Turn On - enable cursor & blink
delayMicroseconds(5000);
0

Používateľov profilový obrázok
jenda23
Ultimate člen
Ultimate člen
Príspevky: 5779
Dátum registrácie: 27 Jún 2008, 00:00
Bydlisko: Česká Třebová
Vek: 33
Kontaktovať používateľa:

Re: OLED display WEH001602ABPP5N00000 s kontrolérom WS0010

Príspevok od používateľa jenda23 » 22 Okt 2014, 07:11

To je u těchto řadičů normální, v podstatě nikomu se tento problém nepodařilo vyřešit. Takže to řeším tak že napájení LCD ovládám jedním portem na MCU a PNP trandem. Po zapnutí MCU display vypnu provedu inicilizaci MCU pak LCD zapnu a provedu jeho inicilizaci aj e to OK.

Jinak na to fungujou i knihovny pro klasickej HD řadič...
0
Lokomotiva je jako žena.Je jich stovky typů a každej z nich je jinej,každá z nich je svým způsobem krásná.Když jí chceš aspoň trochu poznat jsou to stovky hodin času.Nejde s ní být aniž bys jí bezmezně miloval,je nemožný jí znát do poslední skulinky

MiloPS3
Stály člen
Stály člen
Príspevky: 480
Dátum registrácie: 20 Apr 2011, 00:00
Bydlisko: Lazne Kynzvart / CZ

Re: OLED display WEH001602ABPP5N00000 s kontrolérom WS0010

Príspevok od používateľa MiloPS3 » 22 Okt 2014, 10:23

a skousel nekdo na vsechny komunikacni vstupy lcd dat pulldown/up ?
kdyz ten lcd funguje bez problemu a po resetu mcu to blbne tam mu asi zrejme vadi mit nejaky ty piny v lufte (ty radice muzou mit citlivejsi vstupy)..
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok