Forum: Mikrocontroller und Digitale Elektronik MSP430 SSD1306 über I2C


von H. D. (lactobacillus)


Lesenswert?

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.

von R. W. (Gast)


Lesenswert?

Hi
Beitrag "Re: Sammelbestellung OLED 0.96 I2C für den ESP8266"
schauh dir mal den beispiel code an, vieleicht hilft es weiter.
lg rudi ;-)
pullups nicht vergessen!

von Ant (Gast)


Lesenswert?

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.

von H. D. (lactobacillus)


Lesenswert?

@rudi: Pullups! Sollte ich wohl mal probieren.

@Ant: Dein Link ist für parallel ...

von Ant (Gast)


Lesenswert?

Hol dir die Codes zu I2C von TI und Koppel zuerst zwei MSP.
Wenn der BUS läuft, kannst du dich ums Display kümmern.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Ant (Gast)


Lesenswert?

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!

von H. D. (lactobacillus)


Lesenswert?

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
void main(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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

H. D. schrieb:
> Versuche mich eng am Family User's Guide zu orientieren

Und hast Du Dir auch mal die Codebeispiele von TI angesehen?

von H. D. (lactobacillus)


Lesenswert?

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.

1
#include <msp430.h> 
2
3
void main(void){
4
    WDTCTL = WDTPW + WDTHOLD;
5
6
    DCOCTL = CALDCO_1MHZ;        //DCO setting = 8MHz
7
    BCSCTL1 = CALBC1_1MHZ;        //DCO setting = 8MHz
8
9
    // Configure Pins for I2C
10
    P1SEL |= BIT6 + BIT7;                  // Pin init
11
    P1SEL2 |= BIT6 + BIT7;                  // Pin init
12
13
14
15
    UCB0CTL1 = UCSWRST;
16
    UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;      // I2C master mode
17
    UCB0CTL1 |= UCSSEL_2;
18
    UCB0BR0 = 0x14;                          // < 100 kHz
19
    UCB0I2CSA = 0x3C;                       // address
20
    UCB0CTL1 &= ~UCSWRST;
21
    IE2 |= UCB0TXIE;        // Enable TX ready interrupt
22
    UCB0I2CIE = UCNACKIE;
23
24
    while(UCB0STAT & UCBBUSY);
25
26
    UCB0CTL1 |= UCTR + UCTXSTT;
27
28
    _delay_cycles(100000);
29
30
    UCB0TXBUF = 0xAF;
31
32
    _delay_cycles(100000);
33
34
    UCB0TXBUF = 0xA5;
35
36
    _delay_cycles(100000);
37
38
    UCB0CTL1 |= UCTXSTP;
39
40
41
    _delay_cycles(1000000);
42
43
44
    while(1);
45
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

: Bearbeitet durch User
von Ant (Gast)


Lesenswert?

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?

von H. D. (lactobacillus)


Lesenswert?

@Ant: Seite 470:
Writing to the transmit data buffer clears UCBxTXIFG.

Sollte also automatisch gehen.

@Rufus: Danke, guck ich mir heute Abend mal an.

von Ant (Gast)


Lesenswert?

Genau, writing to ...
Also steht es nach jeder Übertragung sofort wieder an. Wo in deinem 
Programm erwartest du ein gelöschtes Flag?

von H. D. (lactobacillus)


Lesenswert?

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
1
UCB0TXBUF = 0xAF;

Da beschreibe ich ja UCB0TXBUF.

von Max G. (l0wside) Benutzerseite


Lesenswert?

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

von Ant (Gast)


Lesenswert?

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. ;-)

von H. D. (lactobacillus)


Lesenswert?

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 ...

von H. D. (lactobacillus)


Lesenswert?

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?


1
#include <msp430.h>
2
3
const unsigned char Init[] = {0xAE,0x81,0x7F,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA4,0xAF};
4
5
const unsigned char Mod[] = {0xAE,0xA5,0xAF};
6
7
void printC(const unsigned char* Array, unsigned int length){
8
  UCB0CTL1 = UCSWRST;
9
  UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;      // I2C master mode
10
  UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
11
  UCB0BR0 = 0x40;                          // < 100 kHz
12
  UCB0I2CSA = 0x3C;                       // address
13
  UCB0CTL1 &= ~UCSWRST;
14
  IE2 |= UCB0TXIE;        // Enable TX ready interrupt
15
  //UCB0I2CIE = UCNACKIE;
16
  UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
17
18
19
  unsigned int c;
20
  for(c = 0; c < length; c++){
21
    __bis_SR_register(LPM3_bits + GIE);
22
    UCB0TXBUF = 0x80;
23
    __bis_SR_register(LPM3_bits + GIE);
24
    UCB0TXBUF = Array[c];
25
  }
26
  __bis_SR_register(LPM3_bits + GIE);
27
  //_delay_cycles(8000000);
28
  UCB0CTL1 |= UCTR + UCTXSTP;
29
}
30
31
32
void main(void){
33
    WDTCTL = WDTPW + WDTHOLD;
34
35
    DCOCTL = CALDCO_8MHZ;        //DCO setting = 8MHz
36
    BCSCTL1 = CALBC1_8MHZ;        //DCO setting = 8MHz
37
38
    // Configure Pins for I2C
39
    P1SEL |= BIT6 + BIT7;                  // Pin init
40
    P1SEL2 |= BIT6 + BIT7;                  // Pin init
41
42
43
    printC(Init,31);
44
    _delay_cycles(8000000);
45
46
    printC(Mod,3);
47
    while(1);
48
49
}
50
51
52
// USCI_B0 Data ISR
53
#pragma vector = USCIAB0TX_VECTOR
54
__interrupt void USCIAB0TX_ISR(void){
55
  __bic_SR_register_on_exit(LPM3_bits);               // Wakeup main code
56
  IFG2 &= ~UCB0TXIFG;
57
}

von Ant (Gast)


Lesenswert?

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.

von H. D. (lactobacillus)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von H. D. (lactobacillus)


Lesenswert?

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.

von R. W. (Gast)


Lesenswert?

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 ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von R. W. (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

R. W. schrieb:
> kannst Du mir noch ergänzen was das IN20 bedeutet.

Das ist die Gehäusebauform und steht in diesem Fall für 20poliges 
DIP-Gehäuse.

von H. D. (lactobacillus)


Lesenswert?

R. W. schrieb:
> OT Frage:
> Welches Board verwendest Du?
> Ich hab auf die schnelle bei R das gefunden:
> Artikel-Nr.: TI EXP 430G2

Genau dieses Board verwende ich als Programmer.


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

Ich verwende keine SSD1306 Lib. Ist ja auch keine eingebunden. Die von 
Adafruit hilft nicht, da sie nicht für I2C ist (siehe Display).

von R. W. (Gast)


Angehängte Dateien:

Lesenswert?

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 - .
1
void Initial_LY096BG30()
2
{
3
  Write_IIC_Command(0xAE);   //display off
4
  Write_IIC_Command(0x20);  //Set Memory Addressing Mode  
5
  Write_IIC_Command(0x10);  //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
6
  Write_IIC_Command(0xb0);  //Set Page Start Address for Page Addressing Mode,0-7
7
  Write_IIC_Command(0xc8);  //Set COM Output Scan Direction
8
  Write_IIC_Command(0x00);//---set low column address
9
  Write_IIC_Command(0x10);//---set high column address
10
  Write_IIC_Command(0x40);//--set start line address
11
  Write_IIC_Command(0x81);//--set contrast control register
12
  Write_IIC_Command(0x7f);
13
  Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
14
  Write_IIC_Command(0xa6);//--set normal display
15
  Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
16
  Write_IIC_Command(0x3F);//
17
  Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
18
  Write_IIC_Command(0xd3);//-set display offset
19
  Write_IIC_Command(0x00);//-not offset
20
  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
1
..
2
const unsigned char Init[] = {0xAE,0x81,0x7F,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA4,0xAF};
3
..


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? ;-)
1
void IIC_without_ACK::Fill_Screen(unsigned char fill_Data)
2
{
3
  unsigned char m,n;
4
  for(m=0;m<8;m++)
5
  {
6
    Write_IIC_Command(0xb0+m);  //page0-page1
7
    Write_IIC_Command(0x00);  //low column start address
8
    Write_IIC_Command(0x10);  //high column start address
9
    Begin_IIC_Data();
10
    for(n=0;n<128;n++)
11
    {
12
      Write_IIC_Byte(fill_Data);
13
    }
14
    IIC_Stop();
15
  }
16
}
17
18
19
20
...
21
22
23
void IIC_without_ACK::Char_F8x16(unsigned char x, unsigned char y,const char ch[])
24
{
25
  unsigned char c=0,i=0,j=0;
26
  while (ch[j]!='\0')
27
  {
28
    c =ch[j]-32;
29
    if(x>120)
30
    {
31
      x=0;
32
      y++;
33
    }
34
    IIC_SetPos(x,y);
35
    Begin_IIC_Data();
36
    for(i=0;i<8;i++)
37
    {
38
      Write_IIC_Byte(font8X16[c*16+i]);
39
    }
40
    IIC_Stop();
41
    IIC_SetPos(x,y+1);
42
    Begin_IIC_Data();
43
    for(i=0;i<8;i++)
44
    {
45
      Write_IIC_Byte(font8X16[c*16+i+8]);
46
    }
47
    IIC_Stop();
48
    x+=8;
49
    j++;
50
  }
51
}*/
52
53
...



lg rudi ;-)

von Oscar K. (sieges)


Lesenswert?

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

von Ant (Gast)


Lesenswert?

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? :-*

von H. D. (lactobacillus)


Lesenswert?

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!

von R. W. (Gast)


Lesenswert?

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
const unsigned char Mod[] = {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:
1
const unsigned char Init[] = {0xAE,0x81,0x7F,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA4,0xAF};

..
1
0xAE,  // Display off
2
0x81,   // set contrast controll register
3
0x7F,  // contrast Wert 127 ok
4
5
0x20,  // Set Memory Adress Mode
6
0x01,  // Vertical Adressing Mode
7
8
0x21,  // was soll das machen? ..
9
10
0x00,  // set low column adress 
11
0x7F,  // column adress 127
12
13
0x22,  // was macht das? ..
14
0x00,  // set low column adress nochmal?
15
16
0x07,  // was macht das?
17
18
0x40,  // set start line adress
19
0xA0,   // was macht das?
20
0xA8,  // set multiplex ratio 1 .. 64
21
0x3F,   // was macht das?
22
0xC0,  // was macht das?
23
0xD3,  // set display offset
24
0x00,  // 
25
0x8D,  // set DC-DC enable
26
0x14,  // was macht das?
27
0xDA,  // set com pins hardware conf
28
0x12,  // pin
29
0xD5,  // set display clock divide..
30
0x80,  //
31
0xD9,  // set pre charge preriod
32
0x22,  // 
33
0xDB,  // set vcomh
34
0x20,  // 0.77 x Vcc
35
0xA4,  // Output follows RAM Content
36
0xAF  // Display on

lg rudi ;-)

von H. D. (lactobacillus)


Lesenswert?

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

von R. W. (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
const unsigned char Init[] = {0xAE,0x81,0x7F,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA4,0xAF};

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 ;-)

von H. D. (lactobacillus)


Lesenswert?

Hier die Init mit Erklärungen:
1
0xAE,  // Display off
2
0x81,  // set contrast controll register
3
0x7F,  // contrast Wert 127 ok
4
5
0x20,  // Set Memory Adress Mode
6
0x01,  // Vertical Adressing Mode
7
8
0x21,  // Set Column Adress
9
0x00,  // Start Adress 0
10
0x7F,  // End Adress 127
11
12
0x22,  // Set Page Adress
13
0x00,  // Start Adress 0
14
0x07,  // End Adress 7
15
16
0x40,  // set start line adress 0
17
18
0xA0,  // Column Adress mapped to SEG0
19
20
0xA8,  // set multiplex ratio
21
0x3F,  // maximum
22
23
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.

von H. D. (lactobacillus)


Lesenswert?

Derzeitiger Stand:
1
#include <msp430g2553.h>
2
3
const unsigned char Init[] = {0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF};
4
5
const unsigned char Mod[] = {0xA5};
6
7
8
void printC(const unsigned char* Array, unsigned int length){
9
  UCB0CTL1 = UCSWRST;
10
  UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;      // I2C master mode
11
  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
  unsigned int c;
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
void main(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
__interrupt void USCIAB0TX_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.

von H. D. (lactobacillus)


Lesenswert?


von DemoniacMilk (Gast)


Lesenswert?

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.

von Ant (Gast)


Lesenswert?

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. :'(

von H. D. (lactobacillus)


Lesenswert?

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?

von DemoniacMilk (Gast)


Lesenswert?

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

von DemoniacMilk (Gast)


Lesenswert?

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.

von DemoniacMilk (Gast)


Lesenswert?

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.

von peter (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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).

von H. D. (lactobacillus)


Lesenswert?

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.

1
#include <msp430g2553.h>
2
3
//const unsigned char Init[] = {0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF};
4
5
const unsigned char Init[] = {0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA1,0xA8,0x3F,0xC8,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF};
6
7
8
const unsigned char Mod[] = {0xA5};
9
10
11
void printC(const unsigned char* Array, unsigned int length){
12
13
  UCB0CTL1 = UCSWRST;
14
  UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;      // I2C master mode
15
  UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
16
  UCB0BR0 = 0x15;                          // < 400 kHz
17
  UCB0I2CSA = 0x3C;                       // address
18
  UCB0CTL1 &= ~UCSWRST;
19
  UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
20
21
  while (!(IFG2 & UCB0TXIFG));
22
23
  unsigned int c;
24
  for(c = 0; c < length; c++){
25
    UCB0TXBUF = 0x80;
26
    while (!(IFG2 & UCB0TXIFG));
27
    UCB0TXBUF = Array[c];
28
    while (!(IFG2 & UCB0TXIFG));
29
  }
30
31
  UCB0CTL1 |= UCTXSTP;
32
}
33
34
void printS(void){
35
36
  UCB0CTL1 = UCSWRST;
37
  UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;      // I2C master mode
38
  UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
39
  UCB0BR0 = 0x15;                          // < 400 kHz
40
  UCB0I2CSA = 0x3C;                       // address
41
  UCB0CTL1 &= ~UCSWRST;
42
  UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
43
  while (!(IFG2 & UCB0TXIFG));
44
  UCB0TXBUF = 0x40;
45
}
46
47
void printD(const unsigned char Data){
48
  while (!(IFG2 & UCB0TXIFG));
49
  UCB0TXBUF = Data;
50
}
51
52
53
void printE(void){
54
  while (!(IFG2 & UCB0TXIFG));
55
  UCB0CTL1 |= UCTR + UCTXSTP;
56
}
57
58
void main(void){
59
    WDTCTL = WDTPW + WDTHOLD;
60
61
    DCOCTL = CALDCO_8MHZ;        //DCO setting = 8MHz
62
    BCSCTL1 = CALBC1_8MHZ;        //DCO setting = 8MHz
63
64
    // Configure Pins for I2C
65
    P1SEL |= BIT6 + BIT7;                  // Pin init
66
    P1SEL2 |= BIT6 + BIT7;                  // Pin init
67
68
69
    printC(Init,31);
70
71
    __delay_cycles(8000000);
72
73
    printC(Mod,1);
74
75
76
    printS();
77
    unsigned int i;
78
    for(i = 512; i > 0; i--){
79
      printD(0x00);
80
      printD(0xFF);
81
    }
82
    printE();
83
84
85
    while(1);
86
87
}

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.