www.mikrocontroller.net

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


Autor: Tobias Frintz (tobias-frintz)
Datum:

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

Autor: Raccoon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt lesen, Befehle extrahieren und dann das Display ansprechen...

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> einen Chip On Glass Textdisplay
Geht es genauer?

Autor: Tobias Frintz (tobias-frintz)
Datum:

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

Autor: Tobias Frintz (tobias-frintz)
Datum:

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

Autor: Jörg S. (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Tobias Frintz (tobias-frintz)
Datum:

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

Autor: klausklingel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
/*******************************************************************************
*
* MODULE      : main.c
*
* COMPILER    : IAR Embedded Workbench IDE 4.7A  (4.7.1.0)
*
* LANGUAGE    : ANSI-C
*
* DESCRIPTION : (fill in a detailed description of the module’s
*                 function here).
*
* SYSTEM      : MSP430F2013
*
* AUTHOR      : <xxx.xxx@xxx.xxx>
*
* HISTORY     : 
*
*******************************************************************************/

/*
 * EA DOGM162E-A                MSP430F2013
 *  __________      __________
 * |      RW  |----------------| P1.2     |
 * |      RS  |----------------| P1.3     |
 * |      CSB |----------------| P1.4     |
 * |          |                |          |
 * |          |                |          |
 * |          |                |          |
 * |          |                |          |
 * |      D6  |----------------| P1.5     |
 * |      D7  |----------------| P1.6     |
 * |__________|                |__________|
 *
 * Angeschlossen am Display
 * 3,3V = D5, D4, D3, D2, D1, D0, E, /Reset, Vin (Pin 25),  Vdd
 * GND = Vss, PSB
 */

/*******************************************************************************
* INCLUDE SECTION
*******************************************************************************/
#include <msp430x20x3.h>
#include <stdint.h>

/*******************************************************************************
* DEFINE AND MACRO SECTION
*******************************************************************************/

/*******************************************************************************
* GLOBAL VARIABLES SECTION
*******************************************************************************/

/*******************************************************************************
* FUNCTION SECTION
*******************************************************************************/
void SPISetup_deviceX(void);
void lcd_write(char command, char daten);

void delay_30us(void);
void delay_50ms(void);
void delay_2ms(void);
void delay_200ms(void);

/*******************************************************************************
* Function name  : void main(void)
*    return   : void
*    arg1     : void
* Author      : 
* History     : date and event
* Description : none
* Notes       : none
*******************************************************************************/
void main(void)
{
  volatile unsigned int i;             // Use volatile to prevent removal
  volatile unsigned int k;

  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog

  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
  DCOCTL = CALDCO_1MHZ;

  P1DIR |= BIT2 + BIT3 + BIT4;         // Port 1.2, 1.3, 1.4 = Output
  P1OUT &= ~BIT2;                      // R/W = LOW

  delay_50ms();

  SPISetup_deviceX();


  while(1){

    // initialise Display

    lcd_write(0x39, 0);
    delay_30us();
    
    lcd_write(0x14, 0);
    delay_30us();

    lcd_write(0x55, 0);
    delay_30us();

    lcd_write(0x6D, 0);
    delay_200ms();

    lcd_write(0x78, 0);
    delay_30us();

    lcd_write(0x38, 0);
    delay_30us();

    lcd_write(0x0F, 0);
    delay_30us();

    lcd_write(0x01, 0);
    delay_2ms();

    lcd_write(0x06, 0);
    delay_30us();


   
    // soll ein paar "x" schreiben...
    lcd_write(0x78, 1);
    delay_200ms();

    lcd_write(0x78, 1);
    delay_200ms();

    lcd_write(0x78, 1);
    delay_200ms();

    lcd_write(0x78, 1);
    delay_200ms();

    lcd_write(0x78, 1);
    delay_200ms();
    
    // Verzögerung um etwas auf dem Display zu sehen...
    for (k = 0; k < 15000; k++){
      for (i = 0; i < 15000; i++);
    }
  }
}




void SPISetup_deviceX(void)
{
  USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;// Port, SPI master, MSB wird zuerst übertragen
  USICKCTL = USIDIV_4 + USISSEL_2;
  USICTL0 &= ~USISWRST;                     // USI released for operation

  USISR = 0x00;
  USICNT = 1;
}


// USI interrupt service routine
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{;}


void lcd_write(char command, char daten)
{
  volatile uint8_t i;

  if (daten==0){
    P1OUT &= ~BIT3; // RS = LOW, es handelt sich um ein Kommando
  }

  if (daten==1){
    P1OUT |= BIT3;  // RS = HIGH, es handelt sich um Daten
  }

  P1OUT &= ~BIT4;        // /CS enable

  USISRL = command;                           // Load value
  USICNT = 8;                               // Send it
  
  while (!(USICTL1&USIIFG));                // Wait for TX to finish

  P1OUT |= BIT4;         // /CS disable
}


void delay_30us(void)
{
  volatile uint8_t i;
  
  for(i=1;i<=1;i++){;} 
}


void delay_2ms(void)
{
  volatile uint16_t i;

  for(i=1;i<=186;i++){;}
}


void delay_50ms(void)
{
  volatile uint16_t i;

  for(i=1;i<=10000;i++){
  }
}


void delay_200ms(void)
{
  volatile uint16_t i;
  volatile uint16_t k;

  for(k=0 ; k<2 ; k++){
      for(i=1;i<=10000;i++){
      }
  }
}

/*******************************************************************************
* END OF FILE
*******************************************************************************/

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

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

Autor: klausklingel (Gast)
Datum:

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

Autor: tobias-frintz (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy

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

Tobi

Autor: Jojo (Gast)
Datum:

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

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

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte dem Display am Anfang einen etwa 100 ms langen Resetpuls 
geben

also z.B. so:
void main(void)
{
  volatile unsigned int i;             // Use volatile to prevent removal
  volatile unsigned int k;

  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog

  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
  DCOCTL = CALDCO_1MHZ;

  P1DIR |= BIT2 + BIT3 + BIT4;         // Port 1.2, 1.3, 1.4 = Output
  P1OUT &= ~BIT2;                      // R/W = LOW
  P1OUT &= ~BIT3;                      // Reset low  <----

  delay_100ms();                       // Auf 100 ms geändert  <----

  P1OUT |= BIT3;                       // Reset high <----

  SPISetup_deviceX();


Dann sollte es auch mit dem Debugger funktionieren.

Grüße,

Peter

Autor: Johannes J. (joje)
Datum:

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

Autor: Johannes J. (joje)
Datum:

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

Autor: Reset (Gast)
Datum:

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

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

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

Autor: joje (Gast)
Datum:

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

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

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

Autor: spess53 (Gast)
Datum:

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

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

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

Autor: spess53 (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

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.