Forum: Mikrocontroller und Digitale Elektronik MSP430 mit textdisplay (16x2)


von Tobias F. (tobias-frintz)


Lesenswert?

Hallo Zusammen

Ich habe den Kontroller MSP430 20xx3 (14 Pin)und ich möchte einen Chip 
On Glass Textdisplay (16x2) über USI anschließen. Ich bin aber neu bei 
Konntrollern, daher weiss ich nicht wie des funkt.

Tobi

von Raccoon (Gast)


Lesenswert?

Datenblatt lesen, Befehle extrahieren und dann das Display ansprechen...

von Jörg S. (Gast)


Lesenswert?

> einen Chip On Glass Textdisplay
Geht es genauer?

von Tobias F. (tobias-frintz)


Lesenswert?

Hy Jörg

Es geht genauer:
Der Display nennt sich EA DOGM-M (STN negativ blau transmittiv) und das 
Datenblat des Kontrollers ST7036 findest du unter 
http:/Icd-module.de/eng/pdf/zubehoer/st7036.pdf
Ich möchte ihn mit 5V über SPI(Anschlüsse: SI; CLK; RS und 
CSB)anschliesen. Der ASCII-Zeichensatz ist integriert, es können 
zusätzlich 8 Zeichen programmmiert werden.

Tobi

von Tobias F. (tobias-frintz)


Lesenswert?

Hallöchen

Also das Datenblatt hab ich gelesen und da steht nur: Je nach Interface 
und Versorgungsspannung ist eine unterschiedliche Beschaltung zu wählen.
Befehle extrahieren???Wie soll ich den Display ansprechen? (Mit 
assembler)

von Jörg S. (Gast)


Lesenswert?

Der MSP kann keine 5V, da musst du schon 3,3V nehmen.

Schau dir das mal an:
http://www.mathar.com/msp_lcd1.html
Darauf kannst du erst mal aufbauen. Das DOG verhält sich (fast) wie 
dieses Standard Display.

von Christian R. (supachris)


Lesenswert?

Und der MSP nimmt es dir sehr krumm, wenn du 5V an seinen Eingang legst, 
also aufpassen.

von Tobias F. (tobias-frintz)


Lesenswert?

Hallöchen

Dein Link hab ich schon gelesen. Mein Kotroller ist aber eine 14-Pin 
Variante. Er hat nur 2 Port Pins. Guck mal im Anhang.

Tobi

von klausklingel (Gast)


Lesenswert?

Mein Aufbau besteht aus dem MSP430F2013 mit einem EA DOGM162E-A Display.

Ich würde behaupten das die Kommandos vom MSP430 über SPI richtig 
rausgehen (mit nem Speicheroszilloskop überprüft, wobei ich die längeren 
Pausen bei der Initialisierung rausgenommen hatte zum messen).

Leider tut sich nichts auf dem Display und ich habe die Befürchtung das 
meine Display defekt ist.
Wäre schön, wenn mal einer über den Code schauen könnte und dort 
vielleicht ein Fehler bei der Initialisierung oder beim senden der Daten 
findet.

Die Reihenfolge der Initialisierung ist aus dem Datenblatt vom Display 
aus dem Jahr 2007.


@ Tobias:
Falls du dein Display schon zum laufen gebracht hast, könntest du den 
Code posten ?
Falls nicht, probiere doch mal bitte meinen Code aus, da mein Display 
vielleicht ja wirklich Defekt ist.
1
/*******************************************************************************
2
*
3
* MODULE      : main.c
4
*
5
* COMPILER    : IAR Embedded Workbench IDE 4.7A  (4.7.1.0)
6
*
7
* LANGUAGE    : ANSI-C
8
*
9
* DESCRIPTION : (fill in a detailed description of the module’s
10
*                 function here).
11
*
12
* SYSTEM      : MSP430F2013
13
*
14
* AUTHOR      : <xxx.xxx@xxx.xxx>
15
*
16
* HISTORY     : 
17
*
18
*******************************************************************************/
19
20
/*
21
 * EA DOGM162E-A                MSP430F2013
22
 *  __________      __________
23
 * |      RW  |----------------| P1.2     |
24
 * |      RS  |----------------| P1.3     |
25
 * |      CSB |----------------| P1.4     |
26
 * |          |                |          |
27
 * |          |                |          |
28
 * |          |                |          |
29
 * |          |                |          |
30
 * |      D6  |----------------| P1.5     |
31
 * |      D7  |----------------| P1.6     |
32
 * |__________|                |__________|
33
 *
34
 * Angeschlossen am Display
35
 * 3,3V = D5, D4, D3, D2, D1, D0, E, /Reset, Vin (Pin 25),  Vdd
36
 * GND = Vss, PSB
37
 */
38
39
/*******************************************************************************
40
* INCLUDE SECTION
41
*******************************************************************************/
42
#include <msp430x20x3.h>
43
#include <stdint.h>
44
45
/*******************************************************************************
46
* DEFINE AND MACRO SECTION
47
*******************************************************************************/
48
49
/*******************************************************************************
50
* GLOBAL VARIABLES SECTION
51
*******************************************************************************/
52
53
/*******************************************************************************
54
* FUNCTION SECTION
55
*******************************************************************************/
56
void SPISetup_deviceX(void);
57
void lcd_write(char command, char daten);
58
59
void delay_30us(void);
60
void delay_50ms(void);
61
void delay_2ms(void);
62
void delay_200ms(void);
63
64
/*******************************************************************************
65
* Function name  : void main(void)
66
*    return   : void
67
*    arg1     : void
68
* Author      : 
69
* History     : date and event
70
* Description : none
71
* Notes       : none
72
*******************************************************************************/
73
void main(void)
74
{
75
  volatile unsigned int i;             // Use volatile to prevent removal
76
  volatile unsigned int k;
77
78
  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog
79
80
  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
81
  DCOCTL = CALDCO_1MHZ;
82
83
  P1DIR |= BIT2 + BIT3 + BIT4;         // Port 1.2, 1.3, 1.4 = Output
84
  P1OUT &= ~BIT2;                      // R/W = LOW
85
86
  delay_50ms();
87
88
  SPISetup_deviceX();
89
90
91
  while(1){
92
93
    // initialise Display
94
95
    lcd_write(0x39, 0);
96
    delay_30us();
97
    
98
    lcd_write(0x14, 0);
99
    delay_30us();
100
101
    lcd_write(0x55, 0);
102
    delay_30us();
103
104
    lcd_write(0x6D, 0);
105
    delay_200ms();
106
107
    lcd_write(0x78, 0);
108
    delay_30us();
109
110
    lcd_write(0x38, 0);
111
    delay_30us();
112
113
    lcd_write(0x0F, 0);
114
    delay_30us();
115
116
    lcd_write(0x01, 0);
117
    delay_2ms();
118
119
    lcd_write(0x06, 0);
120
    delay_30us();
121
122
123
   
124
    // soll ein paar "x" schreiben...
125
    lcd_write(0x78, 1);
126
    delay_200ms();
127
128
    lcd_write(0x78, 1);
129
    delay_200ms();
130
131
    lcd_write(0x78, 1);
132
    delay_200ms();
133
134
    lcd_write(0x78, 1);
135
    delay_200ms();
136
137
    lcd_write(0x78, 1);
138
    delay_200ms();
139
    
140
    // Verzögerung um etwas auf dem Display zu sehen...
141
    for (k = 0; k < 15000; k++){
142
      for (i = 0; i < 15000; i++);
143
    }
144
  }
145
}
146
147
148
149
150
void SPISetup_deviceX(void)
151
{
152
  USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;// Port, SPI master, MSB wird zuerst übertragen
153
  USICKCTL = USIDIV_4 + USISSEL_2;
154
  USICTL0 &= ~USISWRST;                     // USI released for operation
155
156
  USISR = 0x00;
157
  USICNT = 1;
158
}
159
160
161
// USI interrupt service routine
162
#pragma vector=USI_VECTOR
163
__interrupt void universal_serial_interface(void)
164
{;}
165
166
167
void lcd_write(char command, char daten)
168
{
169
  volatile uint8_t i;
170
171
  if (daten==0){
172
    P1OUT &= ~BIT3; // RS = LOW, es handelt sich um ein Kommando
173
  }
174
175
  if (daten==1){
176
    P1OUT |= BIT3;  // RS = HIGH, es handelt sich um Daten
177
  }
178
179
  P1OUT &= ~BIT4;        // /CS enable
180
181
  USISRL = command;                           // Load value
182
  USICNT = 8;                               // Send it
183
  
184
  while (!(USICTL1&USIIFG));                // Wait for TX to finish
185
186
  P1OUT |= BIT4;         // /CS disable
187
}
188
189
190
void delay_30us(void)
191
{
192
  volatile uint8_t i;
193
  
194
  for(i=1;i<=1;i++){;} 
195
}
196
197
198
void delay_2ms(void)
199
{
200
  volatile uint16_t i;
201
202
  for(i=1;i<=186;i++){;}
203
}
204
205
206
void delay_50ms(void)
207
{
208
  volatile uint16_t i;
209
210
  for(i=1;i<=10000;i++){
211
  }
212
}
213
214
215
void delay_200ms(void)
216
{
217
  volatile uint16_t i;
218
  volatile uint16_t k;
219
220
  for(k=0 ; k<2 ; k++){
221
      for(i=1;i<=10000;i++){
222
      }
223
  }
224
}
225
226
/*******************************************************************************
227
* END OF FILE
228
*******************************************************************************/

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Auch ich habe auch das Problem MSP430 + DOGM gehabt und bin auf der 
Suche nach einer Lösung hier gelandet.

Zunächst Dank an Klaus! Dein Code hat mir die entscheidenden Kommandos 
geliefert, z.B. das DCO Timing, das hatte ich total vergessen...

Selbst besitze ich ein EA DOGM163W-A (16x3 Weis Transreflektiv) und ein 
paar MSP430-F2013 (mit USB-FET Debugger-Tool).

Als IDE bevorzuge ich die eclipse-Version (TI Code Composer Essentials 
v2).

Dein Code, Klaus, hat bei mir sofort seine Leistung erbracht, allerdings 
ist der Kontrast in den Beispielen viel zu hoch (alles Schwarz).

Meinen eigenen Code und den von Klaus habe ich fusioniert und in ein 
Header-File gepackt. Im Anhang habe ich für alle, die meinen Leidensweg 
teilen und Erlösung erlangen wollen, den Kompletten Code 
durchkommentiert und funktionsfähig (für DOGM163, für 162 oder 81 müsste 
es schnell umschreibbar sein) hinteregt. Der Zip-Inhalt ist direkt der 
Inhalt für ein CCE-Projektverzeichnis.

Zusätzlich habe ich für interessierte gleich mal eine Target3001!-Datei 
mit dem abstrakten Schaltplan beigefügt. Der Plan ist auch nochmal als 
PNG dabei. (Hinweis: Target 3001! V13 discover ist Freeware!! In der 
Datei sind auch die Symbol- und Bauteildaten für den F2013 und das DOGM 
enthalten!)

Ich hoffe dass dieses Toolkit allen Suchenden genug Material liefert, 
freude am DOGM zu entwickeln! Vielen Dank auch an alle meine Vorposter!

Gruß,
  Christian

von klausklingel (Gast)


Lesenswert?

Vielen Dank Christian (habe jetzt erst gesehen das mir jemand 
geantwortet hatte).

Habe mit deinem Code auch gleich Zeichen auf mein Display bekommen (ohne 
etwas umzuschreiben; bei 5V beschaltung) und mich gefreut das mein 
Display doch geht...

Leider funktioniert mein Display anscheinend nur mit 5V (obwohl es die 
3,3V machen sollte). Hierzu reicht es, wenn man Vdd, Vin und Vout auf 5V 
legt und den Rest kann man über 3,3V laufen lassen (z.B. die ganzen 
Sachen vom MSP430).

Falls noch jemand eine Idee hat woran es liegen könnte, das es unter 
3,3V bei mir noch nicht läuft (falls es doch kein Hardware defekt ist), 
würde ich mich über eine Antwort freuen.
(Initialisierung Sequenz wurde natürlich beim Ausprobieren auf die 3,3V 
umgebaut).


Gruß

klausklingel

von tobias-frintz (Gast)


Lesenswert?

Hallo Forum

Hast du die 2 Kondensatoren angeschlossen (die man bei der 3.3 V Methode 
braucht)?
ich versuch grad Christian´s Code auf den Controller zu brennen bin 
warschenlich aber zu blöd dazu!

Tobi

von Tobi (Gast)


Lesenswert?

Hy

Schreibt hier noch jemand ?!?
Wär wahnsinnig nett

Tobi

von Jojo (Gast)


Lesenswert?

Hallo,

ich wollte mich mal bei Euch für den sehr schönen Beitrag bedanken!
Vorallem auch bei Christian für seinen Code.

Habe Dank des Codes gerade mein DOGM-163 auf dem LaunchPad (mit 
MSP430G2452) zum laufen bekommen!

Allerdings auch nur mit 5V wie beschrieben, mit 3V3 wollte es noch 
nicht. Liegt ev. auch an den Kondensatoren, die zu groß sind (47µF).

Unschön ist noch, dass das Display nicht im Debug Mode der TI IAR läuft. 
Muss es erst abklemmen und neu anstecken. Dann hauts hin. Wenn mann das 
nicht weiß probiert man sehr lange! ;)

Schöne Grüße
Jojo

von Jörg S. (joerg-s)


Lesenswert?

Jojo schrieb:
> Unschön ist noch, dass das Display nicht im Debug Mode der TI IAR läuft.
Sollte es aber...

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Man sollte dem Display am Anfang einen etwa 100 ms langen Resetpuls 
geben

also z.B. so:
1
void main(void)
2
{
3
  volatile unsigned int i;             // Use volatile to prevent removal
4
  volatile unsigned int k;
5
6
  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog
7
8
  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
9
  DCOCTL = CALDCO_1MHZ;
10
11
  P1DIR |= BIT2 + BIT3 + BIT4;         // Port 1.2, 1.3, 1.4 = Output
12
  P1OUT &= ~BIT2;                      // R/W = LOW
13
  P1OUT &= ~BIT3;                      // Reset low  <----
14
15
  delay_100ms();                       // Auf 100 ms geändert  <----
16
17
  P1OUT |= BIT3;                       // Reset high <----
18
19
  SPISetup_deviceX();

Dann sollte es auch mit dem Debugger funktionieren.

Grüße,

Peter

von Johannes J. (joje)


Lesenswert?

Hallo,

vielen Dank für den Hinweis mit der 100ms Pause.
Jedoch hat das in meinem Fall keine Besserung bewirkt. :-(

Ich werde mir den Code selbst in "C" "übersetzen" und mal versuchen 
geziehlt ein paar mehr pausen ein zu fügen.

Eine Frage zur Courser Position habe ich noch: Kann ich die irgendwie 
verschieben? Ich würde mir gerne eine LCD-Funktion schreiben, der ich 
eine bestimme Position und die zu schreibenden zeichen übergebe. So dass 
ich z.B. nur die 2. Zeile neu schreibe.

Vielen Dank, denn bei den Befehlen zum LCD sehe ich noch nicht ganz 
durch. Gibt es da eine gute Erkläreung im Netz?

Grüße,
joje

von Johannes J. (joje)


Lesenswert?

Hallo,

wie wird der Reset im SPI-Mode durchgeführt?

Der RESET-Pin des LCDs liegt bei mir auf dem RESET des Launchpad.

Was ist im obigen Besispiel mit:
>  P1OUT &= ~BIT3;                      // Reset low  <----
genau gemeint?

Auch:
> P1OUT &= ~BIT2;                      // R/W = LOW
kann im SPI-Mode nicht durchgeführt werden, da R/W fest auf 3 bzw. 5V 
liegt.

Also wie kann der Reset im SPI Mode durchgeführt werden?

Vielen Dank!! ;)

PS: Die ersten 8 Zeichen können selbst defineirt werden, laut 
beiliegendem Datenblatt, aber wie erstellt man selbst ein Zeichen, wird 
einem nicht verraten?

von Reset (Gast)


Lesenswert?

Johannes J. schrieb:
> Der RESET-Pin des LCDs liegt bei mir auf dem RESET des Launchpad.

Ja wie willst du denn dann noch einen Reset bei laufendem Controller 
durchführen? Außerdem kannst du den Reset vom uC doch nicht durch den uC 
betätigen.

Da musste schon nen freien Pin wählen.

von Jörg S. (joerg-s)


Lesenswert?

Johannes J. schrieb:
> Vielen Dank, denn bei den Befehlen zum LCD sehe ich noch nicht ganz
> durch. Gibt es da eine gute Erkläreung im Netz?
Zu den 16x2 Displays gibt es minimum 1 Milliarde Seiten :)
Siehe z.B.:
http://mathar.com/msp_lcd1.html

von joje (Gast)


Lesenswert?

> > wie wird der Reset im SPI-Mode durchgeführt?

>Ja wie willst du denn dann noch einen Reset bei laufendem Controller
>durchführen? Außerdem kannst du den Reset vom uC doch nicht durch den uC
>betätigen.

Hätte nicht erwartet, das LCD reseten zu müssen während der 
Programm-Laufzeit. Und den µC natürlich schon garnicht. ;) Ohne Debugger 
Läuft es auch Prima.

Bei SPI bliebe dann wohl nur der RESET-Pin übrig. Aber Mangel freier 
Pins muss er entfallen.

> Zu den 16x2 Displays gibt es minimum 1 Milliarde Seiten :)
>Siehe z.B.:
>http://mathar.com/msp_lcd1.html

Die Frage bezieht sich auch hier auf das DOGM163 via SPI (und nicht auf 
2x16 paralell o.Ä.). Dazu jemand noch einen Tip?

Danke!

von Jörg S. (joerg-s)


Lesenswert?

joje schrieb:
> Die Frage bezieht sich auch hier auf das DOGM163 via SPI (und nicht auf
> 2x16 paralell o.Ä.). Dazu jemand noch einen Tip?
Das tut sich nicht viel. Das betrifft ja nur die reine Datenübertragung. 
Der Rest mit Kommandos etc. ist vollkommen identisch.

von spess53 (Gast)


Lesenswert?

Hi

>Das tut sich nicht viel. Das betrifft ja nur die reine Datenübertragung.
>Der Rest mit Kommandos etc. ist vollkommen identisch.

Erzähle bitte nicht solchen Unsinn. Seit wann hat ein HD44780 Befehle 
für Kontrast, Booster, Umschaltung Instruction Table, ... .

MfG Spess

von Jörg S. (joerg-s)


Lesenswert?

Ich meine ALLGEMEIN Befehle. RS Pin schalten, Daten/Kommando anlegen, 
Takten usw.
Wobei ein Großteil der Kommandos sehrwohl identisch sind.

von spess53 (Gast)


Lesenswert?

Hi

>Ich meine ALLGEMEIN Befehle. RS Pin schalten, Daten/Kommando anlegen,
>Takten usw.

Das ist sogar bei vielen Grafikcontrollern so.

>Wobei ein Großteil der Kommandos sehrwohl identisch sind.

Vor kurzem hatte hier jemand das Problem, das er auf einem DOGM keine 
selbstdefinierte hinbekommen hat. Der Grund war, das er nach der 
Initialisierung nicht wieder auf die Instruction Table 0 umgeschaltet 
hat. Und das obwohl die Befehle dafür identisch mit dem HD44780 sind.

Also ist dein Hinweis auf die 'minimum 1 Milliarde Seiten' nicht sehr 
hilfreich.

MfG Spess

von Matthias (Gast)


Lesenswert?

Vielleicht hier:
http://h13.binary-universe.net/viewforum.php?f=3
mal nachschauen?

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.