Atmega8, OLED 4pin, I2c

Ahoj,

Mám Atmega8 s externým 16Mhz krystálom. K nemu mám OLED 1.3 mono display pripojený cez I2c (SDA,SDL).
Oled má 4 piny, VCC,GND, SDL a SDA.
SDA a SDL má ešte externé rezistory 2k2 pripojené na 5V.
I2c komunikácie mi beží v poriadku, problém však je s vykreslovaním. Nedarí sa mi urobiť clear screen.
Mám nastavení Horizontal address mode:

ldi r16,SET_MEMORY_ADDR_MODE ; Command 20h
rcall i2c_write_byte
ldi r16,HORIZONTAL_ADDRESSING_MODE ; and Set Horizonatl -> 00h
rcall i2c_write_byte 

Nastavené začiatok a koniec obrazovky:

ldi r16,SET_COLUMN_ADDRESS ; Set Working Area
rcall i2c_write_byte
ldi r16,0 ; Columns 0 - 127
rcall i2c_write_byte
ldi r16,127
rcall i2c_write_byte
ldi r16,SET_PAGE_ADDRESS
rcall i2c_write_byte
ldi r16,0 ; Rows (Pages) 0 - 7
rcall i2c_write_byte
ldi r16,7
rcall i2c_write_byte

potom posielam dáta “0” ale nikdy mi to nezmaže celú obrazovku, tak max. jednu PAGE0.

Neviete my s tímto poradiť?

Předpokládám, že se jedná o OLED displej s řadičem SSD1306.

Vzhledem k tomu, že jsi sem nedal výpis funkce i2c_write_byte, pak předpokládám, že start condition a stop condition řeší právě tahle funkce. To sice zajišťuje přenos dat, ale ne komunikaci s displejem.

Jedna tuhle funkci musíš rozdělit na odesílání Data nebo Command.

I2C komunikaci s displejem (funkci SendCommand) mám vyřešenou takhle :]Start condition/:m]
]I2C Slave adresa zařízení s požadovaným stavem R/W/:m]
]Control byte (0x00) - tedy jestli se bude jednat o data nebo command/:m]
]vlastní byte/:m]
]Stop condition/:m]

Nastavení pracovní oblasti displeje -

ldi r16,SET_COLUMN_ADDRESS ; Set Working Area
rcall i2c_write_byte
ldi r16,0 ; Columns 0 - 127
rcall i2c_write_byte
ldi r16,127
rcall i2c_write_byte
ldi r16,SET_PAGE_ADDRESS
rcall i2c_write_byte
ldi r16,0 ; Rows (Pages) 0 - 7
rcall i2c_write_byte
ldi r16,7
rcall i2c_write_byte

by mělo vypadat nějak takto :

ldi r16,SET_COLUMN_ADDRESS
rcall i2c_write_Command
ldi r16,0x00
rcall i2c_write_Command
ldi r16,0x7F
rcall i2c_write_Command

ldi r16,SET_PAGE_ADDRESS
rcall i2c_write_Command
ldi r16,0x00
rcall i2c_write_Command
ldi r16,0x07
rcall i2c_write_Command

Funkce i2c_write_Command musí nejenom odesílat hodnotu z r16, ale zajišťovat to, co jsem popisoval pro funkci SendCommand.

Jak píšu každýmu. Je potřeba číst datasheety - a to PEČLIVĚ !!!

Dakujem, ale vyzera to skor na to ze u OLED 1.3 palce je iny radic a to SH1106, takze asi budu aj nejake rozdiely v commandoch.

Skusal som to a podla mna netreba pre kazdy command alebo data I2c start a i2c stop. Pekne som mazal riadok - PAGE >

I2c start
I2c byte data ; 40h - data
i2c byte 00h
i2c byte 00h
.
.
.

A vyzera ze to funguje.
Nasudujem SH1106 a vyskusam. Dam info co a ako.

Nemas nahodou skusenosti s SH1106?

S řadičem SH1106 jsem se zatím nesetkal. Z toho, co píšeš, tak data posílám stejně jako Ty, ale Command funkci mám psanou kvůli univerzálnosti tak, jak jsem popisoval výše. Podle datasheetu jsou mezi těmito řadiči rozdíly v příkazech, ale komunikace jako taková je popisována shodně. Mě překvapuje, že po start condition posíláš rovnou control byte. Předpokládám, že jako první posíláš address byte a pak teprve control byte a že jsi to sem zapomněl napsat. Podle datasheetu má displej Set page address a Column address se nastavuje na dvakrát. Kromě toho jsem v datasheetu SH1106 nenašel příkaz pro Set working area, na který jsi se ptal. Jestli jsem datasheet správně pochopil, pak při zápisu dat do RAM zapisuješ pouze do aktuální stránky (page) a dochází k automatické inkrementaci adresy, ale pouze v rámci stránky. I podle toho, co jsi psal, to tak vypadá. Jakmile tedy zapíšeš všech 128 bytů, musíš přepnout stránku. Abys tedy smazal displej musíš zapsat 8x128 bytů po stránkách podobně jako u řadiče KS0108.

Ano 1.3’ pouziva iny (starsi? Sh1160) radic ako 0,96’ (sh1306) . Takze ak sa pouzije kniznica z 0.96 nefunguje mazanie. Este su tam rozdielyv adresovani ale pokial sa nepise program pre oba displeje tak je to zanedbatelne.

Upravu programu aby to mazalo mate vysie. Niekde mam kniznicu pre oba displeje v Cku.

A bacha na niektorych displejoch 1,3’ chyba kondik 100n na stabilizatore, potom moze zamrzat displej…