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
Datenblatt lesen, Befehle extrahieren und dann das Display ansprechen...
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
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)
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.
Und der MSP nimmt es dir sehr krumm, wenn du 5V an seinen Eingang legst, also aufpassen.
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
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 | *******************************************************************************/
|
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
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
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
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
Jojo schrieb: > Unschön ist noch, dass das Display nicht im Debug Mode der TI IAR läuft. Sollte es aber...
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
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
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?
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.
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
> > 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!
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.
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
Ich meine ALLGEMEIN Befehle. RS Pin schalten, Daten/Kommando anlegen, Takten usw. Wobei ein Großteil der Kommandos sehrwohl identisch sind.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.