Forum: Mikrocontroller und Digitale Elektronik SSD1306 OLED


von Axel (Gast)


Lesenswert?

Hi Zusammen,

Ich probiere mich gerde an einem OLED-Display mit SSD1306 Controller.

Ich versuche diesen an einem Mega8 ans laufen zubekommen und dabei 
bräuchte ich eure Hilfe. Am liebsten hätte ich natürlich die fertig 
vorgekaute Version die ich nurnoch in den µC laden muss.
Die suche im Internet hat für meinen Standpunkt nichts gebracht, da die 
Codes immer für Bascom, Xmegas oder Adurino Geschichten war.

Den Code dann entsprend umzuschreiben, ist mir vorerstnoch zu aufwendig, 
darum frage ich ob jemand von euch schon was lauffähiges hat und dieses 
auf öffendlich machen würde?

Vielen Dank
Axel

von Michael (Gast)


Lesenswert?

Und worauf programmierst du? C ?

http://code.google.com/p/u8glib/

von Axel (Gast)


Lesenswert?

DAS schaut doch sehr viel versprechend. Super!!!

Jupp in C.
Dann kämpfe ich mich da mal durch.

Danke

von Axel (Gast)


Lesenswert?

Hi

HAt auch schon jemand mal was hinbekommen über den I2C bus ?

von Axel (Gast)


Lesenswert?

Hum hum hum...

Richtig durchsteigen tuhe ich da noch nicht.

Habe mir mal das "hello world" Bsp. angeschaut.

Wo genau muss ich den jetzt definieren welches Display ich habe und über 
welche Schnittstelle ich Arbeiten will. Das ist mir leider noch nicht so 
ganz ersichtlich.

Und kann es sein das die Lib's alle in C++ geschrieben sind?

Ich benutze Eclipse und WinAVR und schreibe halt in "normal" C

von Werner (Gast)


Lesenswert?

Axel schrieb:
> Die suche im Internet hat für meinen Standpunkt nichts gebracht

Axel schrieb:
> Und kann es sein das die Lib's alle in C++ geschrieben sind?
> Ich benutze Eclipse und WinAVR und schreibe halt in "normal" C

Dann mußt du dich vielleicht etwas von deinem Standpunkt lösen und die 
Welt mit einem Suchradius >0 betrachten.

von Axel (Gast)


Lesenswert?

Danke, das hilft !

ist ja nicht so dass ich das Problem nicht selber Versuche zu lösen.

von Axel (Gast)


Lesenswert?

So... Ich konnte die Fehler welche beim Compilieren entstehen jetzt 
zumindest schon mal einschränken.

Bin mir aber über dessen Bedeutung nicht so ganz im klaren. Klar die 
Datei passt so überhaupt nicht in den µc, aber wie kommt das überhaupt 
zustande das die so groß ist?

make: *** [OLED.elf] Error
OLED.elf section .text will not fit in region text
region text overflowed by 1300566 bytes



Ein weiteres Problem was ich nicht verstehe. In "sys_init" musste ich
das Schreiben in das Regeister CLKPR auskommentrieren, da der Compiler 
den Namen CLKPR nicht zuordnen kann. Aber diese müsste doch über 
<avr/io.h> definiert sein oder nicht ?
Ansich ist es ja egal ob jetzt mit vollem Systemtakt (16MHz) oder eben 
8-mal langsamer gerechnet wird. Ich Verstehe nur nicht warum er den 
Namen nicht erkennt.


Danke noch mal für eure Hilfe!


Mein Code schaut z.Z. so aus
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3
#include "src/u8g.h"
4
5
6
u8g_t u8g;
7
8
void u8g_setup(void)
9
{  
10
  
11
  /* activate pull-up, set ports to output, init U8glib */  
12
  u8g_SetPinInput(PN(2,5)); u8g_SetPinLevel(PN(2,5), 1); u8g_SetPinOutput(PN(2,5));
13
  u8g_SetPinInput(PN(2,4)); u8g_SetPinLevel(PN(2,4), 1); u8g_SetPinOutput(PN(2,4));
14
  u8g_InitI2C(&u8g, &u8g_dev_ssd1306_128x64_i2c, U8G_I2C_OPT_NONE);
15
  
16
}
17
18
19
void sys_init(void)
20
{
21
#if defined(__AVR__)
22
//CLKPR = 0x00; /* select minimal prescaler (max system speed) */
23
//CLKPR = 0x08; 
24
#endif
25
}
26
27
void draw(void)
28
{
29
  u8g_SetFont(&u8g, u8g_font_6x10);
30
  u8g_DrawStr(&u8g, 0, 15, "Hello World!");
31
}
32
33
34
int main(void)
35
{
36
  sys_init();
37
  u8g_setup();
38
39
  for(;;)
40
  {  
41
    u8g_FirstPage(&u8g);
42
    do
43
    {
44
      draw();
45
    } while ( u8g_NextPage(&u8g) );
46
    u8g_Delay(100);
47
  }
48
  
49
}

von Axel (Gast)


Lesenswert?

keiner eine Idee zur Fehlermeldung bzw zu dessen Beseitigung ?
1
make: *** [OLED.elf] Error
2
OLED.elf section .text will not fit in region text
3
region text overflowed by 1300566 bytes

von u8glib (Gast)


Lesenswert?

Siehe hier: http://code.google.com/p/u8glib/wiki/avr

U8glib braucht ein paar spezielle Optionen:
        -ffunction-sections
        -fdata-sections
        -Wl,--gc-sections

Eine bebilderte Schritt für Schritt Anleitung habe ich auch hier 
abgelegt:
http://code.google.com/p/m2tklib/wiki/as6

Grüße,
Oliver

von Axel (Gast)


Lesenswert?

Danke schön,

Jetzt klappt zumindest schon mal die erzeugung des Code's.
Allerdings bin ich schon ziemlich frustriert weil ich nichts 
zusammenhängendes finde bezügllich des Displayanschlusses und ich habe 
mir schon die Augen wund gelesen.

über 4 Seiten habe ich mir jetzt folgendes zusammen gereimt.

Display ini

 u8g_InitSPI(&u8g, &u8g_dev_ssd1306_128x64_sw_spi , PN(2, 5), PN(2, 3), 
PN(2, 2), PN(2, 1), U8G_PIN_NONE);


Das Display selber ist wie folgt angeschlossen

Display - Mega8

SDIN - PB1 (OC1A)
SCLK - PB2 (SS)
RS - PB3 (MOSI)
CS - PB4 (MISO)
RES - PB5(SCK)

natrülich passiert nichts. Währe super wenn jemand meiner wenigkeit da 
helfen könnte. ICh bin anscheinend zu B**d um das Große Ganze zu sehen 
=/

von u8glib (Gast)


Lesenswert?

Hi

4 Seiten?
Naja, ich versuche es mal mit den wesentlichen Informationen:
http://code.google.com/p/u8glib/wiki/avr:
"port-number: 0 for PORTA, 1 for PORTB, 2 for PORTC."
Also, ich vermute Du wolltest PN(1, 5), PN(1, 3), ... schreiben (PORT 
B!)

Die Pin-Zuordnung verstehe ich auch nicht ganz.
Von der gleichen Wiki-Seite:
u8g_InitSPI(u8g_t *u8g, u8g_dev_t *dev, uint8_t sck, uint8_t mosi, 
uint8_t cs, uint8_t a0, uint8_t reset);

D.h. wenn Du die SCK Leitung deines Displays an PB2 (PN(1,2)) 
angeschlossen hast, lautet das dritte Argument:
u8g_InitSPI(&u8g, ..., PN(1,2), ...
Wenn Du die MOSI (=SDIN) Leitung deines Displays an PB1 angeschlossen 
hast, lautet das vierte Argument
u8g_InitSPI(&u8g, ..., PN(1,2), PN(1,1)...
u.s.w.
Die "Register-Select-Leitung" (RS) ist wird oft auch A0 genannt (steht 
aber auch auf dem Wiki)

Wenn die Reset Leitung mit dem uC verbunden ist, sollte diese übrigens 
das letzte Argument des u8g_InitSPI Befehls sein.

Grüße,
Oliver

von Axel (Gast)


Angehängte Dateien:

Lesenswert?

Hi Zusammen,

leider komme ich erst jetzt dazu mal wieder meinem Hobby 
nachzugenen..."Hier irrt der Leser, wenn er denkt Studenten hätten viel 
Zeit" :P

Wie dem auch Sei, erstmal Danke für die Hilfe! Läuft nämlich jetzt !!


Nun kommt mir aber ne andere Frage. Da ich meinen Mega8 (später Mega 
168) mit 16/20MHz laufen lassen will, muss ich zwangsläuftig diesen mit 
5V versorgen.
Die "Logikspannung" des SSD1306 Chips darf aber nur max. 3,3V haben.
Das würde dann ja heißen, dass ich die 5V Signale vom AVR vermutlich 
nicht direkt einspeisen kann.

Das Datenblatt des SSD1306 sagt mir:

Vdd = 3,3V

High Logik Inputlevel

Min: 0,9*Vdd
Typ: -
Max: -

Toll was kann ich den mit dieser Aussage den nun anfangen ?!

Währe Super wenn mir einer da helfen könnte. Und wenn ich doch 3,3V 
nehmen muss? Mache ich das dann mit einem einfachem Spannungsteiler oder 
brauche ich nen "spezial" IC der die Pegel anpasst?

Grüße
Axel

von Bernd O. (bitshifter)


Lesenswert?

Axel schrieb:

Hallo Axel,

> Das Datenblatt des SSD1306 sagt mir:
>
> Vdd = 3,3V
>
> High Logik Inputlevel
>
> Min: 0,9*Vdd
> Typ: -
> Max: -
>
> Toll was kann ich den mit dieser Aussage den nun anfangen ?!
Das bedeutet, dass die Spannung an einem Eingang größer als 0,9 * Vdd, 
also größer als 0,9 * 3,3V = 2,97V sein muß um von Displaycontroller 
sicher als "High" erkannt zu werden.

Meist ist hier noch etwas mehr "Luft" und auch kleinere Spannungen 
werden als "High" erkannt, aber das kann sich dann schnell ändern, wenn 
die Versorgungsspannung etwas kleiner oder größer wird, sich die 
Temperatur ändert, wenn (fiktiv) die interne Ladungspumpe aktiviert 
wird, wenn eine neue Bestellung aus China eintrifft bei der der 
Halbleiterhersteller gewechselt wurde, etc.

=> Für ein gutes und robustes Design muß sichergestellt sein, dass ein 
High immer Spannungen größer als 2,97 V bei 3,3V Versorgung ist. Für 
private Basteleien ist das natürlich nicht so kritisch - für 
professionelle (kommerzielle) Produkte aber unerlässlich.

> Und wenn ich doch 3,3V nehmen muss?
Musst Du.

> Mache ich das dann mit einem einfachem Spannungsteiler oder
> brauche ich nen "spezial" IC der die Pegel anpasst?
Ein einfacher Spannungsteiler reicht völlig aus, da Du ja nur von 5V -> 
3,3V wandeln musst, da der Displaycontroller bei SPI nicht gelesen 
werden muß (unidirektionale Kommunikation). Alternativ gehen natürlich 
auch Pegelwandler wie der CD4050 (wird z.B. von Adafruit verwendet. Ich 
würde aber auch einfach Spannungsteiler verwenden - das sollte keine 
Probleme machen und der Atmel liefert ja im Zweifelsfall auch ordentlich 
Strom um auch etwas niederohmigere Spannungsteiler zu treiben wenn's in 
den MHz-Bereich geht. Für I2C gibt's einfache Schaltungen mit 
Low-Power-Mosfets. Steht aber (fast) alles auch hier:
http://www.mikrocontroller.net/articles/Pegelwandler


Viel Erfolg,

Bernd

von Bernd O. (bitshifter)


Lesenswert?

Bernd O. schrieb:
> Axel schrieb:
>> Das Datenblatt des SSD1306 sagt mir:
>>
>> Vdd = 3,3V
>>
>> High Logik Inputlevel
>>
>> Min: 0,9*Vdd
>> Typ: -
>> Max: -
Hallo Axel,

ich habe mir gerade noch schnell Dein Datenblatt angesehen, weil 90 % 
doch ungewöhnlich hoch wären.

Des Rätsels Lösung ist:
Es sind die üblichen 80 %:
High Logik Input level
Min: 0,8*Vdd
Typ: -
Max: -

Der Wert mit 90% ist der High Logic Output Level. Das bedeutet, dass 
die Ausgangsspannung des Displaycontrollers garantiert 90 % der 
Versorgungsspannung ist wenn der Ausgang nicht stärker als mit 100 uA 
belastet wird.


Gruß,

Bernd

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.