Displej s I2C rozhraním

viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Displej s I2C rozhraním

Příspěvek 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
micer
Příspěvky: 180
Registrován: 12 čer 2014, 19:14

Re: Displej s I2C rozhraním

Příspěvek 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.
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Displej s I2C rozhraním

Příspěvek od viki »

Taky mi to přišlo divné ale prozatím mám problém se syntaxí v Pythonu. :-)
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Displej s I2C rozhraním

Příspěvek 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).
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Displej s I2C rozhraním

Příspěvek od viki »

Je tu někdo kdo by měl alspoň nějaký nápad na vyzkoušení ? Abych displej nějak rozjel?
Uživatelský avatar
gilhad
Příspěvky: 262
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Displej s I2C rozhraním

Příspěvek 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
viki
Příspěvky: 42
Registrován: 14 pro 2013, 22:23

Re: Displej s I2C rozhraním

Příspěvek 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.
petr

Re: Displej s I2C rozhraním

Příspěvek 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) ;

DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Displej s I2C rozhraním

Příspěvek 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.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Displej s I2C rozhraním

Příspěvek 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)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Odpovědět