forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Atmega8, OLED 4pin, I2c

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR
 
jeremysk
Nováček
Nováček


Založen: 7.3.2020
Příspěvky: 2

PříspěvekZaslal: 07 březen 2020, 20:21    Předmět: Atmega8, OLED 4pin, I2c Citovat

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ť?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 791

PříspěvekZaslal: 07 březen 2020, 23:16    Předmět: Citovat

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 :
  1. Start condition
  2. I2C Slave adresa zařízení s požadovaným stavem R/W
  3. Control byte (0x00) - tedy jestli se bude jednat o data nebo command
  4. vlastní byte
  5. Stop condition


Nastavení pracovní oblasti displeje -
kód:
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 :
kód:
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Ě !!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
jeremysk
Nováček
Nováček


Založen: 7.3.2020
Příspěvky: 2

PříspěvekZaslal: 07 březen 2020, 23:30    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 791

PříspěvekZaslal: 08 březen 2020, 0:36    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2020 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)