[ DSL @ 29.08.2020. 09:23 ] @
Pozdrav drustvo.

Testiram jedan alfanumericki I2C LCD iz subjecta. Dirty code ali komunikacija tece uredno.
Okruzenje Seeeduino Xiao+Arduino IDE.
Datasheet je ocajan i ne nudi mnogo informacija, uglavnom referise na datasheet kontrolera.
Elem, library koji koristim nudi mogucnost kontrole kontrasta ali ne vidim da sam u stanju da promenim kontrast, ni u kom smeru. Smanjio bih ga malo jer je ovako LCD jedva citljiv.
Ima li neko iskustva sa pomenutim displejem...? Nije navedeno da se nesto moze uraditi sa promenom kapacitivnosti kondenzatora na LCD drajvu...

(tema jeste vise za MCU podforum ali vidim da je aktivnost tamo malo redukovana...)
[ scoolptor @ 29.08.2020. 09:49 ] @
Stavi FON na 1, i igraj se sa C0..C5 i RAB 0..2.
[ ZAS011 @ 29.08.2020. 10:16 ] @
Jesi li pročitao ta pdf što si prikačio?
Sve ti tamo piše:

[ DSL @ 29.08.2020. 11:13 ] @
Kewl.
Prvi put radim sa lcd kod koga se kontrast setuje njakanjem registara... neam iskustva pa ne znam ni da dekodiram kvalitetno informacije iz shita...
Hvala. Ponudio bih nekog alkohola ali sam već pritisnuo Send
[ ZAS011 @ 29.08.2020. 11:31 ] @
Fala lepo, alkohol ne trošimo
Čim ti je I2C, ondak sve softverski odrađuješ.
[ DSL @ 29.08.2020. 12:01 ] @
O lebe... pa šta trošite ondak??

Sad sam probao igranje sa ovim registrima... ili ovo nije pas ptičar ili ga ja ne bacam dovoljno visoko???
Igraču se još malo kasnije ali ostajem bez ideja trenutno...
Inače, ovde kod mene je sad bio pljusak od dva sata, sad je jedno 24 vani... 500km južnije id Stokholma
[ DSL @ 29.08.2020. 16:31 ] @
Ipak ovo nije pas pticar...

Elem, samaram svasta nesto usmereno ka displeju ali nesto ne ide... negde gresim, evidentno...

U setup rutini je smesten pokusaj da se poigram sa kontrastom. Posto ne ide, jer displej evidentno ne reaguje na ove komande, pokusao sam i sa igranjem komandama koje bi trebale da urade clear ili return home, ili da ugase displej, ali bez uspeha...
Negde sistematski gresim, ali od alkohola koji vi necete, jelte, sad ne mogu mutne glave da mislim...a i sve sto sam smislio, nije dalo efekta...

Evo na sta sam sveo kod pokusavajuci samo da naucim kako da se obracam displeju ali, sipak...nesto ipak tu ne stima... Prikaz na displeju se odvija bez problema i to je sve sto ne skripi.

Moze jos malo pomoci??

Code:
#include <Arduino.h>
#include "ST7036.h"
#include <Wire.h>
ST7036 lcd = ST7036 ( 2, 20, 0x78 ); //adresa displeja je 0x78

void setup ()
{
  lcd.init ();
//lcd.setContrast(0);
Wire.begin();                 // Initialise I2C communication as MASTER
Wire.beginTransmission(0x78); // Start I2C Transmission
Wire.write ( 0b01011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b01101000 );    // Follower circuit internal ON, Amplifier follower ratio 
Wire.write ( 0b01110000 );    // Contrast low byte (6) 
Wire.endTransmission();

}

void loop ()
{
lcd.print ("A");
delay(1000);
}
[ ZAS011 @ 29.08.2020. 17:33 ] @
Aj probaj ovo:

Code:
#include <Arduino.h>
//#include "ST7036.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//ST7036 lcd = ST7036 ( 2, 20, 0x78 ); //adresa displeja je 0x78
LiquidCrystal_I2C lcd(2, 20, 0x78);
byte ContrastL, ContrastH;

#define ICONC      0b01011100
#define Folower    0b01101000
#define ContrastC  0b01110000

void setup ()
{
  lcd.init ();
  //lcd.setContrast(0);
  Wire.begin();                 // Initialise I2C communication as MASTER
  Wire.beginTransmission(0x78); // Start I2C Transmission
  Wire.write (ICONC);    // ICON disp on, Booster on, Contrast high byte (2)
  Wire.write (Folower);    // Follower circuit internal ON, Amplifier follower ratio
  Wire.write (ContrastC);    // Contrast low byte (6)
  Wire.endTransmission();

}

void loop ()
{
  byte i, j, ICON, Contrast, Kontrast;
  ICON = ICONC;
  Contrast = ContrastC;
  Kontrast = 0;
  for (j=0; j<2; j++)
  {
    ICON = ICON + j;
    for (i=0; i<16; i++)
    {
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print ("Kontrast: ");
      lcd.print (Kontrast, DEC);
      Kontrast++;
      delay (2000);
    }
    Contrast = ContrastC;
  }
  
  
//  lcd.print ("A");
  delay(2000);
}


Naravno zakomentariši šta je potrebno i odkomentariši ...
[ DSL @ 29.08.2020. 17:55 ] @
Hvala za pomoc!
Pokusao sam i sam prvo sa ovom LiquidCrystal_I2C bibliotekom ali stvar nije proradila apsolutno nikako. Kao ni sada ovaj kod. Displej ne daje znake zivota.

Zbog ovog upozorenja sam na kraju potrazio ima li neko gotovo resenje biblioteke za konkretan kontroler i nasao ono sto sam i nabacio u kodu medjutim, kontrola kontrasta, a posle ce se ispostaviti i ostalo, ne funkcionise.
WARNING: library LCD_I2C-master claims to run on avr architecture(s) and may be incompatible with your current board which runs on samd architecture(s).


Kada sam vratio deo koda iskoristivsi staru biblioteku, kod se uredno izvrsava i tekst je vidljiv na displeju ali se promena kontrasta ne vidi.. bar bi se videla promena kod tranzicije sa 31 na 0 ali ...tjah.
Code:


#include <Arduino.h>
#include "ST7036.h"
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
ST7036 lcd = ST7036 ( 2, 20, 0x78 ); //adresa displeja je 0x78
//LiquidCrystal_I2C lcd(2, 20, 0x78);
byte ContrastL, ContrastH;

#define ICONC      0b01011100
#define Folower    0b01101000
#define ContrastC  0b01110000

void setup ()
{
  lcd.init ();
  //lcd.setContrast(10);
  Wire.begin();   
  Serial.begin (9600);          // Initialise I2C communication as MASTER
  Wire.beginTransmission(0x78); // Start I2C Transmission
  Wire.write (ICONC);           // ICON disp on, Booster on, Contrast high byte (2)
  Wire.write (Folower);         // Follower circuit internal ON, Amplifier follower ratio
  Wire.write (ContrastC);       // Contrast low byte (6)
  Wire.endTransmission();

}

void loop ()
{
  byte i, j, ICON, Contrast, Kontrast;
  ICON = ICONC;
  Contrast = ContrastC;
  Kontrast = 0;
  for (j=0; j<2; j++)
  {
    ICON = ICON + j;
    for (i=0; i<16; i++)
    {
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print ("Kontrast: ");
      lcd.print (Kontrast, DEC);
      Serial.print ("Kontrast: ");
      Serial.println (Kontrast, DEC);
      Kontrast++;
      delay (500);
    }
    Contrast = ContrastC;
  }
  
  
//lcd.print ("A");
  delay(500);
}


[Ovu poruku je menjao DSL dana 29.08.2020. u 20:43 GMT+1]
[ DSL @ 30.08.2020. 12:13 ] @
Interesantno mi je i da se displej odaziva na 0x78C adresu, kako je data u datasheetu, iako skener vidi 0x3C a ne vidi 0x78..
[ ZAS011 @ 30.08.2020. 14:36 ] @
Pa probaj onda umesto 0x78 da staviš 0c3C
[ DSL @ 30.08.2020. 15:05 ] @
Probao sam, naravno i gle čuda, ne odgovara na komande. Ispis se pojavljuje samo kad šaljem na 0x78.
Manje više adresa, jako me kopka zašto ne reaguje na komande...
[ jozimir @ 30.08.2020. 22:08 ] @
Verujem da će ovaj izvod iz datasheet kontrolera malo pomoći i razjasniti stvari.


The sequence is initiated with a START condition (S) from the I2C Interface master, which is followed by the slave address.

.....

After acknowledgement, one or more command words follow which define the status of the addressed slaves.

A command word consists of a control byte, which defines Co and RS, plus a data byte.

The last control byte is tagged with a cleared most significant bit (i.e. the continuation bit Co).

After a control byte with a cleared Co bit, only data bytes will follow.

The state of the RS bit defines whether the data byte is interpreted as a command or as RAM data.





Mislim da je ovo sporno:

Code:
void setup ()
{
  lcd.init ();
  //lcd.setContrast(0);
  Wire.begin();                 // Initialise I2C communication as MASTER
  Wire.beginTransmission(0x78); // Start I2C Transmission
  Wire.write ( 0b01011100 );    // ICON disp on, Booster on, Contrast high byte (2)
                 |
                 '----  0 znači da je poslednja komanda u nizu i da se sledeći bajt 
                         tretira kao karakter koji treba prikazati a NE kao komanda. 
  
  Wire.write ( 0b01101000 );    // Follower circuit internal ON, Amplifier follower ratio 
  Wire.write ( 0b01110000 );    // Contrast low byte (6) 
  Wire.endTransmission();


i da bi trebalo da stoji ovako:

Code:
void setup ()
{
  lcd.init ();
  //lcd.setContrast(0);
  Wire.begin();                 // Initialise I2C communication as MASTER
  Wire.beginTransmission(0x78); // Start I2C Transmission
  Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
  Wire.write ( 0b11101000 );    // Follower circuit internal ON, Amplifier follower ratio 
  Wire.write ( 0b01110000 );    // Contrast low byte (6) 
  Wire.endTransmission();
}
[ ZAS011 @ 30.08.2020. 22:54 ] @
Vi'š kumitj, neko umesto tebe čita datasheet s' razumevanjem

李元芝娜
i druga varijanta
李恩中國
[ DSL @ 31.08.2020. 06:44 ] @
Citat:
jozimir:
Verujem da će ovaj izvod iz datasheet kontrolera malo pomoći i razjasniti stvari.

The sequence is initiated with a START condition (S) from the I2C Interface master, which is followed by the slave address.
.....
After acknowledgement, one or more command words follow which define the status of the addressed slaves.
A command word consists of a control byte, which defines Co and RS, plus a data byte.
The last control byte is tagged with a cleared most significant bit (i.e. the continuation bit Co).
After a control byte with a cleared Co bit, only data bytes will follow.
The state of the RS bit defines whether the data byte is interpreted as a command or as RAM data.


Mislim da je ovo sporno:
Code:

.
.
.



i da bi trebalo da stoji ovako:

Code:
void setup ()
{
  lcd.init ();
  //lcd.setContrast(0);
  Wire.begin();                 // Initialise I2C communication as MASTER
  Wire.beginTransmission(0x78); // Start I2C Transmission
  Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
  Wire.write ( 0b11101000 );    // Follower circuit internal ON, Amplifier follower ratio 
  Wire.write ( 0b01110000 );    // Contrast low byte (6) 
  Wire.endTransmission();
}


Dobro jutro i hvala na korisnoj sugestiji (Scepo, ne mislim na tebe :-P )
Nazalost, ni ovo nije pokazalo neki vidljiv efekat. Evo testiranog koda. Ubacena je i linija koja je trebalo da ugasi displej ali bez efekta.

Code:


#include <Arduino.h>
#include "ST7036.h"
#include <Wire.h>
ST7036 lcd = ST7036 ( 2, 20, 0x78 ); //adresa displeja je 0x78

void setup ()
{
  lcd.init ();
//lcd.setContrast(0);
Wire.begin();                 // Initialise I2C communication as MASTER
Wire.beginTransmission(0x78); // Start I2C Transmission
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11101000 );    // Follower circuit internal ON, Amplifier follower ratio 
Wire.write ( 0b10001000 );    // Display off **************************************
Wire.write ( 0b01110000 );    // Contrast low byte (6) 
Wire.endTransmission();

}

void loop ()
{
lcd.print ("8");
Serial.print ("A");
delay(500);
}




Probacu, kad stignem, da usnifam ziv saobracaj i vidim sta se desava kod lcd.init komande, i sta displej detektuje kao validnu komandu, posto ovde ocigledno ignorise ovo sto je dodato... Sudeci prema ST7036.cpp, inicijalizacija se ne razlikuje mnogo od onog sto sam/smo dodali, osim u ovim Func_set_tbl0/1 upisima.

Code:

const uint8_t FUNC_SET_TBL0  = 0x38; // Function set - 8 bit, 2 line display 5x8, inst table 0
const uint8_t FUNC_SET_TBL1  = 0x39; // Function set - 8 bit, 2 line display 5x8, inst table 1




Code:

void ST7036::init () 
{
   size_t retVal; 
   // Initialise the Wire library.
   Wire.begin();
   
   Wire.beginTransmission ( _i2cAddress );
   Wire.write ( (byte)0x0 );   // Send command to the display
   Wire.write ( FUNC_SET_TBL0 );
   delay (10);
   Wire.write ( FUNC_SET_TBL1 );
   delay (10);
   Wire.write ( 0x14 );  // Set BIAS - 1/5
   Wire.write ( 0x73 );  // Set contrast low byte
   Wire.write ( 0x5E );  // ICON disp on, Booster on, Contrast high byte 
   Wire.write ( 0x6D );  // Follower circuit (internal), amp ratio (6)
   Wire.write ( 0x0C );  // Display on
   Wire.write ( 0x01 );  // Clear display
   Wire.write ( 0x06 );  // Entry mode set - increment
   _status = Wire.endTransmission ();
   
   if ( _status == 0 )
   {
      _initialised = true;
   }
}


Ono sto primecujem je da je, npr kod komande (a i kod svih ostalih)

Code:

Wire.write ( 0x6D );  // Follower circuit (internal), amp ratio (6)


MSB bit i dalje 0, a ne jedinica, kako ste sugerisali. (0b01101101)

U svakom slucaju, hvala za ulozeni trud i dobru volju.



[Ovu poruku je menjao DSL dana 31.08.2020. u 07:59 GMT+1]
[ jozimir @ 31.08.2020. 09:20 ] @

Vidim i ja da je u primerima MSB = 0, mada se u tekstu kod slanja niza komandi sugeriše MSB = 1.
Sve je prilično nejasno.

Posmatrajući vaš kod i primer dat u datasheet-u primećujem da u okviru inicijalizacije šaljete

Wire.write ( 0x73 ); // Set contrast low byte

odgovarajući kod u primeru bi bio

I2C_out(0x78);

komanda za kontrast je oblika 0x7X, odnosno ide od 0x70 do 0x7F.

Probajte da tu promenite kontrast.
[ goran_68 @ 31.08.2020. 09:42 ] @
Probaj da nakon poslednje u nizu komandi pošalješ:


Code:

Wire.endTransmission(stop);



Dakle, ovako bi išao setup

Code:

void setup ()
{
  lcd.init ();
//lcd.setContrast(0);
Wire.begin();                 // Initialise I2C communication as MASTER
Wire.beginTransmission(0x78); // Start I2C Transmission
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11101000 );    // Follower circuit internal ON, Amplifier follower ratio 
Wire.write ( 0b10001000 );    // Display off **************************************
Wire.write ( 0b01110000 );    // Contrast low byte (6) 
Wire.endTransmission(stop);

}
[ DSL @ 31.08.2020. 14:27 ] @
Citat:
jozimir:

Vidim i ja da je u primerima MSB = 0, mada se u tekstu kod slanja niza komandi sugeriše MSB = 1.
Sve je prilično nejasno.

Posmatrajući vaš kod i primer dat u datasheet-u primećujem da u okviru inicijalizacije šaljete
Wire.write ( 0x73 ); // Set contrast low byte
odgovarajući kod u primeru bi bio
I2C_out(0x78);
komanda za kontrast je oblika 0x7X, odnosno ide od 0x70 do 0x7F.

Probajte da tu promenite kontrast.


Probao. Kao sto se da videti iz koda koji mi je Scepa dao, sav opseg ovih nivoa kontrasta je "propitivan". Niti ceprkanje kontrasta niti ostale komande ne prolaze...

Citat:
goran_68:
Probaj da nakon poslednje u nizu komandi pošalješ:


Code:

Wire.endTransmission(stop);



Dakle, ovako bi išao setup

Code:

void setup ()
{
  lcd.init ();
//lcd.setContrast(0);
Wire.begin();                 // Initialise I2C communication as MASTER
Wire.beginTransmission(0x78); // Start I2C Transmission
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11011100 );    // ICON disp on, Booster on, Contrast high byte (2)  
Wire.write ( 0b11101000 );    // Follower circuit internal ON, Amplifier follower ratio 
Wire.write ( 0b10001000 );    // Display off **************************************
Wire.write ( 0b01110000 );    // Contrast low byte (6) 
Wire.endTransmission(stop);

}


Komanda sa (stop) kao parametrom, ne prolazi.
Code:

stop was not declared in this scope



[ DSL @ 31.08.2020. 22:15 ] @
Mali update...

Nakacio sam Bus pirate i sa njim uspešno njakam displej, sve komande prolaze, palim gasim displej i kursor, kontrolišem kontrast...
Sa MCU ovo is nekog razloga ne prolazi. Sta je razlog, ne razaznajem.
Pokusao sam sa BP da snimam sta se dešava na I2C busu ali cenim da je BP prespor da uprati komunikaciju obzirom da mi za jednu te istu sekvencu puštenu sa MCU daje nekonzistentne rezultate capture-inga.
Imam negde logic analyser, moram njega isukati...Nea mi druge...
[ jozimir @ 31.08.2020. 23:49 ] @
U uputstvu za inicijalizaciju kontrolera za I2C komunikaciju data su i vremena koja je potrebno ispoštovati.
Moguće da je tako nešto u pitanju.

Pogledaj priloženu sliku.

Inače interesantno je da se proces inicijalizacije malo razlikuje u zavisnosti od načina komunikacije.
[ DSL @ 01.09.2020. 19:00 ] @
Proces inicijalizacije kod ovog displeja je budibogsnama...

Ne bih nikad nabo sta se desava da nisam nakacio Logic analyzer i upratio/dekodirao sta se desava...

Ovaj kod je proradio:
Code:

#include <Arduino.h>
#include "ST7036.h"
#include <Wire.h>
ST7036 lcd = ST7036 ( 2, 20, 0x78 ); //adresa displeja je 0x78

void setup ()
{
lcd.init ();
Wire.begin();
Wire.beginTransmission(0x3C);
delay(10);
Wire.write (0x08);
Wire.write (0x78);    
Wire.write (0x00);
Wire.write (0x06);      // Entry mode set 
Wire.write (0x38);      //Function set 0
Wire.write (0x39);      //Function set 1
delay(1);
Wire.write (0x00010100);  //Bias set
Wire.write (0b01111000);  //Contrast low byte
Wire.write (0b01011101);  //Booster on/off, Contrast Hi byte
Wire.write (0b01101101);  //Follower circuit internal ON, Amplifier follower ratio
Wire.write (0b00000001);        // Clear the display
Wire.endTransmission();
}

void loop ()
{
lcd.print ("Smor brate ");
delay(1000);
Serial.println ("A");
}


Adresa displeja je 0x78 i samo tu adresu ako stavim, sve funkcionise.
Medjutim, kod slanja komandi za config, prolazi samo adresa 0x3C.
Da meni cudo bude vece... capture vidi samo 0x3C adresu koja se pojavljuje kao odrediste... cak i kad je odrediste evidentno 0x78 (a lcd.init dobija samo tu adresu za slanje) opet se u usnifanom saobracaju vidi 0x3C kao adresa na koju idu komande i na koju se LCD javlja...
Ili ja samo ne poznajem I2C protokol dovoljno...
U svakom slucaju, problem razresen.
Slede sledece nevolje i dozivljaji Macka Tose...
Hvala svima na saradnji!