Stránka 1 z 2

Displej s I2C rozhraním

Napsal: 19 lis 2015, 09:56
od viki
Dobrý den,
snažím se připojit displej SIC1602AYPLEB20c s I2C rozhraním k Raspberry Pi 2 a obsluhovat ho z Pythonu 3.
K displeji jsem připojil 5V, GND. SCL a SDA jsem s Raspberry propojil přes převodník logických úrovní.
V dokumentaci k displeji je napsáno:
Dvouřádkové displeje se obsluhují pomocí řadiče PCF2116. Jeho adresa na I2C sběrnici
je 0x74. Displej se bude inicializovat jako 4 řádkový:
start, I2C adresa 0x74, 00000000, 00100110, 00001110, 00000110 (binárně), stop
Poté by se již měl objevit kurzor a znaky zaslané na displej po I2C sběrnici se zobrazí.
Řadič používá znakovou sadu C, oproti displejům s řadičem HD44780 mají znaky
abecedy nejvyšší bit jedničkový, jejich kód je o 0x80 vyšší.


Mě se v raspberry displej hlásí jako 0x3a.

V pythonu jsem zkoušel nějaký takový kód, ale skončil chybou, nevím jak správně data napsat a poslat do displeje.

Kód: Vybrat vše

import smbus
bus = smbus.SMBus(1)
bus.write_byte_data(0x3a, 00000000, 00100110, 00001110, 00000110)
Předem díky za radu

Re: Displej s I2C rozhraním

Napsal: 19 lis 2015, 11:39
od micer
Neznám Raspberry Pi a se syntaxí neporadím, ale připadá mi zajímavé, že adresa displeje podle dokumentace je 0x74 = 01110100 a hlásí se adresou 0x3A = 00111010 .... což vypadá jako posunuté o jeden bit vpravo.

Re: Displej s I2C rozhraním

Napsal: 19 lis 2015, 14:56
od viki
Taky mi to přišlo divné ale prozatím mám problém se syntaxí v Pythonu. :-)

Re: Displej s I2C rozhraním

Napsal: 19 lis 2015, 15:04
od viki
Tak podle všeho Raspberry zobrazuje adresy jako sedmi bitové. Ignoruje jeden bit, viz text z nějaké příručky:
sudo i2cdetect -y 1

The 7 bit I2C address of all found devices will be shown (ignoring the R/W bit, so I2C address 0000 0110 is displayed as hex 03).

Re: Displej s I2C rozhraním

Napsal: 28 lis 2015, 10:58
od viki
Je tu někdo kdo by měl alspoň nějaký nápad na vyzkoušení ? Abych displej nějak rozjel?

Re: Displej s I2C rozhraním

Napsal: 28 lis 2015, 14:21
od gilhad
Rozhodne bych to zkusil i s tou puvodni adresou 0x74 bez ohledu na to, ze se to ukazuje jako polovicni hodnota, tedy

Kód: Vybrat vše

import smbus
bus = smbus.SMBus(1)
bus.write_byte_data(0x74, 00000000, 00100110, 00001110, 00000110)
Pri nejhorsim posles data neeistujicimu zarizeni, pri nejlepsim to bude fungovat spravne

Re: Displej s I2C rozhraním

Napsal: 28 lis 2015, 16:34
od viki
Když zkusím dát adresu 0x74 tak to skončí chybou input/output error, s adresou 0x3a to tuhle chybu nevyhodí.
bus.write_byte_data(0x74, 00000000, 00100110, 00001110, 00000110) taky neprojde, skončí chybou tekes exactly 3 arguments (5 given)
Jediné co neskončí chybou je:

Kód: Vybrat vše

import smbus

bus = smbus.SMBus(1)
address = 0x3a

bus.write_byte(address, 0x00)
bus.write_byte(address, 0x62)
bus.write_byte(address, 0x0e)
bus.write_byte(address, 0x06)

bus.write_byte(address, 0x0b)
Na displeji se ale nic neobjeví, ani kurzor ani znak 0x0b.

Re: Displej s I2C rozhraním

Napsal: 17 pro 2015, 22:27
od petr
Během minulého týdne jsem řešil připojení tohoto displeje k Raspberry a jeho obsluhu pomocí C++ a knihovny WiringPi.

Adresa displeje je opravdu 0x3a a I2C je tedy třeba inicializovat s touto adresou.

Dále je třeba vždy zvolit registr, do kterého budeme zapisovat. 0x00 pro nastavení displeje, 0x40 pro zápis znaků k zobrazení na displeji.

Pro inspiraci přikládám kód v C++ za použití knihovny WiringPi.

Kód: Vybrat vše

// Inicializace I2C na adrese 0x3a
xio = wiringPiI2CSetup(0x3a);

// Nastavení LCD displeje - zobrazí se kurzor
wiringPiI2CWriteReg8(xio, 0x00, 0x26);
wiringPiI2CWriteReg8(xio, 0x00, 0x0e);
wiringPiI2CWriteReg8(xio, 0x00, 0x06);

// Výpis slova "Hello"
wiringPiI2CWriteReg8(xio, 0x40, 'H' + 128) ;
wiringPiI2CWriteReg8(xio, 0x40, 'E' + 128) ;
wiringPiI2CWriteReg8(xio, 0x40, 'L' + 128) ;
wiringPiI2CWriteReg8(xio, 0x40, 'L' + 128) ;
wiringPiI2CWriteReg8(xio, 0x40, 'O' + 128) ;


Re: Displej s I2C rozhraním

Napsal: 17 pro 2015, 23:40
od DavidO
Funkce write_byte_data má tři parametry, první je adresa, druhý je cmd a třetí jsou jednobytová data. Ve skutečnosti to pošle dva byty na danou adresu (první se chápe jako příkaz, druhý jako data, typicky první byte znamená číslo registru a druhý byte obsah, co tam chci zapsat). Větší bloky dat se posílají přes write_block_data anebo write_i2c_block_data.

K těm 7 a 8 bitům, resp. 0x3A versus 0x74:
V základním režimu se na i2c používají sedmibitové adresy, které jsou do prvního vysílaného bytu doplněny ještě bitem read/write (1=read, 0=write). A tenhle bit je poslední, tedy nejdřív jde 7 bitů adresy (od nejvýznamnějšího po nejméně) a pak tenhle osmý:
ObrázekObrázek
Takže celkem celý první byte na první pohled vypadá jako 2x větší číslo a možná o jedničku vyšší (read). V datasheetech i2c obvodů se adresa uvádí obvykle stylem 0111 100 který jasně naznačuje, že to je 7 bitů a navíc zarovnaných doleva (ale taky se to leckde najde jako 0x3A i 0x74, třeba když to někdo vykouká z kódu). Typická chyba je posílat něco a v prvním bytu dát rovnou tu adresu neposunutou o jedno doleva.
Velmi často mají i2c zařízení konfigurovatelnou adresu tak, že první čtyři bity mají pevné a zbylé tři se dají nastavit hardwarově přizemněním pinů.

Jen pro úplnost, je i režim s 10bitovými adresami a ten je ještě zábavnější: v prvním bytu se pošle 5bitový prefix označující, že se bude adresovat 10bitově, první dva bity z desetibitové adresy a read/write bit. Ve druhém byte se pošle zbylých 8 bitů z desetibitové adresy.

Čtení na víkend (s obrázkama): I2C Bus Specification a I2C Manual.

Re: Displej s I2C rozhraním

Napsal: 17 pro 2015, 23:54
od DavidO
protože
viki píše: start, I2C adresa 0x74, 00000000, 00100110, 00001110, 00000110 (binárně), stop
tak bych řekl, že se to má psát ne
viki píše:

Kód: Vybrat vše

bus.write_byte_data(0x3a, 00000000, 00100110, 00001110, 00000110)
ale spíš

Kód: Vybrat vše

bus.write_i2c_block_data(0x3a, 0b00000000, [0b00100110, 0b00001110, 0b00000110])
Nejsem pythonista, tak to třeba není ono, ber mě s rezevou ;) ale ta adresa pro volání těchhle funkcí má být zarovnaná doprava (o ten jeden bit doleva ji shiftne a read/write bit přilepí knihovna)
(to modrý totiž je to, co leze po sběrnici, ne to, co předáváš nějaké knihovní funkci)