Forum: Mikrocontroller und Digitale Elektronik DOGM162 an MSP430F1232 betreiben


von Norman F. (nofreak)


Lesenswert?

Hallo!

Seit etwas mehr als einer Woche versuche ich, leider erfolglos, ein 
Display von Electronic Assembly namens EA DOGM162W-A an einem TI 
MSP430F1232 Leben einzuhauchen. Der Controller ist auf dem 
Education-Board v1.4 [ http://www.msp430-buch.de/  ] des FTZ Leipzig 
verbaut und hat bereits ein LCD an bord, was zwar die gleichen Ports 
belegt, aber ein andere Initialisierung. Das LCD soll mit 4 Bit bei 3,0 
- 3,3 V laufen (genau sind es +3,12V am Pin2 direkt vom Controller).

Hier erstmal das Datenblatt vom Display: 
http://www.lcd-module.de/pdf/doma/dog-m.pdf

Elektrisch hab ich, wie im Datenblatt angegeben, das LCD angschlossen:
Kontakte
21 (-)1uF(+) 22
23 Masse
24 (+)2,2uF(-) 25 auf +3,3V
26 +3,3V
27 Masse
28 D7 auf P1.3
29 D6 auf P1.2
30 D5 auf P1.1
31 D4 auf P1.0
32 bis 35 auf +3,3V
36 Enable auf P3.1
37 R/W auf Masse
38 Chip Select (CSB) auf Masse
39 RS auf P3.0
40 Reset auf +3,3V oder Masse (ist uneindeutig im Datenblatt, keines von 
beiden zeigt keine Wirkung)

Mit IAR Workbench (Kickstart) habe ich programmiert, das nach der 
Initialisierung (4 Bit, 2 zeilig, Cursor aus, kein Blinken, rechts 
shift) ein 'A' links oben angzeigt werden müsste. Leider gibt es keine 
Reaktion vom LCD. Ob das Display defekt ist oder nicht, kann womöglich 
nur vermutet werden.


Vielen Dank schon im Voraus
Gruß Norman



Hier ist der Quellcode dazu:
1
#include <msp430x12x2.h>
2
3
4
void delay(int z_wert)             // 1000*z_wert ca. 1ms ???
5
{
6
  int v;
7
  for (v=z_wert; v>=0; v--);
8
}
9
10
11
void main(void)
12
{
13
    WDTCTL = WDTPW + WDTHOLD;                     // Stop WDT
14
  
15
  // Setup Port1 8Bit Daten zu Display
16
  P1DIR=0xFF;
17
  P1OUT=0xF0;
18
  //LCD_Init ();                                    // Initiallisierung des LCD
19
20
  delay(30000);                // >32.767 mag Compiler nicht <-- 16 Bit
21
  delay(10000);                // 30ms+10ms=40ms warten
22
  
23
  P1OUT &= ~BIT3+~BIT2+~BIT1+~BIT0; // Port1 = xxxx 0000
24
  P3OUT &= ~BIT0;             // RS=0: Anweisung, Befehl; RS=1: Text
25
  P3OUT |= BIT1;              // Function Set: 0x20
26
  P1OUT = 0x30>>4;                           
27
  P3OUT &=~BIT1;
28
  delay(2000);
29
30
  P3OUT |= BIT1;              // Function Set: 0x20
31
  P1OUT = 0x30>>4;                         
32
  P3OUT &=~BIT1;
33
  delay(1000);
34
35
  P3OUT |= BIT1;              // Function Set: 0x30
36
  P1OUT = 0x30>>4;            // zusendende Daten                           
37
  P3OUT &=~BIT1;              // mit fallender Flanke des Enable-Signasls
38
  delay(1000);
39
40
  P3OUT |= BIT1;              // Function Set: 0x20
41
  P1OUT = 0x20>>4;                           
42
  P3OUT &=~BIT1;
43
  delay(1000);
44
45
  // ab hier 4bit (high nibble, low nibble)
46
  P3OUT |= BIT1;              // Function Set: DL=0, N=1, IS2=0, IS1=1
47
  P1OUT = 0x20>>4;
48
  P3OUT &=~BIT1;
49
  P3OUT |= BIT1;
50
  P1OUT = 0x09;                      
51
  P3OUT &=~BIT1;
52
  delay(1000);
53
54
  P3OUT |= BIT1;              // BIAS: BS=0, FX=0
55
  P1OUT = 0x10>>4;                          
56
  P3OUT &=~BIT1;
57
  P3OUT |= BIT1;
58
  P1OUT = 0x04;                         
59
  P3OUT &=~BIT1; 
60
  delay(1000);
61
62
  P3OUT |= BIT1;              //  Contrast: C3=1, C2=0, C1=0, C0=0
63
  P1OUT = 0x70>>4;                        
64
  P3OUT &=~BIT1;
65
  P3OUT |= BIT1;
66
  P1OUT = 0x08;                         
67
  P3OUT &=~BIT1; 
68
  delay(1000);
69
70
  P3OUT |= BIT1;              // PIC: Ion=1, Bon=1, C5=1, C4=0
71
  P1OUT = 0x50>>4;                         
72
  P3OUT &=~BIT1;
73
  P3OUT |= BIT1;
74
  P1OUT = 0x0E;                         
75
  P3OUT &=~BIT1;
76
  delay(1000);
77
78
  P3OUT |= BIT1;              // Follower Control: Fon=1, Rab2=0, Rab1=1, Rab0=0
79
  P1OUT = 0x60>>4;                         
80
  P3OUT &=~BIT1;
81
  P3OUT |= BIT1;
82
  P1OUT = 0x0A;                          
83
  P3OUT &=~BIT1;  
84
  delay(1000);
85
86
  P3OUT |= BIT1;              // Display ON: D=1, C=0, B=0
87
  P1OUT = 0x00>>4;
88
  P3OUT &=~BIT1;
89
  P3OUT |= BIT1;
90
  P1OUT = 0x0C;
91
  P3OUT &=~BIT1;
92
  delay(1000);
93
94
  P3OUT |= BIT1;              // Clear Display
95
  P1OUT = 0x00>>4;                          
96
  P3OUT &=~BIT1;
97
  P3OUT |= BIT1;
98
  P1OUT = 0x01;                  
99
  P3OUT &=~BIT1;  
100
  delay(1000);
101
102
  P3OUT |= BIT1;              // Entry Mode: I/D=1, S=0
103
  P1OUT = 0x00>>4; 
104
  P3OUT &=~BIT1;
105
  P3OUT |= BIT1;
106
  P1OUT = 0x06;                        
107
  P3OUT &=~BIT1; 
108
  delay(1000);
109
110
  P3OUT |= BIT0;              // RS=0: Anweisung, Befehl; RS=1: Text
111
  P3OUT |= BIT1;              // Write: 'A'
112
  P1OUT = 0x40>>4;                   
113
  P3OUT &=~BIT1;
114
  P3OUT |= BIT1;
115
  P1OUT = 0x01;                    
116
  P3OUT &=~BIT1;  
117
  delay(1000);
118
  
119
}

von Jörg S. (joerg-s)


Lesenswert?

1
P1OUT &= ~BIT3+~BIT2+~BIT1+~BIT0; // Port1 = xxxx 0000
mach mal lieber
1
P1OUT &= ~(BIT3+BIT2+BIT1+BIT0); // Port1 = xxxx 0000
Wobei die umständliche Schreibweise auch egal ist, da du bei jedem 
anderen Zugriff eh immer alles auf 0 setzt. Du kannst also auch einfach 
P1OUT = 0x00 schreiben.
1
 P3OUT |= BIT1;              // Function Set: 0x20
2
 P1OUT = 0x30>>4;
Da passt Code und Kommentar nicht zusammen

>40 Reset auf +3,3V oder Masse (ist uneindeutig im Datenblatt...
Wie im Datenblatt zu sehen ist muss die Leitung eindeutig auf 3,3V (für 
normalbetrieb).

von Norman F. (nofreak)


Angehängte Dateien:

Lesenswert?

Danke für die Antwort.

Ich habe das mit der Klammer und mit dem Reset auf 3,3V geändert.
Der Kommentar ist an der Stelle falsch, aber die Werte sind wie im 
Datenblatt richtig, also:

0x30
0x30
0x30
0x20
.
.
.

Nochmal zum Reset, das ist im Datenblatt ganz hinten in der Tabelle mit 
'L', also LOW, angegeben. Was für mich Masse bedeutet, aber weiter vorne 
in der Zeichnung ist Reset auf +3,3V

Die delay-Funktion habe ich auch nochmal überarbeitet und entsprechend 
auch die delay-Werte:
1
void delay(unsigned int z_wert)
2
{
3
volatile unsigned int i;
4
5
while (z_wert > 0)
6
  {
7
  z_wert--;
8
  for (i=0; i<60; i++);    // equals 1 ms
9
  }
10
}

Es hat alles nichts gebracht. Das LCD macht keinen mux. ;-(

Gruß Norman

von Northernhessian (Gast)


Lesenswert?

Hallo Norman,
schau' mal unter http://homepages.fh-regensburg.de/~scg39398/mc_lab/
Sollte der Link nicht funktionieren, dann füttere mal die Suchmaschine 
Deiner Wahl mit den Begriffen "msp430 niceboard". Dann landest Du auch 
auf der Projektseite der FH-Regensburg. Die haben auf ihrem Board ein 
EA-DOGM162 und entsprechende initialisierungs Routinen für den 4Bit 
Betrieb und auch die Ansteuerung via SPI.

von Jörg S. (joerg-s)


Lesenswert?

Norman Freitag schrieb:
> Nochmal zum Reset, das ist im Datenblatt ganz hinten in der Tabelle mit
> 'L', also LOW, angegeben. Was für mich Masse bedeutet,
> in der Zeichnung ist Reset auf +3,3V
Es ist einfach die Standardbeschaltung für Reset.
Low = Masse = Reset
High = Vcc = Normalbetrieb.

von Norman F. (nofreak)


Lesenswert?

@Jörg S.
Ok, danke für die Info.

@Northernhessian
Northernhessian schrieb:
> Hallo Norman,
> schau' mal unter http://homepages.fh-regensburg.de/~scg39398/mc_lab/
> Sollte der Link nicht funktionieren, dann füttere mal die Suchmaschine
> Deiner Wahl mit den Begriffen "msp430 niceboard". Dann landest Du auch
> auf der Projektseite der FH-Regensburg. Die haben auf ihrem Board ein
> EA-DOGM162 und entsprechende initialisierungs Routinen für den 4Bit
> Betrieb und auch die Ansteuerung via SPI.


Danke für den Tipp, aber das hatte ich schon probiert und es hat nicht 
funktioniert.
Dieses Projekt der FH Regensburg ist als CrossWorks-Projekt online 
gestellt, aber das aktuelle CrossWorks 2.0 kennt keine <msp430x12x2.h>, 
was zu Fehlern beim Kompilieren führt. Außerdem belegen die Authoren 
genau die für das Debugging notwendigen Ports P1.4 bis P1.7.


@ALLE
Ich hab das Display nun mit 8bit zum Laufen bekommen. Wenn bei mir 4bit 
läuft, dann lade ich den Quellcode hoch.

Gruß Norman

von Sid (Gast)


Lesenswert?

Falls du noch einen Pin für Reset frei hast, probier mal:

- Spannung anlegen
- delay
- Reset low
- delay
- Reset High

Bei mir wars so, dass es nur nach definierten Reset lief.

von Norman F. (nofreak)


Lesenswert?

Sid schrieb:
> Falls du noch einen Pin für Reset frei hast, probier mal:
>
> - Spannung anlegen
> - delay
> - Reset low
> - delay
> - Reset High
>
> Bei mir wars so, dass es nur nach definierten Reset lief.


Bezieht sich das auf alle Betriebsmodi, also auch auf 8-Bit-Betrieb?

von Tino K. (blumengiesser)


Lesenswert?

ich habe auch grad damit zu kämpfen gehabt. aber mit SPI. bei mir war 
SPI falsch konfiguriert und der RS + CSB Pin war falsch deklariert. Bei 
dir nicht relevand. SPI Pin's schon verbraucht?

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Norman Freitag schrieb:
> Ich hab das Display nun mit 8bit zum Laufen bekommen. Wenn bei mir 4bit
> läuft, dann lade ich den Quellcode hoch.
Kann dir auch meinen Anbieten :) Hab ich glaub ich schon mal hier 
irgendwo im Forum hochgeladen...

von Norman F. (nofreak)


Lesenswert?

@Jörg S.
Das sieht vielversprechend aus, aber wie ist delay(), DELAY_30_US und 
DELAY_SHORT definiert?



Die Atmels scheinen ja von Haus aus eine ordentliche delay-Funktion mit 
util/delay.h mitzubringen, wenn ich so diverse Quellcodes im Netz finde. 
Leider fehlt dem MSP430 genauer meinem 1232 sowas aber.


Gruß Norman

von Jörg S. (joerg-s)


Lesenswert?

Norman Freitag schrieb:
> Das sieht vielversprechend aus, aber wie ist delay(), DELAY_30_US und
> DELAY_SHORT definiert?
Diese Frage hatte ich befürchtet :)
Ich weiss das man am Anfang gerne alles per CopyPaste haben will, aber 
was eine Delay Funktion macht dürfte doch klar sein, oder? Und sowas zu 
schreiben ist doch auch mehr als Einfach.
Wie lange DELAY_SHORT verzögern muss steht im Kommentar.

>Die Atmels scheinen ja von Haus aus eine ordentliche delay-Funktion mit
>util/delay.h mitzubringen,....
Das hat mit Atmel nichts zu tun, das macht der Compiler Hersteller.

>Leider fehlt dem MSP430 genauer meinem 1232 sowas aber.
Vermisse ich nicht. So eine Funktion schreibt man einmal im Leben und 
kopiert die dann nur noch von Projekt zu Projekt ;)

von Norman F. (nofreak)


Angehängte Dateien:

Lesenswert?

So, wie versprochen mein funktionierender Quellcode für den 8Bit-Modus 
und den 4Bit-Modus.

Die Initialisierungscodes aus dem Datenblatt des ST7036 scheinen nicht 
hundertprozentig stimmig zu sein.


Jedenfalls habe ich die einzeilnen Codesendungen an das Display 
gruppiert, so dass man die Arbeitsweise gut verfolgen kann. Optimiert 
durch Funktionen ist dann ein Quellcode, wie vom Vorredner Jörg S. drin, 
der auch weniger Speicher benötigen sollte.

Das LCD sollte mit meinem Beispiel folgendes anzeigen:

80            8F
C0            CF


Das sind die Positionsadressen der Zellen links oben, rechts oben, links 
unten und rechts unten.

Das Timing kann sicher noch mehr optimiert werden, aber es funktioniert 
so wie es ist erstmal.

Als nächstes möchte ich noch SPI zum Laufen bekommen, wenn ich das habe, 
stelle ich das dann hier ein. Es könnten deshalb Fragen bzgl. SPI von 
mir hier noch folgen.

Danke für die bisherige Hilfe.


Gruß Norman

von Norman F. (nofreak)


Angehängte Dateien:

Lesenswert?

So,
wie versprochen stelle ich hier die Routine für die SPI-Ansteuerung des
Displays ein.

Man hat in dem Quellcode die Wahl zwischen SPI-, 4-Bit- und
8-Bit-Betrieb, sowie die Wahl zwischen MSP430x12x2 (also wie mein F1232)
oder MSP430x22x2 (etwa der F2232) oder dem MSP430x22x4 (also ein F2274).

Die 12xx-µC hat eine "alte" SPI-Initialisierung auf U0, die 22xx-µC 
(22x2 und 22x4) haben die gleiche, hier wurde B0 genutzt, um zwischen 
den µC-Generationen pinkompatibel zu bleiben.

Ich habe alle 9 Kombination getestet und es läuft!!!

Das 1-zeilige sowie das 3-zeilige DOGM-Display kann mit Sicherheit durch
ganz wenige Änderungen auch mit dem Quellcode zum laufen gebracht
werden.

Gruß
Norman

von Johnny B. (johnnyb)


Lesenswert?

Norman Freitag schrieb:
> Die Atmels scheinen ja von Haus aus eine ordentliche delay-Funktion mit
> util/delay.h mitzubringen, wenn ich so diverse Quellcodes im Netz finde.
> Leider fehlt dem MSP430 genauer meinem 1232 sowas aber.

Fehlt nicht, zumindest nicht bei IAR (siehe unten) und Code Composer:

#include <intrinsics.h>

/* Insert a delay with a specific number of cycles. */
__intrinsic void __delay_cycles(unsigned long __cycles);

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.