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 :

[code]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
[/code]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.