Forum: Mikrocontroller und Digitale Elektronik OLED Display SSH1106 - u8glib Problem mit I2C


von M. G. (ixil96)


Lesenswert?

Hallo,

ich möchte ein OLED Display (SSH1106) mit I2C Schnittstelle testen
http://www.icstation.com/13in-white-oled-display-module-interface-128x64-arduino-p-10987.html

Ich verwende einen ATMega328 und die AVR u8glib mit der ich bereits 
erfolgreich ein Display mit SPI Schnittstelle zum Laufen gebracht habe.

Nur mit I2C klappt es noch nicht.
Das Display bietet folgende Anschlüsse:
- Vcc
- GND
- SDA
- SCL

Aus der u8glib verwende ich für die Initialisierung:
1
i2c = u8g_InitI2C(&u8g, &u8g_dev_sh1106_128x64_i2c, U8G_I2C_OPT_NONE);

sowie
PB5 für SCL
PB3 für SDA

von Mr D. (Gast)


Lesenswert?

sind die Daten nicht auf 4 ?
Bei mir sind i2c auf A4/A5

Der link zeigt mir eine Verseuchte Seite, btw...

von M. G. (ixil96)


Angehängte Dateien:

Lesenswert?

Wie kann ich die entsprechende Pin-Zuordnung für I2C einstellen?

Standardmäßig ist in der Library PORTA für SCL=Pin4 und SDA=Pin5 
vorgesehen.
Ich verwende den ATMega328, hier gibt es kein PORTA.

Gibt es eine Funktion wo ich z.B. PORTB einstellen kann?

von Einer K. (Gast)


Lesenswert?

Nein!
I2C liegt auf PC4 und PC5

Alternativ: Soft I2C

von M. G. (ixil96)


Lesenswert?

Arduino F. schrieb:
> Nein!
> I2C liegt auf PC4 und PC5
>
> Alternativ: Soft I2C

Ja, Hardware-I2C wäre auf PC4 und PC5.
Die Frage ist, wie ich in der u8glib das PORT für I2C auf z.B. PORTB 
oder PORTC umstellen kann.

Für HW-SPI gäbe es z.B. diese Funktion:
1
u8g_InitSPI(&u8g, &u8g_dev_sh1106_128x64_hw_spi, PN(1, 5), PN(1, 3), PN(1, 2), PN(1, 1), U8G_PIN_NONE);

Als Parameter z.B. PN(1, 5) steht 1 für PORTB und 5 für den Pin.

Diese Parameter kann ich aber für I2C nicht übergeben da sie nicht zur 
Verfügung stehen.
1
i2c = u8g_InitI2C(&u8g, &u8g_dev_sh1106_128x64_i2c, U8G_I2C_OPT_NONE);

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,

SPI ist nicht gleich I2C. Für SPI ist PB4 und PB5 korrekt.

Für I2C musst Du PC4 (SDA) und PC5 (SCL) nehmen. Zusätzlich benötigst Du 
noch zwei Pullup-Widerstände pro Port von ca. 4,7K.

Hier kannst Du zum Thema noch weitere Informationen nachlesen:

https://www.mikrocontroller.net/articles/I²C

Du musst keine Ports in der Lib anpassen, die macht das schon richtig.

Gruß
Frank

: Bearbeitet durch User
von M. G. (ixil96)


Lesenswert?

Frank L. schrieb:

> Für I2C musst Du PC4 (SDA) und PC5 (SCL) nehmen. Zusätzlich benötigst Du
> noch zwei Pullup-Widerstände pro Port von ca. 4,7K.

Vielen Dank Frank! es funktioniert :-)

Gibt es mit der u8glib auch die Möglichkeit die Helligkeit des Displays 
zu steuern?

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,

die Frage ist nicht eindeutig zu beantworten.

1. Ob die Lib das per Funktion unterstützt, kann ich nicht sagen
2. Generell kannst Du falls das Display ein I2C Kommando dafür hat, 
dieses Kommando auch direkt per I2C an das Display übergeben.

Da ich das Display und seine Kommandos nicht kenne, kann ich Dir da 
nicht weiterhelfen.

Gruß
Frank

von M. K. (sylaina)


Lesenswert?

Frank L. schrieb:
> 2. Generell kannst Du falls das Display ein I2C Kommando dafür hat,
> dieses Kommando auch direkt per I2C an das Display übergeben.

Einen Befehl dafür gibt es, erst schickt man dem Display ein 0x81, die 
nachfolgende Zahl stellt dann den Kontrast ein. 0x00 ist minimaler 
Kontrast, 0xff ist maximaler Kontrast.

von Stefan F. (Gast)


Lesenswert?

> Gibt es mit der u8glib auch die Möglichkeit die Helligkeit des
> Displays zu steuern?

Das hatte neulich schon mal jemand gefragt und damals lautete die 
Antwort, daß die Lib dazu eine Funktion enthält.

"helligkeit" wird im Datenblatt "contrast" genannt. Vielleicht hilft 
diese Info.

von M. G. (ixil96)


Lesenswert?

Die Funktion setContrast ist wie folgt beschrieben:

C: uint8_t u8g_SetContrast(u8g_t *u8g, uint8_t contrast)

Description:
Assigns a new contrast value (0..255) to the display. Not all displays 
or driver support the setting of the contrast value (see devices table).

Arguments:
u8g : Pointer to the u8g structure (C interface only).
contrast: New contrast value (0..255).

**Returns:**The value 1, if the contrast value has been assigned.
Use: Inside and outside picture loop. It is a good practice to use this 
procedure not inside the picture loop.
Note: Available with v1.02

Example:
1
contrast = u8g_SetContrast(&u8g, 255);

Wobei ich bei meinem Display leider keine Veränderung bei 
unterschieldlichen Kontrastwerten feststellen konnte.

von M. K. (sylaina)


Angehängte Dateien:

Lesenswert?

M. G. schrieb:
> Wobei ich bei meinem Display leider keine Veränderung bei
> unterschieldlichen Kontrastwerten feststellen konnte.

Wie gesagt, schick dem Display mal den Befehl 0x81 und anschließend 
einen Wert zwischen 0 und 255, das sollte den Kontrast einstellen beim 
SSH1106.

Ich hab mal zur Alternative meine Lib für SSH1106/SSD1306 angehangen, 
vielleicht hilft dir das ja.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.