Tag allerseits
Ich versuche gerade ein OLED Display mit einem SSD1305 Controller
anzusteuern, habe gesucht, ob ich vielleicht eine fertige C lib für
String und Bildausgabe finde. Ist aber alles kostenpflichtig
Hat jemand von euch schon was damit gemacht?
hm mit ARM kenn ich mich eig überhaupt niad aus, habe zwar einen
rumliegen, aber hab nie was damit gemacht ich habe nen avr at90can128.
und ein pictiva 128x64 2.7" von OSRAM damit gehts, ich habs nach dieser
anleitung oder beispiel gemacht und es ging, hab dann die funktionen ein
wenig erweitert.
aber du verwendest ja erstens mal einen anderen Controller-IC vom
display, das kann schon wieder ganz anders sein.
aber da steht doch bestimmt im datenblatt so eine art initialisierung
wie du schon gemacht hast,
wenn gar nix geht (nicht mal ein blinken oder irgendwas) tippe ich erst
mal auf einen Verdrahtungsfehler
servus martin!!!!!
Ok, den ersten Layout Fehler hätte ich gefunden. Der Stecker war um 1Pin
verschoben, dies hat dazu geführt, dass VCOMH 15V gesehen hat.
Zudem hab ich von paralleler Ansteuerung auf I2C gewechselt, leider
kommt kein Acknoledge zurück, hab nun mal ein Ersatzdisplay bestellt.
Um aber nichts unversucht zu lassen, hier mal die I2C Ansteuerung
Hallo!
Vielleicht eine Hilfe. Ich habe gerade einen ersten Erfolg erzielt mit
Atmega8 auf SDD1305 mittels I2C. Ich hoffe, es stimmt, was ich erzähle,
aber immerhin sehe ich was am Display. Allerdings kenne ich mit mit dem
ARM nicht aus, aber was ich gesehen habe, hast du eine Reihe von
send_command()-Befehlen, die ich ziemlich gleich verwende:
sendCommand(0x00); /* Set Lower Column Address
*/
sendCommand(0x10); /* Set Higher Column
Address*/
sendCommand(0x40); /* Set Display Start Line
*/
sendCommand(0x81); /* Set Contrast Control */
sendCommand(0x30); /* 0 ~ 127 */
sendCommand(0xA0); /* [A0]:column address 0 is
*/
sendCommand(0xC8); /* oben / unten */
sendCommand(0xA4); /* A4=ON */
sendCommand(0xA6); /* Normal Display*/
sendCommand(0xA8); /* Set Multiplex Ratio */
sendCommand(0x3f);
sendCommand(0xAD); /* Set DC-DC */
sendCommand(0x8E); /* 8B=ON, 8A=Off */
sendCommand(0xAF); /* AF=ON , AE=OFF*/
sendCommand(0xD3); /* Set Display Offset */
sendCommand(0x00); /* No offset */
sendCommand(0xD5); /* Set Clock Divide */
sendCommand(0x61); /* Set to 80Hz */
sendCommand(0xD8); /* Set Area Color On or Off
*/
sendCommand(0x00); /* Mono Mode */
sendCommand(0xDA); /* Set Pins Hardware */
sendCommand(0x12);
sendCommand(0xDB); /* Set VCOMH */
sendCommand(0x00);
sendCommand(0xD9); /* Set VP */
sendCommand(0x22); /* P1=2 , P2=2 */
Allerdings sieht es bei mir so aus:
write_command (0x00); //set low column address
write_command (0x10); //set high column address
write_command (0x40); //display start set
write_command (0x20); //stop horizontal scroll, changed from 0x2e
write_command (0xb0); //page address
write_command2(0x81,0x7f); //set contrast control register
write_command2(0x82,0x7f); //set brightness register
write_command (0xa1); //set sement re-map
write_command (0xa4); //normal display mode
write_command (0xa6); //set normal/reverse display
write_command2(0xa8,0x3f); //set multiplex ratio
write_command2(0xd3,0x00); //set display offset
write_command2(0xad,0x8e); //set dc-dc on/off
write_command (0xc8); //set com output scan direction
write_command2(0xd5,0xf0); //set display clock divide
ratio/orcillator/frequency
write_command2(0xd8,0x05); //set area color mode on/off & low power
display mode
write_command2(0xd9,0xc2); //set pre-charge period
write_command2(0xda,0x12); //set com pins hardware configuration
write_command2(0xdb,0x08); //set vcom deselect level
Dabei werden diese Routinen verwendet:
void write_command(unsigned char command)
{
unsigned char address=OLED_write;
char test;
test = i2c_start(address);
test = i2c_write(0x80);
test = i2c_write(command);
i2c_stop();
}
void write_command2(unsigned char command,unsigned char data)
{
unsigned char address=OLED_write;
char test;
test = i2c_start(address);
test = i2c_write(0xC0);
test = i2c_write(command);
test = i2c_write(data);
i2c_stop();
}
Was ich damit sagen will, ich glaube, dass man Kommandos, die ein
Zusatzbyte haben, anders schicken muss, als solche ohne Zusatzbyte. Z.B.
verlangt das Kommando 0x81 (set contrast) danach ein Byte mit dem
Kontrastlevel. In diesem Fall muss ich beim Controlbyte statt 0x80 ein
0xC0 nehmen.
Allerdings weiss ich noch nicht, wie man Kommandos mit 2 oder mehr Bytes
übertrage, das kriege ich momentan nicht hin.
Schönen Guten Abend,
auch wenn das hier schon etwas älter is, versuche ich es mal. Es braucht
ja immer gleich einen neuen Thread.
Also ich hab ein Display mit dem gleichen Controller und nach den ersten
Hindernissen wie die 100ms nach dem Reset vergessen, konnte ich es
konfigurieren.
Achso ich nutze auch den I2C zur Kommunikation mit dem Display.
Jetzt hab ich aber das Problem, dass ich rein garnichts auf das Display
bekomme. Nur der Datenmüll der im Speicher steht. Meine Vorgehensweise
bis jetzt.
Ich Starte den I2C, dann Adresse mit write bit.
Kontrollbyte 0x40 für daten
dann die Daten z.B 0x00 in einer while um alle pixel dunkel zu haben
aber nichts passiert.
Hat jemand vielleicht eine Idee, was ich falsch mache?
Schon mal vielen Dank und einen schönen Abend
Hallo
Setzt Du denn vorher auch die korrekte RAM-Adresse? Eigentlich sollte
die Sequenz auf dem I2C Bus etwa so sein:
0x00 command mode
0x00 lower col
0x10 higher col
0x40 data mode
jetzt kommen erst die Pixel Daten. Es kann auch durchaus sein, dass noch
weitere initalisierungen notwendig sind.
Wenn der SSD1305 kompatibel zum SSD1306 ist (ich meine der SSD1305 war
der Vorgänger), dann könnte ggf U8glib funktionieren.
Oliver
Hallo,
vielen Dank für deine Antwort.
Bekomme leider immer noch nichts aufs Display.
Ich hab bestimmt irgendwo noch nen Denkfehler drin.
Könnte vielleicht jemand mal ein Beispiel vorstellen, wie einen Pixel
oder auch mehrere einschalten kann.
Vielen Dank nochmal und schönes Wochenende!
Gruß Andi
Hallo, hab vor kurzen auch einen Display mit diesem Controller
erstanden.
Würde mich für eine kurze Hilfestellung zum Start interessieren!
Also wenn jemand ein Stück Code posten könnte, wär das echt super!
Gruß Denis