Hallo,
ich versuche ein 128*64 SSD1306 Distplay mit einem MSP430G2553 über
Hardware I2C zum laufen zu bekommen. Leider bleibt das Display schwarz.
Hat jemand einen Minimalcode (z.B. das Display leuchtet komplett auf)?
Ist mein erster Versuch mit I2C und "aus dem Nichts" schaffe ich es
nicht, weil ich nicht weiß wo der Fehler liegt.
Was sagt denn Tante Guschel?
http://xdec.de/msp430-oled-display-ssd1306-128x64/
Für I2C und SPI gibt es Beispiele direkt von TI. Da werden zwei
Launchpads verbunden. Du bekommst den Master und den Slave Code.
Da die I2C-Client-Seite für die Anwendung völlig uninteressant ist, ist
das eine unnötige Baustelle.
Einfacher ist es, ein I2C-EEPROM wie z.B. ein 24C02 anzusteuern. Das
reicht, um die ersten Klippen bei der I2C-Programmierung auf dem MSP430
zu umschiffen.
Rufus Τ. Firefly schrieb:> ist> das eine unnötige Baustelle
Du bekommst lauffähigen und von Tausenden erfolgreich genutzten Code.
Das ist keine Baustelle, sondern ein gutes und erprobtes Werkzeug. :-P
Der Vorteil: Du kannst den Master und/oder den Slave debuggen. Luxus
pur!
Ich versuche es jetzt Schritt für Schritt mit Breakpoints und Register
lesen (z.B. Nack oder nicht). Versuche mich eng am Family User's Guide
zu orientieren. Hier mein derzeitiger Code:
1
#include<msp430.h>
2
3
voidmain(void){
4
WDTCTL=WDTPW+WDTHOLD;
5
6
DCOCTL=CALDCO_1MHZ;
7
BCSCTL1=CALBC1_1MHZ;
8
9
// Configure Pins for I2C
10
P1SEL|=BIT6+BIT7;// Pin init
11
P1SEL2|=BIT6+BIT7;// Pin init
12
13
14
UCB0CTL0=UCMODE_3+UCMST+UCSYNC;
15
UCB0CTL1=UCSWRST+UCSSEL_2+UCTR+UCTXSTT;
16
UCB0I2CSA=0x3C;// address
17
UCB0BR0=0x14;// < 100 kHz
18
UCB0I2CIE=UCNACKIE;
19
20
UCB0CTL1&=~UCSWRST;
21
IE2|=UCB0TXIE;
22
23
24
_delay_cycles(1000000);
25
26
27
while(1);
28
}
Funktioniert soweit halbwegs. Die Adresse ist korrekt, bei falscher
Adresse gibt es einen Nack. Mein Problem ist jetzt, dass laut Seite 471
UCB0TXIFG gesetzt werden müsste, das passiert allerdings nicht. Zu
diesem Zeitpunkt (nach dem delay) wird SCL auf low gehalten, es liegt
kein Nack vor und der entsprechende Interrupt ist enabled.
Wenn du mit Codebeispielen die Libary von TI meinst, ja. Damit hab ich
irgendwann den Interrupt zum laufen bekommen. Leider scheint der
Interrupt Flag nicht zu clearen, obwohl das im User's Guide steht.
H. D. schrieb:> Wenn du mit Codebeispielen die Libary von TI meinst, ja.
Nein, "die Libary von TI" meine ich nicht. Sondern die Sammlung von
kleinen Programmen, die die verschiedenen Peripheriemodule ansteuern,
und die es für die unterschiedlichen Familen der MSP430-Reihe gibt.
Das hier sind die Codebeispiele für msp430x2xxx:
http://www.ti.com/lit/zip/slac485
Hier (neben anderen) diese Beispiele
1
msp430g2xx3_uscib0_i2c_01.c USCI_B0 I2C Master to TMP100, Set P1.0 if Temp > 28C
2
msp430g2xx3_uscib0_i2c_02.c USCI_B0 I2C Master Interface to PCF8574, Read/Write
3
msp430g2xx3_uscib0_i2c_03.c USCI_B0 I2C Master Interface to DAC8571, Write
H. D. schrieb:> Leider scheint der> Interrupt Flag nicht zu clearen, obwohl das im User's Guide steht.
Was steht im F U G und wie hast du das umgesetzt?
Ant schrieb:> Genau, writing to ...> Also steht es nach jeder Übertragung sofort wieder an. Wo in deinem> Programm erwartest du ein gelöschtes Flag?
Z.B. nach
UCBxTXIFG sollte gesetzt sein, wenn der MSP430 ein neues Zeichen
annehmen kann. Wenn er gerade mit Senden beschäftigt ist und kein neues
Zeichen annimmt, ist es nicht gesetzt.
Das lässt sich relativ einfach mittels Interrupt erschlagen. Wenn UCBxIE
(und natürlich GIE) gesetzt sind, wird die ISR aufgerufen, wenn das
nächste Zeichen gesendet werden kann. In der ISR holt man dann das
nächste Zeichen aus dem Sendepuffer und schreibt es in UCBxTXBUF,
fertig.
Max
H. D. schrieb:> Z.B. nach UCB0TXBUF = 0xAF;>> Da beschreibe ich ja UCB0TXBUF.
Hast du danach einen Breakpoint gesetzt? Denn das Byte ist schnell
gesendet und Flag schnell wieder gehisst. ;-)
Ja, für die Zeile und die Zeile danach mit einen delay cycle.
Mit dem TI Beispielcode konnte ich jetzt zumindest irgendetwas anzeigen
lassen, obwohl das noch totaler Quatsch ist. Mit Mülloutput kann man
aber mehr anfangen als mit gar nichts ...
Ich hänge mal wieder. Zumindest bekomme ich das Display jetzt vernünftig
initialisiert. Ohne die Zeile
1
printC(Mod,3);
zeigt das Display den Inhalt des RAM an, mit der Zeile (es soll einfach
nur nach einer Sekunde (siehe Delay) die Ausgabe invertiert werden)
bleibt das Display von Anfang an schwarz. Hat jemand eine Idee warum?
H. D. schrieb:> _delay_cycles(8000000);
Zeig doch einmal den Prototyp der Funktion. Steht in der .h Datei.
Die Spielerei mit dem LPM wirkt sehr konfus. Versuch erst ohne
auszukommen.
Ant schrieb:> H. D. schrieb:>> _delay_cycles(8000000);>> Zeig doch einmal den Prototyp der Funktion. Steht in der .h Datei.>> Die Spielerei mit dem LPM wirkt sehr konfus. Versuch erst ohne> auszukommen.
Konnte ich nicht finden.
http://www.ece.utep.edu/courses/web3376/Links_files/msp430g2553.h
Die Funktion ist so immer schon vorhanden.
Ich werd mal den LPM rauswerfen, aber ich denke nicht, dass das etwas
bringt.
H. D. schrieb:> Konnte ich nicht finden.
Du hast auf Deinem Computer einen Compiler installiert. Der kommt mit
'ner Latte von Headerdateien, und in denen musst Du suchen. Das Werkzeug
der Wahl heißt grep oder findstr (letzteres unter Windows).
In der einen controllerspezifischen Datei (die Du da als Link angegeben
hast) steht das natürlich nicht drin.
Ansonsten wird Dein Compiler über Dokumentation verfügen.
slau132j.pdf
The __delay_cycle Intrinsic
The __delay_cycles intrinsic inserts code to consume precisely the
number of specified cycles with no side effects. The number of cycles
delayed must be a compile-time constant.
H. D. schrieb:> ich versuche ein 128*64 SSD1306 Distplay mit einem MSP430G2553 über> Hardware I2C zum laufen zu bekommen. Leider bleibt das Display schwarz.
Hi
jetzt hast mich neugierig gemacht.
OT Frage:
Welches Board verwendest Du?
Ich hab auf die schnelle bei R das gefunden:
Artikel-Nr.: TI EXP 430G2
und darin steht,
"Die mitgelieferten MSP430G2553IN20 und MSP430G2452IN20 verfügen über
vorinstallierte Beispielprogramme"
Kann man sagen dass der verwendete von Dir der gleiche ist wie der erst
genannte der mitgeliefert wird?
Welches Display verwendest Du mit der SSD1306 Lib, denn es gab mal ein
OLED Grafik Display das Probleme hatte mit der SSD1306 Lib und man
musste einen Mod machen "Adafruit" ..ich hoffe ich finde den Link
nochmal und werde ihn dann pushen.
lg rudi ;-)
R. W. schrieb:> Kann man sagen dass der verwendete von Dir der gleiche ist wie der erst> genannte der mitgeliefert wird?
Wenn er vom 'G2553 redet, dann wird das so sein. Die enthaltenen
"Beispielprogramme" sind nicht relevant, die helfen nur beim allerersten
Inbetriebnehmen des Launchpads, um zu erkennen, daß da etwas lebt (und
die LEDs blinken lässt).
Sobald man ein eigenes Programm in das Flash des Controllers geladen
hat,ist das "Beispielprogramm" weg.
Rufus Τ. Firefly schrieb:> R. W. schrieb:>> Kann man sagen dass der verwendete von Dir der gleiche ist wie der erst>> genannte der mitgeliefert wird?>> Wenn er vom 'G2553 redet, dann wird das so sein.
Danke Rufus.
"MSP430G2553IN20"
kannst Du mir noch ergänzen was das IN20 bedeutet.
Dies wird mein erster Kontakt mit TI ;-) daher.
> Die enthaltenen> "Beispielprogramme" sind nicht relevant, die helfen nur beim allerersten> Inbetriebnehmen des Launchpads, um zu erkennen, daß da etwas lebt (und> die LEDs blinken lässt).> Sobald man ein eigenes Programm in das Flash des Controllers geladen> hat,ist das "Beispielprogramm" weg.
Ok danke!.
lg
Rufus Τ. Firefly schrieb:> .. Gehäusebauform ..20poliges DIP-Gehäuse.
Danke Rufus!
H. D. schrieb:>> Artikel-Nr.: TI EXP 430G2> Genau dieses Board verwende ich als Programmer.
Ok. Sieht gut aus - neugierig bin ich auch - bestellt ;-)
> Das Display ist dieses hier:> http://www.ebay.de/itm/0-96-I2C-IIC-SPI-Serial-128X64-White-OLED-LCD-LED-Display-Module-for-Arduino-/281497952135?pt=LH_DefaultDomain_0&hash=item418a95df87
Okay - hab beide da - dann das linke - unterscheidet sich im Anschluss
Header.
> Ich verwende keine SSD1306 Lib. Ist ja auch keine eingebunden. Die von> Adafruit hilft nicht, da sie nicht für I2C ist (siehe Display).
Okay - hinterfragt, woher nimmst du dann für INITIAL die Register Werte,
also z.B. OLED an/aus, PAGE Auswahl, SCROLLING, Grösse der Schrift,
Schrittweite...Buffer leeren, Zeichensatz, RAM, Landscape Mode, Portrait
Mode, ...
Example'S zum LY096BG30 als I²C OLED
ist nur als Info - ist jetzt nicht explizit für das hiesige OLED mit nur
einer Schnittstelle - aber ist SSD1306 conform - .
Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
21
Write_IIC_Command(0xf0);//--set divide ratio
22
Write_IIC_Command(0xd9);//--set pre-charge period
23
Write_IIC_Command(0x22);//
24
Write_IIC_Command(0xda);//--set com pins hardware configuration
25
Write_IIC_Command(0x12);
26
Write_IIC_Command(0xdb);//--set vcomh
27
Write_IIC_Command(0x20);//0x20,0.77xVcc
28
Write_IIC_Command(0x8d);//--set DC-DC enable
29
Write_IIC_Command(0x14);//
30
Write_IIC_Command(0xaf);//--turn on oled panel
31
}
Beispiel für das OLED mit I²C
unter Verwendung der Register
Wo soll der Buchstabe hin? X pos und y Pos.
usw.
Auf welcher Register Grundlage steuerst du das OLED an?
0xAE = Display off
0xAF = Display on
Was ist <Mod> für RegisterWert?
Woher nimmst du die?
1
..
2
printC(Mod,3);
3
..
Welche Fontfarbe ist bei dir Standard, weiss auf schwarz
oder blau auf schwarz? Oder ist es zweifarbig, TITEL Bereich ORANGE,
Hauptteil blau.
Es kann sein, dass INVERT DISPLAY bei manchen nicht unterstützt wird
wenn keine Farbe ( Vordergrund / FONT , Hintergrund / FONT ) gesetzt
wurde, ( wenn es sich setzen lässt ) vermutlich daher das schwarze Bild
nach dem delay, bin mir aber nicht ganz so sicher, hatte das so noch
nicht und kann es auf die schnelle nicht 'nachbauen'.
Welche FOND Datei?
Hast Du Register Werte? passend zum Display? ;-)
Beim MSP430 immer die Errata's lesen und deine Chip Revision dabei
beachten.
Die Beispielcodes sind manchmal auch buggy !
Aber ich glaube es gibt eine Lib von Ti die funktioniert.
cheers
H. D. schrieb:> slau132j.pdf>> The __delay_cycle Intrinsic> The __delay_cycles intrinsic inserts code to consume precisely the> number of specified cycles with no side effects. The number of cycles> delayed must be a compile-time constant.
Das hilft hier nicht. Dein Programm wird ohne den Prototyp vom Compiler
nicht übersetzt.
Wirf einen Blick auf deinen eigenen Code: Du bindest die msp430io.h ein
und nicht den 2553 Header. Vielleicht steht ja darin der Prototyp? ;-)
;-) ;-)
Warum Frage ich denn danach?
8000000 ist eine sehr große Zahl. Passt die zum Wertebereich des
Parameters? :-*
Ant schrieb:> H. D. schrieb:>> slau132j.pdf>>>> The __delay_cycle Intrinsic>> The __delay_cycles intrinsic inserts code to consume precisely the>> number of specified cycles with no side effects. The number of cycles>> delayed must be a compile-time constant.>> Das hilft hier nicht. Dein Programm wird ohne den Prototyp vom Compiler> nicht übersetzt.>> Wirf einen Blick auf deinen eigenen Code: Du bindest die msp430io.h ein> und nicht den 2553 Header. Vielleicht steht ja darin der Prototyp? ;-)> ;-) ;-)>> Warum Frage ich denn danach?> 8000000 ist eine sehr große Zahl. Passt die zum Wertebereich des> Parameters? :-*
<msp430.h> verweist einfach nur auf 2553 Header. Ist völlig egal welchen
von beiden ich hinschreibe. 8000000 ist auch kein Problem. Glaub mir, an
dem Delay selbst liegt es nicht.
R. W. schrieb:> Okay - hinterfragt, woher nimmst du dann für INITIAL die Register Werte,> also z.B. OLED an/aus, PAGE Auswahl, SCROLLING, Grösse der Schrift,> Schrittweite...Buffer leeren, Zeichensatz, RAM, Landscape Mode, Portrait> Mode, ...
Die Werte für das Initialisieren habe ich aus dem Datasheet bzw. habe
ich mir Anregungen aus dem Netz geholt. Schriftgröße, Scrolling,
Schrittwerte, Buffer leeren, Zeichensatz, etc. hab ich noch nicht. Im
Code steht noch kein Wort von RAM beschreiben oder so. Ich brauche doch
erst einmal eine vernünftige Kommunikation zum Display.
R. W. schrieb:> Auf welcher Register Grundlage steuerst du das OLED an?
Wie Meinst du das? Na auf Grundlage von Init[], da steht doch alles drin
und entspricht auch deinem Beispiel in etwa.
R. W. schrieb:> Was ist <Mod> für RegisterWert?> Woher nimmst du die?
Ist doch oben definiert. Inhalt: Display aus, Display invertieren,
Display an.
R. W. schrieb:> Welche Fontfarbe ist bei dir Standard, weiss auf schwarz> oder blau auf schwarz? Oder ist es zweifarbig, TITEL Bereich ORANGE,> Hauptteil blau.> Es kann sein, dass INVERT DISPLAY bei manchen nicht unterstützt wird> wenn keine Farbe ( Vordergrund / FONT , Hintergrund / FONT ) gesetzt> wurde, ( wenn es sich setzen lässt ) vermutlich daher das schwarze Bild> nach dem delay, bin mir aber nicht ganz so sicher, hatte das so noch> nicht und kann es auf die schnelle nicht 'nachbauen'.
Steht aber im Datasheet. Funktioniert auch, wenn ich es in Init[] setze.
R. W. schrieb:> Welche FOND Datei?> Hast Du Register Werte? passend zum Display? ;-)
Noch gar keine, es geht bisher doch nur um die Ansteuerung! Das Problem
liegt in der Kommunikation über I2C!
H. D. schrieb:> Im> Code steht noch kein Wort von RAM beschreiben oder so. Ich brauche doch> erst einmal eine vernünftige Kommunikation zum Display.>> R. W. schrieb:>> Auf welcher Register Grundlage steuerst du das OLED an?>> Wie Meinst du das? Na auf Grundlage von Init[], da steht doch alles drin> und entspricht auch deinem Beispiel in etwa.
Ja ok - wollte hinterfragen ob es eine header datei bei dir gibt dafür
ok..
>> R. W. schrieb:>> Was ist <Mod> für RegisterWert?>> Woher nimmst du die?>> Ist doch oben definiert. Inhalt: Display aus, Display invertieren,> Display an.
ops -. das ist mir entgangen, ok:
1
constunsignedcharMod[]={0xAE,0xA5,0xAF};
>> Steht aber im Datasheet. Funktioniert auch, wenn ich es in Init[] setze.>> R. W. schrieb:>> Welche FOND Datei?>> Hast Du Register Werte? passend zum Display? ;-)>> Noch gar keine, es geht bisher doch nur um die Ansteuerung! Das Problem> liegt in der Kommunikation über I2C!
ok was mir noch einfällt:
du sagst, dass das Display soweit initialisert wird und wenn du die
zeile
1
printC(Mod,3);
weglässt auch den Inhalt des RAM angezeigt bekommst; wenn du die Zeile
hinzufügst, dann bleibt das Display schwarz.
versuch mal ein delay auch beim invertieren und gib dem OLED bissal
Zeit, ich hab bei mir 1ms drin :
1
printC(Init,31);
2
_delay_cycles(8000000);
3
4
printC(Mod,3);
5
_delay_cycles(8000000);
6
7
while(1);
was machst du da alles:
eine passende header wäre halt hilfreich
hab zwar mal angefangen es zu zerpflücken, sieht aus, als wäre da ein
kleiner versatz drin.. bitte prüfe das noch mal nach:
Hallo Rudi,
wofür denn nun eine Headerdatei? Oben ist der Standard-MSP430-Kram
eingehängt. Zu finden hier:
https://github.com/martinbonnin/teaaa-timer/blob/master/msp430g2553.h
Ansonsten gibt es in dem Projekt noch nichts.
R. W. schrieb:> versuch mal ein delay auch beim invertieren und gib dem OLED bissal> Zeit, ich hab bei mir 1ms drin
Da ist doch bei mir auch schon 1 Sekunde zwischen. Das muss doch locker
reichen. Danach gibt es eine unendliche while-Schleife.
Der Init-Kram steht im Datasheet:
http://www.adafruit.com/datasheets/SSD1306.pdf
Kapitel 9. Seite 28-32
H. D. schrieb:> Hallo Rudi,> wofür denn nun eine Headerdatei?
wegen der besseren Übersicht welche Register mit welchen Werten versehen
werden müssen,
Das ist zwar:
sehr schön aber letztendlich kann man die Daten nicht nachvollziehen
( siehe oben zerpflücken ) da siehst halt dann ob was nicht passt,
kürzen kannst immer noch.
>> versuch mal ein delay auch beim invertieren und gib dem OLED bissal>> Zeit, ich hab bei mir 1ms drin>> Da ist doch bei mir auch schon 1 Sekunde zwischen. Das muss doch locker> reichen. Danach gibt es eine unendliche while-Schleife.
ich lese das aber anders:
1
printC(Init,31);
2
_delay_cycles(8000000);
3
4
// du wartest mit einem delay nach der init
5
// bevor das Commando für INVERT kommt:
6
7
printC(Mod,3);
8
9
// und jetzt springt es gleich wieder nach dem Invert Comando
10
// zur Init wie willst du das sehen/wahrnehmen können?
11
// das meinte ich da mit 1ms damit das Zeit hat überhaupt
12
// in das Register zum schreiben
13
// oder wie du es machst
14
// _delay_cycles(8000000);
15
16
while(1);
17
}
Ich kann mich auch irren aber denke dass das I²C OLED beim MSP430 nicht
anders anzusteurn sein wird wie bei anderen, ( ESP8266 z.B. )
Siehe Bild.
>> Der Init-Kram steht im Datasheet:> http://www.adafruit.com/datasheets/SSD1306.pdf>> Kapitel 9. Seite 28-32
OK, das hab ich auch, aber bei der INIT sind Register und Werte
gemoppelt, das meinte ich mit Versatz.
Ich würde ein Register nach dem anderen bewusst durchgehen ( nicht nur
aus dem Datenblatt notieren ) ob du das auch so setzten willst, also
auseinandersetzen was welches Register für Aufgabe hat und welche Werte
es überhaupt braucht. Denn ich denke nicht dass das OLED COntrast
unterstützt, du setzt es aber ;-) - kann mich irren, wenn Du ein
besonderes Exemplar hättest. Bei mir blieb es am Anfang auch dunkel,
nachem ich nach dem Einschalten dem ganzen 1 sekunde zeit gab sich
überhaupt "hochzufahren" starte ich mit Init und wieder eine pause von
20ms
und dann erst Daten.
Wenn du jetzt eine header hättest wo steht
1
..
2
0x81,// set contrast controll register
3
0x7F,// contrast Wert 127 ok
4
..
könntest es einfach deaktiveren, so musst halt deine INIT immer
editieren, und da kann mal ein Fehler passieren..
Nein ich werd dir keine fertige ´Konfig abliefern ;-) das Datenblatt
gehört Dir ganz alleine in diesem Fall ;-)..
lg rudi ;-)
0xC0,// Set COM Output Scan Direction to normal mode
24
25
0xD3,// set display offset
26
0x00,// 0
27
28
0x8D,// Set Charge Pump Setting
29
0x14,// ON
30
31
0xDA,// set com pins hardware conf
32
0x12,// alternative + disable remap
33
34
0xD5,// set display clock divide + freq
35
0x80,// divide by 1 and medium freq
36
37
0xD9,// set pre charge preriod
38
0x22,// medium (reset value)
39
40
0xDB,// set vcomh
41
0x20,// 0.77 x Vcc
42
43
0xA4,// Output follows RAM Content
44
45
0xAF// Display on
R. W. schrieb:> versuch mal ein delay auch beim invertieren und gib dem OLED bissal> Zeit, ich hab bei mir 1ms drin :>> printC(Init,31);> _delay_cycles(8000000);>> printC(Mod,3);> _delay_cycles(8000000);>> while(1);
Keine Wirkung.
R. W. schrieb:> // und jetzt springt es gleich wieder nach dem Invert Comando> // zur Init wie willst du das sehen/wahrnehmen können?
Nee, er hängt sich in die Endlose While-Schleife ...
R. W. schrieb:> Denn ich denke nicht dass das OLED COntrast> unterstützt, du setzt es aber ;-)
Habe ich ausprobiert mit einem niedrigeren Wert. Man sieht einen
Unterschied. Ich werde aber mal gucken, was ich kürzen kann.
UCB0CTL1=UCSSEL_2+UCSWRST;// Use SMCLK, keep SW reset
12
UCB0BR0=0x40;// < 100 kHz
13
UCB0I2CSA=0x3C;// address
14
UCB0CTL1&=~UCSWRST;
15
IE2|=UCB0TXIE;// Enable TX ready interrupt
16
//UCB0I2CIE = UCNACKIE;
17
UCB0CTL1|=UCTR+UCTXSTT;// I2C TX, start condition
18
19
20
unsignedintc;
21
for(c=0;c<length;c++){
22
__bis_SR_register(LPM3_bits+GIE);
23
UCB0TXBUF=0x80;
24
__bis_SR_register(LPM3_bits+GIE);
25
UCB0TXBUF=Array[c];
26
}
27
__bis_SR_register(LPM3_bits+GIE);
28
//_delay_cycles(8000000);
29
UCB0CTL1|=UCTR+UCTXSTP;
30
//__bis_SR_register(LPM3_bits + GIE);
31
}
32
33
34
35
voidmain(void){
36
WDTCTL=WDTPW+WDTHOLD;
37
38
DCOCTL=CALDCO_8MHZ;//DCO setting = 8MHz
39
BCSCTL1=CALBC1_8MHZ;//DCO setting = 8MHz
40
41
// Configure Pins for I2C
42
P1SEL|=BIT6+BIT7;// Pin init
43
P1SEL2|=BIT6+BIT7;// Pin init
44
45
46
printC(Init,31);
47
48
_delay_cycles(8000000);
49
50
printC(Mod,1);
51
52
while(1);
53
54
}
55
56
57
// USCI_B0 Data ISR
58
#pragma vector = USCIAB0TX_VECTOR
59
__interruptvoidUSCIAB0TX_ISR(void){
60
__bic_SR_register_on_exit(LPM3_bits);// Wakeup main code
61
IFG2&=~UCB0TXIFG;
62
}
Display zeigt, was es nach dem Init zeigen sollte. Leider hängt es beim
2. Anlauf (Mod) vor der ersten Bufferfüllen. Scheint mir so als würde
die erste Übertragung vom MSP430 nicht korrekt beendet, sodass er nicht
richtig die nächste startet.
hallo!
ich habe mir das Display ebenfalls zugelegt zugelegt und bin jetzt auf
der Suche nach Dokumentationen auf dieses recht frische Thema gestoßen.
Dabei hat mir R.W.s initialisierungsfunktion enorm geholfen...
R. W. schrieb:> void Initial_LY096BG30()> { [...]
... und ich bin neugierig, woher die Informationen sind, die zur
Erstellung dieser Funktion benötigt werden. Ich habe ein Datenblatt
gefunden, weclehs ich für passend halte
(http://www.upgradeindustries.com/media/ebay/Photos/OLED/datasheet.pdf)
und dessen Inhalt sich im Beispielcode wieder findet. Allerdings bin ich
grade nicht in der Lage, darin weitere Informationen für meine eigene
Library zu finden/erkennen.
Ant schrieb:> H. D. schrieb:> _delay_cycles(8000000);>> Zeig doch einmal den Prototyp der Funktion. Steht in der .h Datei.>> Die Spielerei mit dem LPM wirkt sehr konfus. Versuch erst ohne> auszukommen.H. D. schrieb:> Die Lösung ist hier zu finden:> http://e2e.ti.com/support/microcontrollers/msp430/...
Tja, den Hinweis gab es bereits ganz am Anfang. :'(
Ant schrieb:> Ant schrieb:>> H. D. schrieb:>> _delay_cycles(8000000);>>>> Zeig doch einmal den Prototyp der Funktion. Steht in der .h Datei.>>>> Die Spielerei mit dem LPM wirkt sehr konfus. Versuch erst ohne>> auszukommen.>> H. D. schrieb:>> Die Lösung ist hier zu finden:>> http://e2e.ti.com/support/microcontrollers/msp430/...>> Tja, den Hinweis gab es bereits ganz am Anfang. :'(
Vom LPM abstand zu nehemen, aber nicht wie es mit LPM geht!
DemoniacMilk schrieb:> ... und ich bin neugierig, woher die Informationen sind, die zur> Erstellung dieser Funktion benötigt werden. Ich habe ein Datenblatt> gefunden, weclehs ich für passend halte> (http://www.upgradeindustries.com/media/ebay/Photos/OLED/datasheet.pdf)> und dessen Inhalt sich im Beispielcode wieder findet. Allerdings bin ich> grade nicht in der Lage, darin weitere Informationen für meine eigene> Library zu finden/erkennen.
In Kapitel 9 stehen die relevanten Intormationen. Was bekommst du denn
zur Zeit schon angezeigt?
H. D. schrieb:> In Kapitel 9 stehen die relevanten Intormationen. Was bekommst du denn> zur Zeit schon angezeigt?
Bisher nur zufälligen pixelbrei oder alles weiß, je nachdem ob ich den
RAM Inhalt nutze oder ignoriere.
Im Datenblatt konnte ich zwar die befehle/Einstellungen finden, aber
weiß nicht welche Option wo hin (also in welche Register etc hab keine
Register map gesehen). Ich werde mir mal Kapitel neun angucken und dann
mitteilen was ich finden konnte, bin grade aber noch unterwegs
Ich kann zwar im moment nichts testen, aber sehe grade im Datenblatt
dass bspw der Kontrast eine der wenigen Anweisungen mit zwei byte
sendevolumen ist. Daraus würde ich jetzt schließen, dass ich gar nicht
direkt in Register schreibe sondern alles über Kommandos mache.
Einstellungen ur den RAM hab ich einige gesehen, allerdings war mir
grade beim Überfliegen nicht aufgefallen wie ich Daten in den RAM des
displays bekomme.
Command Mode
So the Command Mode data format will be: Slave Address ->
GOFi2cOLED_Command_Mode( 0x80) -> Command/Command sets.
Data Mode
And the Data Mode data format will be: Slave Address ->
GOFi2cOLED_Data_Mode( 0x40) -> Data byte/bytes.
- von
http://www.geekonfire.com/wiki/index.php?title=I2C_OLED_Panel(128x64)
Ich denke das beantwortet meine Frage, sobald ich testen konnte melde
ich mich noch mal.
Ich will über einen USB to I2C/SPI Wandler aus VB.Net das Teil
ansteuern!
Auch mit den C- Pro 32 möchte ich es versuchen,solche Dinger liegen noch
rum.
Ein einfacher Basisdialekt ist das Beste.
Habe ja auch Andere 128/65 zum Leben erweckt.
peter schrieb:> Ich will über einen USB to I2C/SPI Wandler aus VB.Net das Teil> ansteuern!
Das hat nichts mit dem Thema des Threads zu tun. Wenn Du eine konkrete
Frage zum Thema Zusammenspiel MSP430 mit SSD1306 und I2C hast, pack die
hierhin. Wenn Du eine andere Frage hast: Mach 'nen Thread dafür auf
(sofern nicht ein halbwegs aktueller Thread zur Frage passt).
Auf Wunsch von bernd_d56 hier der derzeitige (etwas eingeschlafene)
Stand. Ich hoffe es funktioniert in diesem Zustand, wenn nicht, bitte
noch einmal melden! Konnte es spontan nicht noch einmal testen.