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
DAS schaut doch sehr viel versprechend. Super!!! Jupp in C. Dann kämpfe ich mich da mal durch. Danke
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
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.
Danke, das hilft ! ist ja nicht so dass ich das Problem nicht selber Versuche zu lösen.
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 | }
|
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 |
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
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 =/
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.