Hallo Gemeinde, ich versuche seit einigen Tagen den DOGL128W-6 LCD der Firma Electronik-Assembly anzusteuern, leider ohne Erfolg. Ich habe mit einem Logik-Analysator direkt an den Pins des LCD's die Pegel gemessen. Nach meiner Auffassung kommen da auch genau die Hexa-werte die ich zur Initialisierung brauche an, nur leider gibt der Display nichts von sich und da ich leider aus dem Display nichts auslesen kann, weis ich nicht ob es jetzt an meiner Programmierung liegt oder am Display selbst.... Der Display wurde vor ca. einem Monat mit der vom Hersteller Vertriebenen Fassung am PC überprüft un lief ohne Probleme! Also möchte ich einen fehlerhaften Display nahezu ausschließen. Ich denke eher, es muss irgend etwas generelles sein, was ich falsch mache:-/ ich weis nur leider nicht was. Vielleicht könnt Ihr mir bei diesem Problem helfen. Zu dem Programm: Ich habe eine Beispieldatei von Ti umgemodelt um Fehler z.B. in der SPI init auszumerzen. Ich übertrage die Hexa-Werte alle einzeln um zwischendurch besser anhalten zu können, leider hat mir das bis jetzt nicht wirklich etwas gebracht. Das ungenutzte und dann automatisch gesetzte RX-Buffer-Flag fetze ich vor jedem Senden zurück, so dass es daran nicht liegen kann(hoffe ich) Ich habe auch schon versucht, nach jedem gesendeten wert CS auf '1' und/oder A0 auf '1' zu setzen. Leider hat das auch nichts geholfen... Ich hoffe Ihr habt noch die eine oder andere Idee?! Danke schon mal und viele Grüße Christian
Vergleiche doch mal die Initialisierung am PC mit der, die Du hier machst -- mit Deinem Logikanalysator solltest Du schnell die Unterschiede sehen können.
Hallo Rufus, ich mache die Initialisierung, die der Hersteller in dem Datenblatt vorgibt. Deswegen wundert es mich ja, das es nicht funktioniert... Oder Reden wir aneinander vorbei?
Christian D. schrieb: > Oder Reden wir aneinander vorbei? Du schriebst, daß Du einen funktionierenden Testaufbau mit einem PC hast. Nimm den, häng Deinen Logikanalysator da dran und sieh Dir an, ob sich das, was der anzeigt, von dem unterscheidet, was Du an Deinem nicht funktionierenden Aufbau mit dem MSP430 misst. Es geht also nicht darum, das Geschreibsel in den --meiner Ansicht nach recht schrecklichen-- EA-Datenblättern zu interpretieren, sondern ein laufendes und ein nichtlaufendes System auf Unterschiede zu untersuchen. Das hilft dann eventuell auch, den bei EA-Datenblättern immer vorhandenen Interpretationsspielraum einzugrenzen.
Hallo Christian, auf der Supportseite von EA gibt es ein Beispiel für die Initialisierung auf einem MSP430. Schau dir den Code doch mal an, vlt findest du damit ja das Problem.
Wenn das so einfach wäre... leider habe ich den Adapter nicht hier und auch nicht die Möglichkeit wieder an diesen zu kommen. Es geht mir eher um die Fragen: wird das SPI richtig genutzt, ich wundere mich etwas über die einzelnen "Taktblöcke", ist das normal so? Kommt das vom Hardware SPI? Ich befürchte ja immer noch, dass ich irgendeinen generellen Fehler mache, weis aber leider nicht weiter, mit dem PC-Modul wollte ich nur sagen, dass das LCD-Modul in Ordnung ist
Christian D. schrieb: > ich wundere mich etwas über die einzelnen > "Taktblöcke", ist das normal so? Kommt das vom Hardware SPI? Die SPI-Schnittstelle erzeugt nur dann ein Taktsignal, wenn sie Daten zu übertragen hat, insofern ist das normal. > Ich habe eine Beispieldatei von Ti umgemodelt um Fehler > z.B. in der SPI init auszumerzen. Poste mal Deinen Code, und erkläre mal nebenbei, was für Fehler Du in welchem TI-Beispielcode beseitigt haben willst. > Das ungenutzte und dann automatisch gesetzte RX-Buffer-Flag > fetze ich vor jedem Senden zurück Das klingt wirr. Achja: Poste auch einen Schaltplan, daß man sehen kann, wie Dein Display mit dem 'G2553 verbunden ist.
Rufus Τ. Firefly schrieb: > Poste auch einen Schaltplan, daß man sehen kann, wie Dein > Display mit dem 'G2553 verbunden ist. Das könnte wirklich hilfreich sein... So funktionierts bei mir, 3,3V Single Supply, ist aber bestimmt noch verbesserungsfähig:
1 | void SetupDisplay(void) |
2 | {
|
3 | //Ports:
|
4 | //
|
5 | //SCL P5.3
|
6 | //MOSI P5.1
|
7 | //#CS1B P5.0
|
8 | //A0 P4.7
|
9 | //#Reset P4.6 !!!Only Pull Down (active or passive)!!!
|
10 | |
11 | UCB1CTL1 |= UCSWRST; |
12 | |
13 | //reset on p4.6 fehler im layout -> nun aktiv
|
14 | P4OUT &= ~0x80; //set A0 to L(0) |
15 | P4DIR |= 0x80; |
16 | P4OUT &= ~0x40; |
17 | |
18 | P5SEL |= 0x0A; //mosi, sck |
19 | P5OUT |= 0x01; //#CS 1 -> not active |
20 | P5DIR |= 0x0B; |
21 | |
22 | UCB1CTL0 = 0x69; |
23 | UCB1CTL1 = UCSSEL0 + UCSSEL1 + UCSWRST; //smclk |
24 | UCB1BR0 = 1; |
25 | UCB1BR1 = 0; |
26 | |
27 | return; |
28 | }
|
29 | |
30 | void InitDisplay(void) |
31 | {
|
32 | char aucInitCmds[] = { |
33 | 0x40, // Display start line 0 |
34 | 0xa1, // ADC reverse |
35 | 0xc0, // Normal COM0~COM63 |
36 | 0xa6, // Display normal |
37 | 0xa2, // Set bias 1/9 (Duty 1/65) |
38 | 0x2f, // Booster, Regulator and Follower on |
39 | 0xf8, // Set internal Booster to 4x |
40 | 0x00, // Set internal Booster to 4x |
41 | 0x27, // Contrast set, V0 voltage regulator set |
42 | 0x81, // Contrast set, Electronic volume mode set |
43 | 0x16, // Contrast set, Electronic volume changed |
44 | 0xac, // Indicator set |
45 | 0x01, // Indicator on (off!?) |
46 | 0xaf}; // Display on |
47 | |
48 | WriteCmdsToLCD(14,&aucInitCmds[0]); |
49 | |
50 | return; |
51 | }
|
52 | |
53 | void WriteCmdsToLCD(unsigned int uiCount, char* pucData) |
54 | {
|
55 | unsigned int i=0; |
56 | |
57 | UCB1CTL1 &= ~UCSWRST; |
58 | |
59 | //cs low
|
60 | P5OUT &= ~0x01; |
61 | |
62 | for(i=0;i<uiCount;i++) |
63 | {
|
64 | while(!(UC1IFG & UCB1TXIFG)); |
65 | UCB1TXBUF = *pucData; |
66 | pucData++; |
67 | }
|
68 | while(!(UC1IFG & UCB1TXIFG)); |
69 | |
70 | //cs high
|
71 | P5OUT |= 0x01; |
72 | |
73 | UCB1CTL1 |= UCSWRST; |
74 | return; |
75 | }
|
76 | |
77 | void StringToLCD(char ucPage,char ucColumn,char *sText) //page means row (unsigned char *sText) |
78 | {
|
79 | unsigned int i=0; |
80 | unsigned int k=0; |
81 | char aucGeheZu[] = {0xB0,0x10,0x00}; //seite0, high nibble0, low nibble0 |
82 | |
83 | aucGeheZu[0] |= ucPage; |
84 | aucGeheZu[1] |= (ucColumn >> 4); |
85 | aucGeheZu[2] |= (ucColumn & 0x0Fu); |
86 | WriteCmdsToLCD(3,&aucGeheZu[0]); |
87 | |
88 | |
89 | UCB1CTL1 &= ~UCSWRST; |
90 | |
91 | |
92 | P4OUT |= 0x80; //set A0 to H(1) |
93 | |
94 | //cs low
|
95 | P5OUT &= ~0x01; |
96 | |
97 | |
98 | //write text
|
99 | while(sText[i]) |
100 | {
|
101 | k=0; |
102 | while((k<5)&(ucColumn<128)) |
103 | {
|
104 | while(!(UC1IFG & UCB1TXIFG)); |
105 | UCB1TXBUF = kaucASCIITabelle[sText[i]][k++]; |
106 | ucColumn++; |
107 | }
|
108 | //insert extra space
|
109 | //if(1)
|
110 | //{
|
111 | while(!(UC1IFG & UCB1TXIFG)); |
112 | UCB1TXBUF = 0 ; |
113 | ucColumn++; |
114 | //}
|
115 | i++; |
116 | }
|
117 | |
118 | while(!(UC1IFG & UCB1TXIFG)); |
119 | |
120 | //cs high
|
121 | P5OUT |= 0x01; |
122 | |
123 | P4OUT &= ~0x80; //set A0 to L(0) |
124 | |
125 | UCB1CTL1 |= UCSWRST; |
126 | |
127 | return; |
128 | }
|
Anhang: Ich habe gerade gesehen, dass ich das DOG M 128W-6 benutze, nicht DOG W 128W-6. Sieht aber im Datenblatt nach der gleichen initialisierung aus.
Guten Abend, MSP430G2xx3 // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // | | // | P1.2|-> Data Out (UCA0SIMO) // | | // LED <-|P1.0 P1.1|<- Data In (UCA0SOMI) braucht das? // | | // Slave reset <-|P1.5 P1.4|-> Serial Clock Out (UCA0CLK) // | | // | | // | | // CS <-|P1.3 | // | | // A0 <-|P1.6 | so sieht das ganze aus, habe die Schaltung im Moment erstmal auf nem Steckbrett aufgebaut. P1.1 wird nicht genutzt, der stammt noch auf dem SPI-Beispiel von TI. Also zu dem Flag: Ich habe gelesen, das bei SPI die Übertragung synchron abläuft, d.h. der MSP versucht während des Sendens etwas zu lesen, was im empfangsbuffer zwischengespeichert wird, liest man den Buffer nicht aus, löst dieses Flag aus. Ich habe die Codes verglichen und für mich sehen die identisch aus, halt nur Derivat bedingte unterschiede... natürlich mache ich das alles "manuell" um besser Breakpoints setzen zu können.... Ich bin langsam echt am verzweifeln:-/
Wiedervorlage: > Poste mal Deinen Code, und erkläre mal nebenbei, was für Fehler Du in > welchem TI-Beispielcode beseitigt haben willst.
Hallo Leute, ich habe heute endlich den Fehler gefunden! Und zwar hat mein Steckbrett einen Wackelkontakt! Jetzt habe ich das alles auf einer Platine fest verlötet und alles läuft wunderbar! Mein Programm ist vollkommen korrekt nur etwas umständlich aber das wird sich nun ändern;-) Danke für die schnelle Hilfe Viele Grüße Christian
Christian D. schrieb: > Mein Programm ist vollkommen korrekt > nur etwas umständlich aber das wird sich nun ändern;-) Hi Christian, Ich versuche momentan mein DOGM 132-5(selber controller) anzusteuern und wollte fragen ob du den code noch erweitert hast Wäre super wenn das ganze übersichtlicher wäre :) Grüsse Wide
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.