DOGM128 an MSP430

Gast #2419798
Lesenswert?

Hallo,

ich habe ein Dogm128-6 an einen MSP430F2418.
Ich habs nach folgenden Code Initialsiert und sende zum Schluss einfach 
irgendetwas das einen Anzeige hervorufen soll. Leider rührt sich rein 
gar nix. Wer hat einen Idee was falsch ist?
Daten werden sauber übertragen, das hab ich bereits mitn Oszi 
nachgemessen. Also müsste Hardware eigentlich passen! siehe Anhang
1
#include  <msp430x26x.h>
2
volatile unsigned int i;
3

4
void transmit(char data) {
5
  P2OUT &= ~BIT6;            //Chip Select auf 0 legen
6
  P2OUT &= ~BIT5;            //A0 auf 0 legen
7
  while (!(IFG2 & UCB0TXIFG)); 
8
  UCB0TXBUF = data;          // Transmit first character
9
  for(i=30;i>0;i--); 
10
  P2OUT |= BIT6;             //Chip Select wieder auf 1 legen
11

12
}
13

14
void data(char data) {
15
  P2OUT &= ~BIT6;            //Chip Select auf 0 legen
16
  P2OUT |= BIT5;            //A0 auf 1 legen
17
  while (!(IFG2 & UCB0TXIFG)); 
18
  UCB0TXBUF = data;          // Transmit first character
19
  for(i=30;i>0;i--); 
20
  P2OUT |= BIT6;             //Chip Select wieder auf 1 legen
21
  P2OUT &= ~BIT5;     //A0 wieder auf 0
22

23
}
24

25
void goto_xy(char x, char y)
26
{
27
  char set[] = {0xb0, 0x10, 0x00};    //Befehlsarray
28
  set[0] = set[0] + y;                //Y - Position auf Steuerbefehl addieren
29
  set[2] = set[2] + (x & 0x0f);       //Low - Nibble auf Steuerbefehl addieren
30
  set[1] = set[1] + (x >> 4);         //High - Nibble auf Steuerbefehl addieren
31
  transmit(set[0]);
32
  transmit(set[1]);
33
  transmit(set[2]);
34
}
35

36

37

38
void main(void)
39
{
40
  volatile unsigned int i;
41

42
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
43
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ==0xFF)                                     
44
  {  
45
    while(1);                           // If calibration constants erased
46
                                            // do not load, trap CPU!!
47
  }    
48
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
49
  DCOCTL = CALDCO_1MHZ;
50
  for(i=2100;i>0;i--);                      // Wait for DCO to stabilize.
51
                                       
52
  
53
  P3SEL |= 0x0E;                            // P3.3,2,1 option select
54
  UCB0CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB;    //3-pin, 8-bit SPI master
55
  UCB0CTL1 |= UCSSEL_2;                     // SMCLK
56
  UCB0BR0 = 0x02;                           // /2
57
  UCB0BR1 = 0;                              //
58
  UCB0CTL1 &= ~UCSWRST;                // **Initialize USCI state machine**
59
  
60

61
  for(i=50;i>0;i--);                        // Wait for slave to initialize
62
  
63
  
64
  P1SEL &= ~BIT1;         
65
  P1DIR |= BIT1;          
66
  P1OUT |= BIT1;  
67
  
68
  P2SEL &= ~BIT5;         //Steuerleitungen als I/O einstellen
69
  P2DIR |= BIT5;          //Steuerleitungen als Ausgang einstellen
70
  P2OUT &= ~BIT5;         //Alle Steuerleitungen auf 0 setzen
71
  P2SEL &= ~BIT6;         //Steuerleitungen als I/O einstellen
72
  P2DIR |= BIT6;          //Steuerleitungen als Ausgang einstellen
73
  P2OUT &= ~BIT6;         //Alle Steuerleitungen auf 0 setzen
74
  P2OUT |= BIT6;  //Chip Select auf 1 setzen (Ausgangszustand hergestellt)
75
  
76
  transmit(0x40);    //Display start line 0
77
  transmit(0xa1);    //ADC reverse
78
  transmit(0xc0);    //Normal COM0...COM63
79
  transmit(0xa6);   //Display normal
80
  transmit(0xa2);   //Set Bias 1/9 (Duty 1/65)
81
  transmit(0x2f);   //Booster, Regulator and Follower On
82
  transmit(0xf8);   //Set internal Booster to 4x
83
  transmit(0x00);
84
  transmit(0x27);   //Contrast set
85
  transmit(0x81);
86
  transmit(0x0f);
87
  transmit(0xac);   //No indicator
88
  transmit(0x01);
89
  transmit(0xaf);   //Display on
90
  transmit(0xb0);   //Page 0 einstellen
91
  transmit(0x10);    //High-Nible der Spaltenadresse
92
  transmit(0x00);    //Low-Nible der Spaltenadresse
93
  
94
  goto_xy(1,1);
95
  char tester=0x00;
96
  
97
  for(i=127;i>0;i--) {
98
    
99
  data(tester);
100
  tester++;
101
  }
102
  
103
   
104
}
Angehängte Dateien:
#2429037
Lesenswert?

Hallo,

du darft klar CS des DOGM128 auf Low legen.

Wenn das funktioniert ist das ok:

> P3SEL |= 0x0E;          // P3.3,2,1 option select

Es gibt also bei dieser 3 PIN Geschichte keinen  "SS"

Beim Atmega geht das nicht.

Ich muss immer vor der Initialisierung des SPI zum Master den  SS Port 
als Ausgang schalten und auf high legen.

Wird SS nicht konfiguriert funktioniert der SPI nicht!

Ich lege darum immer den SS mit einem 10K Widerstand auf PLUS.


Gruß xmega
Gast #2429090
Lesenswert?

Ja der CS vom DOGM128 darf man natürlich auf low legen, das ist mir 
klar.
Laut meinen Wissen braucht man beim MSP430 den SS Ausgang nicht zwingend 
definieren. Es reichen MOSI, MISO und CLK
SPI funktioniert auch soweit, hab ich bereits nachgemessen, Signale 
kommen am Display an, werden aber leider (wieso auch immer) nicht 
übernommen/wahrgenommen vom LCD  -> es rührt sich nix
#2429395
Lesenswert?

Andy W. schrieb:
> Bisher habe ich noch keine spi schnittstelle gesehen, die direkt das
> format des dogm konnte, so dass ich immer die software emulation nutzen
> musste.
?
Ich habe bisher noch keinen SPI Controller gesehen bei dem man nicht 
zwischen den 4 Standard SPI Modi umschalten konnte. Und mehr 
möglichkeiten braucht man ja nicht.
Die DOG hab ich auch auch schon des öfteren mit Hardware SPI betrieben. 
Keine Probleme.


1
  UCB0TXBUF = data;          // Transmit first character
2
  for(i=30;i>0;i--); 
3
  P2OUT |= BIT6;             //Chip Select wieder auf 1 legen
Bist du 100%ig sicher das der CS erst nach der Übertragung high wird?
#2430298
Lesenswert?

Hi

Jörg S. schrieb:
> Ich habe bisher noch keinen SPI Controller gesehen bei dem man nicht
> zwischen den 4 Standard SPI Modi umschalten konnte. Und mehr
> möglichkeiten braucht man ja nicht.
> Die DOG hab ich auch auch schon des öfteren mit Hardware SPI betrieben.
> Keine Probleme.

habe es sowohl schon mit bei xilinx, msp430 und cortex-m3 probiert.
da ich es nicht mit den jeweils dort vorhandenen schnittstellen 
hinbekommen habe, es nicht wirklich zeitkritisch war und es wichtigere 
aufgaben dabei gab, halt in eine software routine umgesetzt

dabei immer der HL LH flanke des Clocks nach stabilen anliegen des daten 
bits gemacht und es ging.

ich sage ja nicht, das es absolut unmoeglich ist, einen spi controller 
dazu zu bewegen, ich habe es bisher jedoch noch nicht hinbekommen ;-)

LG
Gast #2430319
Lesenswert?

Hi

>Negativ daran: Display geht immer noch nicht! Warum nur?

Ist deine Schaltung wirklich wie in dem obigen Schaltplan? Wenn ja hast 
du einen Fehler drin: VDD und VDD2 müssen 3,3V liegen. Außerdem ist es 
günstiger RST vom Display mit dem Controller zu bedienen. Möglicherweise 
startest du die Initialisierung, wenn sich das Display noch im Reset 
befindet.

MfG Spess
#2430412
Lesenswert?

So, nu muss ich erstmal meinen Senf dazu geben.

till schrieb:
> Wenn ich das richtig sehe, hast du keine Pausen zwischen den einzelnen
> Übertragungen... müsstest du evtl. noch einfügen.

Andy W. schrieb:
> Bisher habe ich noch keine spi schnittstelle gesehen, die direkt das
> format des dogm konnte, so dass ich immer die software emulation nutzen
> musste.

Warum Pausen und SPI - Emulation benutzen? Bei dem Beispiel von 
msp430.funpic.de wird auch die Hardwareschnittstelle benutzt. Wenn man 
das ganze noch auf DMA - Transfer umstellen würde, wäre noch höhere 
Datenraten drinn. SPI - Clock darf ja schließlich 20MHz betragen.

So nun zu deinem Problem:
Prinzipiell ist dein Code richtig. Du solltest nur bedenken da die 
Steuerkommandos teilweis aus zwei Bytes bestehen. Wenn du also nach 
jedem Byte CS = 1 setzt sind einige Kommandos unvollständig.
Also Konfigurationsdaten immer am Stück senden! Gleiches gilt für die 
Übertragung der Displaydaten.

Habe deinen Code entsprechend geändert und auf einem der Funpic - Boards 
getestet

Michael
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren