Forum: Mikrocontroller und Digitale Elektronik DOGM128 an MSP430


von Lukas H. (Gast)


Angehängte Dateien:

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
}

von Lukas H. (Gast)


Lesenswert?

hat keiner eine idee
die init ist übringes von msp430.funpic.net, also bereits getestet und 
müsste auch gehen

von till (Gast)


Lesenswert?

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

von Lukas H. (Gast)


Lesenswert?

er wartet zwischen dem senden 30 Takte, siehe for schleife

von till (Gast)


Lesenswert?

Ich könnte mir vorstellen, dass es zu kurz ist...
Wie lange musst du laut Datenblatt Zeit geben? Was hast du für einen 
Takt?

Ich hatte ein ähnliches Display und musste ca. 80 µs Zeit geben, habe es 
so gemacht:
1
#include <util/delay.h>
2
...
3
_delay_us(80);

von Patrick (Gast)


Lesenswert?

Lukas H. schrieb:
> er wartet zwischen dem senden 30 Takte, siehe for schleife

Welcher Compiler, welche Optimierungsstufe?

Solche for-Schleifen werden gerne wegoptimiert; bitte nur delay... 
einsetzen.

von Lukas H. (Gast)


Lesenswert?

also der smclk takt läuft auf 500khz, also ziemlich langsam
hab gerade nochmal die spannungen an den kondensatoren nachgemessen: 
ergebnis ist das kein init durchgeführt wurde da keine spannungen 
vorhanden

compiler ist ccs! delay zeiten werden auch eingehalten, hab ich nochmals 
per oszi nachgemessen

von Jörg S. (joerg-s)


Lesenswert?

Was sagt das Oszi an den SPI Pins? Alles OK?

von Erik (Gast)


Lesenswert?

Hallo Lukas ,

das Display hat eine eigene Resetbeschaltung ?
evtl. mal mit einen Taster den Kondensator brücken und dann
übern debugger deinen Controler neu starten .
evtl. ein paar Haltepunkte einsetzen .

viel Erfolg  Erik

von Erik (Gast)


Lesenswert?

Nachtrag Hallo Lukas ,

auf der Seite von lcd-module.de ist die Standardbeschaltung
anders oder ich gucke heute schlecht .

mfg Erik

von Lukas H. (Gast)


Lesenswert?

Also hab die Schaltung noch mal überprüft, die müsste passen, wie im 
Handbuch von EA beschrieben.
SPI Signale kommen auch richtig an, zumindest laut meinen Messungen.

Display habe ich auch schon ein anderes probiert. Funktioniert auch 
nicht.
Irgendwo hackst grundsätzlich, aber nur wo?

von Gerhard G. (xmega)


Lesenswert?

Hallo,

"SPI SS" muss es hoch gehalten, um Master-Betrieb zu gewährleisten

Ich kann dir nur den guten Rat geben, SPI 'SS' oder 'CS'  ständig mit 
einem 10K Widerstand auf 3,3 Volt zulegen und dann beim Beginn der 
Übertragung nach low zu ziehen (usw.).

Ich verwende zwar Atmegas, aber auch hier funktioniert das nur so!


Gruß xmega

von Lukas H. (Gast)


Lesenswert?

Da bin ich mir selbst nicht sicher, aber ich denke dadurch das man nur 
3-wire Spi verwendet und die Ports ja dementsprechend zuteilt
siehe:  P3SEL |= 0x0E;         // P3.3,2,1 option select

von Lukas H. (Gast)


Lesenswert?

sollte das auch ohne Pullup gehen

von Gerhard G. (xmega)


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

von Lukas H. (Gast)


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

von Andy W. (tspc)


Lesenswert?

Hallo,

überprüfe bitte mal die Phasenlage des spi clocks zu den Datenbits.
da ist das dogm protokoll sehr speziell und empfindlich gegen jegliche 
abweichung.

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

lg

von Jörg S. (joerg-s)


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?

von Lukas H. (Gast)


Lesenswert?

hab den CS jetzt driket aus der Funktion rausgeschmissen und setzen ihn 
vor der eigentlichen Übertragung auf low, wenn alle hex-Werte übertragen 
sind setzen ich ihn wieder auf hi

von Lukas H. (Gast)


Lesenswert?

So ich hab mal einen kleinen Test gestartet und zwar einen 75HC164 an 
den MSP430. Dies ist ein Schieberegister das mit SPI angesteuert wird.
Fazit: SPI funktioniert, LEds an den Schieberegisterausgängen leuchten

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

von Andy W. (tspc)


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

von spess53 (Gast)


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

von Jörg S. (joerg-s)


Lesenswert?

Lukas H. schrieb:
> hab den CS jetzt driket aus der Funktion rausgeschmissen und setzen ihn
> vor der eigentlichen Übertragung auf low, wenn alle hex-Werte übertragen
> sind setzen ich ihn wieder auf hi
Und du hast wirklich nachgemessen das der CS erst NACH der übertragung 
der Daten high wird?

von Lukas H. (Gast)


Lesenswert?

VDD2 und VDD sind miteinander verbunden, und liegen an 3,3V. Es fehlt 
hier nur die Junction, sinder ab definitiv verbunden.
Resetpin habe ich jetzt auf einen Portpin gelegt und am Anfang einen 
Reset durchgeführt und dann die init durchgeführt -> es tut sich nichts

von Michael P. (protactinium)


Angehängte Dateien:

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

von Q_M (Gast)


Lesenswert?

Hi,
sehe ich das richtig dass du ein blaues Display benutzt mit evtl weißer 
HG Beleuchtung? Alles an 3,3V.
Laut Datenblatt gehts ja nur mittels LED Treiber.
Ich erkenne hier 47 Ohm Widerstände - das funzt? Wie hell ist denn Das 
Display damit?

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.