www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DOGM162 an MSP430F1232 betreiben


Autor: Norman F. (nofreak)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <msp430x12x2.h>


void delay(int z_wert)             // 1000*z_wert ca. 1ms ???
{
  int v;
  for (v=z_wert; v>=0; v--);
}


void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                     // Stop WDT
  
  // Setup Port1 8Bit Daten zu Display
  P1DIR=0xFF;
  P1OUT=0xF0;
  //LCD_Init ();                                    // Initiallisierung des LCD

  delay(30000);                // >32.767 mag Compiler nicht <-- 16 Bit
  delay(10000);                // 30ms+10ms=40ms warten
  
  P1OUT &= ~BIT3+~BIT2+~BIT1+~BIT0; // Port1 = xxxx 0000
  P3OUT &= ~BIT0;             // RS=0: Anweisung, Befehl; RS=1: Text
  P3OUT |= BIT1;              // Function Set: 0x20
  P1OUT = 0x30>>4;                           
  P3OUT &=~BIT1;
  delay(2000);

  P3OUT |= BIT1;              // Function Set: 0x20
  P1OUT = 0x30>>4;                         
  P3OUT &=~BIT1;
  delay(1000);

  P3OUT |= BIT1;              // Function Set: 0x30
  P1OUT = 0x30>>4;            // zusendende Daten                           
  P3OUT &=~BIT1;              // mit fallender Flanke des Enable-Signasls
  delay(1000);

  P3OUT |= BIT1;              // Function Set: 0x20
  P1OUT = 0x20>>4;                           
  P3OUT &=~BIT1;
  delay(1000);

  // ab hier 4bit (high nibble, low nibble)
  P3OUT |= BIT1;              // Function Set: DL=0, N=1, IS2=0, IS1=1
  P1OUT = 0x20>>4;
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x09;                      
  P3OUT &=~BIT1;
  delay(1000);

  P3OUT |= BIT1;              // BIAS: BS=0, FX=0
  P1OUT = 0x10>>4;                          
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x04;                         
  P3OUT &=~BIT1; 
  delay(1000);

  P3OUT |= BIT1;              //  Contrast: C3=1, C2=0, C1=0, C0=0
  P1OUT = 0x70>>4;                        
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x08;                         
  P3OUT &=~BIT1; 
  delay(1000);

  P3OUT |= BIT1;              // PIC: Ion=1, Bon=1, C5=1, C4=0
  P1OUT = 0x50>>4;                         
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x0E;                         
  P3OUT &=~BIT1;
  delay(1000);

  P3OUT |= BIT1;              // Follower Control: Fon=1, Rab2=0, Rab1=1, Rab0=0
  P1OUT = 0x60>>4;                         
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x0A;                          
  P3OUT &=~BIT1;  
  delay(1000);

  P3OUT |= BIT1;              // Display ON: D=1, C=0, B=0
  P1OUT = 0x00>>4;
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x0C;
  P3OUT &=~BIT1;
  delay(1000);

  P3OUT |= BIT1;              // Clear Display
  P1OUT = 0x00>>4;                          
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x01;                  
  P3OUT &=~BIT1;  
  delay(1000);

  P3OUT |= BIT1;              // Entry Mode: I/D=1, S=0
  P1OUT = 0x00>>4; 
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x06;                        
  P3OUT &=~BIT1; 
  delay(1000);

  P3OUT |= BIT0;              // RS=0: Anweisung, Befehl; RS=1: Text
  P3OUT |= BIT1;              // Write: 'A'
  P1OUT = 0x40>>4;                   
  P3OUT &=~BIT1;
  P3OUT |= BIT1;
  P1OUT = 0x01;                    
  P3OUT &=~BIT1;  
  delay(1000);
  
}

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P1OUT &= ~BIT3+~BIT2+~BIT1+~BIT0; // Port1 = xxxx 0000
mach mal lieber
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.
 P3OUT |= BIT1;              // Function Set: 0x20
 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).

Autor: Norman F. (nofreak)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void delay(unsigned int z_wert)
{
volatile unsigned int i;

while (z_wert > 0)
  {
  z_wert--;
  for (i=0; i<60; i++);    // equals 1 ms
  }
}

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

Gruß Norman

Autor: Northernhessian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Norman F. (nofreak)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Norman F. (nofreak)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tino Kühn (blumengiesser)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg S. (joerg-s)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Norman F. (nofreak)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Norman F. (nofreak)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Beitrag #2082982 wurde vom Autor gelöscht.
Beitrag #2082988 wurde vom Autor gelöscht.
Autor: Norman F. (nofreak)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht 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);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.