DOGM-Display: MultiPort-Problem

Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

DOGM-Display: MultiPort-Problem

 · 
Posted: 31.05.2020 - 11:08  ·  #1
Hallo Zusammen,

vielleicht etwas seltsam, daß ich mich wegen eines Displays an euch (Rolf :) ) wende, aber ich verstehs nicht.

Ich habe, um Displays (DOGM163) zu testen, eine uralte Platine (PCA9555 für I2CMultiPort) heraus gekramt und an diese einen Mega8 via I2C angeschlossen. Gleiche Konstellation hatte ich vor rund 10 Jahren genau so verwendet. Nun geht nichts mehr :(. Beim ersten LCDCtrl_M(LCD_m1,$39); stellt sich das Programm in den Wald. Im Programm befindet sich natürlich eine I2CStat-Abfrage und die bestätigt, daß der PCA9555 gefunden wird.

Ich verstehs nicht ...... TWI hab ich ebenfalls getestet: Gleiches Ergebnis.

Code

Program DOGM163Test;
{                                                                              }
{ Version 1: 31.05.2020 DOGM163-Test via I2C; Hardware I2CTrans2               }
{                                                                              }
{                                                                              }
{                                                                              }
{                                                                              }
{                                                                              }

{$NOSHADOW}
{ $WG}                                            // {global Warnings off

Device = mega8, VCC=5;                           // µC ATMega8, 5V
{ $BOOTRST %00C00}                                // Reset Jump to %00000000C00

Import SysTick, I2Cport, LCDmultiPort;           // Import SysTick und TWI-Treibers

From System Import ;                             // braucht man hier nicht


Define
  ProcClock      = 8000000;                      // Frequenz in Hz
  SysTick        = 10;                           // ms
  StackSize      = $0100, iData;                 // Stack-Größe 256 Byte
  FrameSize      = $0100, iData;                 // Frame-Größe 256 Byte

  I2Cport        = PortC;
  I2Cdat         = 4;
  I2Cclk         = 5;
  
  LCDmultiPort   = I2C_Soft;
  LCDrows_M      = 4;              { rows                                  }
  LCDcolumns_M   = 16;             { columns per line                      }
  LCDtype_M      = 66712;
Implementation

{$IDATA}

{------------------------------------------------------------------------------}
{ Type Declarations }
Type                                             // braucht man hier nicht
{------------------------------------------------------------------------------}
{ Const Declarations }
Const                                            // Konstanten
  PCA : Byte = $20;
{------------------------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
Var                                              // Variablen
  LEDred[@PortC,0] : Bit;                        // LED rot true=on
  Counter          : Byte;
{------------------------------------------------------------------------------}
{ functions }
Procedure DOGM_Init;
  Begin
    LEDred:=true;                        // ***** hier folgend hängt er sich auf *****
    LCDCtrl_M(LCD_m1,$39);               // 8 Bit, 3 Zeilen, InstructionSet 01
    LEDred:=false;
    LCDCtrl_M(LCD_m1,$1D);               // BIAS 1/4, 3 Zeilen
    LCDCtrl_M(LCD_m1,$50);               // Booster aus, Contrast C5 & C4
    LCDCtrl_M(LCD_m1,$6C);               // Follower-Control
    LCDCtrl_M(LCD_m1,$7C);               // Contrast C3, C2, C1 & C0
    LCDCtrl_M(LCD_m1,$38);               // 8 Bit, 3 Zeilen, InstructionSet 00
    LCDCtrl_M(LCD_m1,$0C);               // Display On, Cursor & Cursor Position Off
    LCDCtrl_M(LCD_m1,$01);               // Clear Display
    LCDCtrl_M(LCD_m1,$06);               // Cursor AutoIncrement

    mDelay(1000);
    LEDred:=false;
  End DOGM_Init;


Procedure InitPorts;                             
                                                 
  Begin
    DDRC:= %00100011;                            // DDR=DataDiRection 0=Eingang, 1=Ausgang
    PortC:=%00000000;                            // x x SCK SDA x x GND LEDred

    DDRD:= %00000000;                            // DDR=DataDiRection 0=Eingang, 1=Ausgang
    PortD:=%00000000;                            //

  End InitPorts;
  
  
Procedure SigRed(C:Byte);
  Begin
    For Counter:=0 to C do
      LEDred:=true;
      mDelay(25);
      LEDred:=false;
      mDelay(25);
      EndFor;
  End SigRed;

{------------------------------------------------------------------------------}
{ Main Program }
{$IDATA}
Begin
  EnableInts;
  InitPorts;
  LEDred:=false;                                 // LED aus
  If I2CStat(PCA)=true                           // PCA9555 gefunden?
    then
      SigRed(9);
    EndIf;
  DOGM_Init;                                     // Init DOGM
  LCDCLR_M(LCD_m1);
  LCDXY_M(LCD_m1,0,0);
  Write(LCDOut_M,'Test  1234567890');
  LCDXY_M(LCD_m1,0,1);
  Write(LCDOut_M,'Test  abcdefghij');
  LCDXY_M(LCD_m1,0,2);
  Write(LCDOut_M,'Test  ABCDEFGHIJ');

  Loop

    EndLoop;
  End DOGM163Test.



Gruss
Harry

[Edit] Kann man es einrichten, daß man 3 Zeilen definieren kann? Es ist nur 1, 2 und 4 möglich. Es gibt aber inzwischen mehrere Displays mit 3 Zeilen zu kaufen.
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: DOGM-Display: MultiPort-Problem

 · 
Posted: 06.06.2020 - 14:13  ·  #2
Update: Das Display läuft (leidlich) im 4-Bit-Modus.
Code

Import SysTick, LCDPort, SoftPWM;

From System Import ;

Define
        LCDType       = 66712;
        LCDRows       = 4;
        LCDColumns    = 16;
        LCDPort       = PortA;

Procedure DOGM_Init2;                       // 4-Bit, 3.3V, 3-zeilig
  Begin
    LCDCtrl($29);                           // 4-Bit, 3 Zeilen, InstructionSet 1
    LCDCtrl($1D);                           // BS: 1/4 (5V), 3 Zeilen %0001 1101
    LCDCtrl($50);                           // Booster ein, Contrast C5 & C4  Bit0&1
    LCDCtrl($6C);                           // Follower-Control
    LCDCtrl($7C);                           // Contrast C3, C2, C1 & C0  Bit 0-3
    LCDCtrl($28);                           // 4-Bit, 3 Zeilen, InstructionSet 0
    LCDCtrl($0C);                           // Display on, Cursor off
    LCDCtrl($01);                           // Clear Display
    LCDCtrl($06);                           // Cursor AutoIncrement
  End DOGM_Init2;

{ ***** Main *****}
  LCDXY(0,0);
  Write(LCDOut,'ABCDEFGHIJKLMNOP');
  LCDXY(0,1);
  Write(LCDOut,'0123456789+- '+#0+#1+#2);
  LCDXY(0,2);
  Write(LCDOut,'0123456789+- '+#0+#1+#2);
  LCDXY(0,3);
  Write(LCDOut,'0123456789+- '+#0+#1+#2);


Das Problem: Ich kann nur Zeile 0 und 2 beschreiben und das ist im Quellcode aber Zeile 0 und 1.
Hab auch schon sämtliche verfügbaren Controller getestet: 44780, 0070 und 66712.
Irgendwelche Ideen?

Nochmal zu Erinnerung: Das ist ein 3-zeiliges LCD.

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: DOGM-Display: MultiPort-Problem

 · 
Posted: 06.06.2020 - 17:27  ·  #3
Also so funktioniert es:
Code

Procedure WriteLine2(PosX:Byte;OutStr:String[16]);
  Var SCount           : Byte;
      OutS1            : String[1];
      OutC1[@OutS1+1]  : Char;
  Begin
    If PosX in [0..15]
      then
        LCDCtrl($90+PosX);                  // Set DDRAM-Adress Line 2
        For SCount:=1 to (Length(OutStr)-PosX) do
          OutS1:=Copy(OutStr,SCount,1);
          LCDOut(Ord(OutC1));
          EndFor;
      EndIf;
  End WriteLine2;
.
.
.
WriteLine2(0,'ABCDEFGHIJKLMNOP');


Das funktioniert damit aber nicht:
Code
WriteLine2(3,IntToStr(1357:5));


Zeile 1 (von 0 an gerechnet) beginnt im DDRAM bei Adresse $10 bis $1F (Zeile 0: $00-$0F; Zeile 2: $20-$2F). Es ist zwar ein ST7036-Controler, aber in diesem speziellen 3-Zeilen-Modus.

@Rolf: Kannst du das implementieren? Es funktioniert ja mit der Einstellung 66712, aber der 3-Zeilen-Modus ist halt doch was besonderes :D

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: DOGM-Display: MultiPort-Problem

 · 
Posted: 08.06.2020 - 11:00  ·  #4
Falls es jemand interessiert .....

Wenn man das Display so definiert (das funktioniert auch mit dem MultiPort-Treiber):
Code

        LCDType       = 66712;
        LCDRows       = 4;
        LCDColumns    = 20;
        LCDPort       = PortA;

kann man so
Code

  LCDXY(0,0);
  Write(LCDOut,'Zeile 1 01234567');
  LCDXY(0,1);
  Write(LCDOut,'Zeile 3 abcdefgh');
  LCDXY(16,0);
  Write(LCDOut,'Zeile 2 ABCDEFGH');

alle 3 Zeilen ansprechen. Die Positionierung des Cursors auf (16,0) setzt diesen in die 2. Zeile. LCDXY(0,1) ist die 3. Zeile.

Wieso das funktioniert ist nach einem Blick ins Datenblatt des ST7036 leicht zu erklären:
Die DDRAM-Adresse der Zeile 1 ist $00 - $27. Bei einer Konfiguration des Displays in den 3-Zeilen-Modus, liegt die DDRAM-Adresse der 2. Zeile bei $10-$1F. D.h. ein LCDXY(16,0) setzt den Cursor auf die 17. Stelle der ersten Zeile, die aber in der 2. Zeile dargestellt wird. Nicht schön, aber es geht.

Gruss
Harry
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 13   78   91 · Page-Gen-Time: 0.034721s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI